1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/calctrl.h
3 // Purpose:     date-picker control
4 // Author:      Vadim Zeitlin
5 // Modified by:
6 // Created:     29.12.99
7 // RCS-ID:      $Id: calctrl.h 53135 2008-04-12 02:31:04Z VZ $
8 // Copyright:   (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence:     wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11 
12 /*
13    TODO
14 
15    1. implement multiple selections for date ranges
16    2. background bitmap for the calendar?
17  */
18 
19 #ifndef _WX_CALCTRL_H_
20 #define _WX_CALCTRL_H_
21 
22 #include "wx/defs.h"
23 
24 #if wxUSE_CALENDARCTRL
25 
26 #include "wx/dateevt.h"
27 #include "wx/colour.h"
28 #include "wx/font.h"
29 
30 // ----------------------------------------------------------------------------
31 // wxCalendarCtrl flags
32 // ----------------------------------------------------------------------------
33 
34 enum
35 {
36     // show Sunday as the first day of the week (default)
37     wxCAL_SUNDAY_FIRST               = 0x0000,
38 
39     // show Monder as the first day of the week
40     wxCAL_MONDAY_FIRST               = 0x0001,
41 
42     // highlight holidays
43     wxCAL_SHOW_HOLIDAYS              = 0x0002,
44 
45     // disable the year change control, show only the month change one
46     wxCAL_NO_YEAR_CHANGE             = 0x0004,
47 
48     // don't allow changing neither month nor year (implies
49     // wxCAL_NO_YEAR_CHANGE)
50     wxCAL_NO_MONTH_CHANGE            = 0x000c,
51 
52     // use MS-style month-selection instead of combo-spin combination
53     wxCAL_SEQUENTIAL_MONTH_SELECTION = 0x0010,
54 
55     // show the neighbouring weeks in the previous and next month
56     wxCAL_SHOW_SURROUNDING_WEEKS     = 0x0020
57 };
58 
59 // ----------------------------------------------------------------------------
60 // constants
61 // ----------------------------------------------------------------------------
62 
63 // return values for the HitTest() method
64 enum wxCalendarHitTestResult
65 {
66     wxCAL_HITTEST_NOWHERE,      // outside of anything
67     wxCAL_HITTEST_HEADER,       // on the header (weekdays)
68     wxCAL_HITTEST_DAY,          // on a day in the calendar
69     wxCAL_HITTEST_INCMONTH,
70     wxCAL_HITTEST_DECMONTH,
71     wxCAL_HITTEST_SURROUNDING_WEEK
72 };
73 
74 // border types for a date
75 enum wxCalendarDateBorder
76 {
77     wxCAL_BORDER_NONE,          // no border (default)
78     wxCAL_BORDER_SQUARE,        // a rectangular border
79     wxCAL_BORDER_ROUND          // a round border
80 };
81 
82 // ----------------------------------------------------------------------------
83 // wxCalendarDateAttr: custom attributes for a calendar date
84 // ----------------------------------------------------------------------------
85 
86 class WXDLLIMPEXP_ADV wxCalendarDateAttr
87 {
88 #if !defined(__VISAGECPP__)
89 protected:
90     // This has to be before the use of Init(), for MSVC++ 1.5
91     // But dorks up Visualage!
92     void Init(wxCalendarDateBorder border = wxCAL_BORDER_NONE)
93     {
94         m_border = border;
95         m_holiday = false;
96     }
97 #endif
98 public:
99     // ctors
wxCalendarDateAttr()100     wxCalendarDateAttr() { Init(); }
101     wxCalendarDateAttr(const wxColour& colText,
102                        const wxColour& colBack = wxNullColour,
103                        const wxColour& colBorder = wxNullColour,
104                        const wxFont& font = wxNullFont,
105                        wxCalendarDateBorder border = wxCAL_BORDER_NONE)
m_colText(colText)106         : m_colText(colText), m_colBack(colBack),
107           m_colBorder(colBorder), m_font(font)
108     {
109         Init(border);
110     }
111     wxCalendarDateAttr(wxCalendarDateBorder border,
112                        const wxColour& colBorder = wxNullColour)
m_colBorder(colBorder)113         : m_colBorder(colBorder)
114     {
115         Init(border);
116     }
117 
118     // setters
SetTextColour(const wxColour & colText)119     void SetTextColour(const wxColour& colText) { m_colText = colText; }
SetBackgroundColour(const wxColour & colBack)120     void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; }
SetBorderColour(const wxColour & col)121     void SetBorderColour(const wxColour& col) { m_colBorder = col; }
SetFont(const wxFont & font)122     void SetFont(const wxFont& font) { m_font = font; }
SetBorder(wxCalendarDateBorder border)123     void SetBorder(wxCalendarDateBorder border) { m_border = border; }
SetHoliday(bool holiday)124     void SetHoliday(bool holiday) { m_holiday = holiday; }
125 
126     // accessors
HasTextColour()127     bool HasTextColour() const { return m_colText.Ok(); }
HasBackgroundColour()128     bool HasBackgroundColour() const { return m_colBack.Ok(); }
HasBorderColour()129     bool HasBorderColour() const { return m_colBorder.Ok(); }
HasFont()130     bool HasFont() const { return m_font.Ok(); }
HasBorder()131     bool HasBorder() const { return m_border != wxCAL_BORDER_NONE; }
132 
IsHoliday()133     bool IsHoliday() const { return m_holiday; }
134 
GetTextColour()135     const wxColour& GetTextColour() const { return m_colText; }
GetBackgroundColour()136     const wxColour& GetBackgroundColour() const { return m_colBack; }
GetBorderColour()137     const wxColour& GetBorderColour() const { return m_colBorder; }
GetFont()138     const wxFont& GetFont() const { return m_font; }
GetBorder()139     wxCalendarDateBorder GetBorder() const { return m_border; }
140 #if defined(__VISAGECPP__)
141 protected:
142     // This has to be here for VisualAge
143     void Init(wxCalendarDateBorder border = wxCAL_BORDER_NONE)
144     {
145         m_border = border;
146         m_holiday = false;
147     }
148 #endif
149 private:
150     wxColour m_colText,
151              m_colBack,
152              m_colBorder;
153     wxFont   m_font;
154     wxCalendarDateBorder m_border;
155     bool m_holiday;
156 };
157 
158 // ----------------------------------------------------------------------------
159 // wxCalendarCtrl events
160 // ----------------------------------------------------------------------------
161 
162 class WXDLLIMPEXP_FWD_ADV wxCalendarCtrl;
163 
164 class WXDLLIMPEXP_ADV wxCalendarEvent : public wxDateEvent
165 {
166 friend class wxCalendarCtrl;
167 public:
wxCalendarEvent()168     wxCalendarEvent() { Init(); }
169     inline wxCalendarEvent(wxCalendarCtrl *cal, wxEventType type);
170 
SetWeekDay(const wxDateTime::WeekDay wd)171     void SetWeekDay(const wxDateTime::WeekDay wd) { m_wday = wd; }
GetWeekDay()172     wxDateTime::WeekDay GetWeekDay() const { return m_wday; }
173 
174 protected:
Init()175     void Init()
176     {
177         m_wday = wxDateTime::Inv_WeekDay;
178     }
179 
180 private:
181     wxDateTime::WeekDay m_wday;
182 
183     DECLARE_DYNAMIC_CLASS_NO_COPY(wxCalendarEvent)
184 };
185 
186 // ----------------------------------------------------------------------------
187 // wxCalendarCtrl
188 // ----------------------------------------------------------------------------
189 
190 // so far we only have a generic version, so keep it simple
191 #include "wx/generic/calctrl.h"
192 
193 
194 // now we can define the inline ctor using wxCalendarCtrl
195 inline
wxCalendarEvent(wxCalendarCtrl * cal,wxEventType type)196 wxCalendarEvent::wxCalendarEvent(wxCalendarCtrl *cal, wxEventType type)
197                : wxDateEvent(cal, cal->GetDate(), type)
198 {
199 }
200 
201 // ----------------------------------------------------------------------------
202 // calendar event types and macros for handling them
203 // ----------------------------------------------------------------------------
204 
205 BEGIN_DECLARE_EVENT_TYPES()
206     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALENDAR_SEL_CHANGED, 950)
207     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALENDAR_DAY_CHANGED, 951)
208     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALENDAR_MONTH_CHANGED, 952)
209     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALENDAR_YEAR_CHANGED, 953)
210     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALENDAR_DOUBLECLICKED, 954)
211     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALENDAR_WEEKDAY_CLICKED, 955)
212 END_DECLARE_EVENT_TYPES()
213 
214 typedef void (wxEvtHandler::*wxCalendarEventFunction)(wxCalendarEvent&);
215 
216 #define wxCalendarEventHandler(func) \
217     (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxCalendarEventFunction, &func)
218 
219 #define wx__DECLARE_CALEVT(evt, id, fn) \
220     wx__DECLARE_EVT1(wxEVT_CALENDAR_ ## evt, id, wxCalendarEventHandler(fn))
221 
222 #define EVT_CALENDAR(id, fn) wx__DECLARE_CALEVT(DOUBLECLICKED, id, fn)
223 #define EVT_CALENDAR_SEL_CHANGED(id, fn) wx__DECLARE_CALEVT(SEL_CHANGED, id, fn)
224 #define EVT_CALENDAR_DAY(id, fn) wx__DECLARE_CALEVT(DAY_CHANGED, id, fn)
225 #define EVT_CALENDAR_MONTH(id, fn) wx__DECLARE_CALEVT(MONTH_CHANGED, id, fn)
226 #define EVT_CALENDAR_YEAR(id, fn) wx__DECLARE_CALEVT(YEAR_CHANGED, id, fn)
227 #define EVT_CALENDAR_WEEKDAY_CLICKED(id, fn) wx__DECLARE_CALEVT(WEEKDAY_CLICKED, id, fn)
228 
229 #endif // wxUSE_CALENDARCTRL
230 
231 #endif // _WX_CALCTRL_H_
232 
233