]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/controls/controls.cpp
fixed wxSplitPath() bug and added tests for it
[wxWidgets.git] / samples / controls / controls.cpp
index 7255bc38bc11e3cb3dbebb02b79bc966f09bb4df..b34e832b304289f268ec2822f1fad66e22a0bfe2 100644 (file)
@@ -88,6 +88,8 @@ public:
     void OnChoice( wxCommandEvent &event );
     void OnChoiceButtons( wxCommandEvent &event );
     void OnCombo( wxCommandEvent &event );
+    void OnComboTextChanged( wxCommandEvent &event );
+    void OnComboTextEnter( wxCommandEvent &event );
     void OnComboButtons( wxCommandEvent &event );
     void OnRadio( wxCommandEvent &event );
     void OnRadioButtons( wxCommandEvent &event );
@@ -173,8 +175,11 @@ private:
     void UpdateStatusBar(const wxPoint& pos, const wxSize& size)
     {
         wxString msg;
-        msg.Printf(_("pos=(%d, %d), size=%dx%d"),
-                   pos.x, pos.y, size.x, size.y);
+        wxSize sizeCl = GetClientSize();
+        msg.Printf(_("pos=(%d, %d), size=%dx%d (client=%dx%d)"),
+                   pos.x, pos.y,
+                   size.x, size.y,
+                   sizeCl.x, sizeCl.y);
         SetStatusText(msg, 1);
     }
 
@@ -183,6 +188,96 @@ private:
     DECLARE_EVENT_TABLE()
 };
 
+// a button which intercepts double clicks (for testing...)
+class MyButton : public wxButton
+{
+public:
+    MyButton(wxWindow *parent,
+             wxWindowID id,
+             const wxString& label = wxEmptyString,
+             const wxPoint& pos = wxDefaultPosition,
+             const wxSize& size = wxDefaultSize)
+        : wxButton(parent, id, label, pos, size)
+    {
+    }
+
+    void OnDClick(wxMouseEvent& event)
+    {
+        wxLogMessage(_T("MyButton::OnDClick"));
+
+        event.Skip();
+    }
+
+private:
+    DECLARE_EVENT_TABLE()
+};
+
+// a combo which intercepts chars (to test Windows behaviour)
+class MyComboBox : public wxComboBox
+{
+public:
+    MyComboBox(wxWindow *parent, wxWindowID id,
+               const wxString& value = wxEmptyString,
+               const wxPoint& pos = wxDefaultPosition,
+               const wxSize& size = wxDefaultSize,
+               int n = 0, const wxString choices[] = NULL,
+               long style = 0,
+               const wxValidator& validator = wxDefaultValidator,
+               const wxString& name = wxComboBoxNameStr)
+        : wxComboBox(parent, id, value, pos, size, n, choices, style,
+                     validator, name) { }
+
+protected:
+    void OnChar(wxKeyEvent& event);
+    void OnKeyDown(wxKeyEvent& event);
+    void OnKeyUp(wxKeyEvent& event);
+    void OnFocusGot(wxFocusEvent& event)
+    {
+        wxLogMessage(_T("MyComboBox::OnFocusGot"));
+
+        event.Skip();
+    }
+
+private:
+    DECLARE_EVENT_TABLE()
+};
+
+// a radiobox which handles focus set/kill (for testing)
+class MyRadioBox : public wxRadioBox
+{
+public:
+    MyRadioBox(wxWindow *parent,
+               wxWindowID id,
+               const wxString& title = wxEmptyString,
+               const wxPoint& pos = wxDefaultPosition,
+               const wxSize& size = wxDefaultSize,
+               int n = 0, const wxString choices[] = NULL,
+               int majorDim = 1,
+               long style = wxRA_HORIZONTAL,
+               const wxValidator& validator = wxDefaultValidator,
+               const wxString& name = wxComboBoxNameStr)
+        : wxRadioBox(parent, id, title, pos, size, n, choices, majorDim,
+                     style, validator, name) { }
+
+protected:
+    void OnFocusGot(wxFocusEvent& event)
+    {
+        wxLogMessage(_T("MyRadioBox::OnFocusGot"));
+
+        event.Skip();
+    }
+
+    void OnFocusLost(wxFocusEvent& event)
+    {
+        wxLogMessage(_T("MyRadioBox::OnFocusLost"));
+
+        event.Skip();
+    }
+
+private:
+    DECLARE_EVENT_TABLE()
+};
+
 //----------------------------------------------------------------------
 // other
 //----------------------------------------------------------------------
