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/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")
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ public:
|
|||||||
const wxDateTime& GetUpperDateLimit() const { return m_highdate; }
|
const wxDateTime& GetUpperDateLimit() const { return m_highdate; }
|
||||||
|
|
||||||
bool SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime, const wxDateTime& upperdate = wxDefaultDateTime);
|
bool SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime, const wxDateTime& upperdate = wxDefaultDateTime);
|
||||||
|
|
||||||
// calendar mode
|
// calendar mode
|
||||||
// -------------
|
// -------------
|
||||||
|
|
||||||
@@ -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;
|
||||||
@@ -203,7 +203,7 @@ private:
|
|||||||
|
|
||||||
// is this date in the given range?
|
// is this date in the given range?
|
||||||
bool IsDateInRange(const wxDateTime& date) const;
|
bool IsDateInRange(const wxDateTime& date) const;
|
||||||
|
|
||||||
// range helpers
|
// range helpers
|
||||||
bool ChangeYear(wxDateTime* target) const;
|
bool ChangeYear(wxDateTime* target) const;
|
||||||
bool ChangeMonth(wxDateTime* target) const;
|
bool ChangeMonth(wxDateTime* target) const;
|
||||||
@@ -252,10 +252,10 @@ private:
|
|||||||
wxControl *GetYearControl() const;
|
wxControl *GetYearControl() const;
|
||||||
|
|
||||||
// OnPaint helper-methods
|
// OnPaint helper-methods
|
||||||
|
|
||||||
// Highlight the [fromdate : todate] range using pen and brush
|
// Highlight the [fromdate : todate] range using pen and brush
|
||||||
void HighlightRange(wxPaintDC* dc, const wxDateTime& fromdate, const wxDateTime& todate, wxPen* pen, wxBrush* 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.
|
// 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)
|
// 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
|
// if the date isn't visible (-1, -1) is put in (day, week) and false is returned
|
||||||
@@ -292,11 +292,15 @@ private:
|
|||||||
m_rowOffset;
|
m_rowOffset;
|
||||||
|
|
||||||
wxRect m_leftArrowRect,
|
wxRect m_leftArrowRect,
|
||||||
m_rightArrowRect;
|
m_rightArrowRect;
|
||||||
|
|
||||||
// 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()
|
||||||
};
|
};
|
||||||
|
@@ -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,37 +414,40 @@ 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) )
|
||||||
|
{
|
||||||
|
// change everything
|
||||||
|
m_date = date;
|
||||||
|
|
||||||
|
if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) )
|
||||||
|
{
|
||||||
|
// 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();
|
||||||
|
|
||||||
|
// update the calendar
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
// forbidden
|
// forbidden
|
||||||
return retval;
|
retval = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// change everything
|
|
||||||
retval = TRUE;
|
|
||||||
m_date = date;
|
|
||||||
|
|
||||||
if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) )
|
|
||||||
{
|
|
||||||
// update the controls
|
|
||||||
m_comboMonth->SetSelection(m_date.GetMonth());
|
|
||||||
|
|
||||||
if ( AllowYearChange() )
|
|
||||||
{
|
|
||||||
m_spinYear->SetValue(m_date.Format(_T("%Y")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// as the month changed, holidays did too
|
|
||||||
SetHolidayAttrs();
|
|
||||||
|
|
||||||
// update the calendar
|
|
||||||
Refresh();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user