]> Creatis software - bbtk.git/blobdiff - packages/wx/src/bbwxComboBox.cxx
#3496 Linux Bug
[bbtk.git] / packages / wx / src / bbwxComboBox.cxx
index 27e69d030aa4ca18d830fff1be81ffe5dc11b908..f0c3cc5d23de828a180d3a8ed0fd9fafb7ac11d2 100644 (file)
@@ -4,7 +4,6 @@
 #include "bbwxComboBox.h"
 #include "bbwxPackage.h"
 
-
 #include <vector>
 #include <string>
 
@@ -12,6 +11,8 @@
 #include <wx/control.h>
 #include <wx/listbox.h>
 
+#include <wx/spinbutt.h>
+
 namespace bbwx
 {
   //--------------------------------------------------------------------------
@@ -23,17 +24,22 @@ namespace bbwx
                     int iSelection, 
                     std::string title, 
                     std::vector< std::string > lstIn, 
-                                       int typeForm );
+                                       int typeForm, 
+                                       int sizeX, int sizeY );
        ~ComboBoxWidget();
-       void OnComboBox(int iSelection);
+       void OnComboBoxSelection(int iSelection);
        void OnComboBox(wxEvent& event);
        void FillItems( int iSelection, std::vector< std::string > lstIn);
+    void VerifyDeselect(int iSelection);
+
+    void OnSpinCtrlClick(wxCommandEvent& event);
+
 
   private:
     int                        mTypeForm;
     ComboBox           *mBox;
-       wxListBox               *wxlistbox;
-       wxChoice                *wxchoice;
+       wxItemContainer *itemcontainer;
+       wxSpinButton    *mwxspinbutton;
   };
   
 
