/////////////////////////////////////////////////////////////////////////////// // Name: src/generic/notifmsgg.cpp // Purpose: generic implementation of wxNotificationMessage // Author: Vadim Zeitlin // Created: 2007-11-24 // RCS-ID: $Id$ // Copyright: (c) 2007 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ // declarations // ============================================================================ // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- // for compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // include this before the test below, wxUSE_GENERIC_NOTIFICATION_MESSAGE is // defined in this header #include "wx/notifmsg.h" #if wxUSE_GENERIC_NOTIFICATION_MESSAGE #ifndef WX_PRECOMP #include "wx/dialog.h" #include "wx/timer.h" #endif //WX_PRECOMP // ---------------------------------------------------------------------------- // wxNotificationMessageDialog // ---------------------------------------------------------------------------- class wxNotificationMessageDialog : public wxDialog { public: wxNotificationMessageDialog(wxWindow *parent, const wxString& text, int timeout); void Set(wxWindow *parent, const wxString& text, int timeout); bool IsAutomatic() const { return m_timer.IsRunning(); } void SetDeleteOnHide() { m_deleteOnHide = true; } private: void OnClose(wxCloseEvent& event); void OnTimer(wxTimerEvent& event); // if true, delete the dialog when it should disappear, otherwise just hide // it (initially false) bool m_deleteOnHide; // timer which will hide this dialog when it expires, if it's not running // it means we were created without timeout wxTimer m_timer; DECLARE_EVENT_TABLE() DECLARE_NO_COPY_CLASS(wxNotificationMessageDialog) }; // ============================================================================ // wxNotificationMessageDialog implementation // ============================================================================ BEGIN_EVENT_TABLE(wxNotificationMessageDialog, wxDialog) EVT_CLOSE(wxNotificationMessageDialog::OnClose) EVT_TIMER(wxID_ANY, wxNotificationMessageDialog::OnTimer) END_EVENT_TABLE() wxNotificationMessageDialog::wxNotificationMessageDialog(wxWindow *parent, const wxString& text, int timeout) : wxDialog(parent, wxID_ANY, _("Notice"), wxDefaultPosition, wxDefaultSize, 0 /* no caption, no border styles */), m_timer(this) { m_deleteOnHide = false; Set(parent, text, timeout); } void wxNotificationMessageDialog::Set(wxWindow * WXUNUSED(parent), const wxString& text, int timeout) { wxSizer *sizer = CreateTextSizer(text); SetSizerAndFit(sizer); if ( timeout != wxNotificationMessage::Timeout_Never ) { // wxTimer uses ms, timeout is in seconds m_timer.Start(timeout*1000, true /* one shot only */); } else if ( m_timer.IsRunning() ) { m_timer.Stop(); } } void wxNotificationMessageDialog::OnClose(wxCloseEvent& event) { if ( m_deleteOnHide ) { // we don't need to keep this dialog alive any more Destroy(); } else // don't really close, just hide, as we can be shown again later { event.Veto(); Hide(); } } void wxNotificationMessageDialog::OnTimer(wxTimerEvent& WXUNUSED(event)) { if ( m_deleteOnHide ) Destroy(); else Hide(); } // ============================================================================ // wxNotificationMessage implementation // ============================================================================ int wxNotificationMessage::ms_timeout = 10; /* static */ void wxNotificationMessage::SetDefaultTimeout(int timeout) { wxASSERT_MSG( timeout > 0, "negative or zero default timeout doesn't make sense" ); ms_timeout = timeout; } void wxNotificationMessage::Init() { m_dialog = NULL; } wxNotificationMessage::~wxNotificationMessage() { if ( m_dialog->IsAutomatic() ) { // we want to allow the user to create an automatically hidden // notification just by creating a local wxNotificationMessage object // and so we shouldn't hide the notification when this object goes out // of scope m_dialog->SetDeleteOnHide(); } else // manual dialog, hide it immediately { // OTOH for permanently shown dialogs only the code can hide them and // if the object is deleted, we must do it now as it won't be // accessible programmatically any more delete m_dialog; } } bool wxNotificationMessage::Show(int timeout) { if ( timeout == Timeout_Auto ) { timeout = GetDefaultTimeout(); } if ( !m_dialog ) { m_dialog = new wxNotificationMessageDialog ( GetParent(), GetFullMessage(), timeout ); } else // update the existing dialog { m_dialog->Set(GetParent(), GetFullMessage(), timeout); } m_dialog->Show(); return true; } bool wxNotificationMessage::Close() { if ( !m_dialog ) return false; m_dialog->Hide(); return true; } #endif // wxUSE_GENERIC_NOTIFICATION_MESSAGE