@@ -216,7 +311,7 @@ bool MyApp::OnInit()
     // parse the cmd line
     int x = 50,
         y = 50;
-    if ( argc == 2 )
+    if ( argc == 3 )
     {
         wxSscanf(argv[1], "%d", &x);
         wxSscanf(argv[2], "%d", &y);
@@ -356,6 +451,8 @@ EVT_BUTTON    (ID_CHOICE_DELETE,        MyPanel::OnChoiceButtons)
 EVT_BUTTON    (ID_CHOICE_FONT,          MyPanel::OnChoiceButtons)
 EVT_CHECKBOX  (ID_CHOICE_ENABLE,        MyPanel::OnChoiceButtons)
 EVT_COMBOBOX  (ID_COMBO,                MyPanel::OnCombo)
+EVT_TEXT      (ID_COMBO,                MyPanel::OnComboTextChanged)
+EVT_TEXT_ENTER(ID_COMBO,                MyPanel::OnComboTextEnter)
 EVT_BUTTON    (ID_COMBO_SEL_NUM,        MyPanel::OnComboButtons)
 EVT_BUTTON    (ID_COMBO_SEL_STR,        MyPanel::OnComboButtons)
 EVT_BUTTON    (ID_COMBO_CLEAR,          MyPanel::OnComboButtons)
@@ -387,6 +484,27 @@ EVT_BUTTON    (ID_BUTTON_TEST2,         MyPanel::OnTestButton)
 EVT_BUTTON    (ID_BITMAP_BTN,           MyPanel::OnBmpButton)
 END_EVENT_TABLE()
 
+BEGIN_EVENT_TABLE(MyButton, wxButton)
+    EVT_LEFT_DCLICK(MyButton::OnDClick)
+END_EVENT_TABLE()
+
+BEGIN_EVENT_TABLE(MyComboBox, wxComboBox)
+    EVT_CHAR(MyComboBox::OnChar)
+    EVT_KEY_DOWN(MyComboBox::OnKeyDown)
+    EVT_KEY_UP(MyComboBox::OnKeyUp)
+
+    EVT_SET_FOCUS(MyComboBox::OnFocusGot)
+END_EVENT_TABLE()
+
+BEGIN_EVENT_TABLE(MyRadioBox, wxRadioBox)
+    EVT_SET_FOCUS(MyRadioBox::OnFocusGot)
+    EVT_KILL_FOCUS(MyRadioBox::OnFocusLost)
+END_EVENT_TABLE()
+
+// ============================================================================
+// implementation
+// ============================================================================
+
 MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
        : wxPanel( frame, -1, wxPoint(x, y), wxSize(w, h) ),
          m_text(NULL), m_notebook(NULL)
@@ -485,9 +603,9 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
     m_lbSelectNum = new wxButton( panel, ID_LISTBOX_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
     m_lbSelectThis = new wxButton( panel, ID_LISTBOX_SEL_STR, "&Select 'This'", wxPoint(340,30), wxSize(140,30) );
     (void)new wxButton( panel, ID_LISTBOX_CLEAR, "&Clear", wxPoint(180,80), wxSize(140,30) );
-    (void)new wxButton( panel, ID_LISTBOX_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
+    (void)new MyButton( panel, ID_LISTBOX_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
     (void)new wxButton( panel, ID_LISTBOX_DELETE, "D&elete selected item", wxPoint(180,130), wxSize(140,30) );
-    wxButton *button = new wxButton( panel, ID_LISTBOX_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
+    wxButton *button = new MyButton( panel, ID_LISTBOX_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
 
     button->SetDefault();
 
@@ -512,10 +630,8 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
     m_choiceSorted = new wxChoice( panel, ID_CHOICE_SORTED, wxPoint(10,70), wxSize(120,-1),
                                    5, choices, wxCB_SORT );
 
-#ifndef __WXMOTIF__
     SetControlClientData("choice", m_choice);
     SetControlClientData("choice", m_choiceSorted);
-#endif
 
     m_choice->SetSelection(2);
     m_choice->SetBackgroundColour( "red" );
@@ -532,7 +648,11 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
     panel = new wxPanel(m_notebook);
     (void)new wxStaticBox( panel, -1, "&Box around combobox",
                            wxPoint(5, 5), wxSize(150, 100));
-    m_combo = new wxComboBox( panel, ID_COMBO, "This", wxPoint(20,25), wxSize(120,-1), 5, choices, wxCB_READONLY );
+    m_combo = new MyComboBox( panel, ID_COMBO, "This",
+                              wxPoint(20,25), wxSize(120, -1),
+                              5, choices,
+                              /* wxCB_READONLY | */ wxPROCESS_ENTER);
+
     (void)new wxButton( panel, ID_COMBO_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
     (void)new wxButton( panel, ID_COMBO_SEL_STR, "&Select 'This'", wxPoint(340,30), wxSize(140,30) );
     (void)new wxButton( panel, ID_COMBO_CLEAR, "&Clear", wxPoint(180,80), wxSize(140,30) );
@@ -551,7 +671,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
     };
 
     panel = new wxPanel(m_notebook);
-    (void)new wxRadioBox( panel, ID_RADIOBOX, "&That", wxPoint(10,160), wxSize(-1,-1), WXSIZEOF(choices2), choices2, 1, wxRA_SPECIFY_ROWS );
+    (void)new MyRadioBox( panel, ID_RADIOBOX, "&That", wxPoint(10,160), wxSize(-1,-1), WXSIZEOF(choices2), choices2, 1, wxRA_SPECIFY_ROWS );
     m_radio = new wxRadioBox( panel, ID_RADIOBOX, "T&his", wxPoint(10,10), wxSize(-1,-1), WXSIZEOF(choices), choices, 1, wxRA_SPECIFY_COLS );
 
 #if wxUSE_TOOLTIPS
@@ -571,7 +691,9 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
 
     panel = new wxPanel(m_notebook);
     (void)new wxStaticBox( panel, -1, "&wxGauge and wxSlider", wxPoint(10,10), wxSize(200,130) );
-    m_gauge = new wxGauge( panel, -1, 200, wxPoint(18,50), wxSize(155, 30) );
+    m_gauge = new wxGauge( panel, -1, 200, wxPoint(18,50), wxSize(155, 30), wxGA_HORIZONTAL|wxNO_BORDER );
+    m_gauge->SetBackgroundColour(*wxGREEN);
+    m_gauge->SetForegroundColour(*wxRED);
     m_slider = new wxSlider( panel, ID_SLIDER, 0, 0, 200, wxPoint(18,90), wxSize(155,-1), wxSL_LABELS );
     (void)new wxStaticBox( panel, -1, "&Explanation", wxPoint(220,10), wxSize(270,130) );
 #ifdef __WXMOTIF__
@@ -662,7 +784,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
     (void)new wxButton(panel, ID_BUTTON_LABEL, "&Toggle label", wxPoint(250, 20));
     m_label = new wxStaticText(panel, -1, "Label with some long text",
                                wxPoint(250, 60), wxDefaultSize,
-                               wxALIGN_RIGHT | wxST_NO_AUTORESIZE);
+                               wxALIGN_RIGHT /*| wxST_NO_AUTORESIZE*/);
     m_label->SetForegroundColour( *wxBLUE );
 
     m_notebook->AddPage(panel, "wxBitmapXXX");
@@ -727,7 +849,7 @@ void MyPanel::OnPageChanging( wxNotebookEvent &event )
                           "page change from taking place - if you select\n"
                           "[No] the current page will stay the third one\n",
                           "Control sample",
-                          wxICON_QUESTION | wxYES_NO) != wxYES )
+                          wxICON_QUESTION | wxYES_NO, this) != wxYES )
         {
             event.Veto();
 
@@ -875,9 +997,11 @@ void MyPanel::OnListBoxButtons( wxCommandEvent &event )
             {
                 int idx;
                 idx = m_listbox->GetSelection();
-                m_listbox->Delete( idx );
+                if ( idx != wxNOT_FOUND )
+                    m_listbox->Delete( idx );
                 idx = m_listboxSorted->GetSelection();
-                m_listboxSorted->Delete( idx );
+                if ( idx != wxNOT_FOUND )
+                    m_listboxSorted->Delete( idx );
                 break;
             }
         case ID_LISTBOX_FONT:
@@ -958,9 +1082,11 @@ void MyPanel::OnChoiceButtons( wxCommandEvent &event )
         case ID_CHOICE_DELETE:
             {
                 int idx = m_choice->GetSelection();
-                m_choice->Delete( idx );
+                if ( idx != wxNOT_FOUND )
+                    m_choice->Delete( idx );
                 idx = m_choiceSorted->GetSelection();
-                m_choiceSorted->Delete( idx );
+                if ( idx != wxNOT_FOUND )
+                    m_choiceSorted->Delete( idx );
                 break;
             }
         case ID_CHOICE_FONT:
@@ -982,6 +1108,18 @@ void MyPanel::OnCombo( wxCommandEvent &event )
     m_text->AppendText( "\n" );
 }
 
+void MyPanel::OnComboTextChanged(wxCommandEvent& WXUNUSED(event))
+{
+    wxLogMessage(_T("Text in the combobox changed: now is '%s'."),
+                 m_combo->GetValue().c_str());
+}
+
+void MyPanel::OnComboTextEnter(wxCommandEvent& WXUNUSED(event))
+{
+    wxLogMessage(_T("Enter pressed in the combobox: value is '%s'."),
+                 m_combo->GetValue().c_str());
+}
+
 void MyPanel::OnComboButtons( wxCommandEvent &event )
 {
     switch (event.GetId())
@@ -1070,7 +1208,7 @@ void MyPanel::OnUpdateLabel( wxCommandEvent &WXUNUSED(event) )
     static bool s_long = TRUE;
 
     s_long = !s_long;
-    m_label->SetLabel(s_long ? "very very very long text" : "shorter text");
+    m_label->SetLabel(s_long ? "Very very very very very long text." : "Shorter text.");
 }
 
 void MyPanel::OnSliderUpdate( wxCommandEvent &WXUNUSED(event) )
@@ -1323,6 +1461,33 @@ void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) )
     }
 }
 
+void MyComboBox::OnChar(wxKeyEvent& event)
+{
+    wxLogMessage(_T("MyComboBox::OnChar"));
+
+    if ( event.KeyCode() == 'w' )
+        wxLogMessage(_T("MyComboBox: 'w' will be ignored."));
+    else
+        event.Skip();
+}
+
+void MyComboBox::OnKeyDown(wxKeyEvent& event)
+{
+    wxLogMessage(_T("MyComboBox::OnKeyDown"));
+
+    if ( event.KeyCode() == 'w' )
+        wxLogMessage(_T("MyComboBox: 'w' will be ignored."));
+    else
+        event.Skip();
+}
+
+void MyComboBox::OnKeyUp(wxKeyEvent& event)
+{
+    wxLogMessage(_T("MyComboBox::OnKeyUp"));
+
+    event.Skip();
+}
+
 static void SetControlClientData(const char *name,
                                  wxControlWithItems *control)
 {