X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f2fdc4d56e41711ce7c547484bf97aa0c2bd997a..e0dec8753abaf97e006ea1185bfb6775b28df0a8:/samples/widgets/datepick.cpp diff --git a/samples/widgets/datepick.cpp b/samples/widgets/datepick.cpp index 89e9173e2e..f9cdbced62 100644 --- a/samples/widgets/datepick.cpp +++ b/samples/widgets/datepick.cpp @@ -6,7 +6,7 @@ // Created: 27 Sep 2003 // Id: $Id$ // Copyright: (c) 2003 wxWindows team -// License: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -42,6 +42,7 @@ #endif #include "wx/datectrl.h" +#include "wx/dateevt.h" #include "widgets.h" @@ -55,10 +56,8 @@ enum { DatePickerPage_Reset = wxID_HIGHEST, - DatePickerPage_Day, - DatePickerPage_Month, - DatePickerPage_Year, DatePickerPage_Set, + DatePickerPage_SetRange, DatePickerPage_Picker }; @@ -75,10 +74,15 @@ public: virtual wxControl *GetWidget() const { return m_datePicker; } virtual void RecreateWidget() { CreateDatePicker(); } + // lazy creation of the content + virtual void CreateContent(); + protected: // event handlers - void OnButtonSet(wxCommandEvent& event); + void OnDateChanged(wxDateEvent& event); + void OnButtonSet(wxCommandEvent& event); + void OnButtonSetRange(wxCommandEvent& event); void OnButtonReset(wxCommandEvent& event); // reset the date picker parameters @@ -94,9 +98,13 @@ protected: wxDatePickerCtrl *m_datePicker; wxSizer *m_sizerDatePicker; - wxTextCtrl *m_day; - wxTextCtrl *m_month; - wxTextCtrl *m_year; + wxTextCtrl *m_textCur; + wxTextCtrl *m_textMin; + wxTextCtrl *m_textMax; + + wxRadioBox* m_radioKind; + wxCheckBox* m_chkStyleCentury; + wxCheckBox* m_chkStyleAllowNone; // the text entries for command parameters wxTextCtrl *m_textLabel; @@ -113,43 +121,89 @@ private: BEGIN_EVENT_TABLE(DatePickerWidgetsPage, WidgetsPage) EVT_BUTTON(DatePickerPage_Reset, DatePickerWidgetsPage::OnButtonReset) EVT_BUTTON(DatePickerPage_Set, DatePickerWidgetsPage::OnButtonSet) + EVT_BUTTON(DatePickerPage_SetRange, DatePickerWidgetsPage::OnButtonSetRange) + + EVT_DATE_CHANGED(wxID_ANY, DatePickerWidgetsPage::OnDateChanged) END_EVENT_TABLE() // ============================================================================ // implementation // ============================================================================ +#if defined(__WXMSW__) + #define FAMILY_CTRLS NATIVE_CTRLS +#else + #define FAMILY_CTRLS GENERIC_CTRLS +#endif + IMPLEMENT_WIDGETS_PAGE(DatePickerWidgetsPage, wxT("DatePicker"), - (int)wxPlatform(GENERIC_CTRLS).If(wxMSW,NATIVE_CTRLS) - | PICKER_CTRLS + FAMILY_CTRLS | PICKER_CTRLS ); DatePickerWidgetsPage::DatePickerWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist) - :WidgetsPage(book) + :WidgetsPage(book, imaglist, datepick_xpm) { - imaglist->Add(wxBitmap(datepick_xpm)); +} +void DatePickerWidgetsPage::CreateContent() +{ wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL); - // left pane - wxStaticBox *box = new wxStaticBox(this, wxID_ANY, wxT("Date details")); - - wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL); - - sizerLeft->Add( CreateSizerWithTextAndLabel( wxT("&Day"), DatePickerPage_Day , &m_day ), - wxALL | wxALIGN_LEFT , 5 ); - - sizerLeft->Add( CreateSizerWithTextAndLabel( wxT("&Month"), DatePickerPage_Month , &m_month ), - wxALL | wxALIGN_LEFT , 5 ); - - sizerLeft->Add( CreateSizerWithTextAndLabel( wxT("&Year"), DatePickerPage_Year , &m_year ), - wxALL | wxALIGN_LEFT , 5 ); - - sizerLeft->Add( new wxButton( this, wxID_ANY, wxT("&Set date") ), - wxALL , 5 ); - - // right pane + // left pane: style + wxSizer* const sizerLeft = new wxBoxSizer(wxVERTICAL); + + static const wxString kinds[] = { "&Default", "&Spin", "Drop do&wn" }; + m_radioKind = new wxRadioBox(this, wxID_ANY, "&Kind", + wxDefaultPosition, wxDefaultSize, + WXSIZEOF(kinds), kinds, + 1, wxRA_SPECIFY_COLS); + sizerLeft->Add(m_radioKind, wxSizerFlags().Expand().Border()); + + wxSizer* const sizerStyle = new wxStaticBoxSizer(wxVERTICAL, this, "&Style"); + m_chkStyleCentury = CreateCheckBoxAndAddToSizer(sizerStyle, "Show ¢ury"); + m_chkStyleAllowNone = CreateCheckBoxAndAddToSizer(sizerStyle, "Allow &no value"); + + sizerLeft->Add(sizerStyle, wxSizerFlags().Expand().Border()); + + sizerLeft->Add(new wxButton(this, DatePickerPage_Reset, "&Recreate"), + wxSizerFlags().Centre().Border()); + + + // middle pane: operations + wxSizer* const sizerMiddle = new wxBoxSizer(wxVERTICAL); + sizerMiddle->Add(CreateSizerWithTextAndButton + ( + DatePickerPage_Set, + "&Set date", + wxID_ANY, + &m_textCur + ), + wxSizerFlags().Expand().Border()); + + m_textCur->SetMinSize(wxSize(GetTextExtent(" 9999-99-99 ").x, -1)); + + sizerMiddle->AddSpacer(10); + + sizerMiddle->Add(CreateSizerWithTextAndLabel + ( + "&Min date", + wxID_ANY, + &m_textMin + ), + wxSizerFlags().Expand().Border()); + sizerMiddle->Add(CreateSizerWithTextAndLabel + ( + "Ma&x date", + wxID_ANY, + &m_textMax + ), + wxSizerFlags().Expand().Border()); + sizerMiddle->Add(new wxButton(this, DatePickerPage_SetRange, "Set &range"), + wxSizerFlags().Centre().Border()); + + + // right pane: control itself wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL); m_datePicker = new wxDatePickerCtrl(this, DatePickerPage_Picker); @@ -157,19 +211,18 @@ DatePickerWidgetsPage::DatePickerWidgetsPage(WidgetsBookCtrl *book, sizerRight->Add(0, 0, 1, wxCENTRE); sizerRight->Add(m_datePicker, 1, wxCENTRE); sizerRight->Add(0, 0, 1, wxCENTRE); - sizerRight->SetMinSize(150, 0); m_sizerDatePicker = sizerRight; // save it to modify it later // the 3 panes panes compose the window sizerTop->Add(sizerLeft, 0, (wxALL & ~wxLEFT), 10); + sizerTop->Add(sizerMiddle, 0, (wxTOP | wxBOTTOM), 10); sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10); // final initializations + m_chkStyleCentury->SetValue(true); Reset(); SetSizer(sizerTop); - - sizerTop->Fit(this); } void DatePickerWidgetsPage::Reset() @@ -177,9 +230,7 @@ void DatePickerWidgetsPage::Reset() const wxDateTime today = wxDateTime::Today(); m_datePicker->SetValue(today); - m_day->SetValue(wxString::Format(_T("%d"), today.GetDay())); - m_month->SetValue(wxString::Format(_T("%d"), today.GetMonth())); - m_year->SetValue(wxString::Format(_T("%d"), today.GetYear())); + m_textCur->SetValue(today.FormatISODate()); } void DatePickerWidgetsPage::CreateDatePicker() @@ -194,7 +245,30 @@ void DatePickerWidgetsPage::CreateDatePicker() delete m_datePicker; - m_datePicker = new wxDatePickerCtrl(this, DatePickerPage_Picker, value); + long style = 0; + switch ( m_radioKind->GetSelection() ) + { + case 0: + style = wxDP_DEFAULT; + break; + + case 1: + style = wxDP_SPIN; + break; + + case 2: + style = wxDP_DROPDOWN; + break; + } + + if ( m_chkStyleCentury->GetValue() ) + style |= wxDP_SHOWCENTURY; + if ( m_chkStyleAllowNone->GetValue() ) + style |= wxDP_ALLOWNONE; + + m_datePicker = new wxDatePickerCtrl(this, DatePickerPage_Picker, value, + wxDefaultPosition, wxDefaultSize, + style); m_sizerDatePicker->Add(0, 0, 1, wxCENTRE); m_sizerDatePicker->Add(m_datePicker, 1, wxCENTRE); @@ -213,8 +287,56 @@ void DatePickerWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event)) CreateDatePicker(); } +static bool GetDateFromTextControl(wxDateTime& dt, const wxTextCtrl* text) +{ + const wxString& value = text->GetValue(); + if ( !value.empty() ) + { + wxString::const_iterator end; + if ( !dt.ParseDate(value, &end) || end != value.end() ) + { + wxLogError("Invalid date \"%s\""); + return false; + } + } + + return true; +} + void DatePickerWidgetsPage::OnButtonSet(wxCommandEvent& WXUNUSED(event)) { + wxDateTime dt; + if ( GetDateFromTextControl(dt, m_textCur) ) + m_datePicker->SetValue(dt); +} + +void DatePickerWidgetsPage::OnButtonSetRange(wxCommandEvent& WXUNUSED(event)) +{ + wxDateTime dt1, dt2; + if ( !GetDateFromTextControl(dt1, m_textMin) || + !GetDateFromTextControl(dt2, m_textMax) ) + return; + + m_datePicker->SetRange(dt1, dt2); + + if ( !m_datePicker->GetRange(&dt1, &dt2) ) + { + wxLogMessage("No range set"); + } + else + { + m_textMin->SetValue(dt1.IsValid() ? dt1.FormatISODate() : wxString()); + m_textMax->SetValue(dt2.IsValid() ? dt2.FormatISODate() : wxString()); + + wxLogMessage("Date picker range updated"); + } +} + +void DatePickerWidgetsPage::OnDateChanged(wxDateEvent& event) +{ + wxLogMessage("Date changed, now is %s (control value is %s).", + event.GetDate().FormatISOCombined(), + m_datePicker->GetValue().FormatISOCombined()); } #endif // wxUSE_DATEPICKCTRL