]> git.saurik.com Git - wxWidgets.git/blame - samples/calendar/calendar.cpp
Moved the cleanup code to an EVT_WINDOW_DESTROY handler.
[wxWidgets.git] / samples / calendar / calendar.cpp
CommitLineData
74a533f7
VZ
1/////////////////////////////////////////////////////////////////////////////
2// Name: calendar.cpp
3// Purpose: wxCalendarCtrl sample
4// Author: Vadim Zeitlin
4e6bceff 5// Modified by:
74a533f7
VZ
6// Created: 02.01.00
7// RCS-ID: $Id$
8// Copyright: (c) Vadim Zeitlin
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20#ifdef __GNUG__
21 #pragma implementation "calendar.cpp"
22 #pragma interface "calendar.cpp"
23#endif
24
25// For compilers that support precompilation, includes "wx/wx.h".
26#include "wx/wxprec.h"
27
28#ifdef __BORLANDC__
29 #pragma hdrstop
30#endif
31
273b7ed9 32// for all others, include the necessary headers
74a533f7
VZ
33#ifndef WX_PRECOMP
34 #include "wx/app.h"
35 #include "wx/frame.h"
273b7ed9
VZ
36 #include "wx/panel.h"
37 #include "wx/stattext.h"
38 #include "wx/menu.h"
39 #include "wx/layout.h"
40 #include "wx/msgdlg.h"
74a533f7
VZ
41#endif
42
43#include "wx/calctrl.h"
44
45// ----------------------------------------------------------------------------
46// private classes
47// ----------------------------------------------------------------------------
48
49// Define a new application type, each program should derive a class from wxApp
50class MyApp : public wxApp
51{
52public:
53 // override base class virtuals
54 // ----------------------------
55
56 // this one is called on application startup and is a good place for the app
57 // initialization (doing it here and not in the ctor allows to have an error
58 // return: if OnInit() returns false, the application terminates)
59 virtual bool OnInit();
60};
61
62class MyPanel : public wxPanel
63{
64public:
65 MyPanel(wxFrame *frame);
66
67 void OnCalendar(wxCalendarEvent& event);
68 void OnCalendarWeekDayClick(wxCalendarEvent& event);
69 void OnCalendarChange(wxCalendarEvent& event);
0de868d9
VZ
70 void OnCalMonthChange(wxCalendarEvent& event);
71 void OnCalYearChange(wxCalendarEvent& event);
74a533f7 72
bc385ba9
VZ
73 wxCalendarCtrl *GetCal() const { return m_calendar; }
74
37df1f33
VZ
75 // turn on/off the specified style bit on the calendar control
76 void ToggleCalStyle(bool on, int style);
77
74a533f7
VZ
78 void HighlightSpecial(bool on);
79
80private:
81 wxCalendarCtrl *m_calendar;
82 wxStaticText *m_date;
83
84 DECLARE_EVENT_TABLE()
85};
86
87// Define a new frame type: this is going to be our main frame
88class MyFrame : public wxFrame
89{
90public:
91 // ctor(s)
92 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
93
94 // event handlers (these functions should _not_ be virtual)
95 void OnQuit(wxCommandEvent& event);
96 void OnAbout(wxCommandEvent& event);
97
98 void OnCalMonday(wxCommandEvent& event);
99 void OnCalHolidays(wxCommandEvent& event);
100 void OnCalSpecial(wxCommandEvent& event);
101
bc385ba9
VZ
102 void OnCalAllowMonth(wxCommandEvent& event);
103 void OnCalAllowYear(wxCommandEvent& event);
104
37df1f33
VZ
105 void OnCalSeqMonth(wxCommandEvent& event);
106 void OnCalShowSurroundingWeeks(wxCommandEvent& event);
107
bc385ba9
VZ
108 void OnAllowYearUpdate(wxUpdateUIEvent& event);
109
74a533f7
VZ
110private:
111 MyPanel *m_panel;
112
113 // any class wishing to process wxWindows events must use this macro
114 DECLARE_EVENT_TABLE()
115};
116
117// ----------------------------------------------------------------------------
118// constants
119// ----------------------------------------------------------------------------
120
121// IDs for the controls and the menu commands
122enum
123{
124 // menu items
125 Calendar_File_About = 100,
126 Calendar_File_Quit,
127 Calendar_Cal_Monday = 200,
128 Calendar_Cal_Holidays,
129 Calendar_Cal_Special,
bc385ba9
VZ
130 Calendar_Cal_Month,
131 Calendar_Cal_Year,
37df1f33
VZ
132 Calendar_Cal_SeqMonth,
133 Calendar_Cal_SurroundWeeks,
74a533f7
VZ
134 Calendar_CalCtrl = 1000,
135};
136
137// ----------------------------------------------------------------------------
138// event tables and other macros for wxWindows
139// ----------------------------------------------------------------------------
140
141// the event tables connect the wxWindows events with the functions (event
142// handlers) which process them. It can be also done at run-time, but for the
143// simple menu events like this the static method is much simpler.
144BEGIN_EVENT_TABLE(MyFrame, wxFrame)
145 EVT_MENU(Calendar_File_Quit, MyFrame::OnQuit)
146 EVT_MENU(Calendar_File_About, MyFrame::OnAbout)
147
148 EVT_MENU(Calendar_Cal_Monday, MyFrame::OnCalMonday)
149 EVT_MENU(Calendar_Cal_Holidays, MyFrame::OnCalHolidays)
150 EVT_MENU(Calendar_Cal_Special, MyFrame::OnCalSpecial)
bc385ba9
VZ
151
152 EVT_MENU(Calendar_Cal_Month, MyFrame::OnCalAllowMonth)
153 EVT_MENU(Calendar_Cal_Year, MyFrame::OnCalAllowYear)
154
37df1f33
VZ
155 EVT_MENU(Calendar_Cal_SeqMonth, MyFrame::OnCalSeqMonth)
156 EVT_MENU(Calendar_Cal_SurroundWeeks, MyFrame::OnCalShowSurroundingWeeks)
157
bc385ba9 158 EVT_UPDATE_UI(Calendar_Cal_Year, MyFrame::OnAllowYearUpdate)
74a533f7
VZ
159END_EVENT_TABLE()
160
161BEGIN_EVENT_TABLE(MyPanel, wxPanel)
162 EVT_CALENDAR (Calendar_CalCtrl, MyPanel::OnCalendar)
0de868d9
VZ
163 EVT_CALENDAR_MONTH (Calendar_CalCtrl, MyPanel::OnCalMonthChange)
164 EVT_CALENDAR_YEAR (Calendar_CalCtrl, MyPanel::OnCalYearChange)
74a533f7
VZ
165 EVT_CALENDAR_SEL_CHANGED(Calendar_CalCtrl, MyPanel::OnCalendarChange)
166 EVT_CALENDAR_WEEKDAY_CLICKED(Calendar_CalCtrl, MyPanel::OnCalendarWeekDayClick)
167END_EVENT_TABLE()
168
169// Create a new application object: this macro will allow wxWindows to create
170// the application object during program execution (it's better than using a
171// static object for many reasons) and also declares the accessor function
172// wxGetApp() which will return the reference of the right type (i.e. MyApp and
173// not wxApp)
174IMPLEMENT_APP(MyApp)
175
176// ============================================================================
177// implementation
178// ============================================================================
179
180// ----------------------------------------------------------------------------
181// the application class
182// ----------------------------------------------------------------------------
183
184// `Main program' equivalent: the program execution "starts" here
185bool MyApp::OnInit()
186{
187 // Create the main application window
bc385ba9 188 MyFrame *frame = new MyFrame("Calendar wxWindows sample",
4e6bceff 189 wxPoint(50, 50), wxSize(450, 340));
74a533f7 190
74a533f7 191 frame->Show(TRUE);
74a533f7
VZ
192
193 // success: wxApp::OnRun() will be called which will enter the main message
194 // loop and the application will run. If we returned FALSE here, the
195 // application would exit immediately.
196 return TRUE;
197}
198
199// ----------------------------------------------------------------------------
200// main frame
201// ----------------------------------------------------------------------------
202
203// frame constructor
204MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
205 : wxFrame((wxFrame *)NULL, -1, title, pos, size)
206{
207 // create a menu bar
208 wxMenu *menuFile = new wxMenu;
209
210 menuFile->Append(Calendar_File_About, "&About...\tCtrl-A", "Show about dialog");
211 menuFile->AppendSeparator();
212 menuFile->Append(Calendar_File_Quit, "E&xit\tAlt-X", "Quit this program");
213
214 wxMenu *menuCal = new wxMenu;
215 menuCal->Append(Calendar_Cal_Monday,
bc385ba9 216 "Monday &first weekday\tCtrl-F",
74a533f7
VZ
217 "Toggle between Mon and Sun as the first week day",
218 TRUE);
219 menuCal->Append(Calendar_Cal_Holidays, "Show &holidays\tCtrl-H",
220 "Toggle highlighting the holidays",
221 TRUE);
222 menuCal->Append(Calendar_Cal_Special, "Highlight &special dates\tCtrl-S",
223 "Test custom highlighting",
224 TRUE);
37df1f33
VZ
225 menuCal->Append(Calendar_Cal_SurroundWeeks,
226 "Show s&urrounding weeks\tCtrl-W",
227 "Show the neighbouring weeks in the prev/next month",
228 TRUE);
bc385ba9 229 menuCal->AppendSeparator();
37df1f33
VZ
230 menuCal->Append(Calendar_Cal_SeqMonth,
231 "To&ggle month selector style\tCtrl-G",
232 "Use another style for the calendar controls",
233 TRUE);
bc385ba9
VZ
234 menuCal->Append(Calendar_Cal_Month, "&Month can be changed\tCtrl-M",
235 "Allow changing the month in the calendar",
236 TRUE);
237 menuCal->Append(Calendar_Cal_Year, "&Year can be changed\tCtrl-Y",
238 "Allow changing the year in the calendar",
239 TRUE);
74a533f7
VZ
240
241 // now append the freshly created menu to the menu bar...
242 wxMenuBar *menuBar = new wxMenuBar;
243 menuBar->Append(menuFile, "&File");
244 menuBar->Append(menuCal, "&Calendar");
245
246 menuBar->Check(Calendar_Cal_Monday, TRUE);
247 menuBar->Check(Calendar_Cal_Holidays, TRUE);
bc385ba9
VZ
248 menuBar->Check(Calendar_Cal_Month, TRUE);
249 menuBar->Check(Calendar_Cal_Year, TRUE);
74a533f7
VZ
250
251 // ... and attach this menu bar to the frame
252 SetMenuBar(menuBar);
253
254 m_panel = new MyPanel(this);
255
256#if wxUSE_STATUSBAR
257 // create a status bar just for fun (by default with 1 pane only)
9898fcda
MJ
258 CreateStatusBar(2);
259 SetStatusText("Welcome to wxWindows!");
74a533f7
VZ
260#endif // wxUSE_STATUSBAR
261}
262
263void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
264{
265 // TRUE is to force the frame to close
266 Close(TRUE);
267}
268
269void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
270{
271