+///////////////////////////////////////////////////////////////////////////////
+// Name: src/msw/datetimectrl.cpp
+// Purpose: Implementation of wxDateTimePickerCtrl for MSW.
+// Author: Vadim Zeitlin
+// Created: 2011-09-22 (extracted from src/msw/datectrl.cpp)
+// RCS-ID: $Id: wxhead.cpp,v 1.11 2010-04-22 12:44:51 zeitlin Exp $
+// Copyright: (c) 2005-2011 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#include "wx/datetimectrl.h"
+
+#ifdef wxNEEDS_DATETIMEPICKCTRL
+
+#ifndef WX_PRECOMP
+#endif // WX_PRECOMP
+
+#include "wx/msw/private/datecontrols.h"
+
+// apparently some versions of mingw define these macros erroneously
+#ifndef DateTime_GetSystemtime
+ #define DateTime_GetSystemtime DateTime_GetSystemTime
+#endif
+
+#ifndef DateTime_SetSystemtime
+ #define DateTime_SetSystemtime DateTime_SetSystemTime
+#endif
+
+// ============================================================================
+// wxDateTimePickerCtrl implementation
+// ============================================================================
+
+bool
+wxDateTimePickerCtrl::MSWCreateDateTimePicker(wxWindow *parent,
+ wxWindowID id,
+ const wxDateTime& dt,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
+{
+ if ( !wxMSWDateControls::CheckInitialization() )
+ return false;
+
+ // initialize the base class
+ if ( !CreateControl(parent, id, pos, size, style, validator, name) )
+ return false;
+
+ // create the native control
+ if ( !MSWCreateControl(DATETIMEPICK_CLASS, wxString(), pos, size) )
+ return false;
+
+ if ( dt.IsValid() || MSWAllowsNone() )
+ SetValue(dt);
+ else
+ SetValue(wxDateTime::Now());
+
+ return true;
+}
+
+void wxDateTimePickerCtrl::SetValue(const wxDateTime& dt)
+{
+ wxCHECK_RET( dt.IsValid() || MSWAllowsNone(),
+ wxT("this control requires a valid date") );
+
+ SYSTEMTIME st;
+ if ( dt.IsValid() )
+ dt.GetAsMSWSysTime(&st);
+
+ if ( !DateTime_SetSystemtime(GetHwnd(),
+ dt.IsValid() ? GDT_VALID : GDT_NONE,
+ &st) )
+ {
+ // The only expected failure is when the date is out of range but we
+ // already checked for this above.
+ wxFAIL_MSG( wxT("Setting the calendar date unexpectedly failed.") );
+
+ // In any case, skip updating m_date below.
+ return;
+ }
+
+ m_date = dt;
+}
+
+wxDateTime wxDateTimePickerCtrl::GetValue() const
+{
+ return m_date;
+}
+
+wxSize wxDateTimePickerCtrl::DoGetBestSize() const
+{
+ wxClientDC dc(const_cast<wxDateTimePickerCtrl *>(this));
+
+ // Use the same native format as this as the underlying native control.
+ wxString s = wxDateTime::Now().Format(wxLocale::GetInfo(MSWGetFormat()));
+
+ // the best size for the control is bigger than just the string
+ // representation of the current value because the control must accommodate
+ // any date and while the widths of all digits are usually about the same,
+ // the width of the month string varies a lot, so try to account for it
+ s += wxT("WW");
+
+ int x, y;
+ dc.GetTextExtent(s, &x, &y);
+
+ // account for the drop-down arrow or spin arrows
+ x += wxSystemSettings::GetMetric(wxSYS_HSCROLL_ARROW_X);
+
+ // and for the checkbox if we have it
+ if ( MSWAllowsNone() )
+ x += 3*GetCharWidth();
+
+ wxSize best(x, EDIT_HEIGHT_FROM_CHAR_HEIGHT(y));
+ CacheBestSize(best);
+ return best;
+}
+
+bool
+wxDateTimePickerCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
+{
+ NMHDR* hdr = (NMHDR *)lParam;
+ switch ( hdr->code )
+ {
+ case DTN_DATETIMECHANGE:
+ if ( MSWOnDateTimeChange(*(NMDATETIMECHANGE*)(hdr)) )
+ {
+ *result = 0;
+ return true;
+ }
+ break;
+ }
+
+ return wxDateTimePickerCtrlBase::MSWOnNotify(idCtrl, lParam, result);
+}
+
+#endif // wxNEEDS_DATETIMEPICKCTRL