/////////////////////////////////////////////////////////////////////////////
// Name: dialogs.cpp
// Purpose: Common dialogs demo
-// Author: Julian Smart
-// Modified by: ABX (2004) - adjustements for conditional building + new menu
+// Author: Julian Smart, Vadim Zeitlin, ABX
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
+// (c) 2004 ABX
+// (c) Vadim Zeitlin
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#include "wx/fdrepdlg.h"
#endif // wxUSE_FINDREPLDLG
+#if wxUSE_INFOBAR
+ #include "wx/infobar.h"
+#endif // wxUSE_INFOBAR
+
#include "wx/spinctrl.h"
#include "wx/propdlg.h"
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
#if wxUSE_MSGDLG
EVT_MENU(DIALOGS_MESSAGE_BOX, MyFrame::MessageBox)
+ EVT_MENU(DIALOGS_MESSAGE_BOX_WINDOW_MODAL, MyFrame::MessageBoxWindowModal)
EVT_MENU(DIALOGS_MESSAGE_DIALOG, MyFrame::MessageBoxDialog)
EVT_MENU(DIALOGS_MESSAGE_BOX_WXINFO, MyFrame::MessageBoxInfo)
#endif // wxUSE_MSGDLG
#if wxUSE_LOG_DIALOG
EVT_MENU(DIALOGS_LOG_DIALOG, MyFrame::LogDialog)
#endif // wxUSE_LOG_DIALOG
+#if wxUSE_INFOBAR
+ EVT_MENU(DIALOGS_INFOBAR_SIMPLE, MyFrame::InfoBarSimple)
+ EVT_MENU(DIALOGS_INFOBAR_ADVANCED, MyFrame::InfoBarAdvanced)
+#endif // wxUSE_INFOBAR
#if wxUSE_TEXTDLG
EVT_MENU(DIALOGS_TEXT_ENTRY, MyFrame::TextEntry)
EVT_RADIOBUTTON(wxID_ANY, StdButtonSizerDialog::OnEvent)
END_EVENT_TABLE()
-MyCanvas *myCanvas = (MyCanvas *) NULL;
-
// `Main program' equivalent, creating windows and returning main app frame
bool MyApp::OnInit()
{
wxInitAllImageHandlers();
#endif
- m_canvasTextColour = *wxBLACK;
- m_canvasFont = *wxNORMAL_FONT;
-
// Create the main frame window
- MyFrame *frame = new MyFrame((wxFrame *) NULL, wxT("wxWidgets dialogs example"));
+ MyFrame *frame = new MyFrame(wxT("wxWidgets dialogs example"));
// Make a menubar
wxMenu *menuDlg = new wxMenu;
menuDlg->Append(DIALOGS_MESSAGE_BOX, wxT("&Message box\tCtrl-M"));
+ menuDlg->Append(DIALOGS_MESSAGE_BOX_WINDOW_MODAL, wxT("Window-Modal Message box "));
menuDlg->Append(DIALOGS_MESSAGE_DIALOG, wxT("Message dialog\tShift-Ctrl-M"));
info_menu->Append(DIALOGS_LOG_DIALOG, wxT("&Log dialog\tCtrl-L"));
#endif // wxUSE_LOG_DIALOG
+ #if wxUSE_INFOBAR
+ info_menu->Append(DIALOGS_INFOBAR_SIMPLE, "Simple &info bar\tCtrl-I");
+ info_menu->Append(DIALOGS_INFOBAR_ADVANCED, "&Advanced info bar\tShift-Ctrl-I");
+ #endif // wxUSE_INFOBAR
+
#if wxUSE_MSGDLG
info_menu->Append(DIALOGS_MESSAGE_BOX_WXINFO,
- wxT("&wxWidgets information\tCtrl-I"));
+ wxT("&wxWidgets information\tCtrl-W"));
#endif // wxUSE_MSGDLG
menuDlg->Append(wxID_ANY,wxT("&Informative dialogs"),info_menu);
wxMenu *dialogs_menu = new wxMenu;
#if USE_MODAL_PRESENTATION
- dialogs_menu->Append(DIALOGS_MODAL, wxT("&Modal dialog\tCtrl-W"));
+ dialogs_menu->Append(DIALOGS_MODAL, wxT("&Modal dialog\tShift-Ctrl-W"));
#endif // USE_MODAL_PRESENTATION
- dialogs_menu->AppendCheckItem(DIALOGS_MODELESS, wxT("Mode&less dialog\tCtrl-Z"));
+ dialogs_menu->AppendCheckItem(DIALOGS_MODELESS, wxT("Mode&less dialog\tShift-Ctrl-Z"));
dialogs_menu->Append(DIALOGS_CENTRE_SCREEN, wxT("Centered on &screen\tShift-Ctrl-1"));
dialogs_menu->Append(DIALOGS_CENTRE_PARENT, wxT("Centered on &parent\tShift-Ctrl-2"));
#if wxUSE_MINIFRAME
frame->SetMenuBar(menubar);
- myCanvas = new MyCanvas(frame);
- myCanvas->SetBackgroundColour(*wxWHITE);
-
frame->Centre(wxBOTH);
-
- // Show the frame
frame->Show(true);
- SetTopWindow(frame);
-
return true;
}
// My frame constructor
-MyFrame::MyFrame(wxWindow *parent,
- const wxString& title)
- : wxFrame(parent, wxID_ANY, title)
+MyFrame::MyFrame(const wxString& title)
+ : wxFrame(NULL, wxID_ANY, title)
{
- SetIcon(sample_xpm);
+ SetIcon(wxICON(sample));
#if USE_MODAL_PRESENTATION
m_dialog = (MyModelessDialog *)NULL;
#if wxUSE_STATUSBAR
CreateStatusBar();
#endif // wxUSE_STATUSBAR
+
+ m_canvas = new MyCanvas(this);
+
+#if wxUSE_INFOBAR
+ // an info bar can be created very simply and used without any extra effort
+ m_infoBarSimple = new wxInfoBar(this);
+
+ // or it can also be customized by
+ m_infoBarAdvanced = new wxInfoBar(this);
+
+ // ... adding extra buttons (but more than two will usually be too many)
+ m_infoBarAdvanced->AddButton(wxID_UNDO);
+ m_infoBarAdvanced->AddButton(wxID_REDO);
+
+ m_infoBarAdvanced->Connect(wxID_REDO, wxEVT_COMMAND_BUTTON_CLICKED,
+ wxCommandEventHandler(MyFrame::OnInfoBarRedo),
+ NULL,
+ this);
+
+ // adding and removing a button immediately doesn't make sense here, of
+ // course, it's done just to show that it is possible
+ m_infoBarAdvanced->AddButton(wxID_EXIT);
+ m_infoBarAdvanced->RemoveButton(wxID_EXIT);
+
+ // ... changing the colours and/or fonts
+ m_infoBarAdvanced->SetOwnBackgroundColour(0xc8ffff);
+ m_infoBarAdvanced->SetFont(GetFont().Bold().Larger());
+
+ // ... and changing the effect (only does anything under MSW currently)
+ m_infoBarAdvanced->SetShowHideEffects(wxSHOW_EFFECT_EXPAND,
+ wxSHOW_EFFECT_EXPAND);
+ m_infoBarAdvanced->SetEffectDuration(1500);
+
+
+ // to use the info bars we need to use sizer for the window layout
+ wxBoxSizer * const sizer = new wxBoxSizer(wxVERTICAL);
+ sizer->Add(m_infoBarSimple, wxSizerFlags().Expand());
+ sizer->Add(m_canvas, wxSizerFlags(1).Expand());
+ sizer->Add(m_infoBarAdvanced, wxSizerFlags().Expand());
+ SetSizer(sizer);
+
+ // final touch: under MSW the info bars are shown progressively and parts
+ // of the parent window can be seen during the process, so use the same
+ // background colour for our background as for the canvas window which
+ // covers our entire client area to avoid jarring colour jumps
+ SetOwnBackgroundColour(m_canvas->GetBackgroundColour());
+#endif // wxUSE_INFOBAR
}
MyFrame::~MyFrame()
void MyFrame::ChooseColour(wxCommandEvent& WXUNUSED(event))
{
- m_clrData.SetColour(myCanvas->GetBackgroundColour());
+ m_clrData.SetColour(m_canvas->GetBackgroundColour());
wxColourDialog dialog(this, &m_clrData);
dialog.SetTitle(_("Please choose the background colour"));
if ( dialog.ShowModal() == wxID_OK )
{
m_clrData = dialog.GetColourData();
- myCanvas->SetBackgroundColour(m_clrData.GetColour());
- myCanvas->ClearBackground();
- myCanvas->Refresh();
+ m_canvas->SetBackgroundColour(m_clrData.GetColour());
+ m_canvas->ClearBackground();
+ m_canvas->Refresh();
}
}
wxColour clr = wxGetColourFromUser
(
this,
- wxGetApp().m_canvasTextColour,
+ m_canvas->GetForegroundColour(),
"Please choose the foreground colour"
);
if ( clr.IsOk() )
{
- wxGetApp().m_canvasTextColour = clr;
- myCanvas->Refresh();
+ m_canvas->SetForegroundColour(clr);
+ m_canvas->Refresh();
}
//else: dialog cancelled by user
}
#if USE_COLOURDLG_GENERIC
void MyFrame::ChooseColourGeneric(wxCommandEvent& WXUNUSED(event))
{
- m_clrData.SetColour(myCanvas->GetBackgroundColour());
+ m_clrData.SetColour(m_canvas->GetBackgroundColour());
//FIXME:TODO:This has no effect...
m_clrData.SetChooseFull(true);
if (dialog->ShowModal() == wxID_OK)
{
m_clrData = dialog->GetColourData();
- myCanvas->SetBackgroundColour(m_clrData.GetColour());
- myCanvas->ClearBackground();
- myCanvas->Refresh();
+ m_canvas->SetBackgroundColour(m_clrData.GetColour());
+ m_canvas->ClearBackground();
+ m_canvas->Refresh();
}
dialog->Destroy();
}
void MyFrame::ChooseFont(wxCommandEvent& WXUNUSED(event) )
{
wxFontData data;
- data.SetInitialFont(wxGetApp().m_canvasFont);
- data.SetColour(wxGetApp().m_canvasTextColour);
+ data.SetInitialFont(m_canvas->GetFont());
+ data.SetColour(m_canvas->GetForegroundColour());
// you might also do this:
//
if (dialog.ShowModal() == wxID_OK)
{
wxFontData retData = dialog.GetFontData();
- wxGetApp().m_canvasFont = retData.GetChosenFont();
- wxGetApp().m_canvasTextColour = retData.GetColour();
- myCanvas->Refresh();
+ m_canvas->SetFont(retData.GetChosenFont());
+ m_canvas->SetForegroundColour(retData.GetColour());
+ m_canvas->Refresh();
}
//else: cancelled by the user, don't change the font
}
void MyFrame::ChooseFontGeneric(wxCommandEvent& WXUNUSED(event) )
{
wxFontData data;
- data.SetInitialFont(wxGetApp().m_canvasFont);
- data.SetColour(wxGetApp().m_canvasTextColour);
+ data.SetInitialFont(m_canvas->GetFont());
+ data.SetColour(m_canvas->GetForegroundColour());
wxGenericFontDialog *dialog = new wxGenericFontDialog(this, data);
if (dialog->ShowModal() == wxID_OK)
{
wxFontData retData = dialog->GetFontData();
- wxGetApp().m_canvasFont = retData.GetChosenFont();
- wxGetApp().m_canvasTextColour = retData.GetColour();
- myCanvas->Refresh();
+ m_canvas->SetFont(retData.GetChosenFont());
+ m_canvas->SetForegroundColour(retData.GetColour());
+ m_canvas->Refresh();
}
dialog->Destroy();
}
}
#endif // wxUSE_LOG_DIALOG
+#if wxUSE_INFOBAR
+
+void MyFrame::InfoBarSimple(wxCommandEvent& WXUNUSED(event))
+{
+ static int s_count = 0;
+ m_infoBarSimple->ShowMessage
+ (
+ wxString::Format("Message #%d in the info bar.", ++s_count)
+ );
+}
+
+void MyFrame::InfoBarAdvanced(wxCommandEvent& WXUNUSED(event))
+{
+ m_infoBarAdvanced->ShowMessage("Sorry, it didn't work out.", wxICON_WARNING);
+}
+
+void MyFrame::OnInfoBarRedo(wxCommandEvent& WXUNUSED(event))
+{
+ m_infoBarAdvanced->ShowMessage("Still no, sorry again.", wxICON_ERROR);
+}
+
+#endif // wxUSE_INFOBAR
+
+
#if wxUSE_MSGDLG
void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event))
{
wxCENTER |
wxNO_DEFAULT | wxYES_NO | wxCANCEL |
wxICON_INFORMATION);
-
+
wxString extmsg;
if ( dialog.SetYesNoCancelLabels
+ (
+ "Answer &Yes",
+ "Answer &No",
+ "Refuse to answer"
+ ) )
+ {
+ extmsg = "This platform supports custom button labels,\n"
+ "so you should see the descriptive labels below.";
+ }
+ else
+ {
+ extmsg = "Custom button labels are not supported on this platform,\n"
+ "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!"));
+ }
+}
+
+void MyFrame::MessageBoxWindowModal(wxCommandEvent& WXUNUSED(event))
+{
+ wxMessageDialog* dialog = new wxMessageDialog(this,
+ "This is a message box\n"
+ "This is a long, long string to test out if the message box "
+ "is laid out properly.",
+ "Message box text",
+ wxCENTER |
+ wxNO_DEFAULT | wxYES_NO | wxCANCEL |
+ wxICON_INFORMATION);
+
+ wxString extmsg;
+ if ( dialog->SetYesNoCancelLabels
(
"Answer &Yes",
"Answer &No",
extmsg = "Custom button labels are not supported on this platform,\n"
"so the default \"Yes\"/\"No\"/\"Cancel\" buttons are used.";
}
- dialog.SetExtendedMessage(extmsg);
+ dialog->SetExtendedMessage(extmsg);
+ dialog->Connect( wxEVT_WINDOW_MODAL_DIALOG_CLOSED, wxWindowModalDialogEventHandler(MyFrame::MessageBoxWindowModalClosed), NULL, this );
+ dialog->ShowWindowModal();
+}
- switch ( dialog.ShowModal() )
+void MyFrame::MessageBoxWindowModalClosed(wxWindowModalDialogEvent& event)
+{
+ wxDialog* dialog = event.GetDialog();
+ switch ( dialog->GetReturnCode() )
{
case wxID_YES:
wxLogStatus(wxT("You pressed \"Yes\""));
default:
wxLogError(wxT("Unexpected wxMessageDialog return code!"));
}
+ delete dialog;
}
void MyFrame::MessageBoxDialog(wxCommandEvent& WXUNUSED(event))
{
if ( m_dlgReplace )
{
- delete m_dlgReplace;
- m_dlgReplace = NULL;
+ wxDELETE(m_dlgReplace);
}
else
{
{
if ( m_dlgFind )
{
- delete m_dlgFind;
- m_dlgFind = NULL;
+ wxDELETE(m_dlgFind);
}
else
{
void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event) )
{
wxPaintDC dc(this);
- dc.SetFont(wxGetApp().m_canvasFont);
- dc.SetTextForeground(wxGetApp().m_canvasTextColour);
dc.SetBackgroundMode(wxTRANSPARENT);
dc.DrawText(
wxT("wxWidgets common dialogs")
{
if ( event.GetEventObject() == m_btnDelete )
{
- delete m_btnModal;
- m_btnModal = NULL;
-
+ wxDELETE(m_btnModal);
m_btnDelete->Disable();
}
else if ( event.GetEventObject() == m_btnModal )
// this one is for configuring the buttons
+ wxSizer * const
+ sizerBtnsBox = new wxStaticBoxSizer(wxVERTICAL, this, "&Buttons");
+
wxFlexGridSizer * const sizerBtns = new wxFlexGridSizer(2, 5, 5);
sizerBtns->AddGrowableCol(1);
this);
}
- wxSizer * const
- sizerBtnsBox = new wxStaticBoxSizer(wxVERTICAL, this, "&Buttons");
sizerBtnsBox->Add(sizerBtns, wxSizerFlags(1).Expand());
sizerTop->Add(sizerBtnsBox, wxSizerFlags().Expand().Border());
// icon choice
- const wxString icons[] = {
- "&None", "&Information", "&Question", "&Warning", "&Error"
+ const wxString icons[] =
+ {
+ "&Not specified",
+ "E&xplicitly none",
+ "&Information icon",
+ "&Question icon",
+ "&Warning icon",
+ "&Error icon"
};
- m_icons = new wxRadioBox(this, wxID_ANY, "&Icons",
+ wxCOMPILE_TIME_ASSERT( WXSIZEOF(icons) == MsgDlgIcon_Max, IconMismatch );
+
+ m_icons = new wxRadioBox(this, wxID_ANY, "&Icon style",
wxDefaultPosition, wxDefaultSize,
- WXSIZEOF(icons), icons);
+ WXSIZEOF(icons), icons,
+ 2, wxRA_SPECIFY_ROWS);
// Make the 'Information' icon the default one:
- m_icons->SetSelection(1);
+ m_icons->SetSelection(MsgDlgIcon_Info);
sizerTop->Add(m_icons, wxSizerFlags().Expand().Border());
switch ( m_icons->GetSelection() )
{
- case 0: style |= wxICON_NONE; break;
- case 1: style |= wxICON_INFORMATION; break;
- case 2: style |= wxICON_QUESTION; break;
- case 3: style |= wxICON_WARNING; break;
- case 4: style |= wxICON_ERROR; break;
+ case MsgDlgIcon_Max:
+ wxFAIL_MSG( "unexpected selection" );
+
+ case MsgDlgIcon_No:
+ break;
+
+ case MsgDlgIcon_None:
+ style |= wxICON_NONE;
+ break;
+
+ case MsgDlgIcon_Info:
+ style |= wxICON_INFORMATION;
+ break;
+
+ case MsgDlgIcon_Question:
+ style |= wxICON_QUESTION;
+ break;
+
+ case MsgDlgIcon_Warning:
+ style |= wxICON_WARNING;
+ break;
+
+ case MsgDlgIcon_Error:
+ style |= wxICON_ERROR;
+ break;
}
if ( m_chkCentre->IsChecked() )