+ void DoUpdateExtraControls(int sel)
+ {
+ m_sel = sel;
+
+ if ( m_sel == wxNOT_FOUND )
+ {
+ m_labelOrig->SetLabel("<no selection>");
+ m_text->Clear();
+ m_text->Disable();
+ }
+ else // have valid item
+ {
+ m_labelOrig->SetLabelText(m_labelsOrig[m_sel]);
+ m_text->Enable();
+ m_text->SetValue(m_labels[m_sel]);
+ }
+ }
+
+ wxArrayInt& m_order;
+ wxArrayString& m_labels,
+ m_labelsOrig;
+
+ int m_sel;
+ wxStaticText *m_labelOrig;
+ wxTextCtrl *m_text;
+
+ DECLARE_EVENT_TABLE()
+ DECLARE_NO_COPY_CLASS(MyRearrangeDialog)
+};
+
+BEGIN_EVENT_TABLE(MyRearrangeDialog, wxRearrangeDialog)
+ EVT_LISTBOX(wxID_ANY, MyRearrangeDialog::OnSelChange)
+
+ EVT_UPDATE_UI(wxID_APPLY, MyRearrangeDialog::OnUpdateUIRename)
+
+ EVT_TEXT_ENTER(wxID_ANY, MyRearrangeDialog::OnRename)
+ EVT_BUTTON(wxID_APPLY, MyRearrangeDialog::OnRename)
+ EVT_BUTTON(wxID_RESET, MyRearrangeDialog::OnReset)
+END_EVENT_TABLE()
+
+void MyFrame::Rearrange(wxCommandEvent& WXUNUSED(event))
+{
+ // the arrays are static so that we preserve the items order between calls
+ // to this function
+ static wxArrayInt s_order;
+ static wxArrayString s_labels,
+ s_labelsOrig;
+
+ // initialize them on the first call
+ if ( s_labelsOrig.empty() )
+ {
+ static const struct ItemInfo
+ {
+ const char *label;
+ const char *labelOrig;
+ int order;
+ } items[] =
+ {
+ { "File name", "Name", 0 },
+ { "File type", "Ext", 1 },
+ { "Size", "Size", 2 },
+ { "Creation time", "Ctime", ~3 }, // negated so hidden
+ { "Last accessed", "Atime", ~4 },
+ { "Last modified", "Mtime", 5 },
+ };
+
+ s_order.reserve(WXSIZEOF(items));
+ s_labels.reserve(WXSIZEOF(items));
+ s_labelsOrig.reserve(WXSIZEOF(items));
+ for ( unsigned n = 0; n < WXSIZEOF(items); n++ )
+ {
+ const ItemInfo& item = items[n];
+ s_order.push_back(item.order);
+ s_labels.push_back(item.label);
+ s_labelsOrig.push_back(item.labelOrig);
+ }
+ }
+
+ MyRearrangeDialog dlg(this, s_order, s_labels, s_labelsOrig);
+ if ( !dlg.Rearrange() )
+ return;
+
+ wxString columns;
+ for ( unsigned n = 0; n < s_order.size(); n++ )
+ {
+ columns += wxString::Format("\n %u: ", n);
+ int idx = s_order[n];
+ if ( idx < 0 )
+ {
+ columns += "[hidden] ";
+ idx = ~idx;
+ }
+
+ columns += s_labels[idx];
+ if ( s_labels[idx] != s_labelsOrig[idx] )
+ {
+ columns += wxString::Format(" (original label: \"%s\")",
+ s_labelsOrig[idx]);
+ }
+ }
+
+ wxLogMessage("The columns order now is:%s", columns);
+}
+
+#if wxUSE_FILEDLG
+
+// panel with custom controls for file dialog
+class MyExtraPanel : public wxPanel
+{
+public:
+ MyExtraPanel(wxWindow *parent);
+ void OnCheckBox(wxCommandEvent& event) { m_btn->Enable(event.IsChecked()); }
+ wxString GetInfo() const
+ {
+ return wxString::Format("checkbox value = %d", (int) m_cb->GetValue());
+ }
+private:
+ wxButton *m_btn;
+ wxCheckBox *m_cb;
+};
+
+MyExtraPanel::MyExtraPanel(wxWindow *parent)
+ : wxPanel(parent)
+{
+ m_btn = new wxButton(this, -1, _T("Custom Button"));
+ m_btn->Enable(false);
+ m_cb = new wxCheckBox(this, -1, _T("Enable Custom Button"));
+ m_cb->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED,
+ wxCommandEventHandler(MyExtraPanel::OnCheckBox), NULL, this);
+ wxBoxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
+ sizerTop->Add(m_cb, wxSizerFlags().Centre().Border());
+ sizerTop->AddStretchSpacer();
+ sizerTop->Add(m_btn, wxSizerFlags().Right().Border());
+ SetSizerAndFit(sizerTop);
+}
+
+// a static method can be used instead of a function with most of compilers
+static wxWindow* createMyExtraPanel(wxWindow *parent)
+{
+ return new MyExtraPanel(parent);
+}
+
+void MyFrame::FileOpen(wxCommandEvent& WXUNUSED(event) )
+{
+ wxFileDialog dialog
+ (
+ this,
+ _T("Testing open file dialog"),
+ wxEmptyString,
+ wxEmptyString,
+#ifdef __WXMOTIF__
+ _T("C++ files (*.cpp)|*.cpp")
+#else
+ _T("C++ files (*.cpp;*.h)|*.cpp;*.h")
+#endif
+ );
+
+ dialog.SetExtraControlCreator(&createMyExtraPanel);
+ dialog.CentreOnParent();
+ dialog.SetDirectory(wxGetHomeDir());
+
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ wxString info;
+ wxWindow * const extra = dialog.GetExtraControl();
+ info.Printf(_T("Full file name: %s\n")
+ _T("Path: %s\n")
+ _T("Name: %s\n")
+ _T("Custom window: %s"),
+ dialog.GetPath().c_str(),
+ dialog.GetDirectory().c_str(),
+ dialog.GetFilename().c_str(),
+ extra ? static_cast<MyExtraPanel*>(extra)->GetInfo()
+ : wxString("None"));
+ wxMessageDialog dialog2(this, info, _T("Selected file"));
+ dialog2.ShowModal();
+ }
+}
+
+// this shows how to take advantage of specifying a default extension in the
+// call to wxFileSelector: it is remembered after each new call and the next
+// one will use it by default
+void MyFrame::FileOpen2(wxCommandEvent& WXUNUSED(event) )
+{
+ static wxString s_extDef;
+ wxString path = wxFileSelector(
+ _T("Select the file to load"),
+ wxEmptyString, wxEmptyString,
+ s_extDef,
+ wxString::Format
+ (
+ _T("Waveform (*.wav)|*.wav|Plain text (*.txt)|*.txt|All files (%s)|%s"),
+ wxFileSelectorDefaultWildcardStr,
+ wxFileSelectorDefaultWildcardStr
+ ),
+ wxFD_OPEN|wxFD_CHANGE_DIR|wxFD_PREVIEW,
+ this
+ );
+
+ if ( !path )
+ return;
+
+ // it is just a sample, would use wxSplitPath in real program
+ s_extDef = path.AfterLast(_T('.'));
+
+ wxLogMessage(_T("You selected the file '%s', remembered extension '%s'"),
+ path, s_extDef);
+}
+
+void MyFrame::FilesOpen(wxCommandEvent& WXUNUSED(event) )
+{
+ wxString wildcards =
+#ifdef __WXMOTIF__
+ _T("C++ files (*.cpp)|*.cpp");
+#else
+ wxString::Format
+ (
+ _T("All files (%s)|%s|C++ files (*.cpp;*.h)|*.cpp;*.h"),
+ wxFileSelectorDefaultWildcardStr,
+ wxFileSelectorDefaultWildcardStr
+ );
+#endif
+ wxFileDialog dialog(this, _T("Testing open multiple file dialog"),
+ wxEmptyString, wxEmptyString, wildcards,
+ wxFD_OPEN|wxFD_MULTIPLE);
+
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ wxArrayString paths, filenames;
+
+ dialog.GetPaths(paths);
+ dialog.GetFilenames(filenames);
+
+ wxString msg, s;
+ size_t count = paths.GetCount();
+ for ( size_t n = 0; n < count; n++ )
+ {
+ s.Printf(_T("File %d: %s (%s)\n"),
+ (int)n, paths[n].c_str(), filenames[n].c_str());
+
+ msg += s;
+ }
+ s.Printf(_T("Filter index: %d"), dialog.GetFilterIndex());
+ msg += s;
+
+ wxMessageDialog dialog2(this, msg, _T("Selected files"));
+ dialog2.ShowModal();
+ }
+}
+
+void MyFrame::FileSave(wxCommandEvent& WXUNUSED(event) )
+{
+ wxFileDialog dialog(this,
+ _T("Testing save file dialog"),
+ wxEmptyString,
+ _T("myletter.doc"),
+ _T("Text files (*.txt)|*.txt|Document files (*.doc;*.ods)|*.doc;*.ods"),
+ wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
+
+ dialog.SetFilterIndex(1);
+
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ wxLogMessage(_T("%s, filter %d"),
+ dialog.GetPath().c_str(), dialog.GetFilterIndex());
+ }
+}
+#endif // wxUSE_FILEDLG
+
+#if USE_FILEDLG_GENERIC
+void MyFrame::FileOpenGeneric(wxCommandEvent& WXUNUSED(event) )
+{
+ wxGenericFileDialog dialog
+ (
+ this,
+ _T("Testing open file dialog"),
+ wxEmptyString,
+ wxEmptyString,
+ _T("C++ files (*.cpp;*.h)|*.cpp;*.h")
+ );
+
+ dialog.SetExtraControlCreator(&createMyExtraPanel);
+ dialog.SetDirectory(wxGetHomeDir());
+
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ wxString info;
+ info.Printf(_T("Full file name: %s\n")
+ _T("Path: %s\n")
+ _T("Name: %s"),
+ dialog.GetPath().c_str(),
+ dialog.GetDirectory().c_str(),
+ dialog.GetFilename().c_str());
+ wxMessageDialog dialog2(this, info, _T("Selected file"));
+ dialog2.ShowModal();
+ }
+}
+
+void MyFrame::FilesOpenGeneric(wxCommandEvent& WXUNUSED(event) )
+{
+ // On PocketPC you can disable OK-only dialogs policy using system option
+ int buttons = wxSystemOptions::GetOptionInt(wxT("wince.dialog.real-ok-cancel"));
+ wxSystemOptions::SetOption(wxT("wince.dialog.real-ok-cancel"), 1);
+
+ wxString wildcards = _T("All files (*.*)|*.*|C++ files (*.cpp;*.h)|*.cpp;*.h");
+ wxGenericFileDialog dialog(this, _T("Testing open multiple file dialog"),
+ wxEmptyString, wxEmptyString, wildcards,
+ wxFD_MULTIPLE);
+
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ wxArrayString paths, filenames;
+
+ dialog.GetPaths(paths);
+ dialog.GetFilenames(filenames);
+
+ wxString msg, s;
+ size_t count = paths.GetCount();
+ for ( size_t n = 0; n < count; n++ )
+ {
+ s.Printf(_T("File %d: %s (%s)\n"),
+ (int)n, paths[n].c_str(), filenames[n].c_str());
+
+ msg += s;
+ }
+ s.Printf(_T("Filter index: %d"), dialog.GetFilterIndex());
+ msg += s;
+
+ wxMessageDialog dialog2(this, msg, _T("Selected files"));
+ dialog2.ShowModal();
+ }
+
+ // restore system option
+ wxSystemOptions::SetOption(wxT("wince.dialog.real-ok-cancel"), buttons);
+}
+
+void MyFrame::FileSaveGeneric(wxCommandEvent& WXUNUSED(event) )
+{
+ wxGenericFileDialog dialog(this,
+ _T("Testing save file dialog"),
+ wxEmptyString,
+ _T("myletter.doc"),
+ _T("Text files (*.txt)|*.txt|Document files (*.doc;*.ods)|*.doc;*.ods"),
+ wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
+
+ dialog.SetFilterIndex(1);
+
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ wxLogMessage(_T("%s, filter %d"),
+ dialog.GetPath().c_str(), dialog.GetFilterIndex());
+ }
+}
+#endif // USE_FILEDLG_GENERIC
+
+#if wxUSE_DIRDLG
+void MyFrame::DoDirChoose(int style)
+{
+ // pass some initial dir to wxDirDialog
+ wxString dirHome;
+ wxGetHomeDir(&dirHome);
+
+ wxDirDialog dialog(this, _T("Testing directory picker"), dirHome, style);
+
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ wxLogMessage(_T("Selected path: %s"), dialog.GetPath().c_str());
+ }
+}
+
+void MyFrame::DirChoose(wxCommandEvent& WXUNUSED(event) )
+{
+ DoDirChoose(wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST);
+}
+
+void MyFrame::DirChooseNew(wxCommandEvent& WXUNUSED(event) )
+{
+ DoDirChoose(wxDD_DEFAULT_STYLE & ~wxDD_DIR_MUST_EXIST);
+}
+#endif // wxUSE_DIRDLG
+
+#if USE_DIRDLG_GENERIC
+void MyFrame::GenericDirChoose(wxCommandEvent& WXUNUSED(event) )
+{
+ // pass some initial dir to wxDirDialog
+ wxString dirHome;
+ wxGetHomeDir(&dirHome);
+
+ wxGenericDirDialog dialog(this, _T("Testing generic directory picker"), dirHome);
+
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ wxMessageDialog dialog2(this, dialog.GetPath(), _T("Selected path"));
+ dialog2.ShowModal();
+ }
+}
+#endif // USE_DIRDLG_GENERIC
+
+#if USE_MODAL_PRESENTATION
+void MyFrame::ModalDlg(wxCommandEvent& WXUNUSED(event))
+{
+ MyModalDialog dlg(this);
+ dlg.ShowModal();
+}
+#endif // USE_MODAL_PRESENTATION
+
+void MyFrame::ModelessDlg(wxCommandEvent& event)
+{
+ bool show = GetMenuBar()->IsChecked(event.GetId());
+
+ if ( show )
+ {
+ if ( !m_dialog )
+ {
+ m_dialog = new MyModelessDialog(this);
+ }
+
+ m_dialog->Show(true);
+ }
+ else // hide
+ {
+ // If m_dialog is NULL, then possibly the system
+ // didn't report the checked menu item status correctly.
+ // It should be true just after the menu item was selected,
+ // if there was no modeless dialog yet.
+
+ wxASSERT( m_dialog != NULL );
+ if (m_dialog)
+ m_dialog->Hide();
+ }
+}
+
+void MyFrame::DlgCenteredScreen(wxCommandEvent& WXUNUSED(event))
+{
+ wxDialog dlg(this, wxID_ANY, _T("Dialog centered on screen"),
+ wxDefaultPosition, wxSize(200, 100));
+ (new wxButton(&dlg, wxID_OK, _T("Close")))->Centre();
+ dlg.CentreOnScreen();
+ dlg.ShowModal();
+}
+
+void MyFrame::DlgCenteredParent(wxCommandEvent& WXUNUSED(event))
+{
+ wxDialog dlg(this, wxID_ANY, _T("Dialog centered on parent"),
+ wxDefaultPosition, wxSize(200, 100));
+ (new wxButton(&dlg, wxID_OK, _T("Close")))->Centre();
+ dlg.CentreOnParent();
+ dlg.ShowModal();
+}
+
+void MyFrame::MiniFrame(wxCommandEvent& WXUNUSED(event))
+{
+ wxFrame *frame = new wxMiniFrame(this, wxID_ANY, _T("Mini frame"),
+ wxDefaultPosition, wxSize(300, 100),
+ wxCAPTION | wxCLOSE_BOX);
+ new wxStaticText(frame,
+ wxID_ANY,
+ _T("Mini frames have slightly different appearance"),
+ wxPoint(5, 5));
+ new wxStaticText(frame,
+ wxID_ANY,
+ _T("from the normal frames but that's the only difference."),
+ wxPoint(5, 25));
+
+ frame->CentreOnParent();
+ frame->Show();
+}
+
+void MyFrame::DlgOnTop(wxCommandEvent& WXUNUSED(event))
+{
+ wxDialog dlg(this, wxID_ANY, _T("Dialog staying on top of other windows"),
+ wxDefaultPosition, wxSize(300, 100),
+ wxDEFAULT_DIALOG_STYLE | wxSTAY_ON_TOP);
+ (new wxButton(&dlg, wxID_OK, _T("Close")))->Centre();
+ dlg.ShowModal();
+}
+
+#if wxUSE_STARTUP_TIPS
+void MyFrame::ShowTip(wxCommandEvent& WXUNUSED(event))
+{
+ static size_t s_index = (size_t)-1;
+
+ if ( s_index == (size_t)-1 )
+ {
+ srand(time(NULL));
+
+ // this is completely bogus, we don't know how many lines are there
+ // in the file, but who cares, it's a demo only...
+ s_index = rand() % 5;
+ }
+
+ wxTipProvider *tipProvider = wxCreateFileTipProvider(_T("tips.txt"), s_index);
+
+ bool showAtStartup = wxShowTip(this, tipProvider);
+
+ if ( showAtStartup )
+ {
+ wxMessageBox(_T("Will show tips on startup"), _T("Tips dialog"),
+ wxOK | wxICON_INFORMATION, this);
+ }
+
+ s_index = tipProvider->GetCurrentTip();
+ delete tipProvider;
+}
+#endif // wxUSE_STARTUP_TIPS
+
+#if USE_SETTINGS_DIALOG
+void MyFrame::OnPropertySheet(wxCommandEvent& event)
+{
+ SettingsDialog dialog(this, event.GetId());
+ dialog.ShowModal();
+}
+#endif // USE_SETTINGS_DIALOG
+
+void MyFrame::OnRequestUserAttention(wxCommandEvent& WXUNUSED(event))
+{
+ wxLogStatus(_T("Sleeping for 3 seconds to allow you to switch to another window"));
+
+ wxSleep(3);
+
+ RequestUserAttention(wxUSER_ATTENTION_ERROR);
+}
+
+#if wxUSE_NOTIFICATION_MESSAGE
+
+void MyFrame::OnNotifMsgAuto(wxCommandEvent& WXUNUSED(event))
+{
+ if ( !wxNotificationMessage
+ (
+ "Automatic Notification",
+ "Nothing important has happened\n"
+ "this notification will disappear soon."
+ ).Show() )
+ {
+ wxLogStatus("Failed to show notification message");
+ }
+}
+
+void MyFrame::OnNotifMsgShow(wxCommandEvent& WXUNUSED(event))
+{
+ if ( !m_notifMsg )
+ {
+ m_notifMsg = new wxNotificationMessage
+ (
+ "wxWidgets Manual Notification",
+ "You can hide this notification from the menu",
+ this
+ );
+ }
+
+ if ( !m_notifMsg->Show(wxNotificationMessage::Timeout_Never) )
+ {
+ wxLogStatus("Failed to show manual notification message");
+ }
+}
+
+void MyFrame::OnNotifMsgHide(wxCommandEvent& WXUNUSED(event))
+{
+ if ( m_notifMsg )
+ {
+ if ( !m_notifMsg->Close() )
+ wxLogStatus("Failed to hide manual notification message");
+ }
+}
+
+#endif // wxUSE_NOTIFICATION_MESSAGE
+
+void MyFrame::OnStandardButtonsSizerDialog(wxCommandEvent& WXUNUSED(event))
+{
+ StdButtonSizerDialog dialog(this);
+ dialog.ShowModal();
+}
+
+// TestDefaultAction
+
+#define ID_CATCH_LISTBOX_DCLICK 100
+#define ID_LISTBOX 101
+
+BEGIN_EVENT_TABLE(TestDefaultActionDialog, wxDialog)
+ EVT_CHECKBOX(ID_CATCH_LISTBOX_DCLICK, TestDefaultActionDialog::OnCatchListBoxDClick)
+ EVT_LISTBOX_DCLICK(ID_LISTBOX, TestDefaultActionDialog::OnListBoxDClick)
+END_EVENT_TABLE()
+
+TestDefaultActionDialog::TestDefaultActionDialog( wxWindow *parent ) :
+ wxDialog( parent, -1, "Test default action" )
+{
+ m_catchListBoxDClick = false;
+
+ wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
+
+ wxFlexGridSizer *grid_sizer = new wxFlexGridSizer( 2, 5, 5 );
+
+ wxListBox *listbox = new wxListBox( this, ID_LISTBOX );
+ listbox->Append( "String 1" );
+ listbox->Append( "String 2" );
+ listbox->Append( "String 3" );
+ listbox->Append( "String 4" );
+ grid_sizer->Add( listbox );
+
+ grid_sizer->Add( new wxCheckBox( this, ID_CATCH_LISTBOX_DCLICK, "Catch DoubleClick from wxListBox" ), 0, wxALIGN_CENTRE_VERTICAL );
+
+ grid_sizer->Add( new wxTextCtrl( this, -1, "", wxDefaultPosition, wxSize(80,-1), 0 ), 0, wxALIGN_CENTRE_VERTICAL );
+ grid_sizer->Add( new wxStaticText( this, -1, "wxTextCtrl without wxTE_PROCESS_ENTER" ), 0, wxALIGN_CENTRE_VERTICAL );
+
+ grid_sizer->Add( new wxTextCtrl( this, -1, "", wxDefaultPosition, wxSize(80,-1), wxTE_PROCESS_ENTER ), 0, wxALIGN_CENTRE_VERTICAL );
+ grid_sizer->Add( new wxStaticText( this, -1, "wxTextCtrl with wxTE_PROCESS_ENTER" ), 0, wxALIGN_CENTRE_VERTICAL );
+
+ main_sizer->Add( grid_sizer, 0, wxALL, 10 );
+
+ wxSizer *button_sizer = CreateSeparatedButtonSizer( wxOK|wxCANCEL );
+ if (button_sizer)
+ main_sizer->Add( button_sizer, 0, wxALL|wxGROW, 5 );
+
+ SetSizerAndFit( main_sizer );
+}
+
+void TestDefaultActionDialog::OnListBoxDClick(wxCommandEvent& event)
+{
+ event.Skip( !m_catchListBoxDClick );
+}
+
+void TestDefaultActionDialog::OnCatchListBoxDClick(wxCommandEvent& WXUNUSED(event))
+{
+ m_catchListBoxDClick = !m_catchListBoxDClick;
+}
+
+void MyFrame::OnTestDefaultActionDialog(wxCommandEvent& WXUNUSED(event))
+{
+ TestDefaultActionDialog dialog( this );
+ dialog.ShowModal();
+}