X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9d8b1d2f3e70a151591e7b472991bceeef07f32a..acd32ffcdb319f162633c20e0202db3f8542998a:/samples/controls/controls.cpp diff --git a/samples/controls/controls.cpp b/samples/controls/controls.cpp index 57daa3fd06..9b08f4cb6e 100644 --- a/samples/controls/controls.cpp +++ b/samples/controls/controls.cpp @@ -24,10 +24,14 @@ #include "wx/bookctrl.h" #include "wx/imaglist.h" #include "wx/artprov.h" +#include "wx/cshelp.h" #if wxUSE_TOOLTIPS #include "wx/tooltip.h" -#endif +#ifdef __WXMSW__ + #include "wx/numdlg.h" +#endif // __WXMSW__ +#endif // wxUSE_TOOLTIPS #if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__) #define USE_XPM @@ -74,7 +78,10 @@ public: MyPanel(wxFrame *frame, int x, int y, int w, int h); virtual ~MyPanel(); - void OnSize( wxSizeEvent& event ); +#if wxUSE_TOOLTIPS + void SetAllToolTips(); +#endif // wxUSE_TOOLTIPS + void OnIdle( wxIdleEvent &event ); void OnListBox( wxCommandEvent &event ); void OnListBoxDoubleClick( wxCommandEvent &event ); @@ -187,9 +194,15 @@ public: #if wxUSE_TOOLTIPS void OnSetTooltipDelay(wxCommandEvent& event); void OnToggleTooltips(wxCommandEvent& event); +#ifdef __WXMSW__ + void OnSetMaxTooltipWidth(wxCommandEvent& event); +#endif // __WXMSW__ #endif // wxUSE_TOOLTIPS void OnEnableAll(wxCommandEvent& event); + void OnHideAll(wxCommandEvent& event); + void OnHideList(wxCommandEvent& event); + void OnContextHelp(wxCommandEvent& event); void OnIdle( wxIdleEvent& event ); void OnIconized( wxIconizeEvent& event ); @@ -292,7 +305,9 @@ public: const wxValidator& validator = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr) : wxRadioBox(parent, id, title, pos, size, n, choices, majorDim, - style, validator, name) { SetForegroundColour(*wxRED); } + style, validator, name) + { + } protected: void OnFocusGot(wxFocusEvent& event) @@ -375,9 +390,13 @@ enum // tooltip menu CONTROLS_SET_TOOLTIP_DELAY = 200, CONTROLS_ENABLE_TOOLTIPS, + CONTROLS_SET_TOOLTIPS_MAX_WIDTH, // panel menu - CONTROLS_ENABLE_ALL + CONTROLS_ENABLE_ALL, + CONTROLS_HIDE_ALL, + CONTROLS_HIDE_LIST, + CONTROLS_CONTEXT_HELP }; bool MyApp::OnInit() @@ -395,6 +414,10 @@ bool MyApp::OnInit() wxSscanf(wxString(argv[2]), wxT("%d"), &y); } +#if wxUSE_HELP + wxHelpProvider::Set( new wxSimpleHelpProvider ); +#endif // wxUSE_HELP + // Create the main frame window MyFrame *frame = new MyFrame(_T("Controls wxWidgets App"), x, y); frame->Show(true); @@ -436,13 +459,14 @@ const int ID_COMBO_APPEND = 144; const int ID_COMBO_DELETE = 145; const int ID_COMBO_FONT = 146; const int ID_COMBO_ENABLE = 147; +const int ID_COMBO_SET_TEXT = 148; const int ID_RADIOBOX = 160; const int ID_RADIOBOX_SEL_NUM = 161; const int ID_RADIOBOX_SEL_STR = 162; const int ID_RADIOBOX_FONT = 163; const int ID_RADIOBOX_ENABLE = 164; - +const int ID_RADIOBOX2 = 165; const int ID_RADIOBUTTON_1 = 166; const int ID_RADIOBUTTON_2 = 167; @@ -478,8 +502,9 @@ const int ID_SIZER_CHECK4 = 204; const int ID_SIZER_CHECK14 = 205; const int ID_SIZER_CHECKBIG = 206; +const int ID_HYPERLINK = 300; + BEGIN_EVENT_TABLE(MyPanel, wxPanel) -EVT_SIZE ( MyPanel::OnSize) EVT_IDLE ( MyPanel::OnIdle) EVT_BOOKCTRL_PAGE_CHANGING(ID_BOOK, MyPanel::OnPageChanging) EVT_BOOKCTRL_PAGE_CHANGED(ID_BOOK, MyPanel::OnPageChanged) @@ -513,8 +538,10 @@ EVT_BUTTON (ID_COMBO_CLEAR, MyPanel::OnComboButtons) EVT_BUTTON (ID_COMBO_APPEND, MyPanel::OnComboButtons) EVT_BUTTON (ID_COMBO_DELETE, MyPanel::OnComboButtons) EVT_BUTTON (ID_COMBO_FONT, MyPanel::OnComboButtons) +EVT_BUTTON (ID_COMBO_SET_TEXT, MyPanel::OnComboButtons) EVT_CHECKBOX (ID_COMBO_ENABLE, MyPanel::OnComboButtons) EVT_RADIOBOX (ID_RADIOBOX, MyPanel::OnRadio) +EVT_RADIOBOX (ID_RADIOBOX2, MyPanel::OnRadio) EVT_BUTTON (ID_RADIOBOX_SEL_NUM, MyPanel::OnRadioButtons) EVT_BUTTON (ID_RADIOBOX_SEL_STR, MyPanel::OnRadioButtons) EVT_BUTTON (ID_RADIOBOX_FONT, MyPanel::OnRadioButtons) @@ -621,7 +648,6 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) m_text = new wxTextCtrl(this, wxID_ANY, _T("This is the log window.\n"), wxPoint(0, 250), wxSize(100, 50), wxTE_MULTILINE); - m_text->SetBackgroundColour(wxT("wheat")); m_logTargetOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_text)); @@ -630,8 +656,8 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) wxString choices[] = { _T("This"), - _T("is one of my"), - _T("really"), + _T("is"), + _T("one of my long and"), _T("wonderful"), _T("examples.") }; @@ -722,18 +748,15 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) wxPanel *panel = new wxPanel(m_book); m_listbox = new wxListBox( panel, ID_LISTBOX, wxPoint(10,10), wxSize(120,70), - 5, choices, wxLB_MULTIPLE |wxLB_ALWAYS_SB ); + 5, choices, wxLB_MULTIPLE | wxLB_ALWAYS_SB | wxHSCROLL ); m_listboxSorted = new wxListBox( panel, ID_LISTBOX_SORTED, wxPoint(10,90), wxSize(120,70), - 5, choices, wxLB_SORT ); + 3, choices, wxLB_SORT ); SetListboxClientData(wxT("listbox"), m_listbox); SetListboxClientData(wxT("listbox"), m_listboxSorted); m_listbox->SetCursor(*wxCROSS_CURSOR); -#if wxUSE_TOOLTIPS - m_listbox->SetToolTip( _T("This is a list box") ); -#endif // wxUSE_TOOLTIPS m_lbSelectNum = new wxButton( panel, ID_LISTBOX_SEL_NUM, _T("Select #&2"), wxPoint(180,30), wxSize(140,30) ); m_lbSelectThis = new wxButton( panel, ID_LISTBOX_SEL_STR, _T("&Select 'This'"), wxPoint(340,30), wxSize(140,30) ); @@ -743,18 +766,10 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) wxButton *button = new MyButton( panel, ID_LISTBOX_FONT, _T("Set &Italic font"), wxPoint(340,130), wxSize(140,30) ); button->SetDefault(); - button->SetForegroundColour(*wxBLUE); - -#if wxUSE_TOOLTIPS - button->SetToolTip( _T("Press here to set italic font") ); -#endif // wxUSE_TOOLTIPS m_checkbox = new wxCheckBox( panel, ID_LISTBOX_ENABLE, _T("&Disable"), wxPoint(20,170) ); m_checkbox->SetValue(false); button->MoveAfterInTabOrder(m_checkbox); -#if wxUSE_TOOLTIPS - m_checkbox->SetToolTip( _T("Click here to disable the listbox") ); -#endif // wxUSE_TOOLTIPS (void)new wxCheckBox( panel, ID_CHANGE_COLOUR, _T("&Toggle colour"), wxPoint(110,170) ); panel->SetCursor(wxCursor(wxCURSOR_HAND)); @@ -770,7 +785,6 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) SetChoiceClientData(wxT("choice"), m_choiceSorted); m_choice->SetSelection(2); - m_choice->SetBackgroundColour( wxT("red") ); (void)new wxButton( panel, ID_CHOICE_SEL_NUM, _T("Select #&2"), wxPoint(180,30), wxSize(140,30) ); (void)new wxButton( panel, ID_CHOICE_SEL_STR, _T("&Select 'This'"), wxPoint(340,30), wxSize(140,30) ); (void)new wxButton( panel, ID_CHOICE_CLEAR, _T("&Clear"), wxPoint(180,80), wxSize(140,30) ); @@ -788,8 +802,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) m_combo = new MyComboBox( panel, ID_COMBO, _T("This"), wxPoint(20,25), wxSize(120, wxDefaultCoord), 5, choices, - wxCB_READONLY | wxPROCESS_ENTER); - m_combo->SetBackgroundColour(*wxBLUE); + wxTE_PROCESS_ENTER); (void)new wxButton( panel, ID_COMBO_SEL_NUM, _T("Select #&2"), wxPoint(180,30), wxSize(140,30) ); (void)new wxButton( panel, ID_COMBO_SEL_STR, _T("&Select 'This'"), wxPoint(340,30), wxSize(140,30) ); @@ -797,6 +810,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) (void)new wxButton( panel, ID_COMBO_APPEND, _T("&Append 'Hi!'"), wxPoint(340,80), wxSize(140,30) ); (void)new wxButton( panel, ID_COMBO_DELETE, _T("D&elete selected item"), wxPoint(180,130), wxSize(140,30) ); (void)new wxButton( panel, ID_COMBO_FONT, _T("Set &Italic font"), wxPoint(340,130), wxSize(140,30) ); + (void)new wxButton( panel, ID_COMBO_SET_TEXT, _T("Set 'Hi!' at #2"), wxPoint(340,180), wxSize(140,30) ); (void)new wxCheckBox( panel, ID_COMBO_ENABLE, _T("&Disable"), wxPoint(20,130), wxSize(140,30) ); m_book->AddPage(panel, _T("wxComboBox"), false, Image_Combo); @@ -809,20 +823,31 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) }; panel = new wxPanel(m_book); - (void)new MyRadioBox( panel, ID_RADIOBOX, _T("&That"), wxPoint(10,160), wxDefaultSize, WXSIZEOF(choices2), choices2, 1, wxRA_SPECIFY_ROWS ); - m_radio = new wxRadioBox( panel, ID_RADIOBOX, _T("T&his"), wxPoint(10,10), wxDefaultSize, WXSIZEOF(choices), choices, 1, wxRA_SPECIFY_COLS ); - m_radio->SetForegroundColour(*wxRED); - -#if wxUSE_TOOLTIPS - m_combo->SetToolTip(_T("This is a natural\ncombobox - can you believe me?")); - m_radio->SetToolTip(_T("Ever seen a radiobox?")); -#endif // wxUSE_TOOLTIPS + new MyRadioBox(panel, ID_RADIOBOX2, _T("&That"), + wxPoint(10,160), wxDefaultSize, + WXSIZEOF(choices2), choices2, + 1, wxRA_SPECIFY_ROWS ); + m_radio = new wxRadioBox(panel, ID_RADIOBOX, _T("T&his"), + wxPoint(10,10), wxDefaultSize, + WXSIZEOF(choices), choices, + 1, wxRA_SPECIFY_COLS ); + +#if wxUSE_HELP + for( unsigned int item = 0; item < WXSIZEOF(choices); ++item ) + m_radio->SetItemHelpText( item, wxString::Format( _T("Help text for \"%s\""), choices[item].c_str() ) ); + + // erase help text for the second item + m_radio->SetItemHelpText( 1, _T("") ); + // set default help text for control + m_radio->SetHelpText( _T("Default helptext for wxRadioBox") ); +#endif // wxUSE_HELP (void)new wxButton( panel, ID_RADIOBOX_SEL_NUM, _T("Select #&2"), wxPoint(180,30), wxSize(140,30) ); (void)new wxButton( panel, ID_RADIOBOX_SEL_STR, _T("&Select 'This'"), wxPoint(180,80), wxSize(140,30) ); m_fontButton = new wxButton( panel, ID_SET_FONT, _T("Set &more Italic font"), wxPoint(340,30), wxSize(140,30) ); (void)new wxButton( panel, ID_RADIOBOX_FONT, _T("Set &Italic font"), wxPoint(340,80), wxSize(140,30) ); (void)new wxCheckBox( panel, ID_RADIOBOX_ENABLE, _T("&Disable"), wxPoint(340,130), wxDefaultSize ); + wxRadioButton *rb = new wxRadioButton( panel, ID_RADIOBUTTON_1, _T("Radiobutton1"), wxPoint(210,170), wxDefaultSize, wxRB_GROUP ); rb->SetValue( false ); (void)new wxRadioButton( panel, ID_RADIOBUTTON_2, _T("&Radiobutton2"), wxPoint(340,170), wxDefaultSize ); @@ -840,16 +865,11 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) wxBoxSizer *sz = new wxBoxSizer( wxVERTICAL ); gauge_sizer->Add( sz ); m_gauge = new wxGauge( panel, wxID_ANY, 200, wxDefaultPosition, wxSize(155, 30), wxGA_HORIZONTAL|wxNO_BORDER ); - m_gauge->SetBackgroundColour(*wxGREEN); - m_gauge->SetForegroundColour(*wxRED); sz->Add( m_gauge, 0, wxALL, 10 ); m_slider = new wxSlider( panel, ID_SLIDER, 0, 0, 200, wxDefaultPosition, wxSize(155,wxDefaultCoord), wxSL_AUTOTICKS | wxSL_LABELS); m_slider->SetTickFreq(40, 0); -#if wxUSE_TOOLTIPS - m_slider->SetToolTip(_T("This is a sliding slider")); -#endif // wxUSE_TOOLTIPS sz->Add( m_slider, 0, wxALL, 10 ); m_gaugeVert = new wxGauge( panel, wxID_ANY, 100, @@ -902,7 +922,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) s << initialSpinValue; m_spintext = new wxTextCtrl( panel, wxID_ANY, s, wxPoint(20,160), wxSize(80,wxDefaultCoord) ); #if wxUSE_SPINBTN - m_spinbutton = new wxSpinButton( panel, ID_SPIN, wxPoint(103,160) ); + m_spinbutton = new wxSpinButton( panel, ID_SPIN, wxPoint(103,160), wxSize(-1, m_spintext->GetSize().y) ); m_spinbutton->SetRange(-40,30); m_spinbutton->SetValue(initialSpinValue); @@ -914,7 +934,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) #if wxUSE_SPINCTRL m_spinctrl = new wxSpinCtrl( panel, ID_SPINCTRL, wxEmptyString, wxPoint(200, 160), wxSize(80, wxDefaultCoord) ); - m_spinctrl->SetRange(10,30); + m_spinctrl->SetRange(-10,30); m_spinctrl->SetValue(15); #endif // wxUSE_SPINCTRL @@ -936,7 +956,8 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) wxBitmap bitmap( 100, 100 ); wxMemoryDC dc; dc.SelectObject( bitmap ); - dc.SetPen(*wxGREEN_PEN); + dc.SetBackground(*wxGREEN); + dc.SetPen(*wxRED_PEN); dc.Clear(); dc.DrawEllipse(5, 5, 90, 90); dc.DrawText(_T("Bitmap"), 30, 40); @@ -981,9 +1002,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) m_book->AddPage(panel, _T("wxBitmapXXX")); // sizer - panel = new wxPanel(m_book); - panel->SetAutoLayout( true ); wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); @@ -1037,23 +1056,66 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) panel->SetSizer( sizer ); m_book->AddPage(panel, _T("wxSizer")); + + // set the sizer for the panel itself + sizer = new wxBoxSizer(wxVERTICAL); + sizer->Add(m_book, wxSizerFlags().Border().Expand()); + sizer->Add(m_text, wxSizerFlags(1).Border().Expand()); + SetSizer(sizer); + +#if wxUSE_TOOLTIPS + SetAllToolTips(); +#endif // wxUSE_TOOLTIPS } -void MyPanel::OnSize( wxSizeEvent& WXUNUSED(event) ) +#if wxUSE_TOOLTIPS + +namespace { - int x = 0; - int y = 0; - GetClientSize( &x, &y ); - if (m_book) m_book->SetSize( 2, 2, x-4, y*2/3-4 ); - if (m_text) m_text->SetSize( 2, y*2/3+2, x-4, y/3-4 ); +void ResetToolTip(wxWindow *win, const char *tip) +{ + wxCHECK_RET( win, "NULL window?" ); + + win->UnsetToolTip(); + win->SetToolTip(tip); +} + } +void MyPanel::SetAllToolTips() +{ + ResetToolTip(FindWindow(ID_LISTBOX_FONT), "Press here to set italic font"); + ResetToolTip(m_checkbox, "Click here to disable the listbox"); + ResetToolTip(m_listbox, "This is a list box"); + ResetToolTip(m_combo, "This is a natural\ncombobox - can you believe me?"); + ResetToolTip(m_slider, "This is a sliding slider"); + ResetToolTip(FindWindow(ID_RADIOBOX2), "Ever seen a radiobox?"); + + //ResetToolTip(m_radio, "Tooltip for the entire radiobox"); + for ( unsigned int nb = 0; nb < m_radio->GetCount(); nb++ ) + { + m_radio->SetItemToolTip(nb, ""); + m_radio->SetItemToolTip(nb, "tooltip for\n" + m_radio->GetString(nb)); + } + + // remove the tooltip for one of the items + m_radio->SetItemToolTip(2, ""); +} +#endif // wxUSE_TOOLTIPS + void MyPanel::OnIdle(wxIdleEvent& event) { static const int INVALID_SELECTION = -2; static int s_selCombo = INVALID_SELECTION; + + if (!m_combo || !m_choice) + { + event.Skip(); + return; + } + int sel = m_combo->GetSelection(); if ( sel != s_selCombo ) { @@ -1157,23 +1219,29 @@ void MyPanel::OnChangeColour(wxCommandEvent& WXUNUSED(event)) void MyPanel::OnListBox( wxCommandEvent &event ) { -// GetParent()->Move(100, 100); + wxListBox *listbox = event.GetId() == ID_LISTBOX ? m_listbox + : m_listboxSorted; - if (event.GetInt() == -1) + bool deselect = false; + if (listbox->HasFlag(wxLB_MULTIPLE) || listbox->HasFlag(wxLB_EXTENDED)) { - m_text->AppendText( _T("ListBox has no selections anymore\n") ); - return; + deselect = !event.IsSelection(); + if (deselect) + m_text->AppendText( _T("ListBox deselection event\n") ); } - wxListBox *listbox = event.GetId() == ID_LISTBOX ? m_listbox - : m_listboxSorted; - m_text->AppendText( _T("ListBox event selection string is: '") ); m_text->AppendText( event.GetString() ); m_text->AppendText( _T("'\n") ); - m_text->AppendText( _T("ListBox control selection string is: '") ); - m_text->AppendText( listbox->GetStringSelection() ); - m_text->AppendText( _T("'\n") ); + + // can't use GetStringSelection() with multiple selections, there could be + // more than one of them + if ( !listbox->HasFlag(wxLB_MULTIPLE) && !listbox->HasFlag(wxLB_EXTENDED) ) + { + m_text->AppendText( _T("ListBox control selection string is: '") ); + m_text->AppendText( listbox->GetStringSelection() ); + m_text->AppendText( _T("'\n") ); + } wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject()); m_text->AppendText( _T("ListBox event client data string is: '") ); @@ -1184,7 +1252,7 @@ void MyPanel::OnListBox( wxCommandEvent &event ) m_text->AppendText( _T("'\n") ); m_text->AppendText( _T("ListBox control client data string is: '") ); - obj = (wxStringClientData *)listbox->GetClientObject(listbox->GetSelection()); + obj = (wxStringClientData *)listbox->GetClientObject(event.GetInt()); if (obj) m_text->AppendText( obj->GetData() ); else @@ -1246,8 +1314,8 @@ void MyPanel::OnListBoxButtons( wxCommandEvent &event ) } case ID_LISTBOX_APPEND: { - m_listbox->Append( _T("Hi!") ); - m_listboxSorted->Append( _T("Hi!") ); + m_listbox->Append( _T("Hi kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk!") ); + m_listboxSorted->Append( _T("Hi hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh!") ); break; } case ID_LISTBOX_DELETE: @@ -1272,35 +1340,32 @@ void MyPanel::OnListBoxButtons( wxCommandEvent &event ) } #if wxUSE_CHOICE + +static wxString GetDataString(wxClientData *data) +{ + return data ? static_cast(data)->GetData() + : wxString("none"); +} + void MyPanel::OnChoice( wxCommandEvent &event ) { wxChoice *choice = event.GetId() == ID_CHOICE ? m_choice : m_choiceSorted; - m_text->AppendText( _T("Choice event selection string is: '") ); - m_text->AppendText( event.GetString() ); - m_text->AppendText( _T("'\n") ); - m_text->AppendText( _T("Choice control selection string is: '") ); - m_text->AppendText( choice->GetStringSelection() ); - m_text->AppendText( _T("'\n") ); + const int sel = choice->GetSelection(); - wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject()); - m_text->AppendText( _T("Choice event client data string is: '") ); + wxClientData *dataEvt = event.GetClientObject(), + *dataCtrl = choice->GetClientObject(sel); - if (obj) - m_text->AppendText( obj->GetData() ); - else - m_text->AppendText( wxString(_T("none")) ); - - m_text->AppendText( _T("'\n") ); - m_text->AppendText( _T("Choice control client data string is: '") ); - obj = (wxStringClientData *)choice->GetClientObject(choice->GetSelection()); - - if (obj) - m_text->AppendText( obj->GetData() ); - else - m_text->AppendText( wxString(_T("none")) ); - m_text->AppendText( _T("'\n") ); + wxLogMessage(_T("EVT_CHOICE: item %d/%d (event/control), ") + _T("string \"%s\"/\"%s\", ") + _T("data \"%s\"/\"%s\""), + (int)event.GetInt(), + sel, + event.GetString(), + choice->GetStringSelection(), + GetDataString(dataEvt), + GetDataString(dataCtrl)); } void MyPanel::OnChoiceButtons( wxCommandEvent &event ) @@ -1359,6 +1424,9 @@ void MyPanel::OnChoiceButtons( wxCommandEvent &event ) void MyPanel::OnCombo( wxCommandEvent &event ) { + if (!m_combo) + return; + wxLogMessage(_T("EVT_COMBOBOX: item %d/%d (event/control), string \"%s\"/\"%s\""), (int)event.GetInt(), m_combo->GetSelection(), @@ -1368,15 +1436,17 @@ void MyPanel::OnCombo( wxCommandEvent &event ) void MyPanel::OnComboTextChanged(wxCommandEvent& event) { - wxLogMessage(wxT("EVT_TEXT for the combobox: \"%s\" (event) or \"%s\" (control)."), - event.GetString().c_str(), - m_combo->GetValue().c_str()); + if (m_combo) + wxLogMessage(wxT("EVT_TEXT for the combobox: \"%s\" (event) or \"%s\" (control)."), + event.GetString().c_str(), + 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()); + if (m_combo) + wxLogMessage(_T("Enter pressed in the combobox: value is '%s'."), + m_combo->GetValue().c_str()); } void MyPanel::OnComboButtons( wxCommandEvent &event ) @@ -1419,6 +1489,11 @@ void MyPanel::OnComboButtons( wxCommandEvent &event ) m_combo->SetFont( *wxITALIC_FONT ); break; } + case ID_COMBO_SET_TEXT: + { + m_combo->SetString( 2, wxT("Hi!") ); + break; + } } } @@ -1444,27 +1519,20 @@ void MyPanel::OnRadioButtons( wxCommandEvent &event ) switch (event.GetId()) { case ID_RADIOBOX_ENABLE: - { - m_radio->Enable( event.GetInt() == 0 ); - break; - } + m_radio->Enable( event.GetInt() == 0 ); + break; + case ID_RADIOBOX_SEL_NUM: - { - m_radio->SetSelection( 2 ); - break; - } + m_radio->SetSelection( 2 ); + break; + case ID_RADIOBOX_SEL_STR: - { - m_radio->SetStringSelection( _T("This") ); - break; - } - case ID_RADIOBOX_FONT: - { - m_radio->SetForegroundColour(*wxGREEN); + m_radio->SetStringSelection( _T("This") ); + break; - m_radio->SetFont( *wxITALIC_FONT ); - break; - } + case ID_RADIOBOX_FONT: + m_radio->SetFont( *wxITALIC_FONT ); + break; } } @@ -1510,7 +1578,7 @@ void MyPanel::OnSpinCtrl(wxSpinEvent& event) if ( m_spinctrl ) { wxString s; - s.Printf( _T("Spin ctrl changed: now %d (from event: %ld)\n"), + s.Printf( _T("Spin ctrl changed: now %d (from event: %d)\n"), m_spinctrl->GetValue(), event.GetInt() ); m_text->AppendText(s); } @@ -1521,7 +1589,7 @@ void MyPanel::OnSpinCtrlUp(wxSpinEvent& event) if ( m_spinctrl ) { m_text->AppendText( wxString::Format( - _T("Spin up: %d (from event: %ld)\n"), + _T("Spin up: %d (from event: %d)\n"), m_spinctrl->GetValue(), event.GetInt() ) ); } } @@ -1531,7 +1599,7 @@ void MyPanel::OnSpinCtrlDown(wxSpinEvent& event) if ( m_spinctrl ) { m_text->AppendText( wxString::Format( - _T("Spin down: %d (from event: %ld)\n"), + _T("Spin down: %d (from event: %d)\n"), m_spinctrl->GetValue(), event.GetInt() ) ); } } @@ -1701,9 +1769,15 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) #if wxUSE_TOOLTIPS EVT_MENU(CONTROLS_SET_TOOLTIP_DELAY, MyFrame::OnSetTooltipDelay) EVT_MENU(CONTROLS_ENABLE_TOOLTIPS, MyFrame::OnToggleTooltips) +#ifdef __WXMSW__ + EVT_MENU(CONTROLS_SET_TOOLTIPS_MAX_WIDTH, MyFrame::OnSetMaxTooltipWidth) +#endif // __WXMSW__ #endif // wxUSE_TOOLTIPS EVT_MENU(CONTROLS_ENABLE_ALL, MyFrame::OnEnableAll) + EVT_MENU(CONTROLS_HIDE_ALL, MyFrame::OnHideAll) + EVT_MENU(CONTROLS_HIDE_LIST, MyFrame::OnHideList) + EVT_MENU(CONTROLS_CONTEXT_HELP, MyFrame::OnContextHelp) EVT_ICONIZE(MyFrame::OnIconized) EVT_MAXIMIZE(MyFrame::OnMaximized) @@ -1714,8 +1788,10 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) END_EVENT_TABLE() MyFrame::MyFrame(const wxChar *title, int x, int y) - : wxFrame(NULL, wxID_ANY, title, wxPoint(x, y), wxSize(500, 430)) + : wxFrame(NULL, wxID_ANY, title, wxPoint(x, y), wxSize(700, 450)) { + SetHelpText( _T("Controls sample demonstrating various widgets") ); + // Give it an icon // The wxICON() macros loads an icon from a resource under Windows // and uses an #included XPM image under GTK+ and Motif @@ -1742,12 +1818,21 @@ MyFrame::MyFrame(const wxChar *title, int x, int y) tooltip_menu->Append(CONTROLS_ENABLE_TOOLTIPS, _T("&Toggle tooltips\tCtrl-T"), _T("enable/disable tooltips"), true); tooltip_menu->Check(CONTROLS_ENABLE_TOOLTIPS, true); +#ifdef __WXMSW__ + tooltip_menu->Append(CONTROLS_SET_TOOLTIPS_MAX_WIDTH, "Set maximal &width"); +#endif // __WXMSW__ menu_bar->Append(tooltip_menu, _T("&Tooltips")); #endif // wxUSE_TOOLTIPS wxMenu *panel_menu = new wxMenu; panel_menu->Append(CONTROLS_ENABLE_ALL, _T("&Disable all\tCtrl-E"), _T("Enable/disable all panel controls"), true); + panel_menu->Append(CONTROLS_HIDE_ALL, _T("&Hide all\tCtrl-I"), + _T("Show/hide thoe whole panel controls"), true); + panel_menu->Append(CONTROLS_HIDE_LIST, _T("Hide &list ctrl\tCtrl-S"), + _T("Enable/disable all panel controls"), true); + panel_menu->Append(CONTROLS_CONTEXT_HELP, _T("&Context help...\tCtrl-H"), + _T("Get context help for a control")); menu_bar->Append(panel_menu, _T("&Panel")); SetMenuBar(menu_bar); @@ -1757,8 +1842,6 @@ MyFrame::MyFrame(const wxChar *title, int x, int y) #endif // wxUSE_STATUSBAR m_panel = new MyPanel( this, 10, 10, 300, 100 ); - - SetSizeHints( 500, 425 ); } void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) ) @@ -1811,7 +1894,36 @@ void MyFrame::OnToggleTooltips(wxCommandEvent& WXUNUSED(event)) wxLogStatus(this, _T("Tooltips %sabled"), s_enabled ? _T("en") : _T("dis") ); } -#endif // tooltips + +#ifdef __WXMSW__ + +void MyFrame::OnSetMaxTooltipWidth(wxCommandEvent& WXUNUSED(event)) +{ + static int s_maxWidth = 0; + + wxNumberEntryDialog dlg + ( + this, + "Change maximal tooltip width", + "&Width in pixels:", + GetTitle(), + s_maxWidth, + -1, + 600 + ); + if ( dlg.ShowModal() == wxID_CANCEL ) + return; + + s_maxWidth = dlg.GetValue(); + wxToolTip::SetMaxWidth(s_maxWidth); + + // we need to set the tooltip again to test the new width + m_panel->SetAllToolTips(); +} + +#endif // __WXMSW__ + +#endif // wxUSE_TOOLTIPS void MyFrame::OnEnableAll(wxCommandEvent& WXUNUSED(event)) { @@ -1819,6 +1931,37 @@ void MyFrame::OnEnableAll(wxCommandEvent& WXUNUSED(event)) s_enable = !s_enable; m_panel->Enable(s_enable); + static bool s_enableCheckbox = true; + if ( !s_enable ) + { + // this is a test for correct behaviour of either enabling or disabling + // a child when its parent is disabled: the checkbox should have the + // correct state when the parent is enabled back + m_panel->m_checkbox->Enable(s_enableCheckbox); + s_enableCheckbox = !s_enableCheckbox; + } +} + +void MyFrame::OnHideAll(wxCommandEvent& WXUNUSED(event)) +{ + static bool s_show = true; + + s_show = !s_show; + m_panel->Show(s_show); +} + +void MyFrame::OnHideList(wxCommandEvent& WXUNUSED(event)) +{ + static bool s_show = true; + + s_show = !s_show; + m_panel->m_listbox->Show(s_show); +} + +void MyFrame::OnContextHelp(wxCommandEvent& WXUNUSED(event)) +{ + // starts a local event loop + wxContextHelp chelp(this); } void MyFrame::OnMove( wxMoveEvent& event ) @@ -1832,8 +1975,8 @@ void MyFrame::OnMove( wxMoveEvent& event ) void MyFrame::OnIconized( wxIconizeEvent& event ) { - wxLogMessage(_T("Frame %s"), event.Iconized() ? _T("iconized") - : _T("restored")); + wxLogMessage(_T("Frame %s"), event.IsIconized() ? _T("iconized") + : _T("restored")); event.Skip(); } @@ -1854,24 +1997,30 @@ void MyFrame::OnSize( wxSizeEvent& event ) void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) ) { // track the window which has the focus in the status bar - static wxWindow *s_windowFocus = (wxWindow *)NULL; + static wxWindow *s_windowFocus = NULL; wxWindow *focus = wxWindow::FindFocus(); - if ( focus && (focus != s_windowFocus) ) + if ( focus != s_windowFocus ) { s_windowFocus = focus; wxString msg; - msg.Printf( + if ( focus ) + { + msg.Printf( + _T("Focus: %s") #ifdef __WXMSW__ - _T("Focus: %s, HWND = %08x"), -#else - _T("Focus: %s"), + , _T(", HWND = %08x") #endif - s_windowFocus->GetClassInfo()->GetClassName() + , s_windowFocus->GetName().c_str() #ifdef __WXMSW__ - , (unsigned int) s_windowFocus->GetHWND() + , (unsigned int) s_windowFocus->GetHWND() #endif - ); + ); + } + else + { + msg = _T("No focus"); + } #if wxUSE_STATUSBAR SetStatusText(msg);