react to the year being changed in the spin control text zone and not only with the spin buttons

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15968 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2002-06-26 23:13:43 +00:00
parent f1fbff2887
commit f0d5e7a25a
2 changed files with 69 additions and 40 deletions

View File

@@ -18,10 +18,10 @@
#include "wx/control.h" // the base class #include "wx/control.h" // the base class
#include "wx/dcclient.h" // for wxPaintDC #include "wx/dcclient.h" // for wxPaintDC
#include "wx/spinctrl.h" // for wxSpinEvent
class WXDLLEXPORT wxComboBox; class WXDLLEXPORT wxComboBox;
class WXDLLEXPORT wxStaticText; class WXDLLEXPORT wxStaticText;
class WXDLLEXPORT wxSpinCtrl;
#define wxCalendarNameStr _T("CalendarCtrl") #define wxCalendarNameStr _T("CalendarCtrl")
@@ -177,7 +177,7 @@ private:
void OnDClick(wxMouseEvent& event); void OnDClick(wxMouseEvent& event);
void OnChar(wxKeyEvent& event); void OnChar(wxKeyEvent& event);
void OnMonthChange(wxCommandEvent& event); void OnMonthChange(wxCommandEvent& event);
void OnYearChange(wxSpinEvent& event); void OnYearChange(wxCommandEvent& event);
// override some base class virtuals // override some base class virtuals
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;
@@ -297,6 +297,10 @@ private:
// the week day names // the week day names
wxString m_weekdays[7]; wxString m_weekdays[7];
// TRUE if SetDate() is being called as the result of changing the year in
// the year control
bool m_userChangedYear;
DECLARE_DYNAMIC_CLASS(wxCalendarCtrl) DECLARE_DYNAMIC_CLASS(wxCalendarCtrl)
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };

View File

