]> git.saurik.com Git - wxWidgets.git/blob - wxPython/src/calendar.i
memory dc must have bitmap selected into it before it can be used for measuring
[wxWidgets.git] / wxPython / src / calendar.i
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: calendar.i
3 // Purpose: SWIG definitions for the wxCalendarCtrl
4 //
5 // Author: Robin Dunn
6 //
7 // Created: 23-May-2000
8 // RCS-ID: $Id$
9 // Copyright: (c) 2000 by Total Control Software
10 // Licence: wxWindows license
11 /////////////////////////////////////////////////////////////////////////////
12
13 %define DOCSTRING
14 "Classes for an interactive Calendar control."
15 %enddef
16
17 %module(package="wx", docstring=DOCSTRING) calendar
18
19
20 %{
21 #include "wx/wxPython/wxPython.h"
22 #include "wx/wxPython/pyclasses.h"
23
24 #include <wx/calctrl.h>
25 %}
26
27 //----------------------------------------------------------------------
28
29 %import misc.i
30 %pythoncode { wx = _core }
31 %pythoncode { __docfilter__ = wx.__DocFilter(globals()) }
32
33 //---------------------------------------------------------------------------
34
35 enum {
36 wxCAL_SUNDAY_FIRST,
37 wxCAL_MONDAY_FIRST,
38 wxCAL_SHOW_HOLIDAYS,
39 wxCAL_NO_YEAR_CHANGE,
40 wxCAL_NO_MONTH_CHANGE,
41 wxCAL_SEQUENTIAL_MONTH_SELECTION,
42 wxCAL_SHOW_SURROUNDING_WEEKS,
43 };
44
45
46 enum wxCalendarHitTestResult
47 {
48 wxCAL_HITTEST_NOWHERE, // outside of anything
49 wxCAL_HITTEST_HEADER, // on the header (weekdays)
50 wxCAL_HITTEST_DAY, // on a day in the calendar
51 wxCAL_HITTEST_INCMONTH,
52 wxCAL_HITTEST_DECMONTH,
53 wxCAL_HITTEST_SURROUNDING_WEEK
54 };
55
56 // border types for a date
57 enum wxCalendarDateBorder
58 {
59 wxCAL_BORDER_NONE, // no border (default)
60 wxCAL_BORDER_SQUARE, // a rectangular border
61 wxCAL_BORDER_ROUND // a round border
62 };
63
64 //---------------------------------------------------------------------------
65
66 DocStr(wxCalendarDateAttr,
67 "A set of customization attributes for a calendar date, which can be
68 used to control the look of the Calendar object.", "");
69
70 class wxCalendarDateAttr
71 {
72 public:
73 DocStr(wxCalendarDateAttr,
74 "Create a CalendarDateAttr.", "");
75 wxCalendarDateAttr(const wxColour& colText = wxNullColour,
76 const wxColour& colBack = wxNullColour,
77 const wxColour& colBorder = wxNullColour,
78 const wxFont& font = wxNullFont,
79 wxCalendarDateBorder border = wxCAL_BORDER_NONE);
80
81
82 // setters
83 void SetTextColour(const wxColour& colText);
84 void SetBackgroundColour(const wxColour& colBack);
85 void SetBorderColour(const wxColour& col);
86 void SetFont(const wxFont& font);
87 void SetBorder(wxCalendarDateBorder border);
88 void SetHoliday(bool holiday);
89
90 // accessors
91 bool HasTextColour() const;
92 bool HasBackgroundColour() const;
93 bool HasBorderColour() const;
94 bool HasFont() const;
95 bool HasBorder() const;
96
97 bool IsHoliday() const;
98
99 wxColour GetTextColour() const;
100 wxColour GetBackgroundColour() const;
101 wxColour GetBorderColour() const;
102 wxFont GetFont() const;
103 wxCalendarDateBorder GetBorder() const;
104 };
105
106 //---------------------------------------------------------------------------
107
108 class wxCalendarCtrl;
109
110 class wxCalendarEvent : public wxDateEvent
111 {
112 public:
113 wxCalendarEvent(wxCalendarCtrl *cal, wxEventType type);
114
115 void SetWeekDay(const wxDateTime::WeekDay wd);
116 wxDateTime::WeekDay GetWeekDay() const;
117
118 %pythoncode {
119 def PySetDate(self, date):
120 """takes datetime.datetime or datetime.date object"""
121 self.SetDate(_pydate2wxdate(date))
122
123 def PyGetDate(self):
124 """returns datetime.date object"""
125 return _wxdate2pydate(self.GetDate())
126 }
127 };
128
129
130 %constant wxEventType wxEVT_CALENDAR_DOUBLECLICKED;
131 %constant wxEventType wxEVT_CALENDAR_SEL_CHANGED;
132 %constant wxEventType wxEVT_CALENDAR_DAY_CHANGED;
133 %constant wxEventType wxEVT_CALENDAR_MONTH_CHANGED;
134 %constant wxEventType wxEVT_CALENDAR_YEAR_CHANGED;
135 %constant wxEventType wxEVT_CALENDAR_WEEKDAY_CLICKED;
136
137
138 %pythoncode {
139 EVT_CALENDAR = wx.PyEventBinder( wxEVT_CALENDAR_DOUBLECLICKED, 1)
140 EVT_CALENDAR_SEL_CHANGED = wx.PyEventBinder( wxEVT_CALENDAR_SEL_CHANGED, 1)
141 EVT_CALENDAR_DAY = wx.PyEventBinder( wxEVT_CALENDAR_DAY_CHANGED, 1)
142 EVT_CALENDAR_MONTH = wx.PyEventBinder( wxEVT_CALENDAR_MONTH_CHANGED, 1)
143 EVT_CALENDAR_YEAR = wx.PyEventBinder( wxEVT_CALENDAR_YEAR_CHANGED, 1)
144 EVT_CALENDAR_WEEKDAY_CLICKED = wx.PyEventBinder( wxEVT_CALENDAR_WEEKDAY_CLICKED, 1)
145 }
146
147
148 //---------------------------------------------------------------------------
149
150 MAKE_CONST_WXSTRING(CalendarNameStr);
151
152
153 DocStr(wxCalendarCtrl,
154 "The calendar control allows the user to pick a date interactively.
155
156 The CalendarCtrl displays a window containing several parts: the
157 control to pick the month and the year at the top (either or both of
158 them may be disabled) and a month area below them which shows all the
159 days in the month. The user can move the current selection using the
160 keyboard and select the date (generating EVT_CALENDAR event) by
161 pressing <Return> or double clicking it.
162
163 It has advanced possibilities for the customization of its
164 display. All global settings (such as colours and fonts used) can, of
165 course, be changed. But also, the display style for each day in the
166 month can be set independently using CalendarDateAttr class.
167
168 An item without custom attributes is drawn with the default colours
169 and font and without border, but setting custom attributes with
170 SetAttr allows to modify its appearance. Just create a custom
171 attribute object and set it for the day you want to be displayed
172 specially A day may be marked as being a holiday, (even if it is not
173 recognized as one by `wx.DateTime`) by using the SetHoliday method.
174
175 As the attributes are specified for each day, they may change when the
176 month is changed, so you will often want to update them in an
177 EVT_CALENDAR_MONTH event handler.", "
178
179 Window Styles
180 -------------
181 ============================== ============================
182 CAL_SUNDAY_FIRST Show Sunday as the first day
183 in the week
184 CAL_MONDAY_FIRST Show Monday as the first day
185 in the week
186 CAL_SHOW_HOLIDAYS Highlight holidays in the
187 calendar
188 CAL_NO_YEAR_CHANGE Disable the year changing
189 CAL_NO_MONTH_CHANGE Disable the month (and,
190 implicitly, the year) changing
191 CAL_SHOW_SURROUNDING_WEEKS Show the neighbouring weeks in
192 the previous and next months
193 CAL_SEQUENTIAL_MONTH_SELECTION Use alternative, more compact,
194 style for the month and year
195 selection controls.
196 ============================== ============================
197
198 The default calendar style is CAL_SHOW_HOLIDAYS.
199
200 Events
201 -------
202 ============================= ==============================
203 EVT_CALENDAR A day was double clicked in the
204 calendar.
205 EVT_CALENDAR_SEL_CHANGED The selected date changed.
206 EVT_CALENDAR_DAY The selected day changed.
207 EVT_CALENDAR_MONTH The selected month changed.
208 EVT_CALENDAR_YEAR The selected year changed.
209 EVT_CALENDAR_WEEKDAY_CLICKED User clicked on the week day
210 header
211 ============================= ==============================
212
213 Note that changing the selected date will result in one of
214 EVT_CALENDAR_DAY, MONTH or YEAR events and an EVT_CALENDAR_SEL_CHANGED
215 event.
216
217 ");
218
219
220 MustHaveApp(wxCalendarCtrl);
221
222 class wxCalendarCtrl : public wxControl
223 {
224 public:
225 %pythonAppend wxCalendarCtrl "self._setOORInfo(self)"
226 %pythonAppend wxCalendarCtrl() ""
227
228 DocCtorStr(
229 wxCalendarCtrl(wxWindow *parent,
230 wxWindowID id=-1,
231 const wxDateTime& date = wxDefaultDateTime,
232 const wxPoint& pos = wxDefaultPosition,
233 const wxSize& size = wxDefaultSize,
234 long style = wxCAL_SHOW_HOLIDAYS | wxWANTS_CHARS,
235 const wxString& name = wxPyCalendarNameStr),
236 "Create and show a calendar control.", "");
237
238 DocCtorStrName(
239 wxCalendarCtrl(),
240 "Precreate a CalendarCtrl for 2-phase creation.", "",
241 PreCalendarCtrl);
242
243 DocDeclStr(
244 bool , Create(wxWindow *parent,
245 wxWindowID id,
246 const wxDateTime& date = wxDefaultDateTime,
247 const wxPoint& pos = wxDefaultPosition,
248 const wxSize& size = wxDefaultSize,
249 long style = wxCAL_SHOW_HOLIDAYS | wxWANTS_CHARS,
250 const wxString& name = wxPyCalendarNameStr),
251 "Acutally create the GUI portion of the CalendarCtrl for 2-phase
252 creation.", "");
253
254
255
256 DocDeclStr(
257 void, SetDate(const wxDateTime& date),
258 "Sets the current date.", "");
259
260 DocDeclStr(
261 const wxDateTime, GetDate() const,
262 "Gets the currently selected date.", "");
263
264
265
266 DocDeclStr(
267 bool, SetLowerDateLimit(const wxDateTime& date = wxDefaultDateTime),
268 "set the range in which selection can occur", "");
269
270 DocDeclStr(
271 bool, SetUpperDateLimit(const wxDateTime& date = wxDefaultDateTime),
272 "set the range in which selection can occur", "");
273
274 DocDeclStr(
275 const wxDateTime, GetLowerDateLimit() const,
276 "get the range in which selection can occur", "");
277
278 DocDeclStr(
279 const wxDateTime, GetUpperDateLimit() const,
280 "get the range in which selection can occur", "");
281
282 DocDeclStr(
283 bool, SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime,
284 const wxDateTime& upperdate = wxDefaultDateTime),
285 "set the range in which selection can occur", "");
286
287
288
289
290 DocDeclStr(
291 void, EnableYearChange(bool enable = true),
292 "This function should be used instead of changing CAL_NO_YEAR_CHANGE
293 style bit directly. It allows or disallows the user to change the year
294 interactively.", "");
295
296 DocDeclStr(
297 void, EnableMonthChange(bool enable = true),
298 "This function should be used instead of changing CAL_NO_MONTH_CHANGE
299 style bit. It allows or disallows the user to change the month
300 interactively. Note that if the month can not be changed, the year can
301 not be changed either.", "");
302
303 DocDeclStr(
304 void, EnableHolidayDisplay(bool display = true),
305 "This function should be used instead of changing CAL_SHOW_HOLIDAYS
306 style bit directly. It enables or disables the special highlighting of
307 the holidays.", "");
308
309
310
311 DocDeclStr(
312 void, SetHeaderColours(const wxColour& colFg, const wxColour& colBg),
313 "Header colours are used for painting the weekdays at the top.", "");
314
315 DocDeclStr(
316 wxColour, GetHeaderColourFg() const,
317 "Header colours are used for painting the weekdays at the top.", "");
318
319 DocDeclStr(
320 wxColour, GetHeaderColourBg() const,
321 "Header colours are used for painting the weekdays at the top.", "");
322
323
324
325 DocDeclStr(
326 void, SetHighlightColours(const wxColour& colFg, const wxColour& colBg),
327 "Highlight colour is used for the currently selected date.", "");
328
329 DocDeclStr(
330 wxColour, GetHighlightColourFg() const,
331 "Highlight colour is used for the currently selected date.", "");
332
333 DocDeclStr(
334 wxColour, GetHighlightColourBg() const,
335 "Highlight colour is used for the currently selected date.", "");
336
337
338
339 DocDeclStr(
340 void, SetHolidayColours(const wxColour& colFg, const wxColour& colBg),
341 "Holiday colour is used for the holidays (if CAL_SHOW_HOLIDAYS style is
342 used).", "");
343
344 DocDeclStr(
345 wxColour, GetHolidayColourFg() const,
346 "Holiday colour is used for the holidays (if CAL_SHOW_HOLIDAYS style is
347 used).", "");
348
349 DocDeclStr(
350 wxColour, GetHolidayColourBg() const,
351 "Holiday colour is used for the holidays (if CAL_SHOW_HOLIDAYS style is
352 used).", "");
353
354
355
356 DocDeclStr(
357 wxCalendarDateAttr*, GetAttr(size_t day) const,
358 "Returns the attribute for the given date (should be in the range
359 1...31). The returned value may be None", "");
360
361 DocDeclStr(
362 void, SetAttr(size_t day, wxCalendarDateAttr *attr),
363 "Associates the attribute with the specified date (in the range
364 1...31). If the attribute passed is None, the items attribute is
365 cleared.", "");
366
367 DocDeclStr(
368 void, SetHoliday(size_t day),
369 "Marks the specified day as being a holiday in the current month.", "");
370
371 DocDeclStr(
372 void, ResetAttr(size_t day),
373 "Clears any attributes associated with the given day (in the range
374 1...31).", "");
375
376
377
378 DocAStr(HitTest,
379 "HitTest(Point pos) -> (result, date, weekday)",
380 "Returns 3-tuple with information about the given position on the
381 calendar control. The first value of the tuple is a result code and
382 determines the validity of the remaining two values.",
383 "
384 The result codes are:
385
386 =================== ============================================
387 CAL_HITTEST_NOWHERE hit outside of anything
388 CAL_HITTEST_HEADER hit on the header, weekday is valid
389 CAL_HITTEST_DAY hit on a day in the calendar, date is set.
390 =================== ============================================
391 ");
392 %extend {
393 PyObject* HitTest(const wxPoint& pos) {
394 wxDateTime* date = new wxDateTime;
395 wxDateTime::WeekDay wd;
396 wxCalendarHitTestResult result = self->HitTest(pos, date, &wd);
397 wxPyBlock_t blocked = wxPyBeginBlockThreads();
398 PyObject* tup = PyTuple_New(3);
399 PyTuple_SET_ITEM(tup, 0, PyInt_FromLong(result));
400 PyTuple_SET_ITEM(tup, 1, wxPyConstructObject(date, wxT("wxDateTime"), 1));
401 PyTuple_SET_ITEM(tup, 2, PyInt_FromLong(wd));
402 wxPyEndBlockThreads(blocked);
403 return tup;
404 }
405 }
406
407 DocDeclStr(
408 wxControl*, GetMonthControl() const,
409 "Get the currently shown control for month.", "");
410
411 DocDeclStr(
412 wxControl*, GetYearControl() const,
413 "Get the currently shown control for year.", "");
414
415 static wxVisualAttributes
416 GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
417
418 %pythoncode {
419 def PySetDate(self, date):
420 """takes datetime.datetime or datetime.date object"""
421 self.SetDate(_pydate2wxdate(date))
422
423 def PyGetDate(self):
424 """returns datetime.date object"""
425 return _wxdate2pydate(self.GetDate())
426
427 def PySetLowerDateLimit(self, date):
428 """takes datetime.datetime or datetime.date object"""
429 self.SetLowerDateLimit(_pydate2wxdate(date))
430
431 def PySetUpperDateLimit(self, date):
432 """takes datetime.datetime or datetime.date object"""
433 self.SetUpperDateLimit(_pydate2wxdate(date))
434
435 def PySetDateRange(self, lowerdate, upperdate):
436 """takes datetime.datetime or datetime.date objects"""
437 self.PySetLowerDateLimit(lowerdate)
438 self.PySetUpperDateLimit(upperdate)
439
440 def PyGetLowerDateLimit(self):
441 """returns datetime.date object"""
442 return _wxdate2pydate(self.GetLowerDateLimit())
443
444 def PyGetUpperDateLimit(self):
445 """returns datetime.date object"""
446 return _wxdate2pydate(self.GetUpperDateLimit())
447 }
448 };
449
450 %pythoncode {
451 def _pydate2wxdate(date):
452 import datetime
453 assert isinstance(date, (datetime.datetime, datetime.date))
454 tt = date.timetuple()
455 dmy = (tt[2], tt[1]-1, tt[0])
456 return wx.DateTimeFromDMY(*dmy)
457
458 def _wxdate2pydate(date):
459 import datetime
460 assert isinstance(date, wx.DateTime)
461 if date.IsValid():
462 ymd = map(int, date.FormatISODate().split('-'))
463 return datetime.date(*ymd)
464 else:
465 return None
466 }
467
468 //---------------------------------------------------------------------------
469
470 %init %{
471 %}
472
473 //---------------------------------------------------------------------------
474