@@ -44,164 +50,232 @@ namespace bbwx
 
   //-------------------------------------------------------------------------
   ComboBoxWidget::ComboBoxWidget( ComboBox* box,
-               wxWindow *parent,
-               int iSelection,
-               std::string title,
-               std::vector< std::string > lstIn,
-                                       int typeForm)
-    :
-    wxPanel( parent, -1) ,
+            wxWindow *parent,
+            int iSelection,
+            std::string title,
+            std::vector< std::string > lstIn,
+                       int typeForm,
+                       int sizeX, 
+                       int sizeY
+               ) :
+    wxPanel( parent, -1,wxDefaultPosition ) ,
     mBox(box),
     mTypeForm(typeForm)
   {
-       wxPanel         *panel          = this;
-       wxlistbox                               = NULL;
-       wxchoice                                = NULL;
-       int i;
-
+       mwxspinbutton                   = NULL;
+       itemcontainer                   = NULL;
+       wxPanel                 *panel  = this;
+       int                     i;
     //---------------------------------------------------------------------
     // 2) Insertion of the components in the window
     
     // We use a FlexGridSizer
-    wxFlexGridSizer *sizer     = new wxFlexGridSizer(1);
+//    wxFlexGridSizer *sizerV          = new wxFlexGridSizer(1);
+//    wxFlexGridSizer *sizerH1 = new wxFlexGridSizer(0);
+//    wxFlexGridSizer *sizerH2 = new wxFlexGridSizer(2);
+    wxFlexGridSizer *sizer     = new wxFlexGridSizer(2);
+       
     if (title!="")
     {
           sizer->Add( new wxStaticText(panel,-1,  bbtk::std2wx(title) ) ); 
+          sizer->Add( new wxStaticText(panel,-1,  _T("") ) ); 
     }
-    sizer->AddGrowableCol(0);
-    panel->SetSizer(sizer);
-               
     //---------------------------------------------------------------------
-    // 1) Creation de wxChoise widget
-
-               if (mTypeForm==1)
-               {
+        
+       if (mTypeForm==1)
+       {
+               wxListBox *wxlistbox = new wxListBox ( panel , -1 , wxDefaultPosition,wxSize(sizeX,sizeY),0, NULL, wxLB_SINGLE );       
+               itemcontainer=wxlistbox;
+               sizer->Add( wxlistbox,1,wxEXPAND ); 
+               Connect( wxlistbox->GetId(), 
+                 wxEVT_COMMAND_LISTBOX_SELECTED, (wxObjectEventFunction) (void (wxPanel::*)(wxEvent&))&ComboBoxWidget::OnComboBox );                  
+       } else if (mTypeForm==0) {
+               wxChoice *wxchoice = new wxChoice ( panel , -1, wxDefaultPosition,wxSize(sizeX,sizeY));
+               itemcontainer=wxchoice;
+               sizer->Add( wxchoice,1,wxGROW ); 
+               Connect( wxchoice->GetId(), 
+                 wxEVT_COMMAND_CHOICE_SELECTED, (wxObjectEventFunction) (void (wxPanel::*)(wxEvent&))&ComboBoxWidget::OnComboBox ); 
+       }
+       
+       if (mBox->bbGetInputWithSpinButton()==true)
+       {
+               mwxspinbutton = new wxSpinButton( panel, -1 );    
+               Connect( mwxspinbutton->GetId(), 
+                        wxEVT_SPIN, 
+                        (wxObjectEventFunction) 
+                        (void (wxPanel::*)(wxScrollEvent&))
+                        &ComboBoxWidget::OnSpinCtrlClick);
+               sizer->Add( mwxspinbutton,1,wxEXPAND ); 
+       }
+    sizer->AddGrowableCol(0);
 
-                       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();
+    panel->SetSizer(sizer);
+       FillItems( iSelection,lstIn );  
   }
-  //-------------------------------------------------------------------------
-  
+
+  //-------------------------------------------------------------------------  
   ComboBoxWidget::~ComboBoxWidget()
   {
   }
 
-
   //--------------------------------------------------------------------------
-  void ComboBoxWidget::OnComboBox(int iSelection)
+  void ComboBoxWidget::VerifyDeselect(int iSelection)
   {
-    mBox->bbSetInputSelection( iSelection );
-    mBox->bbSetOutputOut( iSelection );
-    mBox->bbSetOutputOutString(    bbtk::wx2std( wxchoice->GetString(iSelection) )     );
-    mBox->bbSignalOutputModification("Out");
-    mBox->bbSignalOutputModification("OutString");
+       if ((iSelection>=0) && (mBox->bbGetInputDeselect()==true) )
+       {
+               if (mTypeForm==1) 
+               { 
+                       ((wxListBox*)itemcontainer)->Deselect( iSelection ); 
+               } // if mTypeForm
+       } // if iSelection
   }
 
   //--------------------------------------------------------------------------
-  void ComboBoxWidget::OnComboBox(wxEvent& event)
+  void ComboBoxWidget::OnComboBoxSelection(int iSelection)
   {
-        int iSelection;
-        if (mTypeForm==1)
-        {
-                iSelection = wxlistbox->GetSelection();
-        } else {
-                iSelection = wxchoice->GetSelection();
-        }
-        OnComboBox(iSelection);
+       if (iSelection>=0) 
+       {
+               mBox->bbSetInputSelection( iSelection );
+               mBox->bbSetOutputOut( iSelection );
+
+// Patch to clean the spaces at the begining 
+               std::string tmpStr = bbtk::wx2std( itemcontainer->GetString(iSelection) );
+               if (tmpStr.length()>0) { while(tmpStr[0]==' ') tmpStr.erase(0,1); }
+               mBox->bbSetOutputOutString(   tmpStr   );
+//             mBox->bbSetOutputOutString(   bbtk::wx2std( itemcontainer->GetString(iSelection) )   );
+
+               mBox->bbSignalOutputModification();
+               VerifyDeselect(iSelection);
+               if (mTypeForm==0) 
+               { 
+                       wxChoice *wxchoise=(wxChoice *)itemcontainer;
+                       wxchoise->SetToolTip( itemcontainer->GetString(iSelection)    );
+               } // if mTypeForm
+
+
+//             mBox->bbSignalOutputModification("Out");
+//             mBox->bbSignalOutputModification("OutString");
+       } // if iSelection
   }
+
 //--------------------------------------------------------------------------
-  void ComboBoxWidget::FillItems(
-               int iSelection,
-               std::vector< std::string > lstIn
-       )
+void ComboBoxWidget::OnComboBox(wxEvent& event)
+{
+       int iSelection = itemcontainer->GetSelection();
+       OnComboBoxSelection( iSelection );
+       if (mBox->bbGetInputWithSpinButton()==true)
        {
-               int i;
-               if (mTypeForm==1)
+               mwxspinbutton->SetValue( iSelection );
+       }
+
+}
+
+//--------------------------------------------------------------------------
+void ComboBoxWidget::OnSpinCtrlClick(wxCommandEvent& event)
+{
+       int iSelection = mwxspinbutton->GetValue();
+       itemcontainer->SetSelection(iSelection);
+       OnComboBoxSelection( iSelection );
+}
+
+
+//--------------------------------------------------------------------------
+void ComboBoxWidget::FillItems( int iSelection, std::vector< std::string > lstIn )
+{
+       int i,size = lstIn.size();
+
+
+#if defined(_WIN32)
+       // Patch to put spaces at the beginin
+#else
+    /*
+       // Patch to put spaces at the beginin
+       int strLength=-1;
+       // Looking for the longest string
+       for (i=0 ;i<size; i++)
+       {       
+               if ( strLength < (int) lstIn[i].length() ) { strLength=lstIn[i].length();  }
+       }       // for
+       // Adding spaces at the bigining to the others strings in the list to have the same size
+       int ii,len2;
+       for (i=0 ;i<size; i++)
+       {       
+               len2 = strLength - lstIn[i].length();
+               for (ii=0;ii<len2;ii++)
+               {       
+                       lstIn[i]="  "+lstIn[i];  // spaces characters
+               } // for ii
+       } // for i
+     */
+#endif // defined(_WIN32)
+       
+       itemcontainer->Clear();
+       for (i=0;i<size; i++)
+       {
+               itemcontainer->Append(  bbtk::std2wx( lstIn[i] )  ); 
+       } // for i
+       if (iSelection>=0)
+       { 
+               itemcontainer->SetSelection(iSelection); 
+               if (mBox->bbGetInputWithSpinButton()==true)
                {
-                       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
-       } 
+                   mwxspinbutton->SetRange( 0,size-1 );
+                       mwxspinbutton->SetValue( iSelection );
+               }
+
+       } // iSelection
+
+       if (mTypeForm==0) 
+       { 
+               ((wxChoice*)itemcontainer)->SetAutoLayout( true ); 
+               ((wxChoice*)itemcontainer)->Layout( ); 
+       } // if mTypeForm       
+} 
 
 BBTK_ADD_BLACK_BOX_TO_PACKAGE(wx,ComboBox)
 BBTK_BLACK_BOX_IMPLEMENTATION(ComboBox,bbtk::WxBlackBox);
