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:
@@ -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()
|
||||
};
|
||||
|
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user