/////////////////////////////////////////////////////////////////////////////
-// Name: msw/datectrl.cpp
+// Name: src/msw/datectrl.cpp
// Purpose: wxDatePickerCtrl implementation
// Author: Vadim Zeitlin
// Modified by:
#pragma hdrstop
#endif
+#if wxUSE_DATEPICKCTRL
+
#ifndef WX_PRECOMP
+ #include "wx/app.h"
+ #include "wx/intl.h"
+ #include "wx/dcclient.h"
+ #include "wx/msw/wrapwin.h"
+ #include "wx/msw/wrapcctl.h"
+ #include "wx/msw/private.h"
#endif
-#if wxUSE_DATEPICKCTRL
-
#include "wx/datectrl.h"
-#include "wx/app.h"
-#include "wx/intl.h"
#include "wx/dynlib.h"
#define _WX_DEFINE_DATE_EVENTS_
#include "wx/dateevt.h"
-#include "wx/msw/wrapwin.h"
-#include "wx/msw/wrapcctl.h"
-#include "wx/msw/private.h"
-
-#if defined(__GNUWIN32__) && !wxCHECK_W32API_VERSION( 2, 4 )
-typedef struct tagNMDATETIMECHANGE
-{
- NMHDR nmhdr;
- DWORD dwFlags;
- SYSTEMTIME st;
-} NMDATETIMECHANGE;
-#endif // old gcc headers
-
// apparently some versions of mingw define these macros erroneously
#ifndef DateTime_GetSystemtime
#define DateTime_GetSystemtime DateTime_GetSystemTime
#define DateTime_SetSystemtime DateTime_SetSystemTime
#endif
+IMPLEMENT_DYNAMIC_CLASS(wxDatePickerCtrl, wxControl)
+
// ============================================================================
// implementation
// ============================================================================
// 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;
}
+#if wxUSE_DYNLIB_CLASS
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(icex);
icex.dwICC = ICC_DATE_CLASSES;
}
s_initDone = true;
+#endif
}
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
wxSize wxDatePickerCtrl::DoGetBestSize() const
{
- const int y = GetCharHeight();
+ wxClientDC dc(wx_const_cast(wxDatePickerCtrl *, this));
+ dc.SetFont(GetFont());
+
+ // we can't use FormatDate() here as the CRT doesn't always use the same
+ // format as the date picker control
+ wxString s;
+ for ( int len = 100; ; len *= 2 )
+ {
+ if ( ::GetDateFormat
+ (
+ LOCALE_USER_DEFAULT, // the control should use the same
+ DATE_SHORTDATE, // the format used by the control
+ NULL, // use current date (we don't care)
+ NULL, // no custom format
+ wxStringBuffer(s, len), // output buffer
+ len // and its length
+ ) )
+ {
+ // success
+ break;
+ }
- return wxSize(DEFAULT_ITEM_WIDTH, EDIT_HEIGHT_FROM_CHAR_HEIGHT(y));
+ const DWORD rc = ::GetLastError();
+ if ( rc != ERROR_INSUFFICIENT_BUFFER )
+ {
+ wxLogApiError(_T("GetDateFormat"), rc);
+
+ // fall back on wxDateTime, what else to do?
+ s = wxDateTime::Today().FormatDate();
+ break;
+ }
+ }
+
+ // the control adds a lot of extra space around separators
+ s.Replace(_T(","), _T(" , "));
+
+ int x, y;
+ dc.GetTextExtent(s, &x, &y);
+
+ wxSize best(x + 40 /* margin + arrows */, EDIT_HEIGHT_FROM_CHAR_HEIGHT(y));
+ CacheBestSize(best);
+ return best;
}
// ----------------------------------------------------------------------------
}
#endif // wxUSE_DATEPICKCTRL
-