From 74a533f7e9487aedece9e0b6259f68ea6a6920c7 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 2 Jan 2000 23:21:51 +0000 Subject: [PATCH] moved wxCalendarCtrl code from control sample to a new one - calendar git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5183 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/calendar/calendar.cpp | 341 ++++++++++++++++++++++++++++++++++ samples/controls/controls.cpp | 74 +------- 2 files changed, 345 insertions(+), 70 deletions(-) create mode 100644 samples/calendar/calendar.cpp diff --git a/samples/calendar/calendar.cpp b/samples/calendar/calendar.cpp new file mode 100644 index 0000000000..4dbe677028 --- /dev/null +++ b/samples/calendar/calendar.cpp @@ -0,0 +1,341 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: calendar.cpp +// Purpose: wxCalendarCtrl sample +// Author: Vadim Zeitlin +// Modified by: +// Created: 02.01.00 +// RCS-ID: $Id$ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#ifdef __GNUG__ + #pragma implementation "calendar.cpp" + #pragma interface "calendar.cpp" +#endif + +// 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 (this file is usually all you +// need because it includes almost all "standard" wxWindows headers +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/frame.h" +#endif + +#include "wx/calctrl.h" + +// ---------------------------------------------------------------------------- +// 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(wxFrame *frame); + + void OnCalendar(wxCalendarEvent& event); + void OnCalendarWeekDayClick(wxCalendarEvent& event); + void OnCalendarChange(wxCalendarEvent& event); + + void StartWithMonday(bool on); + void ShowHolidays(bool on); + void HighlightSpecial(bool on); + +private: + wxCalendarCtrl *m_calendar; + wxStaticText *m_date; + + DECLARE_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, const wxSize& size); + + // event handlers (these functions should _not_ be virtual) + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + + void OnCalMonday(wxCommandEvent& event); + void OnCalHolidays(wxCommandEvent& event); + void OnCalSpecial(wxCommandEvent& event); + +private: + MyPanel *m_panel; + + // any class wishing to process wxWindows events must use this macro + DECLARE_EVENT_TABLE() +}; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// IDs for the controls and the menu commands +enum +{ + // menu items + Calendar_File_About = 100, + Calendar_File_Quit, + Calendar_Cal_Monday = 200, + Calendar_Cal_Holidays, + Calendar_Cal_Special, + Calendar_CalCtrl = 1000, +}; + +// ---------------------------------------------------------------------------- +// event tables and other macros for wxWindows +// ---------------------------------------------------------------------------- + +// the event tables connect the wxWindows 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. +BEGIN_EVENT_TABLE(MyFrame, wxFrame) + EVT_MENU(Calendar_File_Quit, MyFrame::OnQuit) + EVT_MENU(Calendar_File_About, MyFrame::OnAbout) + + EVT_MENU(Calendar_Cal_Monday, MyFrame::OnCalMonday) + EVT_MENU(Calendar_Cal_Holidays, MyFrame::OnCalHolidays) + EVT_MENU(Calendar_Cal_Special, MyFrame::OnCalSpecial) +END_EVENT_TABLE() + +BEGIN_EVENT_TABLE(MyPanel, wxPanel) + EVT_CALENDAR (Calendar_CalCtrl, MyPanel::OnCalendar) + EVT_CALENDAR_SEL_CHANGED(Calendar_CalCtrl, MyPanel::OnCalendarChange) + EVT_CALENDAR_WEEKDAY_CLICKED(Calendar_CalCtrl, MyPanel::OnCalendarWeekDayClick) +END_EVENT_TABLE() + +// Create a new application object: this macro will allow wxWindows 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() +{ + // Create the main application window + MyFrame *frame = new MyFrame("Minimal wxWindows App", + wxPoint(50, 50), wxSize(450, 340)); + + // Show it and tell the application that it's our main window + // @@@ what does it do exactly, in fact? is it necessary here? + frame->Show(TRUE); + SetTopWindow(frame); + + // 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, -1, title, pos, size) +{ + // create a menu bar + wxMenu *menuFile = new wxMenu; + + menuFile->Append(Calendar_File_About, "&About...\tCtrl-A", "Show about dialog"); + menuFile->AppendSeparator(); + menuFile->Append(Calendar_File_Quit, "E&xit\tAlt-X", "Quit this program"); + + wxMenu *menuCal = new wxMenu; + menuCal->Append(Calendar_Cal_Monday, + "&Monday first weekday\tCtrl-M", + "Toggle between Mon and Sun as the first week day", + TRUE); + menuCal->Append(Calendar_Cal_Holidays, "Show &holidays\tCtrl-H", + "Toggle highlighting the holidays", + TRUE); + menuCal->Append(Calendar_Cal_Special, "Highlight &special dates\tCtrl-S", + "Test custom highlighting", + TRUE); + + // now append the freshly created menu to the menu bar... + wxMenuBar *menuBar = new wxMenuBar; + menuBar->Append(menuFile, "&File"); + menuBar->Append(menuCal, "&Calendar"); + + menuBar->Check(Calendar_Cal_Monday, TRUE); + menuBar->Check(Calendar_Cal_Holidays, TRUE); + + // ... and attach this menu bar to the frame + SetMenuBar(menuBar); + + m_panel = new MyPanel(this); + +#if wxUSE_STATUSBAR + // create a status bar just for fun (by default with 1 pane only) + CreateStatusBar(2); + SetStatusText("Welcome to wxWindows!"); +#endif // wxUSE_STATUSBAR +} + +void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) +{ + // TRUE is to force the frame to close + Close(TRUE); +} + +void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) +{ + wxMessageBox(_T("wxCalendarCtrl sample\n© 2000 Vadim Zeitlin"), + _T("About Calendar"), wxOK | wxICON_INFORMATION, this); +} + +void MyFrame::OnCalMonday(wxCommandEvent& event) +{ + m_panel->StartWithMonday(GetMenuBar()->IsChecked(event.GetInt()) != 0); +} + +void MyFrame::OnCalHolidays(wxCommandEvent& event) +{ + m_panel->ShowHolidays(GetMenuBar()->IsChecked(event.GetInt()) != 0); +} + +void MyFrame::OnCalSpecial(wxCommandEvent& event) +{ + m_panel->HighlightSpecial(GetMenuBar()->IsChecked(event.GetInt()) != 0); +} + +// ---------------------------------------------------------------------------- +// MyPanel +// ---------------------------------------------------------------------------- + +MyPanel::MyPanel(wxFrame *frame) + : wxPanel(frame, -1) +{ + SetAutoLayout(TRUE); + + wxString date; + date.Printf("Selected date: %s", + wxDateTime::Today().FormatISODate().c_str()); + m_date = new wxStaticText(this, -1, date); + m_calendar = new wxCalendarCtrl(this, Calendar_CalCtrl, + wxDefaultDateTime, + wxDefaultPosition, + wxDefaultSize, + wxCAL_MONDAY_FIRST | wxCAL_SHOW_HOLIDAYS); + + wxLayoutConstraints *c = new wxLayoutConstraints; + c->left.SameAs(this, wxLeft, 10); + c->centreY.SameAs(m_calendar, wxCentreY); + c->height.AsIs(); + c->width.AsIs(); + + m_date->SetConstraints(c); + + c = new wxLayoutConstraints; + c->left.SameAs(m_date, wxRight, 10); + c->top.SameAs(this, wxTop, 10); + c->height.AsIs(); + c->width.AsIs(); + + m_calendar->SetConstraints(c); +} + +void MyPanel::OnCalendar(wxCalendarEvent& event) +{ + wxLogMessage("Selected %s from calendar", + event.GetDate().FormatISODate().c_str()); +} + +void MyPanel::OnCalendarChange(wxCalendarEvent& event) +{ + wxString s; + s.Printf("Selected date: %s", event.GetDate().FormatISODate().c_str()); + + m_date->SetLabel(s); +} + +void MyPanel::OnCalendarWeekDayClick(wxCalendarEvent& event) +{ + wxLogMessage("Clicked on %s", + wxDateTime::GetWeekDayName(event.GetWeekDay()).c_str()); +} + +void MyPanel::StartWithMonday(bool on) +{ + long style = m_calendar->GetWindowStyle(); + if ( on ) + style |= wxCAL_MONDAY_FIRST; + else + style &= ~wxCAL_MONDAY_FIRST; + + m_calendar->SetWindowStyle(style); + + m_calendar->Refresh(); +} + +void MyPanel::ShowHolidays(bool on) +{ + m_calendar->EnableHolidayDisplay(on); +} + +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(); +} + diff --git a/samples/controls/controls.cpp b/samples/controls/controls.cpp index 68df474759..53486763f4 100644 --- a/samples/controls/controls.cpp +++ b/samples/controls/controls.cpp @@ -65,8 +65,6 @@ #include "wx/spinctrl.h" #endif // wxUSE_SPINCTRL -#include "wx/calctrl.h" - //---------------------------------------------------------------------- // class definitions //---------------------------------------------------------------------- @@ -113,10 +111,6 @@ public: void OnEnableAll(wxCommandEvent& event); void OnChangeColour(wxCommandEvent& event); - void OnCalendar(wxCalendarEvent& event); - void OnCalendarWeekDayClick(wxCalendarEvent& event); - void OnCalendarChange(wxCalendarEvent& event); - wxListBox *m_listbox, *m_listboxSorted; wxChoice *m_choice, @@ -145,9 +139,6 @@ public: wxStaticText *m_label; - wxCalendarCtrl *m_calendar; - wxStaticText *m_date; - private: DECLARE_EVENT_TABLE() }; @@ -330,8 +321,6 @@ const int ID_SPINCTRL = 185; const int ID_CHANGE_COLOUR = 200; -const int ID_CALENDAR = 210; - BEGIN_EVENT_TABLE(MyPanel, wxPanel) EVT_SIZE ( MyPanel::OnSize) EVT_NOTEBOOK_PAGE_CHANGING(ID_NOTEBOOK, MyPanel::OnPageChanging) @@ -382,11 +371,6 @@ EVT_SPINCTRL (ID_SPINCTRL, MyPanel::OnSpinCtrl) #endif // wxUSE_SPINCTRL EVT_BUTTON (ID_BUTTON_LABEL, MyPanel::OnUpdateLabel) EVT_CHECKBOX (ID_CHANGE_COLOUR, MyPanel::OnChangeColour) - -EVT_CALENDAR (ID_CALENDAR, MyPanel::OnCalendar) -EVT_CALENDAR_SEL_CHANGED(ID_CALENDAR, MyPanel::OnCalendarChange) -EVT_CALENDAR_WEEKDAY_CLICKED(ID_CALENDAR, MyPanel::OnCalendarWeekDayClick) - END_EVENT_TABLE() MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) @@ -659,35 +643,6 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) m_notebook->AddPage(panel, "wxBitmapXXX"); - // wxCalendarCtrl - - panel = new wxPanel(m_notebook); - panel->SetAutoLayout( TRUE ); - - wxString date; - date.Printf("Selected date: %s", - wxDateTime::Today().FormatISODate().c_str()); - m_date = new wxStaticText(panel, -1, date); - m_calendar = new wxCalendarCtrl(panel, ID_CALENDAR); - - c = new wxLayoutConstraints; - c->left.SameAs( panel, wxLeft, 10 ); - c->centreY.SameAs( m_calendar, wxCentreY ); - c->height.AsIs(); - c->width.AsIs(); - - m_date->SetConstraints(c); - - c = new wxLayoutConstraints; - c->left.SameAs( m_date, wxRight, 10 ); - c->top.SameAs( panel, wxTop, 10 ); - c->height.AsIs(); - c->width.AsIs(); - - m_calendar->SetConstraints(c); - - m_notebook->AddPage(panel, "wxCalendar"); - // layout constraints panel = new wxPanel(m_notebook); @@ -764,27 +719,6 @@ void MyPanel::OnPageChanged( wxNotebookEvent &event ) *m_text << "Notebook selection is " << event.GetSelection() << "\n"; } -void MyPanel::OnCalendar(wxCalendarEvent& event) -{ - *m_text << "Selected " << event.GetDate().FormatISODate() << - " from calendar\n"; -} - -void MyPanel::OnCalendarChange(wxCalendarEvent& event) -{ - wxString s; - s.Printf("Selected date: %s", event.GetDate().FormatISODate().c_str()); - - m_date->SetLabel(s); -} - -void MyPanel::OnCalendarWeekDayClick(wxCalendarEvent& event) -{ - *m_text << "Clicked on " - << wxDateTime::GetWeekDayName(event.GetWeekDay()) - << "\n"; -} - void MyPanel::OnChangeColour(wxCommandEvent& WXUNUSED(event)) { static wxColour s_colOld; @@ -828,17 +762,17 @@ void MyPanel::OnListBox( wxCommandEvent &event ) wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject()); m_text->AppendText( "ListBox event client data string is: '" ); if (obj) // BC++ doesn't like use of '? .. : .. ' in this context - m_text->AppendText( obj->GetData() ); + m_text->AppendText( obj->GetData() ); else - m_text->AppendText( wxString("none") ); + m_text->AppendText( wxString("none") ); m_text->AppendText( "'\n" ); m_text->AppendText( "ListBox control client data string is: '" ); obj = (wxStringClientData *)listbox->GetClientObject(listbox->GetSelection()); if (obj) - m_text->AppendText( obj->GetData() ); + m_text->AppendText( obj->GetData() ); else - m_text->AppendText( wxString("none") ); + m_text->AppendText( wxString("none") ); m_text->AppendText( "'\n" ); } -- 2.45.2