]> Creatis software - bbtk.git/blobdiff - packages/wx/src/bbwxComboBox.cxx
#3054 BBTK Bug New Normal - package wx - combo box. crash with empty input
[bbtk.git] / packages / wx / src / bbwxComboBox.cxx
index 4d4ce175e4909edac78f638703e2b3a8822a4ee7..36847256d4b89b9c7c7fcf59bd7d6c19e4ccc8eb 100644 (file)
@@ -9,6 +9,8 @@
 #include <string>
 
 #include <wx/choice.h>
+#include <wx/control.h>
+#include <wx/listbox.h>
 
 namespace bbwx
 {
@@ -18,17 +20,20 @@ namespace bbwx
   {
   public:
        ComboBoxWidget( ComboBox* box, wxWindow *parent, 
-                      int iSelection, 
-                      std::string title, 
-                      std::vector< std::string > lstIn );
-
+                    int iSelection, 
+                    std::string title, 
+                    std::vector< std::string > lstIn, 
+                                       int typeForm );
        ~ComboBoxWidget();
-
+       void OnComboBox(int iSelection);
        void OnComboBox(wxEvent& event);
+       void FillItems( int iSelection, std::vector< std::string > lstIn);
 
   private:
-    ComboBox      *mBox;
-        wxChoice               *wxchoice;
+    int                        mTypeForm;
+    ComboBox           *mBox;
+       wxListBox               *wxlistbox;
+       wxChoice                *wxchoice;
   };
   
 
@@ -42,28 +47,17 @@ namespace bbwx
                wxWindow *parent,
                int iSelection,
                std::string title,
-               std::vector< std::string > lstIn )
+               std::vector< std::string > lstIn,
+                                       int typeForm)
     :
     wxPanel( parent, -1) ,
-    mBox(box)
+    mBox(box),
+    mTypeForm(typeForm)
   {
-    wxPanel *panel     = this;
-
-
-    
-    //---------------------------------------------------------------------
-    // 1) Creation de wxChoise widget
-
-        wxchoice = new wxChoice ( panel , -1 );
-
-        Connect( wxchoice->GetId(), wxEVT_COMMAND_CHOICE_SELECTED, (wxObjectEventFunction) (void (wxPanel::*)(wxEvent&))&ComboBoxWidget::OnComboBox ); 
-
-    int i;
-    for (i=0;i<lstIn.size(); i++)
-    {
-          wxchoice->Append(  bbtk::std2wx( lstIn[i] )  ); 
-        } // for i
-    wxchoice->SetSelection(iSelection);
+       wxPanel         *panel          = this;
+       wxlistbox                               = NULL;
+       wxchoice                                = NULL;
+       int i;
 
     //---------------------------------------------------------------------
     // 2) Insertion of the components in the window
@@ -74,13 +68,37 @@ namespace bbwx
     {
           sizer->Add( new wxStaticText(panel,-1,  bbtk::std2wx(title) ) ); 
     }
-    sizer->Add( wxchoice,1,wxGROW ); 
     sizer->AddGrowableCol(0);
     panel->SetSizer(sizer);
+               
+    //---------------------------------------------------------------------
+    // 1) Creation de wxChoise widget
 
+               if (mTypeForm==1)
+               {
+
+                       wxlistbox = new wxListBox ( panel , -1 );                       
+                       Connect( wxlistbox->GetId(), wxEVT_COMMAND_CHOICE_SELECTED, (wxObjectEventFunction) (void (wxPanel::*)(wxEvent&))&ComboBoxWidget::OnComboBox ); 
+               for (i=0;i<lstIn.size(); i++)
+               {
+                               wxlistbox->Append(  bbtk::std2wx( lstIn[i] )  ); 
+                       } // for i
+               wxlistbox->SetSelection(iSelection);
+                  sizer->Add( wxlistbox,1,wxGROW ); 
+
+               } else {
+
+                       wxchoice = new wxChoice ( panel , -1 );
+                       Connect( wxchoice->GetId(), wxEVT_COMMAND_CHOICE_SELECTED, (wxObjectEventFunction) (void (wxPanel::*)(wxEvent&))&ComboBoxWidget::OnComboBox ); 
+               for (i=0;i<lstIn.size(); i++)
+               {
+                               wxchoice->Append(  bbtk::std2wx( lstIn[i] )  ); 
+                       } // for i
+               wxchoice->SetSelection(iSelection);
+                  sizer->Add( wxchoice,1,wxGROW ); 
+               }
 //    panel->SetAutoLayout(true);
 //    panel->Layout();
-
   }
   //-------------------------------------------------------------------------
   
