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