--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// 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();
+}
+
#include "wx/spinctrl.h"
#endif // wxUSE_SPINCTRL
-#include "wx/calctrl.h"
-
//----------------------------------------------------------------------
// class definitions
//----------------------------------------------------------------------
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,
wxStaticText *m_label;
- wxCalendarCtrl *m_calendar;
- wxStaticText *m_date;
-
private:
DECLARE_EVENT_TABLE()
};
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)
#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 )
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);
*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;
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" );
}