@@ -88,19 +106,55 @@ namespace bbwx
   {
   }
 
+
   //--------------------------------------------------------------------------
-  void ComboBoxWidget::OnComboBox(wxEvent& event)
+  void ComboBoxWidget::OnComboBox(int iSelection)
   {
-
-       int iSelection = wxchoice->GetSelection();
     mBox->bbSetInputSelection( iSelection );
-
     mBox->bbSetOutputOut( iSelection );
     mBox->bbSetOutputOutString(    bbtk::wx2std( wxchoice->GetString(iSelection) )     );
     mBox->bbSignalOutputModification("Out");
     mBox->bbSignalOutputModification("OutString");
   }
 
+  //--------------------------------------------------------------------------
+  void ComboBoxWidget::OnComboBox(wxEvent& event)
+  {
+        int iSelection;
+        if (mTypeForm==1)
+        {
+                iSelection = wxlistbox->GetSelection();
+        } else {
+                iSelection = wxchoice->GetSelection();
+        }
+        OnComboBox(iSelection);
+  }
+//--------------------------------------------------------------------------
+  void ComboBoxWidget::FillItems(
+               int iSelection,
+               std::vector< std::string > lstIn
+       )
+       {
+               int i;
+               if (mTypeForm==1)
+               {
+                       wxlistbox->Clear();
+
+               for (i=0;i<lstIn.size(); i++)
+               {
+                               wxlistbox->Append(  bbtk::std2wx( lstIn[i] )  ); 
+                       } // for i
+
+               wxlistbox->SetSelection(iSelection);
+               } else {
+                       wxchoice->Clear();
+               for (i=0;i<lstIn.size(); i++)
+               {
+                               wxchoice->Append(  bbtk::std2wx( lstIn[i] )  ); 
+                       } // for i
+               wxchoice->SetSelection(iSelection);
+               } // if
+       } 
 
 BBTK_ADD_BLACK_BOX_TO_PACKAGE(wx,ComboBox)
 BBTK_BLACK_BOX_IMPLEMENTATION(ComboBox,bbtk::WxBlackBox);
@@ -109,7 +163,34 @@ BBTK_BLACK_BOX_IMPLEMENTATION(ComboBox,bbtk::WxBlackBox);
 //===== 
 void ComboBox::Process()
 {
+
+printf("EED ComboBox::Process start\n");
+
+       int iSelection = bbGetInputSelection();
+printf("EED ComboBox::Process 0\n");
+       if (bbGetInputSelection() >= bbGetInputIn().size()) { iSelection=bbGetInputIn().size()-1; }
+printf("EED ComboBox::Process 1\n");
+       ComboBoxWidget *w = (ComboBoxWidget*)bbGetOutputWidget();
+printf("EED ComboBox::Process 2\n");
+       w->FillItems( iSelection, bbGetInputIn() );
+printf("EED ComboBox::Process 3\n");
+    bbSetInputSelection( iSelection );
+printf("EED ComboBox::Process 4\n");
+    bbSetOutputOut( iSelection );
+printf("EED ComboBox::Process 5\n");
+
+    int size = bbGetInputIn().size();
+    if         (  (iSelection>0) && ( (size-1)<=iSelection) ) 
+    { 
+       bbSetOutputOutString( bbGetInputIn()[ iSelection ] );
+    }
+//    bbSignalOutputModification("Out");
+//    bbSignalOutputModification("OutString");
+
+printf("EED ComboBox::Process end\n");
+
 }
+
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
 //===== 
@@ -122,10 +203,11 @@ void ComboBox::CreateWidget(wxWindow* parent)
 
     ComboBoxWidget *w = new ComboBoxWidget(
                                this,
-                                                                       parent,
+                                                       parent,
                                bbGetInputSelection() ,
                                bbGetInputTitle(),
-                               bbGetInputIn() );
+                               bbGetInputIn(),
+                               bbGetInputForm() );
 
    bbSetOutputOut( bbGetInputSelection() );
    bbSetOutputOutString( bbGetInputIn()[ bbGetInputSelection() ] );
@@ -140,6 +222,7 @@ void ComboBox::bbUserSetDefaultValues()
 {
        bbSetInputSelection(0);
        bbSetInputTitle("");
+       bbSetInputForm(0);
 }
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)