+#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
+