X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/906c935a80b10d53cecf57f71ab5f3f4f1d529ec..e0dec8753abaf97e006ea1185bfb6775b28df0a8:/samples/dialogs/dialogs.cpp diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp index 335cc16ca2..bc8d2601bb 100644 --- a/samples/dialogs/dialogs.cpp +++ b/samples/dialogs/dialogs.cpp @@ -257,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() @@ -527,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")); @@ -648,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() @@ -1720,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", @@ -1729,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)) @@ -1759,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); @@ -2669,6 +2917,7 @@ const TestMessageBoxDialog::BtnInfo TestMessageBoxDialog::ms_btnInfo[] = { wxNO, "&No" }, { wxOK, "&Ok" }, { wxCANCEL, "&Cancel" }, + { wxHELP, "&Help" }, }; BEGIN_EVENT_TABLE(TestMessageBoxDialog, wxDialog) @@ -2690,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, @@ -2889,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)) @@ -2954,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(),