From f0d5e7a25aef93d3a907d005c572bc8cca4f41a1 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 26 Jun 2002 23:13:43 +0000 Subject: [PATCH] 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 --- include/wx/generic/calctrl.h | 18 +++++--- src/generic/calctrl.cpp | 87 +++++++++++++++++++++++------------- 2 files changed, 67 insertions(+), 38 deletions(-) diff --git a/include/wx/generic/calctrl.h b/include/wx/generic/calctrl.h index 7b8f072fb9..ddd08810ae 100644 --- a/include/wx/generic/calctrl.h +++ b/include/wx/generic/calctrl.h @@ -18,10 +18,10 @@ #include "wx/control.h" // the base class #include "wx/dcclient.h" // for wxPaintDC -#include "wx/spinctrl.h" // for wxSpinEvent class WXDLLEXPORT wxComboBox; class WXDLLEXPORT wxStaticText; +class WXDLLEXPORT wxSpinCtrl; #define wxCalendarNameStr _T("CalendarCtrl") @@ -77,7 +77,7 @@ public: const wxDateTime& GetUpperDateLimit() const { return m_highdate; } bool SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime, const wxDateTime& upperdate = wxDefaultDateTime); - + // calendar mode // ------------- @@ -177,7 +177,7 @@ private: void OnDClick(wxMouseEvent& event); void OnChar(wxKeyEvent& event); void OnMonthChange(wxCommandEvent& event); - void OnYearChange(wxSpinEvent& event); + void OnYearChange(wxCommandEvent& event); // override some base class virtuals virtual wxSize DoGetBestSize() const; @@ -203,7 +203,7 @@ private: // is this date in the given range? bool IsDateInRange(const wxDateTime& date) const; - + // range helpers bool ChangeYear(wxDateTime* target) const; bool ChangeMonth(wxDateTime* target) const; @@ -252,10 +252,10 @@ private: wxControl *GetYearControl() const; // OnPaint helper-methods - + // Highlight the [fromdate : todate] range using pen and brush void HighlightRange(wxPaintDC* dc, const wxDateTime& fromdate, const wxDateTime& todate, wxPen* pen, wxBrush* brush); - + // Get the "coordinates" for the date relative to the month currently displayed. // using (day, week): upper left coord is (1, 1), lower right coord is (7, 6) // if the date isn't visible (-1, -1) is put in (day, week) and false is returned @@ -292,11 +292,15 @@ private: m_rowOffset; wxRect m_leftArrowRect, - m_rightArrowRect; + m_rightArrowRect; // the week day names 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_EVENT_TABLE() }; diff --git a/src/generic/calctrl.cpp b/src/generic/calctrl.cpp index dd81cba7fe..0352b4c2f5 100644 --- a/src/generic/calctrl.cpp +++ b/src/generic/calctrl.cpp @@ -38,6 +38,8 @@ #if wxUSE_CALENDARCTRL +#include "wx/spinctrl.h" + #include "wx/calctrl.h" #define DEBUG_PAINT 0 @@ -64,6 +66,7 @@ class wxYearSpinCtrl : public wxSpinCtrl public: wxYearSpinCtrl(wxCalendarCtrl *cal); + void OnYearTextChange(wxCommandEvent& event) { m_cal->OnYearChange(event); } void OnYearChange(wxSpinEvent& event) { m_cal->OnYearChange(event); } private: @@ -90,6 +93,7 @@ BEGIN_EVENT_TABLE(wxMonthComboBox, wxComboBox) END_EVENT_TABLE() BEGIN_EVENT_TABLE(wxYearSpinCtrl, wxSpinCtrl) + EVT_TEXT(-1, wxYearSpinCtrl::OnYearTextChange) EVT_SPINCTRL(-1, wxYearSpinCtrl::OnYearChange) END_EVENT_TABLE() @@ -155,6 +159,8 @@ void wxCalendarCtrl::Init() m_comboMonth = NULL; m_spinYear = NULL; + m_userChangedYear = FALSE; + m_widthCol = m_heightRow = 0; @@ -258,12 +264,19 @@ wxCalendarCtrl::~wxCalendarCtrl() bool wxCalendarCtrl::Destroy() { - if( m_staticYear ) m_staticYear->Destroy(); - if( m_spinYear ) 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; + if ( m_staticYear ) + m_staticYear->Destroy(); + if ( m_spinYear ) + m_spinYear->Destroy(); + if ( m_comboMonth ) + m_comboMonth->Destroy(); + if ( m_staticMonth ) + m_staticMonth->Destroy(); + + m_staticYear = NULL; + m_spinYear = NULL; + m_comboMonth = NULL; + m_staticMonth = NULL; return wxControl::Destroy(); } @@ -391,7 +404,7 @@ void wxCalendarCtrl::EnableMonthChange(bool enable) bool wxCalendarCtrl::SetDate(const wxDateTime& date) { - bool retval = FALSE; + bool retval = TRUE; bool sameMonth = m_date.GetMonth() == date.GetMonth(), sameYear = m_date.GetYear() == date.GetYear(); @@ -401,37 +414,40 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& date) if ( sameMonth && sameYear ) { // just change the day - retval = TRUE; ChangeDay(date); } else { - if ( !AllowMonthChange() || (!AllowYearChange() && !sameYear) ) + if ( AllowMonthChange() && (AllowYearChange() || sameYear) ) { - // forbidden - return retval; - } - - // change everything - retval = TRUE; - m_date = date; - - if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) ) - { - // update the controls - m_comboMonth->SetSelection(m_date.GetMonth()); + // change everything + m_date = date; - if ( AllowYearChange() ) + if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) ) { - m_spinYear->SetValue(m_date.Format(_T("%Y"))); + // update the controls + m_comboMonth->SetSelection(m_date.GetMonth()); + + if ( AllowYearChange() ) + { + if ( !m_userChangedYear ) + m_spinYear->SetValue(m_date.Format(_T("%Y"))); + else // don't overwrite what the user typed in + m_userChangedYear = FALSE; + } } - } - // as the month changed, holidays did too - SetHolidayAttrs(); + // as the month changed, holidays did too + SetHolidayAttrs(); - // update the calendar - Refresh(); + // update the calendar + Refresh(); + } + else + { + // forbidden + retval = FALSE; + } } } @@ -1498,11 +1514,21 @@ void wxCalendarCtrl::OnMonthChange(wxCommandEvent& event) 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(); - int year = (int)event.GetInt(); if ( 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.. m_spinYear->SetValue(target.GetYear()); } - } // ---------------------------------------------------------------------------- -- 2.47.2