+
 //===== 
 // 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)
 //===== 
 void ComboBox::Process()
 {
        int iSelection = bbGetInputSelection();
-       if (bbGetInputSelection() >= bbGetInputIn().size()) { iSelection=bbGetInputIn().size()-1; }
+//     if (bbGetInputSelection() >= bbGetInputIn().size()) { iSelection=bbGetInputIn().size()-1; }
+       if (bbGetInputSelection() >= bbGetInputIn().size()) { iSelection=0; }
        ComboBoxWidget *w = (ComboBoxWidget*)bbGetOutputWidget();
-       w->FillItems( iSelection, bbGetInputIn() );
-    bbSetInputSelection( iSelection );
-    bbSetOutputOut( iSelection );
-
-    int size = bbGetInputIn().size();
-    if         (  (iSelection>0) && ( (size-1)<=iSelection) ) 
-    { 
-       bbSetOutputOutString( bbGetInputIn()[ iSelection ] );
-    }
-//    bbSignalOutputModification("Out");
-//    bbSignalOutputModification("OutString");
+       if (w!=NULL) {
+               w->FillItems( iSelection, bbGetInputIn() );
+               bbSetInputSelection( iSelection );
+               bbSetOutputOut( iSelection );
+               int size = bbGetInputIn().size();
+               if      (  (iSelection>=0) && ( iSelection<size) ) 
+               {
+                  bbSetOutputOutString( bbGetInputIn()[ iSelection ] );
+               } // if iSelection
+               w->VerifyDeselect(iSelection);
+       } // if w
 }
-
 //===== 
 // 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)
 //===== 
 void ComboBox::CreateWidget(wxWindow* parent)
 {
-
-//   bbSetOutputWidget( new wxStaticText ( parent , -1 , _T("") ) );
-//   bbSetOutputWidget( new wxComboBox ( parent , -1 , _T("ups") ) );  
-//   bbSetOutputWidget( new wxChoice ( parent , -1 ) );  
-
     ComboBoxWidget *w = new ComboBoxWidget(
                                this,
                                                        parent,
                                bbGetInputSelection() ,
                                bbGetInputTitle(),
                                bbGetInputIn(),
-                               bbGetInputForm() );
-
+                               bbGetInputForm(),
+                                                       bbGetInputWinWidth(), bbGetInputWinHeight()  );
    bbSetOutputOut( bbGetInputSelection() );
-   bbSetOutputOutString( bbGetInputIn()[ bbGetInputSelection() ] );
+   if (bbGetInputIn().size()> bbGetInputSelection() )
+   {
+          bbSetOutputOutString( bbGetInputIn()[ bbGetInputSelection() ] );
+   } // if InputIn size
    bbSetOutputWidget( w );
-
-
+   
 }
 //===== 
 // 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)
@@ -211,22 +285,24 @@ void ComboBox::bbUserSetDefaultValues()
        bbSetInputSelection(0);
        bbSetInputTitle("");
        bbSetInputForm(0);
+       bbSetInputWinWidth(10);
+       bbSetInputWinHeight(45);
+       bbSetInputDeselect(false);
+       bbSetInputWithSpinButton(false);
 }
 //===== 
 // 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)
 //===== 
 void ComboBox::bbUserInitializeProcessing()
 {
-
 }
 //===== 
 // 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)
 //===== 
 void ComboBox::bbUserFinalizeProcessing()
 {
-
-}
 }
-// EO namespace bbwx
+
+}// EO namespace bbwx