From a4fcd589a85e735e6c17f1470e739d9fcc946e9e Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 4 Apr 2008 15:26:37 +0000 Subject: [PATCH] generate the correct events in the native MSW version of wxCalendarCtrl git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53007 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/calctrl.h | 6 ++++++ include/wx/msw/calctrl.h | 2 ++ src/common/calctrlcmn.cpp | 18 ++++++++++++++++++ src/generic/calctrlg.cpp | 27 +++++++-------------------- src/msw/calctrl.cpp | 35 +++++++++++++++++++++++++++++------ 5 files changed, 62 insertions(+), 26 deletions(-) diff --git a/include/wx/calctrl.h b/include/wx/calctrl.h index 12e715781e..ae92b232c1 100644 --- a/include/wx/calctrl.h +++ b/include/wx/calctrl.h @@ -297,12 +297,18 @@ public: // implementation only from now on +protected: // generate the given calendar event(s) void GenerateEvent(wxEventType type) { wxCalendarEvent event(this, GetDate(), type); HandleWindowEvent(event); } + + // generate all the events for the selection change from dateOld to current + // date: SEL_CHANGED, PAGE_CHANGED if necessary and also one of (deprecated) + // YEAR/MONTH/DAY_CHANGED ones + void GenerateAllChangeEvents(const wxDateTime& dateOld); }; // ---------------------------------------------------------------------------- diff --git a/include/wx/msw/calctrl.h b/include/wx/msw/calctrl.h index abf0e4fc0b..9a2da34dd2 100644 --- a/include/wx/msw/calctrl.h +++ b/include/wx/msw/calctrl.h @@ -56,6 +56,8 @@ protected: virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); private: + wxDateTime m_date; + DECLARE_DYNAMIC_CLASS(wxCalendarCtrl) DECLARE_NO_COPY_CLASS(wxCalendarCtrl) }; diff --git a/src/common/calctrlcmn.cpp b/src/common/calctrlcmn.cpp index 481be6e619..896ac3ba37 100644 --- a/src/common/calctrlcmn.cpp +++ b/src/common/calctrlcmn.cpp @@ -60,5 +60,23 @@ bool wxCalendarCtrlBase::EnableMonthChange(bool enable) return true; } +void wxCalendarCtrlBase::GenerateAllChangeEvents(const wxDateTime& dateOld) +{ + const wxDateTime::Tm tm1 = dateOld.GetTm(), + tm2 = GetDate().GetTm(); + + GenerateEvent(wxEVT_CALENDAR_SEL_CHANGED); + if ( tm1.year != tm2.year || tm1.mon != tm2.mon ) + GenerateEvent(wxEVT_CALENDAR_PAGE_CHANGED); + + // send also one of the deprecated events + if ( tm1.year != tm2.year ) + GenerateEvent(wxEVT_CALENDAR_YEAR_CHANGED); + else if ( tm1.mon != tm2.mon ) + GenerateEvent(wxEVT_CALENDAR_MONTH_CHANGED); + else + GenerateEvent(wxEVT_CALENDAR_DAY_CHANGED); +} + #endif // wxUSE_CALENDARCTRL diff --git a/src/generic/calctrlg.cpp b/src/generic/calctrlg.cpp index 5725f369b5..c52a74808a 100644 --- a/src/generic/calctrlg.cpp +++ b/src/generic/calctrlg.cpp @@ -560,27 +560,10 @@ void wxGenericCalendarCtrl::ChangeDay(const wxDateTime& date) void wxGenericCalendarCtrl::SetDateAndNotify(const wxDateTime& date) { - wxDateTime::Tm tm1 = m_date.GetTm(), - tm2 = date.GetTm(); - - const bool pageChanged = tm1.year != tm2.year || tm1.mon != tm2.mon; - - if ( !pageChanged && tm1.mday == tm2.mday ) - return; - - if ( SetDate(date) ) + const wxDateTime dateOld = GetDate(); + if ( date != dateOld && SetDate(date) ) { - GenerateEvent(wxEVT_CALENDAR_SEL_CHANGED); - if ( !pageChanged ) - GenerateEvent(wxEVT_CALENDAR_PAGE_CHANGED); - - // send also one of the deprecated events - if ( tm1.year != tm2.year ) - GenerateEvent(wxEVT_CALENDAR_YEAR_CHANGED); - else if ( tm1.mon != tm2.mon ) - GenerateEvent(wxEVT_CALENDAR_MONTH_CHANGED); - else - GenerateEvent(wxEVT_CALENDAR_DAY_CHANGED); + GenerateAllChangeEvents(dateOld); } } @@ -1486,6 +1469,10 @@ void wxGenericCalendarCtrl::OnClick(wxMouseEvent& event) ChangeDay(date); GenerateEvent(wxEVT_CALENDAR_SEL_CHANGED); + + // we know that the month/year never change when the user + // clicks on the control so there is no need to call + // GenerateAllChangeEvents() here, we know which event to send GenerateEvent(wxEVT_CALENDAR_DAY_CHANGED); } break; diff --git a/src/msw/calctrl.cpp b/src/msw/calctrl.cpp index 4c57e4440e..8432ccc6bd 100644 --- a/src/msw/calctrl.cpp +++ b/src/msw/calctrl.cpp @@ -166,18 +166,29 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& dt) return false; } + m_date = dt; + return true; } wxDateTime wxCalendarCtrl::GetDate() const { +#ifdef __WXDEBUG__ SYSTEMTIME st; if ( !MonthCal_GetCurSel(GetHwnd(), &st) ) + { + wxASSERT_MSG( !m_date.IsValid(), "mismatch between data and control" ); + return wxDefaultDateTime; + } wxDateTime dt; wxMSWDateControls::FromSystemTime(&dt, st); - return dt; + + wxASSERT_MSG( dt == m_date, "mismatch between data and control" ); +#endif // __WXDEBUG__ + + return m_date; } bool wxCalendarCtrl::SetDateRange(const wxDateTime& dt1, const wxDateTime& dt2) @@ -267,11 +278,23 @@ bool wxCalendarCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) NMHDR* hdr = (NMHDR *)lParam; switch ( hdr->code ) { - case MCN_SELECT: - NMSELCHANGE *sch = (NMSELCHANGE *)hdr; - GenerateEvent(wxEVT_CALENDAR_SEL_CHANGED); - *result = 0; - return true; + case MCN_SELCHANGE: + // we need to update m_date first, before calling the user code + // which expects GetDate() to return the new date + const wxDateTime dateOld = m_date; + const NMSELCHANGE * const sch = (NMSELCHANGE *)lParam; + wxMSWDateControls::FromSystemTime(&m_date, sch->stSelStart); + + // changing the year or the month results in a second dummy + // MCN_SELCHANGE event on this system which doesn't really change + // anything -- filter it out + if ( m_date != dateOld ) + { + GenerateAllChangeEvents(dateOld); + + *result = 0; + return true; + } } return wxCalendarCtrlBase::MSWOnNotify(idCtrl, lParam, result); -- 2.45.2