]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/datectrl.cpp
more wxSocket code wx-ification: use wxDynamicLibrary instead of raw Win32 calls
[wxWidgets.git] / src / msw / datectrl.cpp
index 0beaeb4e8d71500711d126a11a1477e1341c339a..1009211b4d9dc777eca784dc1838d88b11011dbc 100644 (file)
@@ -31,6 +31,7 @@
     #include "wx/app.h"
     #include "wx/intl.h"
     #include "wx/dcclient.h"
+    #include "wx/settings.h"
     #include "wx/msw/private.h"
 #endif
 
@@ -38,7 +39,6 @@
 
 #include "wx/msw/private/datecontrols.h"
 
-#define _WX_DEFINE_DATE_EVENTS_
 #include "wx/dateevt.h"
 
 // apparently some versions of mingw define these macros erroneously
@@ -124,8 +124,7 @@ WXDWORD wxDatePickerCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
 
 wxSize wxDatePickerCtrl::DoGetBestSize() const
 {
-    wxClientDC dc(wx_const_cast(wxDatePickerCtrl *, this));
-    dc.SetFont(GetFont());
+    wxClientDC dc(const_cast<wxDatePickerCtrl *>(this));
 
     // we can't use FormatDate() here as the CRT doesn't always use the same
     // format as the date picker control
@@ -157,13 +156,23 @@ wxSize wxDatePickerCtrl::DoGetBestSize() const
         }
     }
 
-    // the control adds a lot of extra space around separators
-    s.Replace(_T(","), _T("    ,    "));
+    // the best size for the control is bigger than just the string
+    // representation of todays date 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 += _T("WW");
 
     int x, y;
     dc.GetTextExtent(s, &x, &y);
 
-    wxSize best(x + 40 /* margin + arrows */, EDIT_HEIGHT_FROM_CHAR_HEIGHT(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 ( HasFlag(wxDP_ALLOWNONE) )
+        x += 3*GetCharWidth();
+
+    wxSize best(x, EDIT_HEIGHT_FROM_CHAR_HEIGHT(y));
     CacheBestSize(best);
     return best;
 }
@@ -179,7 +188,7 @@ void wxDatePickerCtrl::SetValue(const wxDateTime& dt)
 
     SYSTEMTIME st;
     if ( dt.IsValid() )
-        wxMSWDateControls::ToSystemTime(&st, dt);
+        dt.GetAsMSWSysTime(&st);
     if ( !DateTime_SetSystemtime(GetHwnd(),
                                  dt.IsValid() ? GDT_VALID : GDT_NONE,
                                  &st) )
@@ -201,7 +210,7 @@ wxDateTime wxDatePickerCtrl::GetValue() const
     SYSTEMTIME st;
     if ( DateTime_GetSystemtime(GetHwnd(), &st) == GDT_VALID )
     {
-        wxMSWDateControls::FromSystemTime(&dt, st);
+        dt.SetFromMSWSysTime(st);
     }
 
     wxASSERT_MSG( m_date.IsValid() == dt.IsValid() &&
@@ -219,13 +228,13 @@ void wxDatePickerCtrl::SetRange(const wxDateTime& dt1, const wxDateTime& dt2)
     DWORD flags = 0;
     if ( dt1.IsValid() )
     {
-        wxMSWDateControls::ToSystemTime(&st[0], dt1);
+        dt1.GetAsMSWSysTime(st + 0);
         flags |= GDTR_MIN;
     }
 
     if ( dt2.IsValid() )
     {
-        wxMSWDateControls::ToSystemTime(&st[1], dt2);
+        dt2.GetAsMSWSysTime(st + 1);
         flags |= GDTR_MAX;
     }
 
@@ -243,7 +252,7 @@ bool wxDatePickerCtrl::GetRange(wxDateTime *dt1, wxDateTime *dt2) const
     if ( dt1 )
     {
         if ( flags & GDTR_MIN )
-            wxMSWDateControls::FromSystemTime(dt1, st[0]);
+            dt1->SetFromMSWSysTime(st[0]);
         else
             *dt1 = wxDefaultDateTime;
     }
@@ -251,7 +260,7 @@ bool wxDatePickerCtrl::GetRange(wxDateTime *dt1, wxDateTime *dt2) const
     if ( dt2 )
     {
         if ( flags & GDTR_MAX )
-            wxMSWDateControls::FromSystemTime(dt2, st[1]);
+            dt2->SetFromMSWSysTime(st[1]);
         else
             *dt2 = wxDefaultDateTime;
     }
@@ -274,7 +283,7 @@ wxDatePickerCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
             NMDATETIMECHANGE *dtch = (NMDATETIMECHANGE *)hdr;
             wxDateTime dt;
             if ( dtch->dwFlags == GDT_VALID )
-                wxMSWDateControls::FromSystemTime(&dt, dtch->st);
+                dt.SetFromMSWSysTime(dtch->st);
 
             // filter out duplicate DTN_DATETIMECHANGE events which the native
             // control sends us when using wxDP_DROPDOWN style