+#endif // USE_LOG
+
+#if wxUSE_MENUS
+
+void WidgetsFrame::OnPageChanging(WidgetsBookCtrlEvent& event)
+{
+#if USE_TREEBOOK
+ // don't allow selection of entries without pages (categories)
+ if ( !m_book->GetPage(event.GetSelection()) )
+ event.Veto();
+#else
+ wxUnusedVar(event);
+#endif
+}
+
+void WidgetsFrame::OnPageChanged(WidgetsBookCtrlEvent& event)
+{
+ const int sel = event.GetSelection();
+
+ // adjust "Page" menu selection
+ wxMenuItem *item = GetMenuBar()->FindItem(Widgets_GoToPage + sel);
+ if ( item )
+ item->Check();
+
+ GetMenuBar()->Check(Widgets_BusyCursor, false);
+
+ // create the pages on demand, otherwise the sample startup is too slow as
+ // it creates hundreds of controls
+ WidgetsPage *page = CurrentPage();
+ if ( page->GetChildren().empty() )
+ {
+ wxWindowUpdateLocker noUpdates(page);
+ page->CreateContent();
+ //page->Layout();
+ page->GetSizer()->Fit(page);
+
+ WidgetsBookCtrl *book = wxStaticCast(page->GetParent(), WidgetsBookCtrl);
+ wxSize size;
+ for ( size_t i = 0; i < book->GetPageCount(); ++i )
+ {
+ wxWindow *page = book->GetPage(i);
+ if ( page )
+ {
+ size.IncTo(page->GetSize());
+ }
+ }
+ page->SetSize(size);
+ }
+
+ event.Skip();
+}
+
+void WidgetsFrame::OnGoToPage(wxCommandEvent& event)
+{
+#if USE_TREEBOOK
+ m_book->SetSelection(event.GetId() - Widgets_GoToPage);
+#else
+ m_book->SetSelection(m_book->GetPageCount()-1);
+ WidgetsBookCtrl *book = wxStaticCast(m_book->GetCurrentPage(), WidgetsBookCtrl);
+ book->SetSelection(event.GetId() - Widgets_GoToPage);
+#endif
+}
+
+#if wxUSE_TOOLTIPS
+
+void WidgetsFrame::OnSetTooltip(wxCommandEvent& WXUNUSED(event))
+{
+ static wxString s_tip = wxT("This is a tooltip");
+
+ wxTextEntryDialog dialog
+ (
+ this,
+ wxT("Tooltip text (may use \\n, leave empty to remove): "),
+ wxT("Widgets sample"),
+ s_tip
+ );
+
+ if ( dialog.ShowModal() != wxID_OK )
+ return;
+
+ s_tip = dialog.GetValue();
+ s_tip.Replace(wxT("\\n"), wxT("\n"));
+
+ WidgetsPage *page = CurrentPage();
+
+ const Widgets widgets = page->GetWidgets();
+ for ( Widgets::const_iterator it = widgets.begin();
+ it != widgets.end();
+ ++it )
+ {
+ (*it)->SetToolTip(s_tip);
+ }
+}
+
+#endif // wxUSE_TOOLTIPS
+
+namespace
+{
+
+// Trivial wrapper for wxGetColourFromUser() which also does something even if
+// the colour dialog is not available in the current build (which may happen
+// for the ports in development and it is still useful to see how colours work)
+wxColour GetColourFromUser(wxWindow *parent, const wxColour& colDefault)
+{
+#if wxUSE_COLOURDLG
+ return wxGetColourFromUser(parent, colDefault);
+#else // !wxUSE_COLOURDLG
+ if ( colDefault == *wxBLACK )
+ return *wxWHITE;
+ else
+ return *wxBLACK;
+#endif // wxUSE_COLOURDLG/!wxUSE_COLOURDLG
+}
+
+} // anonymous namespace
+
+void WidgetsFrame::OnSetFgCol(wxCommandEvent& WXUNUSED(event))
+{
+ // allow for debugging the default colour the first time this is called
+ WidgetsPage *page = CurrentPage();
+
+ if (!m_colFg.Ok())
+ m_colFg = page->GetForegroundColour();
+
+ wxColour col = GetColourFromUser(this, m_colFg);
+ if ( !col.Ok() )
+ return;
+
+ m_colFg = col;
+
+ const Widgets widgets = page->GetWidgets();
+ for ( Widgets::const_iterator it = widgets.begin();
+ it != widgets.end();
+ ++it )
+ {
+ (*it)->SetForegroundColour(m_colFg);
+ (*it)->Refresh();
+ }
+}
+
+void WidgetsFrame::OnSetBgCol(wxCommandEvent& WXUNUSED(event))
+{
+ WidgetsPage *page = CurrentPage();
+
+ if ( !m_colBg.Ok() )
+ m_colBg = page->GetBackgroundColour();
+
+ wxColour col = GetColourFromUser(this, m_colBg);
+ if ( !col.Ok() )
+ return;
+
+ m_colBg = col;
+
+ const Widgets widgets = page->GetWidgets();
+ for ( Widgets::const_iterator it = widgets.begin();
+ it != widgets.end();
+ ++it )
+ {
+ (*it)->SetBackgroundColour(m_colBg);
+ (*it)->Refresh();
+ }
+}
+
+void WidgetsFrame::OnSetPageBg(wxCommandEvent& WXUNUSED(event))
+{
+ wxColour col = GetColourFromUser(this, GetBackgroundColour());
+ if ( !col.Ok() )
+ return;
+
+ CurrentPage()->SetBackgroundColour(col);
+ CurrentPage()->Refresh();
+}
+
+void WidgetsFrame::OnSetFont(wxCommandEvent& WXUNUSED(event))
+{
+#if wxUSE_FONTDLG
+ WidgetsPage *page = CurrentPage();
+
+ if (!m_font.Ok())
+ m_font = page->GetFont();
+
+ wxFont font = wxGetFontFromUser(this, m_font);
+ if ( !font.Ok() )
+ return;
+
+ m_font = font;
+
+ const Widgets widgets = page->GetWidgets();
+ for ( Widgets::const_iterator it = widgets.begin();
+ it != widgets.end();
+ ++it )
+ {
+ (*it)->SetFont(m_font);
+ (*it)->Refresh();
+ }
+#else
+ wxLogMessage(wxT("Font selection dialog not available in current build."));
+#endif
+}
+
+void WidgetsFrame::OnEnable(wxCommandEvent& event)
+{
+ const Widgets widgets = CurrentPage()->GetWidgets();
+ for ( Widgets::const_iterator it = widgets.begin();
+ it != widgets.end();
+ ++it )
+ {
+ (*it)->Enable(event.IsChecked());
+ }
+}
+
+void WidgetsFrame::OnSetBorder(wxCommandEvent& event)
+{
+ int border;
+ switch ( event.GetId() )
+ {
+ case Widgets_BorderNone: border = wxBORDER_NONE; break;
+ case Widgets_BorderStatic: border = wxBORDER_STATIC; break;
+ case Widgets_BorderSimple: border = wxBORDER_SIMPLE; break;
+ case Widgets_BorderRaised: border = wxBORDER_RAISED; break;
+ case Widgets_BorderSunken: border = wxBORDER_SUNKEN; break;
+ case Widgets_BorderDouble: border = wxBORDER_DOUBLE; break;
+
+ default:
+ wxFAIL_MSG( wxT("unknown border style") );
+ // fall through
+
+ case Widgets_BorderDefault: border = wxBORDER_DEFAULT; break;
+ }
+
+ WidgetsPage::ms_defaultFlags &= ~wxBORDER_MASK;
+ WidgetsPage::ms_defaultFlags |= border;
+
+ WidgetsPage *page = CurrentPage();
+
+ page->RecreateWidget();
+}
+
+void WidgetsFrame::OnToggleGlobalBusyCursor(wxCommandEvent& event)
+{
+ if ( event.IsChecked() )
+ wxBeginBusyCursor();
+ else
+ wxEndBusyCursor();
+}
+
+void WidgetsFrame::OnToggleBusyCursor(wxCommandEvent& event)
+{
+ wxCursor cursor(*(event.IsChecked() ? wxHOURGLASS_CURSOR
+ : wxSTANDARD_CURSOR));
+
+ const Widgets widgets = CurrentPage()->GetWidgets();
+ for ( Widgets::const_iterator it = widgets.begin();
+ it != widgets.end();
+ ++it )
+ {
+ (*it)->SetCursor(cursor);
+ }
+}
+
+void WidgetsFrame::OnDisableAutoComplete(wxCommandEvent& WXUNUSED(event))
+{
+ wxTextEntryBase *entry = CurrentPage()->GetTextEntry();
+ wxCHECK_RET( entry, "menu item should be disabled" );
+
+ if ( entry->AutoComplete(wxArrayString()) )
+ {
+ wxLogMessage("Disabled auto completion.");
+ }
+ else
+ {
+ wxLogMessage("AutoComplete() failed.");
+ }
+}
+
+void WidgetsFrame::OnAutoCompleteFixed(wxCommandEvent& WXUNUSED(event))
+{
+ wxTextEntryBase *entry = CurrentPage()->GetTextEntry();
+ wxCHECK_RET( entry, "menu item should be disabled" );
+
+ wxArrayString completion_choices;
+
+ // add a few strings so a completion occurs on any letter typed
+ for ( char idxc = 'a'; idxc < 'z'; ++idxc )
+ completion_choices.push_back(wxString::Format("%c%c", idxc, idxc));
+
+ completion_choices.push_back("is this string for test?");
+ completion_choices.push_back("this is a test string");
+ completion_choices.push_back("this is another test string");
+ completion_choices.push_back("this string is for test");
+
+ if ( entry->AutoComplete(completion_choices) )
+ {
+ wxLogMessage("Enabled auto completion of a set of fixed strings.");
+ }
+ else
+ {
+ wxLogMessage("AutoComplete() failed.");
+ }
+}
+
+void WidgetsFrame::OnAutoCompleteFilenames(wxCommandEvent& WXUNUSED(event))
+{
+ wxTextEntryBase *entry = CurrentPage()->GetTextEntry();
+ wxCHECK_RET( entry, "menu item should be disabled" );
+
+ if ( entry->AutoCompleteFileNames() )
+ {
+ wxLogMessage("Enable auto completion of file names.");
+ }
+ else
+ {
+ wxLogMessage("AutoCompleteFileNames() failed.");
+ }
+}
+
+void WidgetsFrame::OnSetHint(wxCommandEvent& WXUNUSED(event))
+{
+ wxTextEntryBase *entry = CurrentPage()->GetTextEntry();
+ wxCHECK_RET( entry, "menu item should be disabled" );
+
+ static wxString s_hint("Type here");
+ wxString
+ hint = wxGetTextFromUser("Text hint:", "Widgets sample", s_hint, this);
+ if ( hint.empty() )
+ return;
+
+ s_hint = hint;
+
+ if ( entry->SetHint(hint) )
+ {
+ wxLogMessage("Set hint to \"%s\".", hint);
+ }
+ else
+ {
+ wxLogMessage("Text hints not supported.");
+ }
+}
+
+#endif // wxUSE_MENUS