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
This commit is contained in:
Vadim Zeitlin
2008-04-04 15:26:37 +00:00
parent ee22a3a2a6
commit a4fcd589a8
5 changed files with 62 additions and 26 deletions

View File

@@ -297,12 +297,18 @@ public:
// implementation only from now on // implementation only from now on
protected:
// generate the given calendar event(s) // generate the given calendar event(s)
void GenerateEvent(wxEventType type) void GenerateEvent(wxEventType type)
{ {
wxCalendarEvent event(this, GetDate(), type); wxCalendarEvent event(this, GetDate(), type);
HandleWindowEvent(event); 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);
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -56,6 +56,8 @@ protected:
virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
private: private:
wxDateTime m_date;
DECLARE_DYNAMIC_CLASS(wxCalendarCtrl) DECLARE_DYNAMIC_CLASS(wxCalendarCtrl)
DECLARE_NO_COPY_CLASS(wxCalendarCtrl) DECLARE_NO_COPY_CLASS(wxCalendarCtrl)
}; };

View File

@@ -60,5 +60,23 @@ bool wxCalendarCtrlBase::EnableMonthChange(bool enable)
return true; 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 #endif // wxUSE_CALENDARCTRL

View File

@@ -560,27 +560,10 @@ void wxGenericCalendarCtrl::ChangeDay(const wxDateTime& date)
void wxGenericCalendarCtrl::SetDateAndNotify(const wxDateTime& date) void wxGenericCalendarCtrl::SetDateAndNotify(const wxDateTime& date)
{ {
wxDateTime::Tm tm1 = m_date.GetTm(), const wxDateTime dateOld = GetDate();
tm2 = date.GetTm(); if ( date != dateOld && SetDate(date) )
const bool pageChanged = tm1.year != tm2.year || tm1.mon != tm2.mon;
if ( !pageChanged && tm1.mday == tm2.mday )
return;
if ( SetDate(date) )
{ {
GenerateEvent(wxEVT_CALENDAR_SEL_CHANGED); GenerateAllChangeEvents(dateOld);
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);
} }
} }
@@ -1486,6 +1469,10 @@ void wxGenericCalendarCtrl::OnClick(wxMouseEvent& event)
ChangeDay(date); ChangeDay(date);
GenerateEvent(wxEVT_CALENDAR_SEL_CHANGED); 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); GenerateEvent(wxEVT_CALENDAR_DAY_CHANGED);
} }
break; break;

View File

@@ -166,18 +166,29 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& dt)
return false; return false;
} }
m_date = dt;
return true; return true;
} }
wxDateTime wxCalendarCtrl::GetDate() const wxDateTime wxCalendarCtrl::GetDate() const
{ {
#ifdef __WXDEBUG__
SYSTEMTIME st; SYSTEMTIME st;
if ( !MonthCal_GetCurSel(GetHwnd(), &st) ) if ( !MonthCal_GetCurSel(GetHwnd(), &st) )
{
wxASSERT_MSG( !m_date.IsValid(), "mismatch between data and control" );
return wxDefaultDateTime; return wxDefaultDateTime;
}
wxDateTime dt; wxDateTime dt;
wxMSWDateControls::FromSystemTime(&dt, st); 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) bool wxCalendarCtrl::SetDateRange(const wxDateTime& dt1, const wxDateTime& dt2)
@@ -267,12 +278,24 @@ bool wxCalendarCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
NMHDR* hdr = (NMHDR *)lParam; NMHDR* hdr = (NMHDR *)lParam;
switch ( hdr->code ) switch ( hdr->code )
{ {
case MCN_SELECT: case MCN_SELCHANGE:
NMSELCHANGE *sch = (NMSELCHANGE *)hdr; // we need to update m_date first, before calling the user code
GenerateEvent(wxEVT_CALENDAR_SEL_CHANGED); // 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; *result = 0;
return true; return true;
} }
}
return wxCalendarCtrlBase::MSWOnNotify(idCtrl, lParam, result); return wxCalendarCtrlBase::MSWOnNotify(idCtrl, lParam, result);
} }