]> git.saurik.com Git - wxWidgets.git/blame - src/gtk/calctrl.cpp
pure CF code
[wxWidgets.git] / src / gtk / calctrl.cpp
CommitLineData
628e155d
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: src/gtk/calctrl.cpp
3// Purpose: implementation of the wxGtkCalendarCtrl
4// Author: Marcin Wojdyr
5// RCS-ID: $Id$
6// Copyright: (c) 2008 Marcin Wojdyr
7// Licence: wxWindows licence
8///////////////////////////////////////////////////////////////////////////////
9
10#include "wx/wxprec.h"
11
12#ifdef __BORLANDC__
13 #pragma hdrstop
14#endif
15
16#ifndef WX_PRECOMP
17#endif //WX_PRECOMP
18
19#if wxUSE_CALENDARCTRL
20
21#include "wx/gtk/private.h"
22#include "wx/calctrl.h"
23#include "wx/gtk/calctrl.h"
24
25
26extern "C" {
27
28static void gtk_day_selected_callback(GtkWidget *WXUNUSED(widget),
29 wxGtkCalendarCtrl *cal)
30{
7b0ccb8a
RR
31 wxDateTime date = cal->GetDate();
32 if (cal->m_selectedDate == date)
33 return;
34
35 cal->m_selectedDate = date;
36
628e155d 37 cal->GenerateEvent(wxEVT_CALENDAR_SEL_CHANGED);
7b0ccb8a 38 // send deprecated event
628e155d
VZ
39 cal->GenerateEvent(wxEVT_CALENDAR_DAY_CHANGED);
40}
41
42static void gtk_day_selected_double_click_callback(GtkWidget *WXUNUSED(widget),
43 wxGtkCalendarCtrl *cal)
44{
45 cal->GenerateEvent(wxEVT_CALENDAR_DOUBLECLICKED);
46}
47
48static void gtk_month_changed_callback(GtkWidget *WXUNUSED(widget),
49 wxGtkCalendarCtrl *cal)
50{
51 cal->GenerateEvent(wxEVT_CALENDAR_PAGE_CHANGED);
52}
53
54// callbacks that send deprecated events
55
56static void gtk_prev_month_callback(GtkWidget *WXUNUSED(widget),
57 wxGtkCalendarCtrl *cal)
58{
59 cal->GenerateEvent(wxEVT_CALENDAR_MONTH_CHANGED);
60}
61
62static void gtk_prev_year_callback(GtkWidget *WXUNUSED(widget),
63 wxGtkCalendarCtrl *cal)
64{
65 cal->GenerateEvent(wxEVT_CALENDAR_YEAR_CHANGED);
66}
67
68}
69
70// ----------------------------------------------------------------------------
71// wxGtkCalendarCtrl
72// ----------------------------------------------------------------------------
73
74
75bool wxGtkCalendarCtrl::Create(wxWindow *parent,
76 wxWindowID id,
77 const wxDateTime& date,
78 const wxPoint& pos,
79 const wxSize& size,
80 long style,
81 const wxString& name)
82{
83 if (!PreCreation(parent, pos, size) ||
84 !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name))
85 {
86 wxFAIL_MSG(wxT("wxGtkCalendarCtrl creation failed"));
87 return false;
88 }
89
90 m_widget = gtk_calendar_new();
91 SetDate(date.IsValid() ? date : wxDateTime::Today());
92
93 if (style & wxCAL_NO_MONTH_CHANGE)
94 g_object_set (G_OBJECT (m_widget), "no-month-change", true, NULL);
7b0ccb8a
RR
95 if (style & wxCAL_SHOW_WEEK_NUMBERS)
96 g_object_set (G_OBJECT (m_widget), "show-week-numbers", true, NULL);
628e155d
VZ
97
98 g_signal_connect_after(m_widget, "day-selected",
99 G_CALLBACK (gtk_day_selected_callback),
100 this);
101 g_signal_connect_after(m_widget, "day-selected-double-click",
102 G_CALLBACK (gtk_day_selected_double_click_callback),
103 this);
104 g_signal_connect_after(m_widget, "month-changed",
105 G_CALLBACK (gtk_month_changed_callback),
106 this);
107
108 // connect callbacks that send deprecated events
109 g_signal_connect_after(m_widget, "prev-month",
110 G_CALLBACK (gtk_prev_month_callback),
111 this);
112 g_signal_connect_after(m_widget, "next-month",
113 G_CALLBACK (gtk_prev_month_callback),
114 this);
115 g_signal_connect_after(m_widget, "prev-year",
116 G_CALLBACK (gtk_prev_year_callback),
117 this);
118 g_signal_connect_after(m_widget, "next-year",
119 G_CALLBACK (gtk_prev_year_callback),
120 this);
121
122 m_parent->DoAddChild(this);
123
124 PostCreation(size);
125
126 return true;
127}
128
129bool wxGtkCalendarCtrl::EnableMonthChange(bool enable)
130{
131 if ( !wxCalendarCtrlBase::EnableMonthChange(enable) )
132 return false;
133
134 g_object_set (G_OBJECT (m_widget), "no-month-change", !enable, NULL);
135
136 return true;
137}
138
7b0ccb8a 139
628e155d
VZ
140bool wxGtkCalendarCtrl::SetDate(const wxDateTime& date)
141{
7b0ccb8a
RR
142 g_signal_handlers_block_by_func(m_widget,
143 (gpointer) gtk_day_selected_callback, this);
144
145 m_selectedDate = date;
628e155d
VZ
146 int year = date.GetYear();
147 int month = date.GetMonth();
148 int day = date.GetDay();
149 gtk_calendar_select_month(GTK_CALENDAR(m_widget), month, year);
150 gtk_calendar_select_day(GTK_CALENDAR(m_widget), day);
7b0ccb8a
RR
151
152 g_signal_handlers_unblock_by_func( m_widget,
153 (gpointer) gtk_day_selected_callback, this);
154
628e155d
VZ
155 return true;
156}
157
158wxDateTime wxGtkCalendarCtrl::GetDate() const
159{
160 guint year, month, day;
161 gtk_calendar_get_date(GTK_CALENDAR(m_widget), &year, &month, &day);
162 return wxDateTime(day, (wxDateTime::Month) month, year);
163}
164
165void wxGtkCalendarCtrl::Mark(size_t day, bool mark)
166{
167 if (mark)
168 gtk_calendar_mark_day(GTK_CALENDAR(m_widget), day);
169 else
170 gtk_calendar_unmark_day(GTK_CALENDAR(m_widget), day);
171}
172
173IMPLEMENT_DYNAMIC_CLASS(wxGtkCalendarCtrl, wxControl)
174
175
176#endif // wxUSE_CALENDARCTRL