added wxDateTime::SetFrom/GetAsMSWSysTime() (#9161)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53697 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-05-22 00:49:27 +00:00
parent 026d727651
commit 154014d681
6 changed files with 91 additions and 41 deletions

View File

@@ -30,6 +30,9 @@
class WXDLLIMPEXP_FWD_BASE wxDateTime;
class WXDLLIMPEXP_FWD_BASE wxTimeSpan;
class WXDLLIMPEXP_FWD_BASE wxDateSpan;
#ifdef __WXMSW__
struct _SYSTEMTIME;
#endif
#include "wx/dynarray.h"
@@ -598,6 +601,12 @@ public:
wxDateTime_t minute = 0,
wxDateTime_t second = 0,
wxDateTime_t millisec = 0);
#ifdef __WXMSW__
wxDateTime(const struct _SYSTEMTIME& st)
{
SetFromMSWSysTime(st);
}
#endif
// default copy ctor ok
@@ -912,6 +921,17 @@ public:
// pack the date in DOS format
unsigned long GetAsDOS() const;
// SYSTEMTIME format
// ------------------------------------------------------------------------
#ifdef __WXMSW__
// convert SYSTEMTIME to wxDateTime
wxDateTime& SetFromMSWSysTime(const struct _SYSTEMTIME&);
// convert wxDateTime to SYSTEMTIME
void GetAsMSWSysTime(struct _SYSTEMTIME*) const;
#endif // __WXMSW__
// comparison (see also functions below for operator versions)
// ------------------------------------------------------------------------

View File

@@ -24,32 +24,8 @@ namespace wxMSWDateControls
// happen with a very old version of common controls DLL, i.e. before 4.70)
extern bool CheckInitialization();
// convert SYSTEMTIME to wxDateTime
inline void FromSystemTime(wxDateTime *dt, const SYSTEMTIME& st)
{
dt->Set(st.wDay,
wx_static_cast(wxDateTime::Month, wxDateTime::Jan + st.wMonth - 1),
st.wYear,
0, 0, 0);
}
// convert wxDateTime to SYSTEMTIME
inline void ToSystemTime(SYSTEMTIME *st, const wxDateTime& dt)
{
const wxDateTime::Tm tm(dt.GetTm());
st->wYear = (WXWORD)tm.year;
st->wMonth = (WXWORD)(tm.mon - wxDateTime::Jan + 1);
st->wDay = tm.mday;
st->wDayOfWeek =
st->wHour =
st->wMinute =
st->wSecond =
st->wMilliseconds = 0;
}
} // namespace wxMSWDateControls
#endif // _MSW_PRIVATE_DATECONTROLS_H_

View File

@@ -285,6 +285,17 @@ public:
wxDateTime_t minute = 0, wxDateTime_t second = 0,
wxDateTime_t millisec = 0);
/**
Same as SetFromMSWSysTime.
@param st
Input, Windows SYSTEMTIME reference
@since 2.9.0
@remarks MSW only
*/
wxDateTime(const struct _SYSTEMTIME& st);
/**
Reset time to midnight (00:00:00) without changing the date.
*/
@@ -410,6 +421,24 @@ public:
*/
long unsigned int GetAsDOS() const;
/**
Initialize using the Windows SYSTEMTIME structure.
@param st
Input, Windows SYSTEMTIME reference
@since 2.9.0
@remarks MSW only
*/
wxDateTime& SetFromMSWSysTime(const struct _SYSTEMTIME& st);
/**
Returns the date and time in the Windows SYSTEMTIME format.
@param st
Output, pointer to Windows SYSTEMTIME
@since 2.9.0
@remarks MSW only
*/
void GetAsMSWSysTime(struct _SYSTEMTIME* st) const;
/**
Returns the century of this date.
*/

View File

@@ -4588,4 +4588,30 @@ WXDLLIMPEXP_BASE void wxPrevWDay(wxDateTime::WeekDay& wd)
: (wxDateTime::WeekDay)(wd - 1);
}
#ifdef __WXMSW__
wxDateTime& wxDateTime::SetFromMSWSysTime(const SYSTEMTIME& st)
{
return Set(st.wDay,
wx_static_cast(wxDateTime::Month, wxDateTime::Jan + st.wMonth - 1),
st.wYear,
0, 0, 0);
}
void wxDateTime::GetAsMSWSysTime(SYSTEMTIME* st) const
{
const wxDateTime::Tm tm(GetTm());
st->wYear = (WXWORD)tm.year;
st->wMonth = (WXWORD)(tm.mon - wxDateTime::Jan + 1);
st->wDay = tm.mday;
st->wDayOfWeek =
st->wHour =
st->wMinute =
st->wSecond =
st->wMilliseconds = 0;
}
#endif // __WXMSW__
#endif // wxUSE_DATETIME

View File

@@ -177,7 +177,7 @@ wxCalendarCtrl::HitTest(const wxPoint& pos,
case MCHT_CALENDARDATE:
if ( date )
wxMSWDateControls::FromSystemTime(date, hti.st);
date->SetFromMSWSysTime(hti.st);
return wxCAL_HITTEST_DAY;
case MCHT_CALENDARDAY:
@@ -208,7 +208,7 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& dt)
wxCHECK_MSG( dt.IsValid(), false, "invalid date" );
SYSTEMTIME st;
wxMSWDateControls::ToSystemTime(&st, dt);
dt.GetAsMSWSysTime(&st);
if ( !MonthCal_SetCurSel(GetHwnd(), &st) )
{
wxLogDebug(_T("DateTime_SetSystemtime() failed"));
@@ -232,8 +232,7 @@ wxDateTime wxCalendarCtrl::GetDate() const
return wxDefaultDateTime;
}
wxDateTime dt;
wxMSWDateControls::FromSystemTime(&dt, st);
wxDateTime dt(st);
wxASSERT_MSG( dt == m_date, "mismatch between data and control" );
#endif // __WXDEBUG__
@@ -248,13 +247,13 @@ bool wxCalendarCtrl::SetDateRange(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;
}
@@ -274,7 +273,7 @@ bool wxCalendarCtrl::GetDateRange(wxDateTime *dt1, wxDateTime *dt2) const
if ( dt1 )
{
if ( flags & GDTR_MIN )
wxMSWDateControls::FromSystemTime(dt1, st[0]);
dt1->SetFromMSWSysTime(st[0]);
else
*dt1 = wxDefaultDateTime;
}
@@ -282,7 +281,7 @@ bool wxCalendarCtrl::GetDateRange(wxDateTime *dt1, wxDateTime *dt2) const
if ( dt2 )
{
if ( flags & GDTR_MAX )
wxMSWDateControls::FromSystemTime(dt2, st[1]);
dt2->SetFromMSWSysTime(st[1]);
else
*dt2 = wxDefaultDateTime;
}
@@ -363,7 +362,7 @@ bool wxCalendarCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
// which expects GetDate() to return the new date
const wxDateTime dateOld = m_date;
const NMSELCHANGE * const sch = (NMSELCHANGE *)lParam;
wxMSWDateControls::FromSystemTime(&m_date, sch->stSelStart);
m_date.SetFromMSWSysTime(sch->stSelStart);
// changing the year or the month results in a second dummy
// MCN_SELCHANGE event on this system which doesn't really

View File

@@ -178,7 +178,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) )
@@ -200,7 +200,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() &&
@@ -218,13 +218,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;
}
@@ -242,7 +242,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;
}
@@ -250,7 +250,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;
}
@@ -273,7 +273,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