@@ -38,6 +38,8 @@
#if wxUSE_CALENDARCTRL #if wxUSE_CALENDARCTRL
#include "wx/spinctrl.h"
#include "wx/calctrl.h" #include "wx/calctrl.h"
#define DEBUG_PAINT 0 #define DEBUG_PAINT 0
@@ -64,6 +66,7 @@ class wxYearSpinCtrl : public wxSpinCtrl
public: public:
wxYearSpinCtrl(wxCalendarCtrl *cal); wxYearSpinCtrl(wxCalendarCtrl *cal);
void OnYearTextChange(wxCommandEvent& event) { m_cal->OnYearChange(event); }
void OnYearChange(wxSpinEvent& event) { m_cal->OnYearChange(event); } void OnYearChange(wxSpinEvent& event) { m_cal->OnYearChange(event); }
private: private:
@@ -90,6 +93,7 @@ BEGIN_EVENT_TABLE(wxMonthComboBox, wxComboBox)
END_EVENT_TABLE() END_EVENT_TABLE()
BEGIN_EVENT_TABLE(wxYearSpinCtrl, wxSpinCtrl) BEGIN_EVENT_TABLE(wxYearSpinCtrl, wxSpinCtrl)
EVT_TEXT(-1, wxYearSpinCtrl::OnYearTextChange)
EVT_SPINCTRL(-1, wxYearSpinCtrl::OnYearChange) EVT_SPINCTRL(-1, wxYearSpinCtrl::OnYearChange)
END_EVENT_TABLE() END_EVENT_TABLE()
@@ -155,6 +159,8 @@ void wxCalendarCtrl::Init()
m_comboMonth = NULL; m_comboMonth = NULL;
m_spinYear = NULL; m_spinYear = NULL;
m_userChangedYear = FALSE;
m_widthCol = m_widthCol =
m_heightRow = 0; m_heightRow = 0;
@@ -258,12 +264,19 @@ wxCalendarCtrl::~wxCalendarCtrl()
bool wxCalendarCtrl::Destroy() bool wxCalendarCtrl::Destroy()
{ {
if( m_staticYear ) m_staticYear->Destroy(); if ( m_staticYear )
if( m_spinYear ) m_spinYear->Destroy(); m_staticYear->Destroy();
if( m_comboMonth ) m_comboMonth->Destroy(); if ( m_spinYear )
if( m_staticMonth ) m_staticMonth->Destroy(); m_spinYear->Destroy();
if ( m_comboMonth )
m_comboMonth->Destroy();
if ( m_staticMonth )
m_staticMonth->Destroy();
m_staticYear = 0; m_spinYear = 0; m_comboMonth = 0; m_staticMonth = 0; m_staticYear = NULL;
m_spinYear = NULL;
m_comboMonth = NULL;
m_staticMonth = NULL;
return wxControl::Destroy(); return wxControl::Destroy();
} }
@@ -391,7 +404,7 @@ void wxCalendarCtrl::EnableMonthChange(bool enable)
bool wxCalendarCtrl::SetDate(const wxDateTime& date) bool wxCalendarCtrl::SetDate(const wxDateTime& date)
{ {
bool retval = FALSE; bool retval = TRUE;
bool sameMonth = m_date.GetMonth() == date.GetMonth(), bool sameMonth = m_date.GetMonth() == date.GetMonth(),
sameYear = m_date.GetYear() == date.GetYear(); sameYear = m_date.GetYear() == date.GetYear();
@@ -401,19 +414,13 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& date)
if ( sameMonth && sameYear ) if ( sameMonth && sameYear )
{ {
// just change the day // just change the day
retval = TRUE;
ChangeDay(date); ChangeDay(date);
} }
else else
{ {
if ( !AllowMonthChange() || (!AllowYearChange() && !sameYear) ) if ( AllowMonthChange() && (AllowYearChange() || sameYear) )
{ {
// forbidden
return retval;
}
// change everything // change everything
retval = TRUE;
m_date = date; m_date = date;
if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) ) if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) )
@@ -423,7 +430,10 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& date)
if ( AllowYearChange() ) if ( AllowYearChange() )
{ {
if ( !m_userChangedYear )
m_spinYear->SetValue(m_date.Format(_T("%Y"))); m_spinYear->SetValue(m_date.Format(_T("%Y")));
else // don't overwrite what the user typed in
m_userChangedYear = FALSE;
} }
} }
@@ -433,6 +443,12 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& date)
// update the calendar // update the calendar
Refresh(); Refresh();
} }
else
{
// forbidden
retval = FALSE;
}
}
} }
return retval; return retval;
@@ -1498,11 +1514,21 @@ void wxCalendarCtrl::OnMonthChange(wxCommandEvent& event)
SetDateAndNotify(target); SetDateAndNotify(target);
} }
void wxCalendarCtrl::OnYearChange(wxSpinEvent& event) void wxCalendarCtrl::OnYearChange(wxCommandEvent& event)
{ {
int year = (int)event.GetInt();
if ( year == INT_MIN )
{
// invalid year in the spin control, ignore it
return;
}
// set the flag for SetDate(): otherwise it would overwrite the year
// typed in by the user
m_userChangedYear = TRUE;
wxDateTime::Tm tm = m_date.GetTm(); wxDateTime::Tm tm = m_date.GetTm();
int year = (int)event.GetInt();
if ( tm.mday > wxDateTime::GetNumberOfDays(tm.mon, year) ) if ( tm.mday > wxDateTime::GetNumberOfDays(tm.mon, year) )
{ {
tm.mday = wxDateTime::GetNumberOfDays(tm.mon, year); tm.mday = wxDateTime::GetNumberOfDays(tm.mon, year);
@@ -1520,7 +1546,6 @@ void wxCalendarCtrl::OnYearChange(wxSpinEvent& event)
// inside the same year but a strange number of months forward/back.. // inside the same year but a strange number of months forward/back..
m_spinYear->SetValue(target.GetYear()); m_spinYear->SetValue(target.GetYear());
} }
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------