]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/calendar/calendar.cpp
don't use wxFromSystemTime() with possibly invalid date (closes bug 1596606)
[wxWidgets.git] / samples / calendar / calendar.cpp
index 59fff7cfeb5f5d582453c3d746fee0c758f0b5aa..6370bb2411f903b242f13b4b75209695cb9d67e4 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(__APPLE__)
-    #pragma implementation "calendar.cpp"
-    #pragma interface "calendar.cpp"
-#endif
-
 // For compilers that support precompilation, includes "wx/wx.h".
 #include "wx/wxprec.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/sizer.h"
-#include "wx/textctrl.h"
-
 #include "wx/calctrl.h"
 
 #if wxUSE_DATEPICKCTRL
     #endif // wxUSE_DATEPICKCTRL_GENERIC
 #endif // wxUSE_DATEPICKCTRL
 
-// the application icon (under Windows and OS/2 it is in resources and even
-// though we could still include the XPM here it would be unused)
-#if !defined(__WXMSW__) && !defined(__WXPM__)
-    #include "../sample.xpm"
-#endif
+#include "../sample.xpm"
+
+#define USE_SIZABLE_CALENDAR 0
 
 // ----------------------------------------------------------------------------
 // private classes
@@ -96,7 +91,7 @@ public:
 
     void SetDate();
     void Today();
-    
+
 private:
     wxCalendarCtrl *m_calendar;
     wxStaticText   *m_date;
@@ -109,7 +104,7 @@ class MyFrame : public wxFrame
 {
 public:
     // ctor(s)
-    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
+    MyFrame(const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize);
 
     // event handlers (these functions should _not_ be virtual)
     void OnQuit(wxCommandEvent& event);
@@ -262,8 +257,11 @@ IMPLEMENT_APP(MyApp)
 bool MyApp::OnInit()
 {
     // Create the main application window
-    MyFrame *frame = new MyFrame(_T("Calendar wxWidgets sample"),
-                                 wxPoint(50, 50), wxSize(450, 340));
+    MyFrame *frame = new MyFrame(_T("Calendar wxWidgets sample")
+#ifndef __WXWINCE__
+                                 ,wxPoint(50, 50), wxSize(450, 340)
+#endif
+                                                                );
 
     frame->Show(true);
 
@@ -282,7 +280,7 @@ 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));
+    SetIcon(wxIcon(sample_xpm));
 
     // create a menu bar
     wxMenu *menuFile = new wxMenu;
@@ -497,11 +495,21 @@ MyPanel::MyPanel(wxFrame *frame)
                                     wxCAL_SHOW_HOLIDAYS |
                                     wxRAISED_BORDER);
 
-    wxBoxSizer *m_sizer = new wxBoxSizer( wxHORIZONTAL );
+#if USE_SIZABLE_CALENDAR
+    wxCalendarCtrl *sizableCalendar = new wxCalendarCtrl(this, wxID_ANY);
+#endif
+
+    // adjust to vertical/horizontal display, check mostly dedicated to WinCE
+    bool horizontal = ( wxSystemSettings::GetMetric(wxSYS_SCREEN_X) > wxSystemSettings::GetMetric(wxSYS_SCREEN_Y) );
+    wxBoxSizer *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);
 
+#if USE_SIZABLE_CALENDAR
+    m_sizer->Add(sizableCalendar, 1, wxEXPAND);
+#endif
+
     SetSizer( m_sizer );
     m_sizer->SetSizeHints( this );
 }
@@ -590,23 +598,24 @@ void MyPanel::Today()
 #if wxUSE_DATEPICKCTRL
 
 MyDialog::MyDialog(wxWindow *parent, const wxDateTime& dt, int dtpStyle)
-        : wxDialog(parent, -1, wxString(_T("Calendar: Choose a date")))
+        : wxDialog(parent, wxID_ANY, wxString(_T("Calendar: Choose a date")))
 {
     wxStdDialogButtonSizer *sizerBtns = new wxStdDialogButtonSizer;
     sizerBtns->AddButton(new wxButton(this, wxID_OK));
     sizerBtns->AddButton(new wxButton(this, wxID_CANCEL));
-    sizerBtns->Finalise();
+    sizerBtns->Realize();
 
     wxSizer *sizerText = new wxBoxSizer(wxHORIZONTAL);
-    sizerText->Add(new wxStaticText(this, -1, _T("Date in ISO format: ")),
-                    wxSizerFlags().Border());
-    m_text = new wxTextCtrl(this, -1);
-    sizerText->Add(m_text, wxSizerFlags().Expand().Border());
+    sizerText->Add(new wxStaticText(this, wxID_ANY, _T("Date in ISO format: ")),
+                    wxSizerFlags().Border().Align(wxALIGN_CENTRE_VERTICAL));
+    m_text = new wxTextCtrl(this, wxID_ANY);
+    sizerText->Add(m_text, wxSizerFlags().
+                        Expand().Border().Align(wxALIGN_CENTRE_VERTICAL));
 
     wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
     sizerTop->Add(new wxStaticText
                       (
-                        this, -1,
+                        this, wxID_ANY,
                         _T("Enter your birthday date (not before 20th century):")
                       ),
                     wxSizerFlags().Border());
@@ -614,13 +623,13 @@ MyDialog::MyDialog(wxWindow *parent, const wxDateTime& dt, int dtpStyle)
 #if wxUSE_DATEPICKCTRL_GENERIC
     wxFrame *frame = (wxFrame *)wxGetTopLevelParent(parent);
     if ( frame && frame->GetMenuBar()->IsChecked(Calendar_DatePicker_Generic) )
-        m_datePicker = new wxDatePickerCtrlGeneric(this, -1, dt,
+        m_datePicker = new wxDatePickerCtrlGeneric(this, wxID_ANY, dt,
                                                    wxDefaultPosition,
                                                    wxDefaultSize,
                                                    dtpStyle);
     else
 #endif // wxUSE_DATEPICKCTRL_GENERIC
-    m_datePicker = new wxDatePickerCtrl(this, -1, dt,
+    m_datePicker = new wxDatePickerCtrl(this, wxID_ANY, dt,
                                         wxDefaultPosition, wxDefaultSize,
                                         dtpStyle);
     m_datePicker->SetRange(wxDateTime(1, wxDateTime::Jan, 1900),
@@ -638,8 +647,11 @@ MyDialog::MyDialog(wxWindow *parent, const wxDateTime& dt, int dtpStyle)
 
 void MyDialog::OnDateChange(wxDateEvent& event)
 {
-    m_text->SetValue(event.GetDate().FormatISODate());
+    const wxDateTime dt = event.GetDate();
+    if(dt.IsValid())
+        m_text->SetValue(dt.FormatISODate());
+    else
+        m_text->SetValue(wxEmptyString);
 }
 
 #endif // wxUSE_DATEPICKCTRL
-