X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/87a1867991ec94e6a86557af9971cf53365b9c36..c6aabd1ca9a5590d5dd8e89d83a5fba74c69c931:/samples/dialogs/dialogs.cpp diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp index 8b59fce29d..6be65d3237 100644 --- a/samples/dialogs/dialogs.cpp +++ b/samples/dialogs/dialogs.cpp @@ -1,11 +1,12 @@ ///////////////////////////////////////////////////////////////////////////// // 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 ///////////////////////////////////////////////////////////////////////////// @@ -86,6 +87,10 @@ #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" @@ -118,6 +123,7 @@ END_EVENT_TABLE() 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 @@ -133,6 +139,10 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) #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) @@ -270,16 +280,14 @@ 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")); @@ -397,9 +405,14 @@ bool MyApp::OnInit() 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); @@ -416,9 +429,9 @@ bool MyApp::OnInit() 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 @@ -474,21 +487,16 @@ bool MyApp::OnInit() frame->SetMenuBar(menubar); 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; @@ -517,6 +525,51 @@ MyFrame::MyFrame(wxWindow *parent, #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() @@ -548,12 +601,12 @@ void MyFrame::GetColour(wxCommandEvent& WXUNUSED(event)) wxColour clr = wxGetColourFromUser ( this, - wxGetApp().m_canvasTextColour, + m_canvas->GetForegroundColour(), "Please choose the foreground colour" ); if ( clr.IsOk() ) { - wxGetApp().m_canvasTextColour = clr; + m_canvas->SetForegroundColour(clr); m_canvas->Refresh(); } //else: dialog cancelled by user @@ -596,8 +649,8 @@ void MyFrame::ChooseColourGeneric(wxCommandEvent& WXUNUSED(event)) 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: // @@ -609,8 +662,8 @@ void MyFrame::ChooseFont(wxCommandEvent& WXUNUSED(event) ) if (dialog.ShowModal() == wxID_OK) { wxFontData retData = dialog.GetFontData(); - wxGetApp().m_canvasFont = retData.GetChosenFont(); - wxGetApp().m_canvasTextColour = retData.GetColour(); + m_canvas->SetFont(retData.GetChosenFont()); + m_canvas->SetForegroundColour(retData.GetColour()); m_canvas->Refresh(); } //else: cancelled by the user, don't change the font @@ -621,15 +674,15 @@ void MyFrame::ChooseFont(wxCommandEvent& WXUNUSED(event) ) 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(); + m_canvas->SetFont(retData.GetChosenFont()); + m_canvas->SetForegroundColour(retData.GetColour()); m_canvas->Refresh(); } dialog->Destroy(); @@ -660,6 +713,30 @@ void MyFrame::LogDialog(wxCommandEvent& WXUNUSED(event)) } #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)) { @@ -671,9 +748,57 @@ 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", @@ -688,9 +813,15 @@ void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event)) 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\"")); @@ -707,6 +838,7 @@ void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event)) default: wxLogError(wxT("Unexpected wxMessageDialog return code!")); } + delete dialog; } void MyFrame::MessageBoxDialog(wxCommandEvent& WXUNUSED(event)) @@ -1817,8 +1949,7 @@ void MyFrame::ShowReplaceDialog( wxCommandEvent& WXUNUSED(event) ) { if ( m_dlgReplace ) { - delete m_dlgReplace; - m_dlgReplace = NULL; + wxDELETE(m_dlgReplace); } else { @@ -1838,8 +1969,7 @@ void MyFrame::ShowFindDialog( wxCommandEvent& WXUNUSED(event) ) { if ( m_dlgFind ) { - delete m_dlgFind; - m_dlgFind = NULL; + wxDELETE(m_dlgFind); } else { @@ -1937,8 +2067,6 @@ void MyFrame::OnFindDialog(wxFindDialogEvent& event) 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") @@ -2017,9 +2145,7 @@ void MyModalDialog::OnButton(wxCommandEvent& event) { if ( event.GetEventObject() == m_btnDelete ) { - delete m_btnModal; - m_btnModal = NULL; - + wxDELETE(m_btnModal); m_btnDelete->Disable(); } else if ( event.GetEventObject() == m_btnModal ) @@ -2431,6 +2557,9 @@ TestMessageBoxDialog::TestMessageBoxDialog(wxWindow *parent) // 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); @@ -2452,22 +2581,29 @@ TestMessageBoxDialog::TestMessageBoxDialog(wxWindow *parent) 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()); @@ -2528,11 +2664,31 @@ void TestMessageBoxDialog::OnApply(wxCommandEvent& WXUNUSED(event)) 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() )