X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/628e155d8c70da0f962289cf1e1dea3699255707..7344108e8a129a3f9b4df5ab0f98a1713db03b89:/include/wx/calctrl.h diff --git a/include/wx/calctrl.h b/include/wx/calctrl.h index 7e293b247a..ce056a11fe 100644 --- a/include/wx/calctrl.h +++ b/include/wx/calctrl.h @@ -30,7 +30,7 @@ enum // show Sunday as the first day of the week (default) wxCAL_SUNDAY_FIRST = 0x0000, - // show Monder as the first day of the week + // show Monday as the first day of the week wxCAL_MONDAY_FIRST = 0x0001, // highlight holidays @@ -48,7 +48,10 @@ enum wxCAL_SEQUENTIAL_MONTH_SELECTION = 0x0010, // show the neighbouring weeks in the previous and next month - wxCAL_SHOW_SURROUNDING_WEEKS = 0x0020 + wxCAL_SHOW_SURROUNDING_WEEKS = 0x0020, + + // show week numbers on the left side of the calendar. + wxCAL_SHOW_WEEK_NUMBERS = 0x0040 }; // ---------------------------------------------------------------------------- @@ -63,7 +66,8 @@ enum wxCalendarHitTestResult wxCAL_HITTEST_DAY, // on a day in the calendar wxCAL_HITTEST_INCMONTH, wxCAL_HITTEST_DECMONTH, - wxCAL_HITTEST_SURROUNDING_WEEK + wxCAL_HITTEST_SURROUNDING_WEEK, + wxCAL_HITTEST_WEEK }; // border types for a date @@ -108,10 +112,10 @@ public: void SetHoliday(bool holiday) { m_holiday = holiday; } // accessors - bool HasTextColour() const { return m_colText.Ok(); } - bool HasBackgroundColour() const { return m_colBack.Ok(); } - bool HasBorderColour() const { return m_colBorder.Ok(); } - bool HasFont() const { return m_font.Ok(); } + bool HasTextColour() const { return m_colText.IsOk(); } + bool HasBackgroundColour() const { return m_colBack.IsOk(); } + bool HasBorderColour() const { return m_colBorder.IsOk(); } + bool HasFont() const { return m_font.IsOk(); } bool HasBorder() const { return m_border != wxCAL_BORDER_NONE; } bool IsHoliday() const { return m_holiday; } @@ -157,17 +161,19 @@ public: wxCalendarEvent() : m_wday(wxDateTime::Inv_WeekDay) { } wxCalendarEvent(wxWindow *win, const wxDateTime& dt, wxEventType type) : wxDateEvent(win, dt, type), - m_wday(wxDateTime::Inv_WeekDay) - { - } + m_wday(wxDateTime::Inv_WeekDay) { } + wxCalendarEvent(const wxCalendarEvent& event) + : wxDateEvent(event), m_wday(event.m_wday) { } void SetWeekDay(const wxDateTime::WeekDay wd) { m_wday = wd; } wxDateTime::WeekDay GetWeekDay() const { return m_wday; } + virtual wxEvent *Clone() const { return new wxCalendarEvent(*this); } + private: wxDateTime::WeekDay m_wday; - DECLARE_DYNAMIC_CLASS_NO_COPY(wxCalendarEvent) + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCalendarEvent) }; // ---------------------------------------------------------------------------- @@ -185,6 +191,32 @@ public: virtual bool SetDate(const wxDateTime& date) = 0; + // restricting the dates shown by the control to the specified range: only + // implemented in the generic and MSW versions for now + + // if either date is set, the corresponding limit will be enforced and true + // returned; if none are set, the existing restrictions are removed and + // false is returned + virtual bool + SetDateRange(const wxDateTime& WXUNUSED(lowerdate) = wxDefaultDateTime, + const wxDateTime& WXUNUSED(upperdate) = wxDefaultDateTime) + { + return false; + } + + // retrieves the limits currently in use (wxDefaultDateTime if none) in the + // provided pointers (which may be NULL) and returns true if there are any + // limits or false if none + virtual bool + GetDateRange(wxDateTime *lowerdate, wxDateTime *upperdate) const + { + if ( lowerdate ) + *lowerdate = wxDefaultDateTime; + if ( upperdate ) + *upperdate = wxDefaultDateTime; + return false; + } + // returns one of wxCAL_HITTEST_XXX constants and fills either date or wd // with the corresponding value (none for NOWHERE, the date for DAY and wd // for HEADER) @@ -204,7 +236,7 @@ public: // // NB: we provide implementation for this pure virtual function, derived // classes should call it - virtual bool EnableMonthChange(bool enable) = 0; + virtual bool EnableMonthChange(bool enable = true) = 0; // an item without custom attributes is drawn with the default colours and @@ -228,14 +260,79 @@ public: virtual void ResetAttr(size_t WXUNUSED(day)) { } + // holidays support + // + // currently only the generic version implements all functions in this + // section; wxMSW implements simple support for holidays (they can be + // just enabled or disabled) and wxGTK doesn't support them at all + + // equivalent to changing wxCAL_SHOW_HOLIDAYS flag but should be called + // instead of just changing it + virtual void EnableHolidayDisplay(bool display = true); + + // set/get the colours to use for holidays (if they're enabled) + virtual void SetHolidayColours(const wxColour& WXUNUSED(colFg), + const wxColour& WXUNUSED(colBg)) { } + + virtual const wxColour& GetHolidayColourFg() const { return wxNullColour; } + virtual const wxColour& GetHolidayColourBg() const { return wxNullColour; } + + // mark the given day of the current month as being a holiday + virtual void SetHoliday(size_t WXUNUSED(day)) { } + + + // customizing the colours of the controls + // + // most of the methods in this section are only implemented by the native + // version of the control and do nothing in the native ones + + // set/get the colours to use for the display of the week day names at the + // top of the controls + virtual void SetHeaderColours(const wxColour& WXUNUSED(colFg), + const wxColour& WXUNUSED(colBg)) { } + + virtual const wxColour& GetHeaderColourFg() const { return wxNullColour; } + virtual const wxColour& GetHeaderColourBg() const { return wxNullColour; } + + // set/get the colours used for the currently selected date + virtual void SetHighlightColours(const wxColour& WXUNUSED(colFg), + const wxColour& WXUNUSED(colBg)) { } + + virtual const wxColour& GetHighlightColourFg() const { return wxNullColour; } + virtual const wxColour& GetHighlightColourBg() const { return wxNullColour; } + + // implementation only from now on - // generate the given calendar event(s) - void GenerateEvent(wxEventType type) + // generate the given calendar event, return true if it was processed + // + // NB: this is public because it's used from GTK+ callbacks + bool GenerateEvent(wxEventType type) { wxCalendarEvent event(this, GetDate(), type); - HandleWindowEvent(event); + return HandleWindowEvent(event); } + +protected: + // generate all the events for the selection change from dateOld to current + // date: SEL_CHANGED, PAGE_CHANGED if necessary and also one of (deprecated) + // YEAR/MONTH/DAY_CHANGED ones + // + // returns true if page changed event was generated, false if the new date + // is still in the same month as before + bool GenerateAllChangeEvents(const wxDateTime& dateOld); + + // call SetHoliday() for all holidays in the current month + // + // should be called on month change, does nothing if wxCAL_SHOW_HOLIDAYS is + // not set and returns false in this case, true if we do show them + bool SetHolidayAttrs(); + + // called by SetHolidayAttrs() to forget the previously set holidays + virtual void ResetHolidayAttrs() { } + + // called by EnableHolidayDisplay() + virtual void RefreshHolidays() { } }; // ---------------------------------------------------------------------------- @@ -244,34 +341,41 @@ public: #define wxCalendarNameStr "CalendarCtrl" -#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) - #define wxHAS_NATIVE_CALENDARCTRL - #include "wx/gtk/calctrl.h" - #define wxCalendarCtrl wxGtkCalendarCtrl -#else +#ifndef __WXUNIVERSAL__ + #if defined(__WXGTK20__) + #define wxHAS_NATIVE_CALENDARCTRL + #include "wx/gtk/calctrl.h" + #define wxCalendarCtrl wxGtkCalendarCtrl + #elif defined(__WXMSW__) + #define wxHAS_NATIVE_CALENDARCTRL + #include "wx/msw/calctrl.h" + #endif +#endif // !__WXUNIVERSAL__ + +#ifndef wxHAS_NATIVE_CALENDARCTRL #include "wx/generic/calctrlg.h" #define wxCalendarCtrl wxGenericCalendarCtrl #endif - // ---------------------------------------------------------------------------- // calendar event types and macros for handling them // ---------------------------------------------------------------------------- -extern WXDLLIMPEXP_ADV const wxEventType wxEVT_CALENDAR_SEL_CHANGED; -extern WXDLLIMPEXP_ADV const wxEventType wxEVT_CALENDAR_PAGE_CHANGED; -extern WXDLLIMPEXP_ADV const wxEventType wxEVT_CALENDAR_DOUBLECLICKED; -extern WXDLLIMPEXP_ADV const wxEventType wxEVT_CALENDAR_WEEKDAY_CLICKED; +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_PAGE_CHANGED, wxCalendarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_DOUBLECLICKED, wxCalendarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_WEEKDAY_CLICKED, wxCalendarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_WEEK_CLICKED, wxCalendarEvent ); // deprecated events -extern WXDLLIMPEXP_ADV const wxEventType wxEVT_CALENDAR_DAY_CHANGED; -extern WXDLLIMPEXP_ADV const wxEventType wxEVT_CALENDAR_MONTH_CHANGED; -extern WXDLLIMPEXP_ADV const wxEventType wxEVT_CALENDAR_YEAR_CHANGED; +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_DAY_CHANGED, wxCalendarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_MONTH_CHANGED, wxCalendarEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_CALENDAR_YEAR_CHANGED, wxCalendarEvent ); typedef void (wxEvtHandler::*wxCalendarEventFunction)(wxCalendarEvent&); #define wxCalendarEventHandler(func) \ - (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxCalendarEventFunction, &func) + wxEVENT_HANDLER_CAST(wxCalendarEventFunction, func) #define wx__DECLARE_CALEVT(evt, id, fn) \ wx__DECLARE_EVT1(wxEVT_CALENDAR_ ## evt, id, wxCalendarEventHandler(fn)) @@ -280,6 +384,7 @@ typedef void (wxEvtHandler::*wxCalendarEventFunction)(wxCalendarEvent&); #define EVT_CALENDAR_SEL_CHANGED(id, fn) wx__DECLARE_CALEVT(SEL_CHANGED, id, fn) #define EVT_CALENDAR_PAGE_CHANGED(id, fn) wx__DECLARE_CALEVT(PAGE_CHANGED, id, fn) #define EVT_CALENDAR_WEEKDAY_CLICKED(id, fn) wx__DECLARE_CALEVT(WEEKDAY_CLICKED, id, fn) +#define EVT_CALENDAR_WEEK_CLICKED(id, fn) wx__DECLARE_CALEVT(WEEK_CLICKED, id, fn) // deprecated events #define EVT_CALENDAR_DAY(id, fn) wx__DECLARE_CALEVT(DAY_CHANGED, id, fn)