#include "wx/apptrait.h"
#include "wx/datetime.h"
+#include "wx/filename.h"
#include "wx/image.h"
#include "wx/bookctrl.h"
#include "wx/artprov.h"
#include "wx/minifram.h"
#include "wx/sysopt.h"
#include "wx/notifmsg.h"
+#include "wx/modalhook.h"
#if wxUSE_RICHMSGDLG
#include "wx/richmsgdlg.h"
EVT_MENU(DIALOGS_STANDARD_BUTTON_SIZER_DIALOG, MyFrame::OnStandardButtonsSizerDialog)
EVT_MENU(DIALOGS_TEST_DEFAULT_ACTION, MyFrame::OnTestDefaultActionDialog)
+ EVT_MENU(DIALOGS_MODAL_HOOK, MyFrame::OnModalHook)
EVT_MENU(DIALOGS_REQUEST, MyFrame::OnRequestUserAttention)
#if wxUSE_NOTIFICATION_MESSAGE
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()
#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"));
+ menuDlg->AppendCheckItem(DIALOGS_MODAL_HOOK, "Enable modal dialog hook");
menuDlg->AppendSeparator();
menuDlg->Append(wxID_EXIT, wxT("E&xit\tAlt-X"));
m_infoBarAdvanced->AddButton(wxID_UNDO);
m_infoBarAdvanced->AddButton(wxID_REDO);
- m_infoBarAdvanced->Connect(wxID_REDO, wxEVT_COMMAND_BUTTON_CLICKED,
+ m_infoBarAdvanced->Connect(wxID_REDO, wxEVT_BUTTON,
wxCommandEventHandler(MyFrame::OnInfoBarRedo),
NULL,
this);
// 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_MENU,
+ wxCommandEventHandler(MyFrame::ShowSimpleAboutDialog));
+ }
+#endif // __WXMSW__
}
MyFrame::~MyFrame()
{
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:
+ void OnCheckBox(wxCommandEvent& event) { m_btn->Enable(event.IsChecked()); }
+ void OnUpdateLabelUI(wxUpdateUIEvent& event)
+ {
+ wxFileDialog* const dialog = wxStaticCast(GetParent(), wxFileDialog);
+ const wxString fn = dialog->GetCurrentlySelectedFilename();
+
+ wxString msg;
+ if ( fn.empty() )
+ msg = "Nothing";
+ else if ( wxFileName::FileExists(fn) )
+ msg = "File";
+ else if ( wxFileName::DirExists(fn) )
+ msg = "Directory";
+ else
+ msg = "Something else";
+
+ event.SetText(msg + " selected");
+ }
+
wxButton *m_btn;
wxCheckBox *m_cb;
+ wxStaticText *m_label;
};
MyExtraPanel::MyExtraPanel(wxWindow *parent)
m_btn = new wxButton(this, -1, wxT("Custom Button"));
m_btn->Enable(false);
m_cb = new wxCheckBox(this, -1, wxT("Enable Custom Button"));
- m_cb->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED,
+ m_cb->Connect(wxEVT_CHECKBOX,
wxCommandEventHandler(MyExtraPanel::OnCheckBox), NULL, this);
+ m_label = new wxStaticText(this, wxID_ANY, "Nothing selected");
+ m_label->Connect(wxEVT_UPDATE_UI,
+ wxUpdateUIEventHandler(MyExtraPanel::OnUpdateLabelUI),
+ NULL, this);
+
wxBoxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
sizerTop->Add(m_cb, wxSizerFlags().Centre().Border());
sizerTop->AddStretchSpacer();
- sizerTop->Add(m_btn, wxSizerFlags().Right().Border());
+ sizerTop->Add(m_btn, wxSizerFlags().Centre().Border());
+ sizerTop->AddStretchSpacer();
+ sizerTop->Add(m_label, wxSizerFlags().Centre().Border());
+
SetSizerAndFit(sizerTop);
}
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",
{
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))
#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 (no delay)", "&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);
+ m_timeDelay = new wxCheckBox(this, wxID_ANY, "Delay show" );
+
+ // 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());
+ sizer->Add(m_timeDelay, 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_BUTTON,
+ wxCommandEventHandler(RichTipDialog::OnShowTipForText),
+ NULL,
+ this
+ );
+
+ btnShowBtn->Connect
+ (
+ wxEVT_BUTTON,
+ 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;
+ }
+
+ int delay = m_timeDelay->IsChecked() ? 500 : 0;
+
+ switch ( m_timeouts->GetSelection() )
+ {
+ case Timeout_None:
+ // Don't call SetTimeout unnecessarily
+ // or msw will show generic impl
+ if ( delay )
+ tip.SetTimeout(0, delay);
+ break;
+
+ case Timeout_Default:
+ break;
+
+ case Timeout_3sec:
+ tip.SetTimeout(3000, delay);
+ break;
+ }
+
+ tip.SetTipKind(static_cast<wxTipKind>(m_tipKinds->GetSelection()));
+
+ tip.ShowFor(win);
+ }
+
+ wxTextCtrl* m_textTitle;
+ wxTextCtrl* m_textBody;
+ wxRadioBox* m_icons;
+ wxRadioBox* m_tipKinds;
+ wxRadioBox* m_bgStyles;
+ wxRadioBox* m_timeouts;
+ wxCheckBox* m_timeDelay;
+};
+
+void MyFrame::OnRichTipDialog(wxCommandEvent& WXUNUSED(event))
+{
+ RichTipDialog dialog(this);
+ dialog.ShowModal();
+}
+
+#endif // wxUSE_RICHTOOLTIP
+
void MyFrame::OnStandardButtonsSizerDialog(wxCommandEvent& WXUNUSED(event))
{
StdButtonSizerDialog dialog(this);
dialog.ShowModal();
}
+void MyFrame::OnModalHook(wxCommandEvent& event)
+{
+ class TestModalHook : public wxModalDialogHook
+ {
+ protected:
+ virtual int Enter(wxDialog* dialog)
+ {
+ wxLogStatus("Showing %s modal dialog",
+ dialog->GetClassInfo()->GetClassName());
+ return wxID_NONE;
+ }
+
+ virtual void Exit(wxDialog* dialog)
+ {
+ wxLogStatus("Leaving %s modal dialog",
+ dialog->GetClassInfo()->GetClassName());
+ }
+ };
+
+ static TestModalHook s_hook;
+ if ( event.IsChecked() )
+ s_hook.Register();
+ else
+ s_hook.Unregister();
+}
+
void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event) )
{
Close(true);
{
wxEventType type = event.GetEventType();
- if ( type == wxEVT_COMMAND_FIND || type == wxEVT_COMMAND_FIND_NEXT )
+ if ( type == wxEVT_FIND || type == wxEVT_FIND_NEXT )
{
wxLogMessage(wxT("Find %s'%s' (flags: %s)"),
- type == wxEVT_COMMAND_FIND_NEXT ? wxT("next ") : wxT(""),
+ type == wxEVT_FIND_NEXT ? wxT("next ") : wxT(""),
event.GetFindString().c_str(),
DecodeFindDialogEventFlags(event.GetFlags()).c_str());
}
- else if ( type == wxEVT_COMMAND_FIND_REPLACE ||
- type == wxEVT_COMMAND_FIND_REPLACE_ALL )
+ else if ( type == wxEVT_FIND_REPLACE ||
+ type == wxEVT_FIND_REPLACE_ALL )
{
wxLogMessage(wxT("Replace %s'%s' with '%s' (flags: %s)"),
- type == wxEVT_COMMAND_FIND_REPLACE_ALL ? wxT("all ") : wxT(""),
+ type == wxEVT_FIND_REPLACE_ALL ? wxT("all ") : wxT(""),
event.GetFindString().c_str(),
event.GetReplaceString().c_str(),
DecodeFindDialogEventFlags(event.GetFlags()).c_str());
}
- else if ( type == wxEVT_COMMAND_FIND_CLOSE )
+ else if ( type == wxEVT_FIND_CLOSE )
{
wxFindReplaceDialog *dlg = event.GetDialog();
{ wxNO, "&No" },
{ wxOK, "&Ok" },
{ wxCANCEL, "&Cancel" },
+ { wxHELP, "&Help" },
};
BEGIN_EVENT_TABLE(TestMessageBoxDialog, wxDialog)
// 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,
"&Information icon",
"&Question icon",
"&Warning icon",
- "&Error icon"
+ "&Error icon",
+ "A&uth needed icon"
};
wxCOMPILE_TIME_ASSERT( WXSIZEOF(icons) == MsgDlgIcon_Max, IconMismatch );
case MsgDlgIcon_Error:
style |= wxICON_ERROR;
break;
+
+ case MsgDlgIcon_AuthNeeded:
+ style |= wxICON_AUTH_NEEDED;
+ break;
}
if ( m_chkCentre->IsChecked() )
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))
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(),