Also use wxString instead of wxChar* strings. Closes https://github.com/wxWidgets/wxWidgets/pull/950
		
			
				
	
	
		
			341 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			341 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Program:     wxWidgets Widgets Sample
 | |
| // Name:        datepick.cpp
 | |
| // Purpose:     Part of the widgets sample showing date picker
 | |
| // Author:      Dimitri Schoolwerth, Vadim Zeitlin
 | |
| // Created:     27 Sep 2003
 | |
| // Copyright:   (c) 2003 wxWindows team
 | |
| // Licence:     wxWindows licence
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| // ============================================================================
 | |
| // declarations
 | |
| // ============================================================================
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // headers
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| // for compilers that support precompilation, includes "wx/wx.h".
 | |
| #include "wx/wxprec.h"
 | |
| 
 | |
| #ifdef __BORLANDC__
 | |
|     #pragma hdrstop
 | |
| #endif
 | |
| 
 | |
| #if wxUSE_DATEPICKCTRL
 | |
| 
 | |
| // for all others, include the necessary headers
 | |
| #ifndef WX_PRECOMP
 | |
|     #include "wx/app.h"
 | |
|     #include "wx/log.h"
 | |
| 
 | |
|     #include "wx/bitmap.h"
 | |
|     #include "wx/button.h"
 | |
|     #include "wx/checkbox.h"
 | |
|     #include "wx/radiobox.h"
 | |
|     #include "wx/statbox.h"
 | |
|     #include "wx/textctrl.h"
 | |
| 
 | |
|     #include "wx/sizer.h"
 | |
| #endif
 | |
| 
 | |
| #include "wx/datectrl.h"
 | |
| #include "wx/dateevt.h"
 | |
| 
 | |
| #include "widgets.h"
 | |
| 
 | |
| #include "icons/datepick.xpm"
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // constants
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| // control ids
 | |
| enum
 | |
| {
 | |
|     DatePickerPage_Reset = wxID_HIGHEST,
 | |
|     DatePickerPage_Set,
 | |
|     DatePickerPage_SetRange,
 | |
|     DatePickerPage_Picker
 | |
| };
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // CheckBoxWidgetsPage
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| class DatePickerWidgetsPage : public WidgetsPage
 | |
| {
 | |
| public:
 | |
|     DatePickerWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
 | |
| 
 | |
|     virtual wxWindow *GetWidget() const wxOVERRIDE { return m_datePicker; }
 | |
|     virtual void RecreateWidget() wxOVERRIDE { CreateDatePicker(); }
 | |
| 
 | |
|     // lazy creation of the content
 | |
|     virtual void CreateContent() wxOVERRIDE;
 | |
| 
 | |
| protected:
 | |
|     // event handlers
 | |
|     void OnDateChanged(wxDateEvent& event);
 | |
| 
 | |
|     void OnButtonSet(wxCommandEvent& event);
 | |
|     void OnButtonSetRange(wxCommandEvent& event);
 | |
|     void OnButtonReset(wxCommandEvent& event);
 | |
| 
 | |
|     // reset the date picker parameters
 | |
|     void Reset();
 | |
| 
 | |
|     // (re)create the date picker
 | |
|     void CreateDatePicker();
 | |
| 
 | |
|     // the controls
 | |
|     // ------------
 | |
| 
 | |
|     // the checkbox itself and the sizer it is in
 | |
|     wxDatePickerCtrl *m_datePicker;
 | |
|     wxSizer *m_sizerDatePicker;
 | |
| 
 | |
|     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;
 | |
| 
 | |
| private:
 | |
|     wxDECLARE_EVENT_TABLE();
 | |
|     DECLARE_WIDGETS_PAGE(DatePickerWidgetsPage)
 | |
| };
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // event tables
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| wxBEGIN_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)
 | |
| wxEND_EVENT_TABLE()
 | |
| 
 | |
| // ============================================================================
 | |
| // implementation
 | |
| // ============================================================================
 | |
| 
 | |
| #if defined(__WXMSW__)
 | |
|     #define FAMILY_CTRLS NATIVE_CTRLS
 | |
| #else
 | |
|     #define FAMILY_CTRLS GENERIC_CTRLS
 | |
| #endif
 | |
| 
 | |
| IMPLEMENT_WIDGETS_PAGE(DatePickerWidgetsPage, "DatePicker",
 | |
|                        FAMILY_CTRLS | PICKER_CTRLS
 | |
|                        );
 | |
| 
 | |
| DatePickerWidgetsPage::DatePickerWidgetsPage(WidgetsBookCtrl *book,
 | |
|                                          wxImageList *imaglist)
 | |
|                       :WidgetsPage(book, imaglist, datepick_xpm)
 | |
| {
 | |
| }
 | |
| 
 | |
| void DatePickerWidgetsPage::CreateContent()
 | |
| {
 | |
|     wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
 | |
| 
 | |
|     // 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);
 | |
| 
 | |
|     sizerRight->Add(0, 0, 1, wxCENTRE);
 | |
|     sizerRight->Add(m_datePicker, 1, wxCENTRE);
 | |
|     sizerRight->Add(0, 0, 1, wxCENTRE);
 | |
|     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);
 | |
| }
 | |
| 
 | |
| void DatePickerWidgetsPage::Reset()
 | |
| {
 | |
|     const wxDateTime today = wxDateTime::Today();
 | |
| 
 | |
|     m_datePicker->SetValue(today);
 | |
|     m_textCur->SetValue(today.FormatISODate());
 | |
| }
 | |
| 
 | |
| void DatePickerWidgetsPage::CreateDatePicker()
 | |
| {
 | |
|     const wxDateTime value = m_datePicker->GetValue();
 | |
| 
 | |
|     size_t count = m_sizerDatePicker->GetChildren().GetCount();
 | |
|     for ( size_t n = 0; n < count; n++ )
 | |
|     {
 | |
|         m_sizerDatePicker->Remove(0);
 | |
|     }
 | |
| 
 | |
|     delete m_datePicker;
 | |
| 
 | |
|     long style = GetAttrs().m_defaultFlags;
 | |
|     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);
 | |
|     m_sizerDatePicker->Add(0, 0, 1, wxCENTRE);
 | |
|     m_sizerDatePicker->Layout();
 | |
| }
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // event handlers
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| void DatePickerWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
 | |
| {
 | |
|     Reset();
 | |
| 
 | |
|     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
 |