X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4f6aed9c6a21d4bc732579aa564adf4cdb2c9aab..cde47db3d8b3ebd3046204e8b9facb9be777fb8a:/include/wx/generic/calctrl.h diff --git a/include/wx/generic/calctrl.h b/include/wx/generic/calctrl.h index 78a9385d3b..f7d3d6abbc 100644 --- a/include/wx/generic/calctrl.h +++ b/include/wx/generic/calctrl.h @@ -6,10 +6,10 @@ // Created: 29.12.99 // RCS-ID: $Id$ // Copyright: (c) 1999 Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma interface "calctrl.h" #endif @@ -17,10 +17,11 @@ #define _WX_GENERIC_CALCTRL_H #include "wx/control.h" // the base class - -#include "wx/spinctrl.h" // for wxSpinEvent +#include "wx/dcclient.h" // for wxPaintDC class WXDLLEXPORT wxComboBox; +class WXDLLEXPORT wxStaticText; +class WXDLLEXPORT wxSpinCtrl; #define wxCalendarNameStr _T("CalendarCtrl") @@ -28,7 +29,7 @@ class WXDLLEXPORT wxComboBox; // wxCalendarCtrl: a control allowing the user to pick a date interactively // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxCalendarCtrl : public wxControl +class WXDLLIMPEXP_ADV wxCalendarCtrl : public wxControl { friend class wxMonthComboBox; friend class wxYearSpinCtrl; @@ -41,32 +42,53 @@ public: const wxDateTime& date = wxDefaultDateTime, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxCAL_SHOW_HOLIDAYS, - const wxString& name = wxCalendarNameStr) - : wxControl(parent, id, pos, size, - style | wxWANTS_CHARS, wxDefaultValidator, name) - { - Init(); - - (void)Create(parent, id, date, pos, size, style, name); - } + long style = wxCAL_SHOW_HOLIDAYS | wxWANTS_CHARS, + const wxString& name = wxCalendarNameStr); bool Create(wxWindow *parent, wxWindowID id, const wxDateTime& date = wxDefaultDateTime, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxCAL_SHOW_HOLIDAYS, + long style = wxCAL_SHOW_HOLIDAYS | wxWANTS_CHARS, const wxString& name = wxCalendarNameStr); virtual ~wxCalendarCtrl(); + virtual bool Destroy(); + // set/get the current date // ------------------------ - void SetDate(const wxDateTime& date); + bool SetDate(const wxDateTime& date); // we need to be able to control if the event should be sent in SetDateAndNotify(...) const wxDateTime& GetDate() const { return m_date; } + // set/get the range in which selection can occur + // --------------------------------------------- + + bool SetLowerDateLimit(const wxDateTime& date = wxDefaultDateTime); + const wxDateTime& GetLowerDateLimit() const { return m_lowdate; } + bool SetUpperDateLimit(const wxDateTime& date = wxDefaultDateTime); + const wxDateTime& GetUpperDateLimit() const { return m_highdate; } + + bool SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime, const wxDateTime& upperdate = wxDefaultDateTime); + + // calendar mode + // ------------- + + // some calendar styles can't be changed after the control creation by + // just using SetWindowStyle() and Refresh() and the functions below + // should be used instead for them + + // corresponds to wxCAL_NO_YEAR_CHANGE bit + void EnableYearChange(bool enable = TRUE); + + // corresponds to wxCAL_NO_MONTH_CHANGE bit + void EnableMonthChange(bool enable = TRUE); + + // corresponds to wxCAL_SHOW_HOLIDAYS bit + void EnableHolidayDisplay(bool display = TRUE); + // customization // ------------- @@ -100,11 +122,6 @@ public: const wxColour& GetHolidayColourFg() const { return m_colHolidayFg; } const wxColour& GetHolidayColourBg() const { return m_colHolidayBg; } - // this function should be called instead of directly changing the - // wxCAL_SHOW_HOLIDAYS bit in the control style after the control creation - // (this won't work) - void EnableHolidayDisplay(bool display = TRUE); - // an item without custom attributes is drawn with the default colours and // font and without border, setting custom attributes allows to modify this // @@ -155,8 +172,7 @@ private: void OnDClick(wxMouseEvent& event); void OnChar(wxKeyEvent& event); void OnMonthChange(wxCommandEvent& event); - void OnYearChange(wxSpinEvent& event); - void OnCalMonthChange(wxCalendarEvent& event); + void OnYearChange(wxCommandEvent& event); // override some base class virtuals virtual wxSize DoGetBestSize() const; @@ -180,6 +196,13 @@ private: // is this date shown? bool IsDateShown(const wxDateTime& date) const; + // 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; + // redraw the given date void RefreshDate(const wxDateTime& date); @@ -205,13 +228,54 @@ private: GenerateEvent(type2); } + // do we allow changing the month/year? + bool AllowMonthChange() const + { + return (GetWindowStyle() & wxCAL_NO_MONTH_CHANGE) + != wxCAL_NO_MONTH_CHANGE; + } + bool AllowYearChange() const + { + return !(GetWindowStyle() & wxCAL_NO_YEAR_CHANGE); + } + + // show the correct controls + void ShowCurrentControls(); + +public: + // get the currently shown control for month/year + wxControl *GetMonthControl() const; + wxControl *GetYearControl() const; + +private: + // 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 + bool GetDateCoord(const wxDateTime& date, int *day, int *week) const; + + // Set the flag for SetDate(): otherwise it would overwrite the year + // typed in by the user + void SetUserChangedYear() { m_userChangedYear = TRUE; } + // the subcontrols + wxStaticText *m_staticMonth; wxComboBox *m_comboMonth; + + wxStaticText *m_staticYear; wxSpinCtrl *m_spinYear; // the current selection wxDateTime m_date; + // the date-range + wxDateTime m_lowdate; + wxDateTime m_highdate; + // default attributes wxColour m_colHighlightFg, m_colHighlightBg, @@ -225,13 +289,22 @@ private: // the width and height of one column/row in the calendar wxCoord m_widthCol, - m_heightRow; + m_heightRow, + m_rowOffset; + + wxRect m_leftArrowRect, + 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() + DECLARE_NO_COPY_CLASS(wxCalendarCtrl) }; #endif // _WX_GENERIC_CALCTRL_H