]> git.saurik.com Git - wxWidgets.git/commitdiff
generate the correct events in the native MSW version of wxCalendarCtrl
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 4 Apr 2008 15:26:37 +0000 (15:26 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 4 Apr 2008 15:26:37 +0000 (15:26 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53007 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/calctrl.h
include/wx/msw/calctrl.h
src/common/calctrlcmn.cpp
src/generic/calctrlg.cpp
src/msw/calctrl.cpp

index 12e715781e35f37ec4f49642e6e9120ce4f7cb56..ae92b232c160de54795714591c1d471521774232 100644 (file)
@@ -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);
 };
 
 // ----------------------------------------------------------------------------
index abf0e4fc0bb3dc8346584caa6f5283896c2b11d0..9a2da34dd2bf84a4b2335663891bd06ba209b6c4 100644 (file)
@@ -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)
 };
index 481be6e619027d6664496cafd205dcad08c32b12..896ac3ba37087953398afd3a3cac5f74db320e4e 100644 (file)
@@ -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
 
index 5725f369b5c8a717085cd6702e8a22275635d78b..c52a74808ae554f43c51a7e0c75042d687c4c2e3 100644 (file)
@@ -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;
index 4c57e4440e38c61cb099bf5a0b05ce393a2adfc6..8432ccc6bd8fe49aeecdd0f6260e6b9a5c57adee 100644 (file)
@@ -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);