#include "wx/brush.h"
#include "wx/combobox.h"
#include "wx/stattext.h"
+ #include "wx/textctrl.h"
#endif //WX_PRECOMP
#if wxUSE_CALENDARCTRL
+#include "wx/spinctrl.h"
+
#include "wx/calctrl.h"
#define DEBUG_PAINT 0
wxCalendarCtrl *m_cal;
DECLARE_EVENT_TABLE()
+ DECLARE_NO_COPY_CLASS(wxMonthComboBox)
};
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:
wxCalendarCtrl *m_cal;
DECLARE_EVENT_TABLE()
+ DECLARE_NO_COPY_CLASS(wxYearSpinCtrl)
};
// ----------------------------------------------------------------------------
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(wxYearSpinCtrl, wxSpinCtrl)
+ EVT_TEXT(-1, wxYearSpinCtrl::OnYearTextChange)
EVT_SPINCTRL(-1, wxYearSpinCtrl::OnYearChange)
END_EVENT_TABLE()
// wxCalendarCtrl
// ----------------------------------------------------------------------------
+wxCalendarCtrl::wxCalendarCtrl(wxWindow *parent,
+ wxWindowID id,
+ const wxDateTime& date,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name)
+{
+ Init();
+
+ (void)Create(parent, id, date, pos, size, style, name);
+}
+
void wxCalendarCtrl::Init()
{
m_comboMonth = NULL;
m_spinYear = NULL;
+ m_userChangedYear = FALSE;
+
m_widthCol =
m_heightRow = 0;
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();
}
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();
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
+ m_date = date;
- // change everything
- retval = TRUE;
- m_date = date;
-
- if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) )
- {
- // update the controls
- m_comboMonth->SetSelection(m_date.GetMonth());
-
- 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;
+ }
}
}
// the constants used for the layout
#define VERT_MARGIN 5 // distance between combo and calendar
+#ifdef __WXMAC__
+#define HORZ_MARGIN 5 // spin
+#else
#define HORZ_MARGIN 15 // spin
-
+#endif
wxSize wxCalendarCtrl::DoGetBestSize() const
{
// calc the size of the calendar
if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) )
{
// our real height is bigger
- if ( height )
+ if ( height && GetMonthControl())
{
*height += GetMonthControl()->GetSize().y + VERT_MARGIN;
}
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);
// inside the same year but a strange number of months forward/back..
m_spinYear->SetValue(target.GetYear());
}
-
}
// ----------------------------------------------------------------------------
void wxCalendarCtrl::OnChar(wxKeyEvent& event)
{
wxDateTime target;
- switch ( event.KeyCode() )
+ switch ( event.GetKeyCode() )
{
case _T('+'):
case WXK_ADD: