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/dcclient.h" // for wxPaintDC
#include "wx/spinctrl.h" // for wxSpinEvent
class WXDLLEXPORT wxComboBox;
class WXDLLEXPORT wxStaticText;
class WXDLLEXPORT wxSpinCtrl;
#define wxCalendarNameStr _T("CalendarCtrl")
@@ -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;
@@ -297,6 +297,10 @@ private:
// 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()
};

View File

@@ -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();
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;
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,19 +414,13 @@ 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) )
@@ -423,7 +430,10 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& date)
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;
}
}
@@ -433,6 +443,12 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& date)
// update the calendar
Refresh();
}
else
{
// forbidden
retval = FALSE;
}
}
}
return retval;
@@ -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());
}
}
// ----------------------------------------------------------------------------