Refactor wxDatePickerCtrl to derive from wxDateTimePickerCtrl.
No real changes, just refactor wxMSW wxDatePickerCtrl to allow sharing code with the upcoming wxTimePickerCtrl class. Even less changes for the other platforms where wxDateTimePickerCtrl is trivial. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69222 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
152
src/msw/datetimectrl.cpp
Normal file
152
src/msw/datetimectrl.cpp
Normal file
@@ -0,0 +1,152 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// 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
|
||||
Reference in New Issue
Block a user