#include "wx/msw/wrapcctl.h"
#include "wx/msw/private.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
+
+IMPLEMENT_DYNAMIC_CLASS(wxDatePickerCtrl, wxControl)
+
// ============================================================================
// implementation
// ============================================================================
{
const wxDateTime::Tm tm(dt.GetTm());
- st->wYear = tm.year;
- st->wMonth = tm.mon - wxDateTime::Jan + 1;
+ st->wYear = (WXWORD)tm.year;
+ st->wMonth = (WXWORD)(tm.mon - wxDateTime::Jan + 1);
st->wDay = tm.mday;
st->wDayOfWeek =
// supposed to initialize all common controls, in comctl32.dll 4.72 (and
// presumably earlier versions 4.70 and 4.71, date time picker not being
// supported in < 4.70 anyhow) it does not do it and we have to initialize
- // it explicitely
+ // it explicitly
static bool s_initDone = false; // MT-ok: used from GUI thread only
if ( !s_initDone )
{
- if ( wxTheApp->GetComCtl32Version() < 470 )
+ if ( wxApp::GetComCtl32Version() < 470 )
{
wxLogError(_("This system doesn't support date picker control, please upgrade your version of comctl32.dll"));
return false;
// create the native control
- if ( !MSWCreateControl(DATETIMEPICK_CLASS, _T(""), pos, size) )
+ if ( !MSWCreateControl(DATETIMEPICK_CLASS, wxEmptyString, pos, size) )
return false;
- if ( dt.IsValid() )
+ if ( dt.IsValid() || (style & wxDP_ALLOWNONE) )
SetValue(dt);
return true;
// although MSDN doesn't mention it, DTS_UPDOWN doesn't work with
// comctl32.dll 4.72
- if ( wxTheApp->GetComCtl32Version() > 472 && (style & wxDP_SPIN) )
+ if ( wxApp::GetComCtl32Version() > 472 && (style & wxDP_SPIN) )
styleMSW |= DTS_UPDOWN;
//else: drop down by default
#endif // DTS_SHORTDATECENTURYFORMAT
styleMSW |= DTS_SHORTDATEFORMAT;
+ if ( style & wxDP_ALLOWNONE )
+ styleMSW |= DTS_SHOWNONE;
+
return styleMSW;
}
{
const int y = GetCharHeight();
- return wxSize(DEFAULT_ITEM_WIDTH, EDIT_HEIGHT_FROM_CHAR_HEIGHT(y));
+ wxSize best(DEFAULT_ITEM_WIDTH, EDIT_HEIGHT_FROM_CHAR_HEIGHT(y));
+ CacheBestSize(best);
+ return best;
}
// ----------------------------------------------------------------------------
void wxDatePickerCtrl::SetValue(const wxDateTime& dt)
{
- // as we don't support DTS_SHOWNONE style so far, we don't allow setting
- // the control to an invalid date, but this restriction may be lifted in
- // the future
- wxCHECK_RET( dt.IsValid(), _T("invalid date") );
+ wxCHECK_RET( dt.IsValid() || HasFlag(wxDP_ALLOWNONE),
+ _T("this control requires a valid date") );
SYSTEMTIME st;
- wxToSystemTime(&st, dt);
- if ( !DateTime_SetSystemtime(GetHwnd(), GDT_VALID, &st) )
+ if ( dt.IsValid() )
+ wxToSystemTime(&st, dt);
+ if ( !DateTime_SetSystemtime(GetHwnd(),
+ dt.IsValid() ? GDT_VALID : GDT_NONE,
+ &st) )
{
wxLogDebug(_T("DateTime_SetSystemtime() failed"));
}