mirror of
https://github.com/wxWidgets/wxWidgets.git
synced 2026-09-21 13:26:08 +08:00
1. msec resolution for timer functions under Win32
2. small wxLog corrections/enhancements 3. some wxDateTime and wxLongLong work git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4744 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
+14
-14
@@ -13,14 +13,14 @@
|
||||
|
||||
#! now transform these hashes into $project tags
|
||||
foreach $file (sort keys %wxCommon) {
|
||||
next if $wxCommon{$file} !~ /\bB\b/;
|
||||
next if $wxCommon{$file} !~ /\bB\b/;
|
||||
|
||||
my $tag = $file =~ /\.c$/ ? "WXCSRCS" : "WXCOMMONSRCS";
|
||||
$project{$tag} .= $file . " "
|
||||
}
|
||||
|
||||
foreach $file (sort keys %wxMSW) {
|
||||
next if $wxMSW{$file} !~ /\bB\b/;
|
||||
next if $wxMSW{$file} !~ /\bB\b/;
|
||||
|
||||
my $tag = $file =~ /\.c$/ ? "WXMSWCSRCS" : "WXMSWSRCS";
|
||||
$project{$tag} .= $file . " "
|
||||
@@ -65,16 +65,16 @@ RSC=rc.exe
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Output_Dir "BaseRelease"
|
||||
# PROP BASE Intermediate_Dir "BaseRelease"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Output_Dir "BaseRelease"
|
||||
# PROP Intermediate_Dir "BaseRelease"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /Zi /O2 /I "$(wx)\include" /I "$(wx)\src\zlib" /D "NDEBUG" /D wxUSE_GUI=0 /D WIN95=1 /D "__WIN95__" /D "WIN32" /D "_WIN32" /D WINVER=0x400 /D "__WINDOWS__" /D "__WXMSW__" /D "__WIN32__" /Yu"wx/wxprec.h" /FD /c
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D _MT /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /Zi /O2 /I "$(wx)\include" /I "$(wx)\src\zlib" /D "NDEBUG" /D wxUSE_GUI=0 /D WIN95=1 /D "__WIN95__" /D "WIN32" /D "_WIN32" /D WINVER=0x400 /D "__WINDOWS__" /D "__WXMSW__" /D "__WIN32__" /D _MT /Yu"wx/wxprec.h" /FD /c
|
||||
# ADD BASE RSC /l 0x409
|
||||
# ADD RSC /l 0x409
|
||||
BSC32=bscmake.exe
|
||||
@@ -88,16 +88,16 @@ LIB32=link.exe -lib
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Output_Dir "BaseDebug"
|
||||
# PROP BASE Intermediate_Dir "BaseDebug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Output_Dir "BaseDebug"
|
||||
# PROP Intermediate_Dir "BaseDebug"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
|
||||
# ADD CPP /nologo /W4 /Zi /Od /I "$(wx)\include" /I "$(wx)\src\zlib" /D "_DEBUG" /D DEBUG=1 /D WXDEBUG=1 /D "__WXDEBUG__" /D wxUSE_GUI=0 /D "__WIN95__" /D "WIN32" /D "_WIN32" /D WINVER=0x400 /D "__WINDOWS__" /D "__WIN32__" /D "__WXMSW__" /Fr /Yu"wx/wxprec.h" /FD /c
|
||||
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D _MT /YX /FD /c
|
||||
# ADD CPP /nologo /W4 /Zi /Od /I "$(wx)\include" /I "$(wx)\src\zlib" /D "_DEBUG" /D DEBUG=1 /D WXDEBUG=1 /D "__WXDEBUG__" /D wxUSE_GUI=0 /D "__WIN95__" /D "WIN32" /D "_WIN32" /D WINVER=0x400 /D "__WINDOWS__" /D "__WIN32__" /D "__WXMSW__" /D _MT /Fr /Yu"wx/wxprec.h" /FD /c
|
||||
# ADD BASE RSC /l 0x409
|
||||
# ADD RSC /l 0x409
|
||||
BSC32=bscmake.exe
|
||||
|
||||
+336
-82
File diff suppressed because it is too large
Load Diff
+26
-2
@@ -57,6 +57,11 @@
|
||||
#define wxUSE_LONGLONG_NATIVE 0
|
||||
class WXDLLEXPORT wxLongLongWx;
|
||||
typedef wxLongLongWx wxLongLong;
|
||||
#else
|
||||
// if nothing is defined, use native implementation by default, of course
|
||||
#ifndef wxUSE_LONGLONG_NATIVE
|
||||
#define wxUSE_LONGLONG_NATIVE 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef wxUSE_LONGLONG_WX
|
||||
@@ -112,10 +117,13 @@ public:
|
||||
unsigned long GetLo() const
|
||||
{ return (unsigned long) (m_ll & 0x00000000FFFFFFFFl); }
|
||||
|
||||
// get absolute value
|
||||
wxLongLongNative& Abs() { if ( m_ll < 0 ) m_ll = -m_ll; return *this; }
|
||||
|
||||
// convert to native long long
|
||||
wxLongLong_t GetValue() const { return m_ll; }
|
||||
|
||||
operator wxLongLong_t() const { return m_ll; }
|
||||
//operator wxLongLong_t() const { return m_ll; }
|
||||
|
||||
// operations
|
||||
// addition
|
||||
@@ -189,7 +197,7 @@ public:
|
||||
wxLongLongNative& operator^=(const wxLongLongNative& ll)
|
||||
{ m_ll ^= ll.m_ll; return *this; }
|
||||
|
||||
// multiplication/division TODO
|
||||
// multiplication/division
|
||||
wxLongLongNative operator*(const wxLongLongNative& ll) const
|
||||
{ return wxLongLongNative(m_ll * ll.m_ll); }
|
||||
wxLongLongNative& operator*=(const wxLongLongNative& ll)
|
||||
@@ -197,25 +205,41 @@ public:
|
||||
|
||||
wxLongLongNative operator/(const wxLongLongNative& ll) const
|
||||
{ return wxLongLongNative(m_ll / ll.m_ll); }
|
||||
wxLongLongNative operator/(long l) const
|
||||
{ return wxLongLongNative(m_ll / l); }
|
||||
wxLongLongNative& operator/=(const wxLongLongNative& ll)
|
||||
{ m_ll /= ll.m_ll; return *this; }
|
||||
|
||||
wxLongLongNative operator%(const wxLongLongNative& ll) const
|
||||
{ return wxLongLongNative(m_ll % ll.m_ll); }
|
||||
wxLongLongNative operator%(long l) const
|
||||
{ return wxLongLongNative(m_ll % l); }
|
||||
|
||||
// comparison
|
||||
bool operator==(const wxLongLongNative& ll) const
|
||||
{ return m_ll == ll.m_ll; }
|
||||
bool operator==(long l) const
|
||||
{ return m_ll == l; }
|
||||
bool operator!=(const wxLongLongNative& ll) const
|
||||
{ return m_ll != ll.m_ll; }
|
||||
bool operator!=(long l) const
|
||||
{ return m_ll != l; }
|
||||
bool operator<(const wxLongLongNative& ll) const
|
||||
{ return m_ll < ll.m_ll; }
|
||||
bool operator<(long l) const
|
||||
{ return m_ll < l; }
|
||||
bool operator>(const wxLongLongNative& ll) const
|
||||
{ return m_ll > ll.m_ll; }
|
||||
bool operator>(long l) const
|
||||
{ return m_ll > l; }
|
||||
bool operator<=(const wxLongLongNative& ll) const
|
||||
{ return m_ll <= ll.m_ll; }
|
||||
bool operator<=(long l) const
|
||||
{ return m_ll <= l; }
|
||||
bool operator>=(const wxLongLongNative& ll) const
|
||||
{ return m_ll >= ll.m_ll; }
|
||||
bool operator>=(long l) const
|
||||
{ return m_ll >= l; }
|
||||
|
||||
// miscellaneous
|
||||
// conversion to byte array: returns a pointer to static buffer!
|
||||
|
||||
@@ -31,12 +31,84 @@
|
||||
|
||||
//#define TEST_ARRAYS
|
||||
//#define TEST_LOG
|
||||
#define TEST_THREADS
|
||||
//#define TEST_THREADS
|
||||
//#define TEST_TIME
|
||||
#define TEST_LONGLONG
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// long long
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#ifdef TEST_LONGLONG
|
||||
|
||||
#include <wx/longlong.h>
|
||||
#include <wx/timer.h>
|
||||
|
||||
static void TestSpeed()
|
||||
{
|
||||
static const long max = 100000000;
|
||||
long n;
|
||||
|
||||
{
|
||||
wxStopWatch sw;
|
||||
|
||||
long l = 0;
|
||||
for ( n = 0; n < max; n++ )
|
||||
{
|
||||
l += n;
|
||||
}
|
||||
|
||||
printf("Summing longs took %ld milliseconds.\n", sw.Time());
|
||||
}
|
||||
|
||||
{
|
||||
wxStopWatch sw;
|
||||
|
||||
__int64 l = 0;
|
||||
for ( n = 0; n < max; n++ )
|
||||
{
|
||||
l += n;
|
||||
}
|
||||
|
||||
printf("Summing __int64s took %ld milliseconds.\n", sw.Time());
|
||||
}
|
||||
|
||||
{
|
||||
wxStopWatch sw;
|
||||
|
||||
wxLongLong l;
|
||||
for ( n = 0; n < max; n++ )
|
||||
{
|
||||
l += n;
|
||||
}
|
||||
|
||||
printf("Summing wxLongLongs took %ld milliseconds.\n", sw.Time());
|
||||
}
|
||||
}
|
||||
|
||||
static void TestDivision()
|
||||
{
|
||||
wxLongLong ll = 0x38417388; // some number < LONG_MAX
|
||||
|
||||
wxASSERT( (ll / 1000l)*1000l == ll );
|
||||
}
|
||||
|
||||
#endif // TEST_LONGLONG
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// date time
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#ifdef TEST_TIME
|
||||
|
||||
#include <wx/datetime.h>
|
||||
|
||||
#endif // TEST_TIME
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// threads
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -241,6 +313,21 @@ int main(int argc, char **argv)
|
||||
(unsigned long)thread.Wait());
|
||||
#endif // TEST_THREADS
|
||||
|
||||
#ifdef TEST_LONGLONG
|
||||
if ( 0 )
|
||||
TestSpeed();
|
||||
if ( 1 )
|
||||
TestDivision();
|
||||
#endif // TEST_LONGLONG
|
||||
|
||||
#ifdef TEST_TIME
|
||||
wxDateTime time = wxDateTime::Now();
|
||||
printf("Current time: '%s', current year %u is %sa leap one",
|
||||
time.Format().c_str(),
|
||||
time.GetYear(),
|
||||
wxDateTime::IsLeapYear(time.GetYear()) ? "" : "not");
|
||||
#endif // TEST_TIME
|
||||
|
||||
wxUninitialize();
|
||||
|
||||
return 0;
|
||||
|
||||
+359
-6
@@ -34,8 +34,38 @@
|
||||
#include "wx/log.h"
|
||||
#endif // WX_PRECOMP
|
||||
|
||||
#define wxDEFINE_TIME_CONSTANTS
|
||||
|
||||
#include "wx/datetime.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// constants
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// the number of days in month in Julian/Gregorian calendar: the first line is
|
||||
// for normal years, the second one is for the leap ones
|
||||
static wxDateTime::wxDateTime_t gs_daysInMonth[2][12] =
|
||||
{
|
||||
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
|
||||
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// private functions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
static wxString CallStrftime(const wxChar *format, const tm* tm)
|
||||
{
|
||||
wxChar buf[1024];
|
||||
if ( !wxStrftime(buf, WXSIZEOF(buf), format, tm) )
|
||||
{
|
||||
// is ti really possible that 1024 is too short?
|
||||
wxFAIL_MSG(_T("strftime() failed"));
|
||||
}
|
||||
|
||||
return wxString(buf);
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// implementation of wxDateTime
|
||||
// ============================================================================
|
||||
@@ -44,16 +74,188 @@
|
||||
// static data
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
Country wxDateTime::ms_country;
|
||||
wxDateTime::Country wxDateTime::ms_country = wxDateTime::Country_Unknown;
|
||||
wxDateTime wxDateTime::ms_InvDateTime;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// struct Tm
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxDateTime::Tm::Tm()
|
||||
{
|
||||
year = (wxDateTime_t)wxDateTime::Inv_Year;
|
||||
mon = wxDateTime::Inv_Month;
|
||||
mday = 0;
|
||||
hour = min = sec = 0;
|
||||
wday = wxDateTime::Inv_WeekDay;
|
||||
}
|
||||
|
||||
wxDateTime::Tm::Tm(const struct tm& tm)
|
||||
{
|
||||
sec = tm.tm_sec;
|
||||
min = tm.tm_min;
|
||||
hour = tm.tm_hour;
|
||||
mday = tm.tm_mday;
|
||||
mon = tm.tm_mon;
|
||||
year = 1900 + tm.tm_year;
|
||||
wday = tm.tm_wday;
|
||||
yday = tm.tm_yday;
|
||||
}
|
||||
|
||||
bool wxDateTime::Tm::IsValid() const
|
||||
{
|
||||
// we allow for the leap seconds, although we don't use them (yet)
|
||||
return (year != wxDateTime::Inv_Year) && (mon < 12) &&
|
||||
(mday < gs_daysInMonth[IsLeapYear(year)][mon]) &&
|
||||
(hour < 24) && (min < 60) && (sec < 62);
|
||||
}
|
||||
|
||||
void wxDateTime::Tm::ComputeWeekDay()
|
||||
{
|
||||
wxFAIL_MSG(_T("TODO"));
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// static functions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
/* static */
|
||||
bool wxDateTime::IsLeapYear(int year, wxDateTime::Calendar cal)
|
||||
{
|
||||
if ( cal == Gregorian )
|
||||
{
|
||||
// in Gregorian calendar leap years are those divisible by 4 except
|
||||
// those divisible by 100 unless they're also divisible by 400
|
||||
// (in some countries, like Russia and Greece, additional corrections
|
||||
// exist, but they won't manifest themselves until 2700)
|
||||
return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
|
||||
}
|
||||
else if ( cal == Julian )
|
||||
{
|
||||
// in Julian calendar the rule is simpler
|
||||
return year % 4 == 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
wxFAIL_MSG(_T("unknown calendar"));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* static */
|
||||
void wxDateTime::SetCountry(wxDateTime::Country country)
|
||||
{
|
||||
ms_country = country;
|
||||
}
|
||||
|
||||
/* static */
|
||||
int wxDateTime::ConvertYearToBC(int year)
|
||||
{
|
||||
// year 0 is BC 1
|
||||
return year > 0 ? year : year - 1;
|
||||
}
|
||||
|
||||
/* static */
|
||||
int wxDateTime::GetCurrentYear(wxDateTime::Calendar cal)
|
||||
{
|
||||
switch ( cal )
|
||||
{
|
||||
case Gregorian:
|
||||
return Now().GetYear();
|
||||
|
||||
case Julian:
|
||||
wxFAIL_MSG(_T("TODO"));
|
||||
break;
|
||||
|
||||
default:
|
||||
wxFAIL_MSG(_T("unsupported calendar"));
|
||||
break;
|
||||
}
|
||||
|
||||
return Inv_Year;
|
||||
}
|
||||
|
||||
/* static */
|
||||
wxDateTime::Month wxDateTime::GetCurrentMonth(wxDateTime::Calendar cal)
|
||||
{
|
||||
switch ( cal )
|
||||
{
|
||||
case Gregorian:
|
||||
return Now().GetMonth();
|
||||
break;
|
||||
|
||||
case Julian:
|
||||
wxFAIL_MSG(_T("TODO"));
|
||||
break;
|
||||
|
||||
default:
|
||||
wxFAIL_MSG(_T("unsupported calendar"));
|
||||
break;
|
||||
}
|
||||
|
||||
return Inv_Month;
|
||||
}
|
||||
|
||||
/* static */
|
||||
wxDateTime::wxDateTime_t wxDateTime::GetNumberOfDays(wxDateTime::Month month,
|
||||
int year,
|
||||
wxDateTime::Calendar cal)
|
||||
{
|
||||
wxCHECK_MSG( month < 12, 0, _T("invalid month") );
|
||||
|
||||
if ( cal == Gregorian || cal == Julian )
|
||||
{
|
||||
if ( year == Inv_Year )
|
||||
{
|
||||
// take the current year if none given
|
||||
year = GetCurrentYear();
|
||||
}
|
||||
|
||||
return gs_daysInMonth[IsLeapYear(year)][month];
|
||||
}
|
||||
else
|
||||
{
|
||||
wxFAIL_MSG(_T("unsupported calendar"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* static */
|
||||
wxString wxDateTime::GetMonthName(wxDateTime::Month month, bool abbr)
|
||||
{
|
||||
wxCHECK_MSG( month != Inv_Month, _T(""), _T("invalid month") );
|
||||
|
||||
tm tm = { 0, 0, 0, 1, month, 76 }; // any year will do
|
||||
|
||||
return CallStrftime(abbr ? _T("%b") : _T("%B"), &tm);
|
||||
}
|
||||
|
||||
/* static */
|
||||
wxString wxDateTime::GetWeekDayName(wxDateTime::WeekDay wday, bool abbr)
|
||||
{
|
||||
wxCHECK_MSG( wday != Inv_WeekDay, _T(""), _T("invalid weekday") );
|
||||
|
||||
// take some arbitrary Sunday
|
||||
tm tm = { 0, 0, 0, 28, Nov, 99 };
|
||||
|
||||
// and offset it by the number of days needed to get
|
||||
tm.tm_mday += wday;
|
||||
|
||||
return CallStrftime(abbr ? _T("%a") : _T("%A"), &tm);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// constructors and assignment operators
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxDateTime& wxDateTime::Set(const struct tm& tm)
|
||||
wxDateTime& wxDateTime::Set(const struct tm& tm1)
|
||||
{
|
||||
time_t timet = mktime(tm);
|
||||
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
||||
|
||||
tm tm2(tm1);
|
||||
time_t timet = mktime(&tm2);
|
||||
if ( timet == (time_t)(-1) )
|
||||
{
|
||||
wxFAIL_MSG(_T("Invalid time"));
|
||||
@@ -71,6 +273,8 @@ wxDateTime& wxDateTime::Set(wxDateTime_t hour,
|
||||
wxDateTime_t second,
|
||||
wxDateTime_t millisec)
|
||||
{
|
||||
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
||||
|
||||
// we allow seconds to be 61 to account for the leap seconds, even if we
|
||||
// don't use them really
|
||||
wxCHECK_MSG( hour < 24 && second < 62 && minute < 60 && millisec < 1000,
|
||||
@@ -86,7 +290,7 @@ wxDateTime& wxDateTime::Set(wxDateTime_t hour,
|
||||
tm->tm_min = minute;
|
||||
tm->tm_sec = second;
|
||||
|
||||
(void)Set(tm);
|
||||
(void)Set(*tm);
|
||||
|
||||
// and finally adjust milliseconds
|
||||
return SetMillisecond(millisec);
|
||||
@@ -100,6 +304,8 @@ wxDateTime& wxDateTime::Set(wxDateTime_t day,
|
||||
wxDateTime_t second,
|
||||
wxDateTime_t millisec)
|
||||
{
|
||||
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
||||
|
||||
wxCHECK_MSG( hour < 24 && second < 62 && minute < 60 && millisec < 1000,
|
||||
ms_InvDateTime,
|
||||
_T("Invalid time in wxDateTime::Set()") );
|
||||
@@ -121,9 +327,9 @@ wxDateTime& wxDateTime::Set(wxDateTime_t day,
|
||||
if ( year >= yearMaxInRange && year <= yearMaxInRange )
|
||||
{
|
||||
// use the standard library version if the date is in range - this is
|
||||
// probably much more efficient than our code
|
||||
// probably more efficient than our code
|
||||
struct tm tm;
|
||||
tm.tm_year = year;
|
||||
tm.tm_year = year - 1900;
|
||||
tm.tm_mon = month;
|
||||
tm.tm_mday = day;
|
||||
tm.tm_hour = hour;
|
||||
@@ -140,7 +346,154 @@ wxDateTime& wxDateTime::Set(wxDateTime_t day,
|
||||
// do time calculations ourselves: we want to calculate the number of
|
||||
// milliseconds between the given date and the epoch (necessarily
|
||||
// negative)
|
||||
wxFAIL_MSG(_T("TODO"));
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// time_t <-> broken down time conversions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxDateTime::Tm wxDateTime::GetTm() const
|
||||
{
|
||||
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
||||
|
||||
time_t time = GetTicks();
|
||||
if ( time != (time_t)-1 )
|
||||
{
|
||||
// use C RTL functions
|
||||
tm *tm = localtime(&time);
|
||||
|
||||
// should never happen
|
||||
wxCHECK_MSG( tm, Tm(), _T("localtime() failed") );
|
||||
|
||||
return Tm(*tm);
|
||||
}
|
||||
else
|
||||
{
|
||||
wxFAIL_MSG(_T("TODO"));
|
||||
|
||||
return Tm();
|
||||
}
|
||||
}
|
||||
|
||||
wxDateTime& wxDateTime::SetYear(int year)
|
||||
{
|
||||
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
||||
|
||||
Tm tm(GetTm());
|
||||
tm.year = year;
|
||||
Set(tm);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
wxDateTime& wxDateTime::SetMonth(Month month)
|
||||
{
|
||||
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
||||
|
||||
Tm tm(GetTm());
|
||||
tm.mon = month;
|
||||
Set(tm);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
wxDateTime& wxDateTime::SetDay(wxDateTime_t mday)
|
||||
{
|
||||
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
||||
|
||||
Tm tm(GetTm());
|
||||
tm.mday = mday;
|
||||
Set(tm);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
wxDateTime& wxDateTime::SetHour(wxDateTime_t hour)
|
||||
{
|
||||
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
||||
|
||||
Tm tm(GetTm());
|
||||
tm.hour = hour;
|
||||
Set(tm);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
wxDateTime& wxDateTime::SetMinute(wxDateTime_t min)
|
||||
{
|
||||
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
||||
|
||||
Tm tm(GetTm());
|
||||
tm.min = min;
|
||||
Set(tm);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
wxDateTime& wxDateTime::SetSecond(wxDateTime_t sec)
|
||||
{
|
||||
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
||||
|
||||
Tm tm(GetTm());
|
||||
tm.sec = sec;
|
||||
Set(tm);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
wxDateTime& wxDateTime::SetMillisecond(wxDateTime_t millisecond)
|
||||
{
|
||||
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
||||
|
||||
// we don't need to use GetTm() for this one
|
||||
m_time -= m_time % 1000l;
|
||||
m_time += millisecond;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxDateTime arithmetics
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxDateTime& wxDateTime::Add(const wxDateSpan& diff)
|
||||
{
|
||||
Tm tm(GetTm());
|
||||
|
||||
tm.year += diff.GetYears();
|
||||
tm.mon += diff.GetMonths();
|
||||
tm.mday += diff.GetTotalDays();
|
||||
|
||||
Set(tm);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxDateTime to/from text representations
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxString wxDateTime::Format(const wxChar *format) const
|
||||
{
|
||||
time_t time = GetTicks();
|
||||
if ( time != (time_t)-1 )
|
||||
{
|
||||
// use strftime()
|
||||
tm *tm = localtime(&time);
|
||||
|
||||
// should never happen
|
||||
wxCHECK_MSG( tm, _T(""), _T("localtime() failed") );
|
||||
|
||||
return CallStrftime(format, tm);
|
||||
}
|
||||
else
|
||||
{
|
||||
wxFAIL_MSG(_T("TODO"));
|
||||
|
||||
return _T("");
|
||||
}
|
||||
}
|
||||
|
||||
+22
-6
@@ -607,15 +607,16 @@ void wxOnAssert(const wxChar *szFile, int nLine, const wxChar *szMsg)
|
||||
// send it to the normal log destination
|
||||
wxLogDebug(szBuf);
|
||||
|
||||
#if wxUSE_GUI
|
||||
#if wxUSE_GUI || defined(__WXMSW__)
|
||||
// this message is intentionally not translated - it is for
|
||||
// developpers only
|
||||
wxStrcat(szBuf, wxT("\nDo you want to stop the program?"
|
||||
"\nYou can also choose [Cancel] to suppress "
|
||||
"further warnings."));
|
||||
"\nYou can also choose [Cancel] to suppress "
|
||||
"further warnings."));
|
||||
|
||||
switch ( wxMessageBox(szBuf, _("Debug"),
|
||||
wxYES_NO | wxCANCEL | wxICON_STOP ) ) {
|
||||
#if wxUSE_GUI
|
||||
switch ( wxMessageBox(szBuf, "Debug",
|
||||
wxYES_NO | wxCANCEL | wxICON_STOP ) ) {
|
||||
case wxYES:
|
||||
Trap();
|
||||
break;
|
||||
@@ -624,8 +625,23 @@ void wxOnAssert(const wxChar *szFile, int nLine, const wxChar *szMsg)
|
||||
s_bNoAsserts = TRUE;
|
||||
break;
|
||||
|
||||
//case wxNO: nothing to do
|
||||
//case wxNO: nothing to do
|
||||
}
|
||||
#else // !GUI, but MSW
|
||||
switch ( ::MessageBox(NULL, szBuf, "Debug",
|
||||
MB_YESNOCANCEL | MB_ICONSTOP ) ) {
|
||||
case IDYES:
|
||||
Trap();
|
||||
break;
|
||||
|
||||
case IDCANCEL:
|
||||
s_bNoAsserts = TRUE;
|
||||
break;
|
||||
|
||||
//case IDNO: nothing to do
|
||||
}
|
||||
#endif // GUI or MSW
|
||||
|
||||
#else // !GUI
|
||||
Trap();
|
||||
#endif // GUI/!GUI
|
||||
|
||||
@@ -136,6 +136,12 @@ long wxGetCurrentTime()
|
||||
// return GMT time in millisecond
|
||||
long wxGetCurrentMTime()
|
||||
{
|
||||
#if defined(__WIN32__)
|
||||
SYSTEMTIME st;
|
||||
::GetLocalTime(&st);
|
||||
|
||||
return 1000*(60*(60*st.wHour+st.wMinute)+st.wSecond)+st.wMilliseconds;
|
||||
#else
|
||||
#if defined(HAVE_LOCALTIME)
|
||||
time_t t0 = time(&t0);
|
||||
if ( t0 != (time_t)-1 )
|
||||
@@ -166,6 +172,7 @@ long wxGetCurrentMTime()
|
||||
wxLogSysError(_("Failed to get the system time"));
|
||||
|
||||
return -1;
|
||||
#endif // __WIN32__/!__WIN32__
|
||||
}
|
||||
|
||||
bool wxGetLocalTime(long *timeZone, int *dstObserved)
|
||||
|
||||
Reference in New Issue
Block a user