diff --git a/interface/wx/infobar.h b/interface/wx/infobar.h index 9f57867d3c..a59e1edea7 100644 --- a/interface/wx/infobar.h +++ b/interface/wx/infobar.h @@ -116,10 +116,20 @@ public: (in LTR layout), with each successive button being added to the right of the previous one. - Clicking the button will generate a normal event which can be handled - as usual. Notice that if you wish the info bar to be hidden when the - button is clicked, simply call @c event.Skip() in the button handler to - let the base class handler do it. + Clicking the button will generate a normal EVT_COMMAND_BUTTON_CLICKED + event which can be handled as usual. The default handler in wxInfoBar + itself closes the window whenever a button in it is clicked so if you + wish the info bar to be hidden when the button is clicked, simply call + @c event.Skip() in the button handler to let the base class handler do + it. On the other hand, if you don't skip the event, the info bar will + remain opened so make sure to do it for at least some buttons to allow + the user to close it. + + Notice that the generic wxInfoBar implementation handles the button + events itself and so they are not propagated to the info bar parent and + you need to either inherit from wxInfoBar and handle them in your + derived class or use wxEvtHandler::Connect(), as is done in the dialogs + sample, to handle the button events in the parent frame. @param btnid Id of the button. It will be used in the button message clicking diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp index 1558b54a25..0319bb4541 100644 --- a/samples/dialogs/dialogs.cpp +++ b/samples/dialogs/dialogs.cpp @@ -528,21 +528,33 @@ MyFrame::MyFrame(const wxString& title) // 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 + // 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()); @@ -709,6 +721,11 @@ 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 diff --git a/samples/dialogs/dialogs.h b/samples/dialogs/dialogs.h index 57a7105b43..fc11ed657a 100644 --- a/samples/dialogs/dialogs.h +++ b/samples/dialogs/dialogs.h @@ -429,6 +429,8 @@ private: wxWindow *m_canvas; #if wxUSE_INFOBAR + void OnInfoBarRedo(wxCommandEvent& event); + wxInfoBar *m_infoBarSimple, *m_infoBarAdvanced; #endif // wxUSE_INFOBAR diff --git a/src/gtk/infobar.cpp b/src/gtk/infobar.cpp index 53d075d04b..237b99a9f0 100644 --- a/src/gtk/infobar.cpp +++ b/src/gtk/infobar.cpp @@ -163,11 +163,17 @@ void wxInfoBar::ShowMessage(const wxString& msg, int flags) UpdateParent(); } -void wxInfoBar::GTKResponse(int WXUNUSED(btnid)) +void wxInfoBar::GTKResponse(int btnid) { - Hide(); + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, btnid); + event.SetEventObject(this); - UpdateParent(); + if ( !HandleWindowEvent(event) ) + { + Hide(); + + UpdateParent(); + } } void wxInfoBar::AddButton(wxWindowID btnid, const wxString& label)