| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: calendar.cpp
- // Purpose: wxCalendarCtrl sample
- // Author: Vadim Zeitlin
- // Modified by:
- // Created: 02.01.00
- // Copyright: (c) Vadim Zeitlin
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- // ============================================================================
- // declarations
- // ============================================================================
- // ----------------------------------------------------------------------------
- // headers
- // ----------------------------------------------------------------------------
- // For compilers that support precompilation, includes "wx/wx.h".
- #include "wx/wxprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- // for all others, include the necessary headers
- #ifndef WX_PRECOMP
- #include "wx/app.h"
- #include "wx/log.h"
- #include "wx/frame.h"
- #include "wx/panel.h"
- #include "wx/stattext.h"
- #include "wx/menu.h"
- #include "wx/layout.h"
- #include "wx/msgdlg.h"
- #include "wx/icon.h"
- #include "wx/button.h"
- #include "wx/sizer.h"
- #include "wx/textctrl.h"
- #include "wx/settings.h"
- #endif
- #include "wx/calctrl.h"
- #include "wx/splitter.h"
- #if wxUSE_DATEPICKCTRL
- #include "wx/datectrl.h"
- #if wxUSE_DATEPICKCTRL_GENERIC
- #include "wx/generic/datectrl.h"
- #endif // wxUSE_DATEPICKCTRL_GENERIC
- #endif // wxUSE_DATEPICKCTRL
- #if wxUSE_TIMEPICKCTRL
- #include "wx/timectrl.h"
- #if wxUSE_TIMEPICKCTRL_GENERIC
- #include "wx/generic/timectrl.h"
- #endif // wxUSE_TIMEPICKCTRL_GENERIC
- #endif // wxUSE_TIMEPICKCTRL
- #include "../sample.xpm"
- #ifdef wxHAS_NATIVE_CALENDARCTRL
- #include "wx/generic/calctrlg.h"
- #endif
- // ----------------------------------------------------------------------------
- // private classes
- // ----------------------------------------------------------------------------
- // Define a new application type, each program should derive a class from wxApp
- class MyApp : public wxApp
- {
- public:
- // override base class virtuals
- // ----------------------------
- // this one is called on application startup and is a good place for the app
- // initialization (doing it here and not in the ctor allows to have an error
- // return: if OnInit() returns false, the application terminates)
- virtual bool OnInit();
- };
- class MyPanel : public wxPanel
- {
- public:
- MyPanel(wxWindow *parent);
- void OnCalendar(wxCalendarEvent& event);
- void OnCalendarWeekDayClick(wxCalendarEvent& event);
- void OnCalendarWeekClick(wxCalendarEvent& event);
- void OnCalendarChange(wxCalendarEvent& event);
- void OnCalMonthChange(wxCalendarEvent& event);
- wxCalendarCtrlBase *GetCal() const { return m_calendar; }
- // turn on/off the specified style bit on the calendar control
- void ToggleCalStyle(bool on, int style);
- bool IsUsingGeneric() const { return m_usingGeneric; }
- void ToggleUseGeneric()
- {
- m_usingGeneric = !m_usingGeneric;
- RecreateCalendar(m_calendar->GetWindowStyle());
- }
- void HighlightSpecial(bool on);
- void LimitDateRange(bool on);
- wxDateTime GetDate() const { return m_calendar->GetDate(); }
- void SetDate(const wxDateTime& dt) { m_calendar->SetDate(dt); }
- private:
- wxCalendarCtrlBase *DoCreateCalendar(const wxDateTime& dt, long style);
- void RecreateCalendar(long style);
- wxCalendarCtrlBase *m_calendar;
- wxStaticText *m_date;
- wxSizer *m_sizer;
- bool m_usingGeneric;
- wxDECLARE_EVENT_TABLE();
- };
- // Define a new frame type: this is going to be our main frame
- class MyFrame : public wxFrame
- {
- public:
- // ctor(s)
- MyFrame(const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize);
- // event handlers (these functions should _not_ be virtual)
- void OnAbout(wxCommandEvent& event);
- void OnClearLog(wxCommandEvent& event);
- void OnQuit(wxCommandEvent& event);
- #if wxUSE_DATEPICKCTRL
- void OnAskDate(wxCommandEvent& event);
- void OnUpdateUIStartWithNone(wxUpdateUIEvent& event);
- #endif // wxUSE_DATEPICKCTRL
- #if wxUSE_TIMEPICKCTRL
- void OnAskTime(wxCommandEvent& event);
- #endif // wxUSE_TIMEPICKCTRL
- #ifdef wxHAS_NATIVE_CALENDARCTRL
- void OnCalGeneric(wxCommandEvent& WXUNUSED(event))
- {
- m_panel->ToggleUseGeneric();
- }
- #endif // wxHAS_NATIVE_CALENDARCTRL
- void OnCalMonday(wxCommandEvent& event);
- void OnCalHolidays(wxCommandEvent& event);
- void OnCalSpecial(wxCommandEvent& event);
- void OnCalAllowMonth(wxCommandEvent& event);
- void OnCalLimitDates(wxCommandEvent& event);
- void OnCalSeqMonth(wxCommandEvent& event);
- void OnCalShowSurroundingWeeks(wxCommandEvent& event);
- void OnCalShowWeekNumbers(wxCommandEvent& event);
- void OnSetDate(wxCommandEvent& event);
- void OnToday(wxCommandEvent& event);
- void OnBeginDST(wxCommandEvent& event);
- void OnCalToggleResizable(wxCommandEvent& event);
- void OnUpdateUIGenericOnly(wxUpdateUIEvent& event)
- {
- event.Enable(m_panel->IsUsingGeneric());
- }
- void OnCalRClick(wxMouseEvent& event);
- private:
- MyPanel *m_panel;
- wxTextCtrl *m_logWindow;
- // any class wishing to process wxWidgets events must use this macro
- wxDECLARE_EVENT_TABLE();
- };
- #if wxUSE_DATEPICKCTRL
- // Define a simple modal dialog which asks the user for a date
- class MyDateDialog : public wxDialog
- {
- public:
- MyDateDialog(wxWindow *parent, const wxDateTime& dt, int dtpStyle);
- wxDateTime GetDate() const { return m_datePicker->GetValue(); }
- private:
- void OnDateChange(wxDateEvent& event);
- wxDatePickerCtrlBase *m_datePicker;
- wxStaticText *m_dateText;
- wxDECLARE_EVENT_TABLE();
- };
- #endif // wxUSE_DATEPICKCTRL
- #if wxUSE_TIMEPICKCTRL
- // Another simple dialog, this one asking for time.
- class MyTimeDialog : public wxDialog
- {
- public:
- MyTimeDialog(wxWindow* parent);
- wxDateTime GetTime() const { return m_timePicker->GetValue(); }
- private:
- void OnTimeChange(wxDateEvent& event);
- wxTimePickerCtrlBase* m_timePicker;
- wxStaticText* m_timeText;
- wxDECLARE_EVENT_TABLE();
- };
- #endif // wxUSE_TIMEPICKCTRL
- // ----------------------------------------------------------------------------
- // constants
- // ----------------------------------------------------------------------------
- // IDs for the controls and the menu commands
- enum
- {
- // menu items
- Calendar_File_About = wxID_ABOUT,
- Calendar_File_ClearLog = wxID_CLEAR,
- Calendar_File_Quit = wxID_EXIT,
- Calendar_Cal_Generic = 200,
- Calendar_Cal_Monday,
- Calendar_Cal_Holidays,
- Calendar_Cal_Special,
- Calendar_Cal_Month,
- Calendar_Cal_LimitDates,
- Calendar_Cal_SeqMonth,
- Calendar_Cal_SurroundWeeks,
- Calendar_Cal_WeekNumbers,
- Calendar_Cal_SetDate,
- Calendar_Cal_Today,
- Calendar_Cal_BeginDST,
- Calendar_Cal_Resizable,
- #if wxUSE_DATEPICKCTRL
- Calendar_DatePicker_AskDate = 300,
- Calendar_DatePicker_ShowCentury,
- Calendar_DatePicker_DropDown,
- Calendar_DatePicker_AllowNone,
- Calendar_DatePicker_StartWithNone,
- #if wxUSE_DATEPICKCTRL_GENERIC
- Calendar_DatePicker_Generic,
- #endif // wxUSE_DATEPICKCTRL_GENERIC
- #endif // wxUSE_DATEPICKCTRL
- #if wxUSE_TIMEPICKCTRL
- Calendar_TimePicker_AskTime = 400,
- #if wxUSE_TIMEPICKCTRL_GENERIC
- Calendar_TimePicker_Generic,
- #endif // wxUSE_TIMEPICKCTRL_GENERIC
- #endif // wxUSE_TIMEPICKCTRL
- Calendar_CalCtrl = 1000
- };
- // ----------------------------------------------------------------------------
- // event tables and other macros for wxWidgets
- // ----------------------------------------------------------------------------
- // the event tables connect the wxWidgets events with the functions (event
- // handlers) which process them. It can be also done at run-time, but for the
- // simple menu events like this the static method is much simpler.
- wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
- EVT_MENU(Calendar_File_About, MyFrame::OnAbout)
- EVT_MENU(Calendar_File_ClearLog, MyFrame::OnClearLog)
- EVT_MENU(Calendar_File_Quit, MyFrame::OnQuit)
- #if wxUSE_DATEPICKCTRL
- EVT_MENU(Calendar_DatePicker_AskDate, MyFrame::OnAskDate)
- EVT_UPDATE_UI(Calendar_DatePicker_StartWithNone,
- MyFrame::OnUpdateUIStartWithNone)
- #endif // wxUSE_DATEPICKCTRL
- #if wxUSE_TIMEPICKCTRL
- EVT_MENU(Calendar_TimePicker_AskTime, MyFrame::OnAskTime)
- #endif // wxUSE_TIMEPICKCTRL
- #ifdef wxHAS_NATIVE_CALENDARCTRL
- EVT_MENU(Calendar_Cal_Generic, MyFrame::OnCalGeneric)
- #endif // wxHAS_NATIVE_CALENDARCTRL
- EVT_MENU(Calendar_Cal_Monday, MyFrame::OnCalMonday)
- EVT_MENU(Calendar_Cal_Holidays, MyFrame::OnCalHolidays)
- EVT_MENU(Calendar_Cal_Special, MyFrame::OnCalSpecial)
- EVT_MENU(Calendar_Cal_Month, MyFrame::OnCalAllowMonth)
- EVT_MENU(Calendar_Cal_LimitDates, MyFrame::OnCalLimitDates)
- EVT_MENU(Calendar_Cal_SeqMonth, MyFrame::OnCalSeqMonth)
- EVT_MENU(Calendar_Cal_SurroundWeeks, MyFrame::OnCalShowSurroundingWeeks)
- EVT_MENU(Calendar_Cal_WeekNumbers, MyFrame::OnCalShowWeekNumbers)
- EVT_MENU(Calendar_Cal_SetDate, MyFrame::OnSetDate)
- EVT_MENU(Calendar_Cal_Today, MyFrame::OnToday)
- EVT_MENU(Calendar_Cal_BeginDST, MyFrame::OnBeginDST)
- EVT_MENU(Calendar_Cal_Resizable, MyFrame::OnCalToggleResizable)
- EVT_UPDATE_UI(Calendar_Cal_SeqMonth, MyFrame::OnUpdateUIGenericOnly)
- #ifdef __WXGTK20__
- EVT_UPDATE_UI(Calendar_Cal_Monday, MyFrame::OnUpdateUIGenericOnly)
- EVT_UPDATE_UI(Calendar_Cal_Holidays, MyFrame::OnUpdateUIGenericOnly)
- #endif
- EVT_UPDATE_UI(Calendar_Cal_Special, MyFrame::OnUpdateUIGenericOnly)
- EVT_UPDATE_UI(Calendar_Cal_SurroundWeeks, MyFrame::OnUpdateUIGenericOnly)
- wxEND_EVENT_TABLE()
- wxBEGIN_EVENT_TABLE(MyPanel, wxPanel)
- EVT_CALENDAR(Calendar_CalCtrl, MyPanel::OnCalendar)
- EVT_CALENDAR_PAGE_CHANGED(Calendar_CalCtrl, MyPanel::OnCalMonthChange)
- EVT_CALENDAR_SEL_CHANGED(Calendar_CalCtrl, MyPanel::OnCalendarChange)
- EVT_CALENDAR_WEEKDAY_CLICKED(Calendar_CalCtrl, MyPanel::OnCalendarWeekDayClick)
- EVT_CALENDAR_WEEK_CLICKED(Calendar_CalCtrl, MyPanel::OnCalendarWeekClick)
- wxEND_EVENT_TABLE()
- // Create a new application object: this macro will allow wxWidgets to create
- // the application object during program execution (it's better than using a
- // static object for many reasons) and also declares the accessor function
- // wxGetApp() which will return the reference of the right type (i.e. MyApp and
- // not wxApp)
- IMPLEMENT_APP(MyApp)
- // ============================================================================
- // implementation
- // ============================================================================
- // ----------------------------------------------------------------------------
- // the application class
- // ----------------------------------------------------------------------------
- // `Main program' equivalent: the program execution "starts" here
- bool MyApp::OnInit()
- {
- if ( !wxApp::OnInit() )
- return false;
- // Create the main application window
- MyFrame *frame = new MyFrame(wxT("Calendar wxWidgets sample")
- #ifndef __WXWINCE__
- ,wxPoint(50, 50), wxSize(450, 340)
- #endif
- );
- frame->Show(true);
- // success: wxApp::OnRun() will be called which will enter the main message
- // loop and the application will run. If we returned false here, the
- // application would exit immediately.
- return true;
- }
- // ----------------------------------------------------------------------------
- // main frame
- // ----------------------------------------------------------------------------
- // frame constructor
- MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
- : wxFrame((wxFrame *)NULL, wxID_ANY, title, pos, size)
- {
- // set the frame icon
- SetIcon(wxICON(sample));
- // create a menu bar
- wxMenuBar *menuBar = new wxMenuBar;
- wxMenu *menuFile = new wxMenu;
- menuFile->Append(Calendar_File_About, wxT("&About\tCtrl-A"), wxT("Show about dialog"));
- menuFile->AppendSeparator();
- menuFile->Append(Calendar_File_ClearLog, wxT("&Clear log\tCtrl-L"));
- menuFile->AppendSeparator();
- menuFile->Append(Calendar_File_Quit, wxT("E&xit\tAlt-X"), wxT("Quit this program"));
- menuBar->Append(menuFile, wxT("&File"));
- wxMenu *menuCal = new wxMenu;
- #ifdef wxHAS_NATIVE_CALENDARCTRL
- menuCal->AppendCheckItem(Calendar_Cal_Generic, "Use &generic version\tCtrl-G",
- "Toggle between native and generic control");
- menuCal->AppendSeparator();
- #endif // wxHAS_NATIVE_CALENDARCTRL
- menuCal->Append(Calendar_Cal_Monday,
- wxT("Monday &first weekday\tCtrl-F"),
- wxT("Toggle between Mon and Sun as the first week day"),
- true);
- menuCal->Append(Calendar_Cal_Holidays, wxT("Show &holidays\tCtrl-H"),
- wxT("Toggle highlighting the holidays"),
- true);
- menuCal->Append(Calendar_Cal_Special, wxT("Highlight &special dates\tCtrl-S"),
- wxT("Test custom highlighting"),
- true);
- menuCal->Append(Calendar_Cal_SurroundWeeks,
- wxT("Show s&urrounding weeks\tCtrl-W"),
- wxT("Show the neighbouring weeks in the prev/next month"),
- true);
- menuCal->Append(Calendar_Cal_WeekNumbers,
- wxT("Show &week numbers"),
- wxT("Toggle week numbers"),
- true);
- menuCal->AppendSeparator();
- menuCal->Append(Calendar_Cal_SeqMonth,
- wxT("Toggle month selector st&yle\tCtrl-Y"),
- wxT("Use another style for the calendar controls"),
- true);
- menuCal->Append(Calendar_Cal_Month, wxT("&Month can be changed\tCtrl-M"),
- wxT("Allow changing the month in the calendar"),
- true);
- menuCal->AppendCheckItem(Calendar_Cal_LimitDates, wxT("Toggle date ra&nge\tCtrl-N"),
- wxT("Limit the valid dates"));
- menuCal->AppendSeparator();
- menuCal->Append(Calendar_Cal_SetDate, wxT("Call &SetDate(2005-12-24)"), wxT("Set date to 2005-12-24."));
- menuCal->Append(Calendar_Cal_Today, wxT("Call &Today()"), wxT("Set to the current date."));
- menuCal->Append(Calendar_Cal_BeginDST, "Call SetDate(GetBeginDST())");
- menuCal->AppendSeparator();
- menuCal->AppendCheckItem(Calendar_Cal_Resizable, wxT("Make &resizable\tCtrl-R"));
- menuBar->Append(menuCal, wxT("&Calendar"));
- #if wxUSE_DATEPICKCTRL
- wxMenu *menuDate = new wxMenu;
- menuDate->AppendCheckItem(Calendar_DatePicker_ShowCentury,
- wxT("Al&ways show century"));
- menuDate->AppendCheckItem(Calendar_DatePicker_DropDown,
- wxT("Use &drop down control"));
- menuDate->AppendCheckItem(Calendar_DatePicker_AllowNone,
- wxT("Allow &no date"));
- menuDate->AppendCheckItem(Calendar_DatePicker_StartWithNone,
- wxT("Start &with no date"));
- #if wxUSE_DATEPICKCTRL_GENERIC
- menuDate->AppendCheckItem(Calendar_DatePicker_Generic,
- wxT("Use &generic version of the control"));
- #endif // wxUSE_DATEPICKCTRL_GENERIC
- menuDate->AppendSeparator();
- menuDate->Append(Calendar_DatePicker_AskDate, wxT("&Choose date...\tCtrl-D"), wxT("Show dialog with wxDatePickerCtrl"));
- menuBar->Append(menuDate, wxT("&Date picker"));
- #endif // wxUSE_DATEPICKCTRL
- #if wxUSE_TIMEPICKCTRL
- wxMenu *menuTime = new wxMenu;
- #if wxUSE_TIMEPICKCTRL_GENERIC
- menuTime->AppendCheckItem(Calendar_TimePicker_Generic,
- wxT("Use &generic version of the control"));
- menuTime->AppendSeparator();
- #endif // wxUSE_TIMEPICKCTRL_GENERIC
- menuTime->Append(Calendar_TimePicker_AskTime, wxT("&Choose time...\tCtrl-T"), wxT("Show dialog with wxTimePickerCtrl"));
- menuBar->Append(menuTime, wxT("&Time picker"));
- #endif // wxUSE_TIMEPICKCTRL
- menuBar->Check(Calendar_Cal_Monday, true);
- menuBar->Check(Calendar_Cal_Holidays, true);
- menuBar->Check(Calendar_Cal_Month, true);
- menuBar->Check(Calendar_Cal_LimitDates, false);
- #if wxUSE_DATEPICKCTRL
- menuBar->Check(Calendar_DatePicker_ShowCentury, true);
- #endif // wxUSE_DATEPICKCTRL
- // ... and attach this menu bar to the frame
- SetMenuBar(menuBar);
- wxSplitterWindow *splitter = new wxSplitterWindow(this, wxID_ANY,
- wxDefaultPosition, wxDefaultSize,
- wxSP_NOBORDER);
- m_panel = new MyPanel(splitter);
- m_logWindow = new wxTextCtrl(splitter, wxID_ANY, wxEmptyString,
- wxDefaultPosition, wxDefaultSize,
- wxTE_READONLY | wxTE_MULTILINE);
- splitter->SplitHorizontally(m_panel, m_logWindow);
- splitter->SetMinimumPaneSize(20);
- wxLog::SetActiveTarget(new wxLogTextCtrl(m_logWindow));
- }
- void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
- {
- // true is to force the frame to close
- Close(true);
- }
- void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
- {
- wxMessageBox(wxT("wxCalendarCtrl sample\n(c) 2000--2008 Vadim Zeitlin"),
- wxT("About Calendar"), wxOK | wxICON_INFORMATION, this);
- }
- void MyFrame::OnClearLog(wxCommandEvent& WXUNUSED(event))
- {
- m_logWindow->Clear();
- }
- void MyFrame::OnCalMonday(wxCommandEvent& event)
- {
- m_panel->ToggleCalStyle(event.IsChecked(), wxCAL_MONDAY_FIRST);
- }
- void MyFrame::OnCalHolidays(wxCommandEvent& event)
- {
- m_panel->GetCal()->EnableHolidayDisplay(event.IsChecked());
- }
- void MyFrame::OnCalSpecial(wxCommandEvent& event)
- {
- m_panel->HighlightSpecial(GetMenuBar()->IsChecked(event.GetId()));
- }
- void MyFrame::OnCalLimitDates(wxCommandEvent& event)
- {
- m_panel->LimitDateRange(GetMenuBar()->IsChecked(event.GetId()));
- }
- void MyFrame::OnCalAllowMonth(wxCommandEvent& event)
- {
- m_panel->GetCal()->EnableMonthChange(event.IsChecked());
- }
- void MyFrame::OnCalSeqMonth(wxCommandEvent& event)
- {
- m_panel->ToggleCalStyle(event.IsChecked(),
- wxCAL_SEQUENTIAL_MONTH_SELECTION);
- }
- void MyFrame::OnCalShowSurroundingWeeks(wxCommandEvent& event)
- {
- m_panel->ToggleCalStyle(event.IsChecked(), wxCAL_SHOW_SURROUNDING_WEEKS);
- }
- void MyFrame::OnCalShowWeekNumbers(wxCommandEvent& event)
- {
- m_panel->ToggleCalStyle(event.IsChecked(), wxCAL_SHOW_WEEK_NUMBERS);
- }
- void MyFrame::OnSetDate(wxCommandEvent &WXUNUSED(event))
- {
- m_panel->SetDate(wxDateTime(24, wxDateTime::Dec, 2005, 22, 00, 00));
- }
- void MyFrame::OnToday(wxCommandEvent &WXUNUSED(event))
- {
- m_panel->SetDate(wxDateTime::Today());
- }
- void MyFrame::OnBeginDST(wxCommandEvent &WXUNUSED(event))
- {
- m_panel->SetDate(wxDateTime::GetBeginDST(m_panel->GetDate().GetYear()));
- }
- void MyFrame::OnCalToggleResizable(wxCommandEvent& event)
- {
- wxSizer * const sizer = m_panel->GetSizer();
- wxSizerItem * const item = sizer->GetItem(m_panel->GetCal());
- if ( event.IsChecked() )
- {
- item->SetProportion(1);
- item->SetFlag(wxEXPAND);
- }
- else // not resizable
- {
- item->SetProportion(0);
- item->SetFlag(wxALIGN_CENTER);
- }
- sizer->Layout();
- }
- void MyFrame::OnCalRClick(wxMouseEvent& event)
- {
- wxDateTime dt;
- wxDateTime::WeekDay wd;
- const wxPoint pt = event.GetPosition();
- wxString msg = wxString::Format("Point (%d, %d) is ", pt.x, pt.y);
- switch ( m_panel->GetCal()->HitTest(pt, &dt, &wd) )
- {
- default:
- wxFAIL_MSG( "unexpected" );
- // fall through
- case wxCAL_HITTEST_NOWHERE:
- msg += "nowhere";
- break;
- case wxCAL_HITTEST_HEADER:
- msg += wxString::Format("over %s", wxDateTime::GetWeekDayName(wd));
- break;
- case wxCAL_HITTEST_DAY:
- msg += wxString::Format("over %s", dt.FormatISODate());
- break;
- case wxCAL_HITTEST_INCMONTH:
- msg += "over next month button";
- break;
- case wxCAL_HITTEST_DECMONTH:
- msg += "over previous month button";
- break;
- case wxCAL_HITTEST_SURROUNDING_WEEK:
- msg += "over a day from another month";
- break;
- }
- wxLogMessage("%s", msg);
- }
- #if wxUSE_DATEPICKCTRL
- void MyFrame::OnUpdateUIStartWithNone(wxUpdateUIEvent& event)
- {
- // it only makes sense to start with invalid date if we can have no date
- event.Enable( GetMenuBar()->IsChecked(Calendar_DatePicker_AllowNone) );
- }
- void MyFrame::OnAskDate(wxCommandEvent& WXUNUSED(event))
- {
- wxDateTime dt = m_panel->GetCal()->GetDate();
- int style = wxDP_DEFAULT;
- if ( GetMenuBar()->IsChecked(Calendar_DatePicker_ShowCentury) )
- style |= wxDP_SHOWCENTURY;
- if ( GetMenuBar()->IsChecked(Calendar_DatePicker_DropDown) )
- style |= wxDP_DROPDOWN;
- if ( GetMenuBar()->IsChecked(Calendar_DatePicker_AllowNone) )
- {
- style |= wxDP_ALLOWNONE;
- if ( GetMenuBar()->IsChecked(Calendar_DatePicker_StartWithNone) )
- dt = wxDefaultDateTime;
- }
- MyDateDialog dlg(this, dt, style);
- if ( dlg.ShowModal() == wxID_OK )
- {
- dt = dlg.GetDate();
- if ( dt.IsValid() )
- {
- const wxDateTime today = wxDateTime::Today();
- if ( dt.GetDay() == today.GetDay() &&
- dt.GetMonth() == today.GetMonth() )
- {
- wxMessageBox(wxT("Happy birthday!"), wxT("Calendar Sample"));
- }
- m_panel->SetDate(dt);
- wxLogStatus(wxT("Changed the date to your input"));
- }
- else
- {
- wxLogStatus(wxT("No date entered"));
- }
- }
- }
- #endif // wxUSE_DATEPICKCTRL
- #if wxUSE_TIMEPICKCTRL
- void MyFrame::OnAskTime(wxCommandEvent& WXUNUSED(event))
- {
- MyTimeDialog dlg(this);
- if ( dlg.ShowModal() == wxID_OK )
- {
- wxLogMessage("You entered %s", dlg.GetTime().FormatISOTime());
- }
- }
- #endif // wxUSE_TIMEPICKCTRL
- // ----------------------------------------------------------------------------
- // MyPanel
- // ----------------------------------------------------------------------------
- MyPanel::MyPanel(wxWindow *parent)
- : wxPanel(parent, wxID_ANY)
- {
- #ifdef wxHAS_NATIVE_CALENDARCTRL
- m_usingGeneric = false;
- #else
- m_usingGeneric = true;
- #endif
- wxString date;
- date.Printf(wxT("Selected date: %s"),
- wxDateTime::Today().FormatISODate().c_str());
- m_date = new wxStaticText(this, wxID_ANY, date);
- m_calendar = DoCreateCalendar(wxDefaultDateTime,
- wxCAL_MONDAY_FIRST | wxCAL_SHOW_HOLIDAYS);
- // adjust to vertical/horizontal display, check mostly dedicated to WinCE
- bool horizontal = ( wxSystemSettings::GetMetric(wxSYS_SCREEN_X) > wxSystemSettings::GetMetric(wxSYS_SCREEN_Y) );
- m_sizer = new wxBoxSizer( horizontal ? wxHORIZONTAL : wxVERTICAL );
- m_sizer->Add(m_date, 0, wxALIGN_CENTER | wxALL, 10 );
- m_sizer->Add(m_calendar, 0, wxALIGN_CENTER | wxALIGN_LEFT);
- SetSizer( m_sizer );
- m_sizer->SetSizeHints( this );
- }
- void MyPanel::OnCalendar(wxCalendarEvent& event)
- {
- // clicking the same date twice unmarks it (convenient for testing)
- static wxDateTime s_dateLast;
- const bool mark = !s_dateLast.IsValid() || event.GetDate() != s_dateLast;
- s_dateLast = event.GetDate();
- m_calendar->Mark(event.GetDate().GetDay(), mark);
- wxLogMessage(wxT("Selected (and %smarked) %s from calendar."),
- mark ? "" : "un", s_dateLast.FormatISODate().c_str());
- }
- void MyPanel::OnCalendarChange(wxCalendarEvent& event)
- {
- wxString s;
- s.Printf(wxT("Selected date: %s"), event.GetDate().FormatISODate().c_str());
- m_date->SetLabel(s);
- wxLogStatus(s);
- }
- void MyPanel::OnCalMonthChange(wxCalendarEvent& event)
- {
- wxLogStatus(wxT("Calendar month changed to %s %d"),
- wxDateTime::GetMonthName(event.GetDate().GetMonth()),
- event.GetDate().GetYear());
- }
- void MyPanel::OnCalendarWeekDayClick(wxCalendarEvent& event)
- {
- wxLogMessage(wxT("Clicked on %s"),
- wxDateTime::GetWeekDayName(event.GetWeekDay()).c_str());
- }
- void MyPanel::OnCalendarWeekClick(wxCalendarEvent& event)
- {
- wxLogMessage(wxT("Clicked on week %d"), event.GetDate().GetWeekOfYear());
- }
- wxCalendarCtrlBase *MyPanel::DoCreateCalendar(const wxDateTime& dt, long style)
- {
- wxCalendarCtrlBase *calendar;
- #ifdef wxHAS_NATIVE_CALENDARCTRL
- if ( m_usingGeneric )
- calendar = new wxGenericCalendarCtrl(this, Calendar_CalCtrl,
- dt,
- wxDefaultPosition,
- wxDefaultSize,
- style);
- else
- #endif // wxHAS_NATIVE_CALENDARCTRL
- calendar = new wxCalendarCtrl(this, Calendar_CalCtrl,
- dt,
- wxDefaultPosition,
- wxDefaultSize,
- style);
- calendar->Connect(wxEVT_RIGHT_DOWN,
- wxMouseEventHandler(MyFrame::OnCalRClick),
- NULL,
- ( MyFrame * )wxGetTopLevelParent(this));
- return calendar;
- }
- void MyPanel::RecreateCalendar(long style)
- {
- wxCalendarCtrlBase *calendar = DoCreateCalendar(m_calendar->GetDate(), style);
- m_sizer->Replace(m_calendar, calendar);
- delete m_calendar;
- m_calendar = calendar;
- m_sizer->Layout();
- }
- void MyPanel::ToggleCalStyle(bool on, int flag)
- {
- long style = m_calendar->GetWindowStyle();
- if ( on )
- style |= flag;
- else
- style &= ~flag;
- if ( flag == wxCAL_SEQUENTIAL_MONTH_SELECTION
- || flag == wxCAL_SHOW_WEEK_NUMBERS)
- {
- // changing this style requires recreating the control
- RecreateCalendar(style);
- }
- else // just changing the style is enough
- {
- m_calendar->SetWindowStyle(style);
- m_calendar->Refresh();
- }
- }
- void MyPanel::HighlightSpecial(bool on)
- {
- if ( on )
- {
- wxCalendarDateAttr
- *attrRedCircle = new wxCalendarDateAttr(wxCAL_BORDER_ROUND, *wxRED),
- *attrGreenSquare = new wxCalendarDateAttr(wxCAL_BORDER_SQUARE, *wxGREEN),
- *attrHeaderLike = new wxCalendarDateAttr(*wxBLUE, *wxLIGHT_GREY);
- m_calendar->SetAttr(17, attrRedCircle);
- m_calendar->SetAttr(29, attrGreenSquare);
- m_calendar->SetAttr(13, attrHeaderLike);
- }
- else // off
- {
- m_calendar->ResetAttr(17);
- m_calendar->ResetAttr(29);
- m_calendar->ResetAttr(13);
- }
- m_calendar->Refresh();
- }
- // Toggle a restricted date range to the six months centered on today's date.
- void MyPanel::LimitDateRange(bool on)
- {
- if ( on )
- {
- // limit the choice of date to 3 months around today
- const wxDateSpan diff = wxDateSpan::Months(3);
- const wxDateTime today = wxDateTime::Today();
- // Set the restricted date range.
- if ( m_calendar->SetDateRange(today - diff, today + diff) )
- {
- wxLogStatus("Date range limited to 3 months around today.");
- wxDateTime firstValidDate;
- wxDateTime lastValidDate;
- if ( m_calendar->GetDateRange(&firstValidDate, &lastValidDate) )
- {
- wxLogMessage("First valid date: %s, last valid date: %s",
- firstValidDate.FormatISODate(),
- lastValidDate.FormatISODate());
- }
- else
- {
- wxLogWarning("Failed to get back the valid dates range.");
- }
- }
- else
- {
- wxLogWarning("Date range not supported.");
- }
- }
- else // off
- {
- // Remove the date restrictions.
- if ( m_calendar->SetDateRange() )
- {
- wxLogStatus("Date choice is unlimited now.");
- }
- else
- {
- wxLogWarning("Date range not supported.");
- }
- }
- m_calendar->Refresh();
- }
- // ----------------------------------------------------------------------------
- // MyDateDialog
- // ----------------------------------------------------------------------------
- #if wxUSE_DATEPICKCTRL
- wxBEGIN_EVENT_TABLE(MyDateDialog, wxDialog)
- EVT_DATE_CHANGED(wxID_ANY, MyDateDialog::OnDateChange)
- wxEND_EVENT_TABLE()
- MyDateDialog::MyDateDialog(wxWindow *parent, const wxDateTime& dt, int dtpStyle)
- : wxDialog(parent, wxID_ANY, wxString(wxT("Calendar: Choose a date")))
- {
- #if wxUSE_DATEPICKCTRL_GENERIC
- wxFrame *frame = (wxFrame *)wxGetTopLevelParent(parent);
- if ( frame && frame->GetMenuBar()->IsChecked(Calendar_DatePicker_Generic) )
- m_datePicker = new wxDatePickerCtrlGeneric(this, wxID_ANY, dt,
- wxDefaultPosition,
- wxDefaultSize,
- dtpStyle);
- else
- #endif // wxUSE_DATEPICKCTRL_GENERIC
- m_datePicker = new wxDatePickerCtrl(this, wxID_ANY, dt,
- wxDefaultPosition, wxDefaultSize,
- dtpStyle);
- m_datePicker->SetRange(wxDateTime(1, wxDateTime::Jan, 1900),
- wxDefaultDateTime);
- m_dateText = new wxStaticText(this, wxID_ANY,
- dt.IsValid() ? dt.FormatISODate()
- : wxString());
- const wxSizerFlags flags = wxSizerFlags().Centre().Border();
- wxFlexGridSizer* const sizerMain = new wxFlexGridSizer(2);
- sizerMain->Add(new wxStaticText(this, wxID_ANY, "Enter &date:"), flags);
- sizerMain->Add(m_datePicker, flags);
- sizerMain->Add(new wxStaticText(this, wxID_ANY, "Date in ISO format:"),
- flags);
- sizerMain->Add(m_dateText, flags);
- wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
- sizerTop->Add(sizerMain, flags);
- sizerTop->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), flags);
- SetSizerAndFit(sizerTop);
- }
- void MyDateDialog::OnDateChange(wxDateEvent& event)
- {
- const wxDateTime dt = event.GetDate();
- if ( dt.IsValid() )
- m_dateText->SetLabel(dt.FormatISODate());
- else
- m_dateText->SetLabel(wxEmptyString);
- }
- #endif // wxUSE_DATEPICKCTRL
- // ----------------------------------------------------------------------------
- // MyTimeDialog
- // ----------------------------------------------------------------------------
- #if wxUSE_TIMEPICKCTRL
- wxBEGIN_EVENT_TABLE(MyTimeDialog, wxDialog)
- EVT_TIME_CHANGED(wxID_ANY, MyTimeDialog::OnTimeChange)
- wxEND_EVENT_TABLE()
- MyTimeDialog::MyTimeDialog(wxWindow *parent)
- : wxDialog(parent, wxID_ANY, wxString(wxT("Calendar: Choose time")))
- {
- #if wxUSE_TIMEPICKCTRL_GENERIC
- wxFrame *frame = (wxFrame *)wxGetTopLevelParent(parent);
- if ( frame && frame->GetMenuBar()->IsChecked(Calendar_TimePicker_Generic) )
- m_timePicker = new wxTimePickerCtrlGeneric(this, wxID_ANY);
- else
- #endif // wxUSE_TIMEPICKCTRL_GENERIC
- m_timePicker = new wxTimePickerCtrl(this, wxID_ANY);
- m_timeText = new wxStaticText(this, wxID_ANY,
- m_timePicker->GetValue().FormatISOTime());
- const wxSizerFlags flags = wxSizerFlags().Centre().Border();
- wxFlexGridSizer* const sizerMain = new wxFlexGridSizer(2);
- sizerMain->Add(new wxStaticText(this, wxID_ANY, "Enter &time:"), flags);
- sizerMain->Add(m_timePicker, flags);
- sizerMain->Add(new wxStaticText(this, wxID_ANY, "Time in ISO format:"),
- flags);
- sizerMain->Add(m_timeText, flags);
- wxSizer* sizerTop = new wxBoxSizer(wxVERTICAL);
- sizerTop->Add(sizerMain, flags);
- sizerTop->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), flags);
- SetSizerAndFit(sizerTop);
- }
- void MyTimeDialog::OnTimeChange(wxDateEvent& event)
- {
- m_timeText->SetLabel(event.GetDate().FormatISOTime());
- }
- #endif // wxUSE_TIMEPICKCTRL
|