X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c31d9c7f601e767cc3210b63a989434af76fef61..e0dec8753abaf97e006ea1185bfb6775b28df0a8:/samples/dialogs/dialogs.cpp diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp index 3abb136139..bc8d2601bb 100644 --- a/samples/dialogs/dialogs.cpp +++ b/samples/dialogs/dialogs.cpp @@ -152,6 +152,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) #endif // wxUSE_INFOBAR #if wxUSE_TEXTDLG + EVT_MENU(DIALOGS_LINE_ENTRY, MyFrame::LineEntry) EVT_MENU(DIALOGS_TEXT_ENTRY, MyFrame::TextEntry) EVT_MENU(DIALOGS_PASSWORD_ENTRY, MyFrame::PasswordEntry) #endif // wxUSE_TEXTDLG @@ -256,6 +257,10 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(DIALOGS_NOTIFY_HIDE, MyFrame::OnNotifMsgHide) #endif // wxUSE_NOTIFICATION_MESSAGE +#if wxUSE_RICHTOOLTIP + EVT_MENU(DIALOGS_RICHTIP_DIALOG, MyFrame::OnRichTipDialog) +#endif // wxUSE_RICHTOOLTIP + EVT_MENU(wxID_EXIT, MyFrame::OnExit) END_EVENT_TABLE() @@ -277,12 +282,63 @@ BEGIN_EVENT_TABLE(StdButtonSizerDialog, wxDialog) EVT_RADIOBUTTON(wxID_ANY, StdButtonSizerDialog::OnEvent) END_EVENT_TABLE() +#if wxUSE_CMDLINE_PARSER + +#include "wx/cmdline.h" + +static const char *PROGRESS_SWITCH = "progress"; + +void MyApp::OnInitCmdLine(wxCmdLineParser& parser) +{ + wxApp::OnInitCmdLine(parser); + + parser.AddOption("", PROGRESS_SWITCH, + "Style for the startup progress dialog (wxPD_XXX)", + wxCMD_LINE_VAL_NUMBER); +} + +bool MyApp::OnCmdLineParsed(wxCmdLineParser& parser) +{ + if ( !wxApp::OnCmdLineParsed(parser) ) + return false; + + parser.Found(PROGRESS_SWITCH, &m_startupProgressStyle); + + return true; +} + +#endif // wxUSE_CMDLINE_PARSER + // `Main program' equivalent, creating windows and returning main app frame bool MyApp::OnInit() { if ( !wxApp::OnInit() ) return false; +#if wxUSE_PROGRESSDLG + if ( m_startupProgressStyle != -1 ) + { + // Show a test progress dialog before the main event loop is started: + // it should still work. + const int PROGRESS_COUNT = 100; + wxProgressDialog dlg + ( + "Progress in progress", + "Please wait, starting...", + PROGRESS_COUNT, + NULL, + m_startupProgressStyle + ); + for ( int i = 0; i <= PROGRESS_COUNT; i++ ) + { + if ( !dlg.Update(i) ) + break; + + wxMilliSleep(50); + } + } +#endif // wxUSE_PROGRESSDLG + #if wxUSE_IMAGE wxInitAllImageHandlers(); #endif @@ -344,7 +400,8 @@ bool MyApp::OnInit() wxMenu *entry_menu = new wxMenu; #if wxUSE_TEXTDLG - entry_menu->Append(DIALOGS_TEXT_ENTRY, wxT("Text &entry\tCtrl-E")); + entry_menu->Append(DIALOGS_LINE_ENTRY, wxT("Single line &entry\tCtrl-E")); + entry_menu->Append(DIALOGS_TEXT_ENTRY, wxT("Multi line text &entry\tShift-Ctrl-E")); entry_menu->Append(DIALOGS_PASSWORD_ENTRY, wxT("&Password entry\tCtrl-P")); #endif // wxUSE_TEXTDLG @@ -474,6 +531,11 @@ bool MyApp::OnInit() #endif // wxUSE_NOTIFICATION_MESSAGE menuDlg->AppendSubMenu(menuNotif, "&User notifications"); +#if wxUSE_RICHTOOLTIP + menuDlg->Append(DIALOGS_RICHTIP_DIALOG, "Rich &tooltip dialog...\tCtrl-H"); + menuDlg->AppendSeparator(); +#endif // wxUSE_RICHTOOLTIP + menuDlg->Append(DIALOGS_STANDARD_BUTTON_SIZER_DIALOG, wxT("&Standard Buttons Sizer Dialog")); menuDlg->Append(DIALOGS_TEST_DEFAULT_ACTION, wxT("&Test dialog default action")); @@ -488,8 +550,23 @@ bool MyApp::OnInit() menuHelp->Append(DIALOGS_ABOUTDLG_CUSTOM, wxT("About (&custom)...\tCtrl-Shift-F1")); #endif // wxUSE_ABOUTDLG + wxMenu* editMenu = new wxMenu; + editMenu->Append(wxID_UNDO, _("&Undo\tCtrl+Z")); + editMenu->Append(wxID_REDO, _("&Redo\tCtrl+Y")); + editMenu->AppendSeparator(); + editMenu->Append(wxID_CUT, _("Cu&t\tCtrl+X")); + editMenu->Append(wxID_COPY, _("&Copy\tCtrl+C")); + editMenu->Append(wxID_PASTE, _("&Paste\tCtrl+V")); + editMenu->Append(wxID_CLEAR, _("&Delete")); + + editMenu->AppendSeparator(); + editMenu->Append(wxID_SELECTALL, _("Select All\tCtrl+A")); + wxMenuBar *menubar = new wxMenuBar; menubar->Append(menuDlg, wxT("&Dialogs")); + + menubar->Append(editMenu, wxT("&Edit")); + #if wxUSE_ABOUTDLG menubar->Append(menuHelp, wxT("&Help")); #endif // wxUSE_ABOUTDLG @@ -580,6 +657,24 @@ MyFrame::MyFrame(const wxString& title) // covers our entire client area to avoid jarring colour jumps SetOwnBackgroundColour(m_canvas->GetBackgroundColour()); #endif // wxUSE_INFOBAR + +#ifdef __WXMSW__ + // Test MSW-specific function allowing to access the "system" menu. + wxMenu * const menu = MSWGetSystemMenu(); + if ( menu ) + { + menu->AppendSeparator(); + + // The ids of the menu commands in MSW system menu must be multiple of + // 16 so we can't use DIALOGS_ABOUTDLG_SIMPLE here because it might not + // satisfy this condition and need to define and connect a separate id. + static const int DIALOGS_SYSTEM_ABOUT = 0x4010; + + menu->Append(DIALOGS_SYSTEM_ABOUT, "&About"); + Connect(DIALOGS_SYSTEM_ABOUT, wxEVT_COMMAND_MENU_SELECTED, + wxCommandEventHandler(MyFrame::ShowSimpleAboutDialog)); + } +#endif // __WXMSW__ } MyFrame::~MyFrame() @@ -758,7 +853,7 @@ void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event)) wxCENTER | wxNO_DEFAULT | wxYES_NO | wxCANCEL | wxICON_INFORMATION); - + wxString extmsg; if ( dialog.SetYesNoCancelLabels ( @@ -776,21 +871,21 @@ void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event)) "so the default \"Yes\"/\"No\"/\"Cancel\" buttons are used."; } dialog.SetExtendedMessage(extmsg); - + switch ( dialog.ShowModal() ) { case wxID_YES: wxLogStatus(wxT("You pressed \"Yes\"")); break; - + case wxID_NO: wxLogStatus(wxT("You pressed \"No\"")); break; - + case wxID_CANCEL: wxLogStatus(wxT("You pressed \"Cancel\"")); break; - + default: wxLogError(wxT("Unexpected wxMessageDialog return code!")); } @@ -912,7 +1007,7 @@ void MyFrame::PasswordEntry(wxCommandEvent& WXUNUSED(event)) } } -void MyFrame::TextEntry(wxCommandEvent& WXUNUSED(event)) +void MyFrame::LineEntry(wxCommandEvent& WXUNUSED(event)) { wxTextEntryDialog dialog(this, wxT("This is a small sample\n") @@ -926,6 +1021,19 @@ void MyFrame::TextEntry(wxCommandEvent& WXUNUSED(event)) wxMessageBox(dialog.GetValue(), wxT("Got string"), wxOK | wxICON_INFORMATION, this); } } + +void MyFrame::TextEntry(wxCommandEvent& WXUNUSED(event)) +{ + wxTextEntryDialog dialog(this, "You can enter a multiline string here.", + "Please enter some text", + "First line\nSecond one\nAnd another one too", + wxOK | wxCANCEL | wxTE_MULTILINE); + + if (dialog.ShowModal() == wxID_OK) + { + wxMessageBox(dialog.GetValue(), wxT("Got text"), wxOK | wxICON_INFORMATION, this); + } +} #endif // wxUSE_TEXTDLG #if wxUSE_CHOICEDLG @@ -1639,6 +1747,9 @@ void MyFrame::OnRequestUserAttention(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnNotifMsgAuto(wxCommandEvent& WXUNUSED(event)) { + // Notice that the notification remains shown even after the + // wxNotificationMessage object itself is destroyed so we can show simple + // notifications using temporary objects. if ( !wxNotificationMessage ( "Automatic Notification", @@ -1648,6 +1759,11 @@ void MyFrame::OnNotifMsgAuto(wxCommandEvent& WXUNUSED(event)) { wxLogStatus("Failed to show notification message"); } + + // But it doesn't have to be a temporary, of course. + wxNotificationMessage n("Dummy Warning", "Example of a warning notification."); + n.SetFlags(wxICON_ERROR); + n.Show(5); // Just for testing, use 5 second delay. } void MyFrame::OnNotifMsgShow(wxCommandEvent& WXUNUSED(event)) @@ -1678,6 +1794,219 @@ void MyFrame::OnNotifMsgHide(wxCommandEvent& WXUNUSED(event)) #endif // wxUSE_NOTIFICATION_MESSAGE +#if wxUSE_RICHTOOLTIP + +#include "wx/richtooltip.h" + +#include "tip.xpm" + +class RichTipDialog : public wxDialog +{ +public: + RichTipDialog(wxWindow* parent) + : wxDialog(parent, wxID_ANY, "wxRichToolTip Test", + wxDefaultPosition, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + { + // Create the controls. + m_textTitle = new wxTextCtrl(this, wxID_ANY, "Tooltip title"); + m_textBody = new wxTextCtrl(this, wxID_ANY, "Main tooltip text\n" + "possibly on several\n" + "lines.", + wxDefaultPosition, wxDefaultSize, + wxTE_MULTILINE); + wxButton* btnShowText = new wxButton(this, wxID_ANY, "Show for &text"); + wxButton* btnShowBtn = new wxButton(this, wxID_ANY, "Show for &button"); + + const wxString icons[] = + { + "&None", + "&Information", + "&Warning", + "&Error", + "&Custom" + }; + wxCOMPILE_TIME_ASSERT( WXSIZEOF(icons) == Icon_Max, IconMismatch ); + m_icons = new wxRadioBox(this, wxID_ANY, "&Icon choice:", + wxDefaultPosition, wxDefaultSize, + WXSIZEOF(icons), icons, + 1, wxRA_SPECIFY_ROWS); + m_icons->SetSelection(Icon_Info); + + const wxString tipKinds[] = + { + "&None", "Top left", "Top", "Top right", + "Bottom left", "Bottom", "Bottom right", "&Auto" + }; + m_tipKinds = new wxRadioBox(this, wxID_ANY, "Tip &kind:", + wxDefaultPosition, wxDefaultSize, + WXSIZEOF(tipKinds), tipKinds, + 4, wxRA_SPECIFY_COLS); + m_tipKinds->SetSelection(wxTipKind_Auto); + + const wxString bgStyles[] = + { + "&Default", "&Solid", "&Gradient", + }; + wxCOMPILE_TIME_ASSERT( WXSIZEOF(bgStyles) == Bg_Max, BgMismatch ); + m_bgStyles = new wxRadioBox(this, wxID_ANY, "Background style:", + wxDefaultPosition, wxDefaultSize, + WXSIZEOF(bgStyles), bgStyles, + 1, wxRA_SPECIFY_ROWS); + + const wxString timeouts[] = { "&None", "&Default", "&3 seconds" }; + wxCOMPILE_TIME_ASSERT( WXSIZEOF(timeouts) == Timeout_Max, TmMismatch ); + m_timeouts = new wxRadioBox(this, wxID_ANY, "Timeout:", + wxDefaultPosition, wxDefaultSize, + WXSIZEOF(timeouts), timeouts, + 1, wxRA_SPECIFY_ROWS); + m_timeouts->SetSelection(Timeout_Default); + + // Lay them out. + m_textBody->SetMinSize(wxSize(300, 200)); + + wxBoxSizer* const sizer = new wxBoxSizer(wxVERTICAL); + sizer->Add(m_textTitle, wxSizerFlags().Expand().Border()); + sizer->Add(m_textBody, wxSizerFlags(1).Expand().Border()); + sizer->Add(m_icons, wxSizerFlags().Expand().Border()); + sizer->Add(m_tipKinds, wxSizerFlags().Centre().Border()); + sizer->Add(m_bgStyles, wxSizerFlags().Centre().Border()); + sizer->Add(m_timeouts, wxSizerFlags().Centre().Border()); + wxBoxSizer* const sizerBtns = new wxBoxSizer(wxHORIZONTAL); + sizerBtns->Add(btnShowText, wxSizerFlags().Border(wxRIGHT)); + sizerBtns->Add(btnShowBtn, wxSizerFlags().Border(wxLEFT)); + sizer->Add(sizerBtns, wxSizerFlags().Centre().Border()); + sizer->Add(CreateStdDialogButtonSizer(wxOK), + wxSizerFlags().Expand().Border()); + SetSizerAndFit(sizer); + + + // And connect the event handlers. + btnShowText->Connect + ( + wxEVT_COMMAND_BUTTON_CLICKED, + wxCommandEventHandler(RichTipDialog::OnShowTipForText), + NULL, + this + ); + + btnShowBtn->Connect + ( + wxEVT_COMMAND_BUTTON_CLICKED, + wxCommandEventHandler(RichTipDialog::OnShowTipForBtn), + NULL, + this + ); + } + +private: + enum + { + Icon_None, + Icon_Info, + Icon_Warning, + Icon_Error, + Icon_Custom, + Icon_Max + }; + + enum + { + Bg_Default, + Bg_Solid, + Bg_Gradient, + Bg_Max + }; + + enum + { + Timeout_None, + Timeout_Default, + Timeout_3sec, + Timeout_Max + }; + + + void OnShowTipForText(wxCommandEvent& WXUNUSED(event)) + { + DoShowTip(m_textTitle); + } + + void OnShowTipForBtn(wxCommandEvent& WXUNUSED(event)) + { + DoShowTip(FindWindow(wxID_OK)); + } + + void DoShowTip(wxWindow* win) + { + wxRichToolTip tip(m_textTitle->GetValue(), m_textBody->GetValue()); + const int iconSel = m_icons->GetSelection(); + if ( iconSel == Icon_Custom ) + { + tip.SetIcon(tip_xpm); + } + else // Use a standard icon. + { + static const int stdIcons[] = + { + wxICON_NONE, + wxICON_INFORMATION, + wxICON_WARNING, + wxICON_ERROR, + }; + + tip.SetIcon(stdIcons[iconSel]); + } + + switch ( m_bgStyles->GetSelection() ) + { + case Bg_Default: + break; + + case Bg_Solid: + tip.SetBackgroundColour(*wxLIGHT_GREY); + break; + + case Bg_Gradient: + tip.SetBackgroundColour(*wxWHITE, wxColour(0xe4, 0xe5, 0xf0)); + break; + } + + switch ( m_timeouts->GetSelection() ) + { + case Timeout_None: + tip.SetTimeout(0); + break; + + case Timeout_Default: + break; + + case Timeout_3sec: + tip.SetTimeout(3000); + break; + } + + tip.SetTipKind(static_cast(m_tipKinds->GetSelection())); + + tip.ShowFor(win); + } + + wxTextCtrl* m_textTitle; + wxTextCtrl* m_textBody; + wxRadioBox* m_icons; + wxRadioBox* m_tipKinds; + wxRadioBox* m_bgStyles; + wxRadioBox* m_timeouts; +}; + +void MyFrame::OnRichTipDialog(wxCommandEvent& WXUNUSED(event)) +{ + RichTipDialog dialog(this); + dialog.ShowModal(); +} + +#endif // wxUSE_RICHTOOLTIP + void MyFrame::OnStandardButtonsSizerDialog(wxCommandEvent& WXUNUSED(event)) { StdButtonSizerDialog dialog(this); @@ -1688,10 +2017,15 @@ void MyFrame::OnStandardButtonsSizerDialog(wxCommandEvent& WXUNUSED(event)) #define ID_CATCH_LISTBOX_DCLICK 100 #define ID_LISTBOX 101 +#define ID_DISABLE_OK 102 +#define ID_DISABLE_CANCEL 103 BEGIN_EVENT_TABLE(TestDefaultActionDialog, wxDialog) EVT_CHECKBOX(ID_CATCH_LISTBOX_DCLICK, TestDefaultActionDialog::OnCatchListBoxDClick) + EVT_CHECKBOX(ID_DISABLE_OK, TestDefaultActionDialog::OnDisableOK) + EVT_CHECKBOX(ID_DISABLE_CANCEL, TestDefaultActionDialog::OnDisableCancel) EVT_LISTBOX_DCLICK(ID_LISTBOX, TestDefaultActionDialog::OnListBoxDClick) + EVT_TEXT_ENTER(wxID_ANY, TestDefaultActionDialog::OnTextEnter) END_EVENT_TABLE() TestDefaultActionDialog::TestDefaultActionDialog( wxWindow *parent ) : @@ -1720,6 +2054,9 @@ TestDefaultActionDialog::TestDefaultActionDialog( wxWindow *parent ) : 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 ); + grid_sizer->Add( new wxCheckBox(this, ID_DISABLE_OK, "Disable \"OK\""), 0, wxALIGN_CENTRE_VERTICAL ); + grid_sizer->Add( new wxCheckBox(this, ID_DISABLE_CANCEL, "Disable \"Cancel\""), 0, wxALIGN_CENTRE_VERTICAL ); + main_sizer->Add( grid_sizer, 0, wxALL, 10 ); wxSizer *button_sizer = CreateSeparatedButtonSizer( wxOK|wxCANCEL ); @@ -1729,6 +2066,16 @@ TestDefaultActionDialog::TestDefaultActionDialog( wxWindow *parent ) : SetSizerAndFit( main_sizer ); } +void TestDefaultActionDialog::OnDisableOK(wxCommandEvent& event) +{ + FindWindow(wxID_OK)->Enable(!event.IsChecked()); +} + +void TestDefaultActionDialog::OnDisableCancel(wxCommandEvent& event) +{ + FindWindow(wxID_CANCEL)->Enable(!event.IsChecked()); +} + void TestDefaultActionDialog::OnListBoxDClick(wxCommandEvent& event) { event.Skip( !m_catchListBoxDClick ); @@ -1739,6 +2086,11 @@ void TestDefaultActionDialog::OnCatchListBoxDClick(wxCommandEvent& WXUNUSED(even m_catchListBoxDClick = !m_catchListBoxDClick; } +void TestDefaultActionDialog::OnTextEnter(wxCommandEvent& event) +{ + wxLogMessage("Text \"%s\" entered.", event.GetString()); +} + void MyFrame::OnTestDefaultActionDialog(wxCommandEvent& WXUNUSED(event)) { TestDefaultActionDialog dialog( this ); @@ -2565,6 +2917,7 @@ const TestMessageBoxDialog::BtnInfo TestMessageBoxDialog::ms_btnInfo[] = { wxNO, "&No" }, { wxOK, "&Ok" }, { wxCANCEL, "&Cancel" }, + { wxHELP, "&Help" }, }; BEGIN_EVENT_TABLE(TestMessageBoxDialog, wxDialog) @@ -2586,6 +2939,10 @@ bool TestMessageBoxDialog::Create() // this sizer allows to configure the messages shown in the message box wxSizer * const sizerMsgs = new wxStaticBoxSizer(wxVERTICAL, this, "&Messages"); + sizerMsgs->Add(new wxStaticText(this, wxID_ANY, "&Title:")); + m_textTitle = new wxTextCtrl(this, wxID_ANY, "Test Message Box"); + sizerMsgs->Add(m_textTitle, wxSizerFlags().Expand().Border(wxBOTTOM)); + sizerMsgs->Add(new wxStaticText(this, wxID_ANY, "&Main message:")); m_textMsg = new wxTextCtrl(this, wxID_ANY, "Hello from a box!", wxDefaultPosition, wxDefaultSize, @@ -2644,7 +3001,7 @@ bool TestMessageBoxDialog::Create() }; wxCOMPILE_TIME_ASSERT( WXSIZEOF(icons) == MsgDlgIcon_Max, IconMismatch ); - + m_icons = new wxRadioBox(this, wxID_ANY, "&Icon style", wxDefaultPosition, wxDefaultSize, WXSIZEOF(icons), icons, @@ -2785,14 +3142,46 @@ void TestMessageBoxDialog::PrepareMessageDialog(wxMessageDialogBase &dlg) dlg.SetOKLabel(m_labels[Btn_Ok]->GetValue()); } } + + if ( style & wxHELP ) + { + dlg.SetHelpLabel(m_labels[Btn_Help]->GetValue()); + } } void TestMessageBoxDialog::OnApply(wxCommandEvent& WXUNUSED(event)) { - wxMessageDialog dlg(this, GetMessage(), "Test Message Box", GetStyle()); + wxMessageDialog dlg(this, GetMessage(), GetBoxTitle(), GetStyle()); PrepareMessageDialog(dlg); - dlg.ShowModal(); + wxString btnName; + switch ( dlg.ShowModal() ) + { + case wxID_OK: + btnName = "OK"; + break; + + case wxID_CANCEL: + // Avoid the extra message box if the dialog was cancelled. + return; + + case wxID_YES: + btnName = "Yes"; + break; + + case wxID_NO: + btnName = "No"; + break; + + case wxID_HELP: + btnName = "Help"; + break; + + default: + btnName = "Unknown"; + } + + wxLogMessage("Dialog was closed with the \"%s\" button.", btnName); } void TestMessageBoxDialog::OnClose(wxCommandEvent& WXUNUSED(event)) @@ -2850,8 +3239,7 @@ void TestRichMessageDialog::AddAdditionalFlags(wxSizer *sizer) void TestRichMessageDialog::OnApply(wxCommandEvent& WXUNUSED(event)) { - wxRichMessageDialog dlg(this, GetMessage(), "Test Rich Message Dialog", - GetStyle()); + wxRichMessageDialog dlg(this, GetMessage(), GetBoxTitle(), GetStyle()); PrepareMessageDialog(dlg); dlg.ShowCheckBox(m_textCheckBox->GetValue(),