1. fixed bug with the accels in sub menus not working

2. fixed minor bugs in wxCmdLineParser, underscores and digits are now allows
   in the option names
3. made wxGetLocalTimeMillis() public, documented it and other time functions,
   added wxDateTime::UNow(), also "%l" format specificator in
   wxDateTime::Format()
4. fixed fatal bug in wxTimeSpan::Format()
5. fixed nice bug in wxDateTime::Subtract(wxDateTime) which returned the result
   with the wrong sign


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7664 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2000-07-02 21:48:22 +00:00
parent 888b22c897
commit 948f1f2b77
11 changed files with 221 additions and 97 deletions

View File

@@ -85,7 +85,8 @@ enum wxCmdLineEntryType
The field {\tt shortName} is the usual, short, name of the switch or the option. The field {\tt shortName} is the usual, short, name of the switch or the option.
{\tt longName} is the corresponding long name or NULL if the option has no long {\tt longName} is the corresponding long name or NULL if the option has no long
name. Both of these fields are unused for the parameters. name. Both of these fields are unused for the parameters. Both the short and
long option names can contain only letters, digits and the underscores.
{\tt description} is used by the \helpref{Usage()}{wxcmdlineparserusage} method {\tt description} is used by the \helpref{Usage()}{wxcmdlineparserusage} method
to construct a help message explaining the syntax of the program. to construct a help message explaining the syntax of the program.
@@ -109,7 +110,8 @@ enum
wxCMD\_LINE\_OPTION\_MANDATORY = 0x01, // this option must be given wxCMD\_LINE\_OPTION\_MANDATORY = 0x01, // this option must be given
wxCMD\_LINE\_PARAM\_OPTIONAL = 0x02, // the parameter may be omitted wxCMD\_LINE\_PARAM\_OPTIONAL = 0x02, // the parameter may be omitted
wxCMD\_LINE\_PARAM\_MULTIPLE = 0x04, // the parameter may be repeated wxCMD\_LINE\_PARAM\_MULTIPLE = 0x04, // the parameter may be repeated
wxCMD\_LINE\_OPTION\_HELP = 0x08 // this option is a help request wxCMD\_LINE\_OPTION\_HELP = 0x08, // this option is a help request
wxCMD\_LINE\_NEEDS\_SEPARATOR = 0x10, // must have sep before the value
} }
\end{verbatim}} \end{verbatim}}
@@ -125,6 +127,10 @@ use \helpref{GetParamCount}{wxcmdlineparsergetparamcount} to retrieve the number
of parameters effectively specified after calling of parameters effectively specified after calling
\helpref{Parse}{wxcmdlineparserparse}. \helpref{Parse}{wxcmdlineparserparse}.
The last flag {\tt wxCMD\_LINE\_NEEDS\_SEPARATOR} can be specified to require a
separator (either a colon, an equal sign or white space) between the option
name and its value. By default, no separator is required.
\wxheading{See also} \wxheading{See also}
\helpref{wxApp::argc}{wxappargc} and \helpref{wxApp::argv}{wxappargv}\\ \helpref{wxApp::argc}{wxappargc} and \helpref{wxApp::argv}{wxappargv}\\

View File

@@ -212,6 +212,7 @@ supported. Future versions will support other calendars.
\helpref{GetBeginDST}{wxdatetimegetbegindst}\\ \helpref{GetBeginDST}{wxdatetimegetbegindst}\\
\helpref{GetEndDST}{wxdatetimegetenddst}\\ \helpref{GetEndDST}{wxdatetimegetenddst}\\
\helpref{Now}{wxdatetimenow}\\ \helpref{Now}{wxdatetimenow}\\
\helpref{UNow}{wxdatetimeunow}\\
\helpref{Today}{wxdatetimetoday} \helpref{Today}{wxdatetimetoday}
\membersection{Constructors, assignment operators and setters} \membersection{Constructors, assignment operators and setters}
@@ -562,6 +563,10 @@ Example:
printf("Current time in Paris:\t%s\n", now.Format("%c", wxDateTime::CET).c_str()); printf("Current time in Paris:\t%s\n", now.Format("%c", wxDateTime::CET).c_str());
\end{verbatim} \end{verbatim}
Note that this function is accurate up to second:
\helpref{wxDateTime::UNow}{wxdatetimeunow} should be used for better precision
(but it is less efficient and might not be availabel on all platforms).
\wxheading{See also} \wxheading{See also}
\helpref{Today}{wxdatetimetoday} \helpref{Today}{wxdatetimetoday}
@@ -591,6 +596,18 @@ same as \helpref{Now()}{wxdatetimenow}, but the time part is set to $0$).
\helpref{Now}{wxdatetimenow} \helpref{Now}{wxdatetimenow}
\membersection{wxDateTime::UNow}\label{wxdatetimeunow}
\func{static wxDateTime}{UNow}{\void}
Returns the object corresopnding to the current time including the
milliseconds if a function to get time with such precision is available on the
current platform (supported under most Unices and Win32).
\wxheading{See also}
\helpref{Now}{wxdatetimenow}
%%%%%%%%%%%%%%%%%%%%%%%%%%% constructors &c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%% constructors &c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\membersection{wxDateTime::wxDateTime}\label{wxdatetimewxdatetimedef} \membersection{wxDateTime::wxDateTime}\label{wxdatetimewxdatetimedef}
@@ -1069,6 +1086,10 @@ the character which stopped the scan.
This function does the same as the standard ANSI C {\tt strftime(3)} function. This function does the same as the standard ANSI C {\tt strftime(3)} function.
Please see its description for the meaning of {\it format} parameter. Please see its description for the meaning of {\it format} parameter.
It also accepts a few wxWindows-specific extensions: you can optionally specify
the width of the field to follow using {\tt printf(3)}-like syntax and the
format specificator {\tt \%l} can be used to get the number of milliseconds.
\wxheading{See also} \wxheading{See also}
\helpref{ParseFormat}{wxdatetimeparseformat} \helpref{ParseFormat}{wxdatetimeparseformat}

View File

@@ -1459,21 +1459,6 @@ Return the (current) user's home directory.
<wx/utils.h> <wx/utils.h>
\membersection{::wxGetElapsedTime}\label{wxgetelapsedtime}
\func{long}{wxGetElapsedTime}{\param{bool}{ resetTimer = TRUE}}
Gets the time in milliseconds since the last \helpref{::wxStartTimer}{wxstarttimer}.
If {\it resetTimer} is TRUE (the default), the timer is reset to zero
by this call.
See also \helpref{wxTimer}{wxtimer}.
\wxheading{Include files}
<wx/timer.h>
\membersection{::wxGetFreeMemory}\label{wxgetfreememory} \membersection{::wxGetFreeMemory}\label{wxgetfreememory}
\func{long}{wxGetFreeMemory}{\void} \func{long}{wxGetFreeMemory}{\void}
@@ -1803,18 +1788,6 @@ as a keyboard shortkey in Windows and Motif) and $\backslash$t (tab in Windows).
<wx/utils.h> <wx/utils.h>
\membersection{::wxStartTimer}\label{wxstarttimer}
\func{void}{wxStartTimer}{\void}
Starts a stopwatch; use \helpref{::wxGetElapsedTime}{wxgetelapsedtime} to get the elapsed time.
See also \helpref{wxTimer}{wxtimer}.
\wxheading{Include files}
<wx/timer.h>
\membersection{::wxToLower}\label{wxtolower} \membersection{::wxToLower}\label{wxtolower}
\func{char}{wxToLower}{\param{char }{ch}} \func{char}{wxToLower}{\param{char }{ch}}
@@ -2700,6 +2673,86 @@ Returns the error message corresponding to the given system error code. If
\helpref{wxSysErrorCode}{wxsyserrorcode}, \helpref{wxSysErrorCode}{wxsyserrorcode},
\helpref{wxLogSysError}{wxlogsyserror} \helpref{wxLogSysError}{wxlogsyserror}
\section{Time functions}\label{timefunctions}
The functions in this section deal with getting the current time and
starting/stopping the global timers. Please note that the timer functions are
deprecated because they work with one global timer only and
\helpref{wxTimer}{wxtimer} and/or \helpref{wxStopWatch}{wxstopwatch} classes
should be used instead. For retrieving the current time, you may also use
\helpref{wxDateTime::Now}{wxdatetimenow} or
\helpref{wxDateTime::UNow}{wxdatetimeunow} methods.
\membersection{::wxGetElapsedTime}\label{wxgetelapsedtime}
\func{long}{wxGetElapsedTime}{\param{bool}{ resetTimer = TRUE}}
Gets the time in milliseconds since the last \helpref{::wxStartTimer}{wxstarttimer}.
If {\it resetTimer} is TRUE (the default), the timer is reset to zero
by this call.
See also \helpref{wxTimer}{wxtimer}.
\wxheading{Include files}
<wx/timer.h>
\membersection{::wxGetLocalTime}\label{wxgetlocaltime}
\func{long}{wxGetLocalTime}{\void}
Returns the number of seconds since local time 00:00:00 Jan 1st 1970.
\wxheading{See also}
\helpref{wxDateTime::Now}{wxdatetimenow}
\wxheading{Include files}
<wx/timer.h>
\membersection{::wxGetLocalTimeMillis}\label{wxgetlocaltimemillis}
\func{wxLongLone}{wxGetLocalTimeMillis}{\void}
Returns the number of milliseconds since local time 00:00:00 Jan 1st 1970.
\wxheading{See also}
\helpref{wxDateTime::Now}{wxdatetimenow},\\
\helpref{wxLongLone}{wxlonglong}
\wxheading{Include files}
<wx/timer.h>
\membersection{::wxGetUTCTime}\label{wxgetutctime}
\func{long}{wxGetUTCTime}{\void}
Returns the number of seconds since GMT 00:00:00 Jan 1st 1970.
\wxheading{See also}
\helpref{wxDateTime::Now}{wxdatetimenow}
\wxheading{Include files}
<wx/timer.h>
\membersection{::wxStartTimer}\label{wxstarttimer}
\func{void}{wxStartTimer}{\void}
Starts a stopwatch; use \helpref{::wxGetElapsedTime}{wxgetelapsedtime} to get the elapsed time.
See also \helpref{wxTimer}{wxtimer}.
\wxheading{Include files}
<wx/timer.h>
\section{Debugging macros and functions}\label{debugmacros} \section{Debugging macros and functions}\label{debugmacros}
Useful macros and functions for error checking and defensive programming. ASSERTs are only Useful macros and functions for error checking and defensive programming. ASSERTs are only

View File

@@ -32,7 +32,8 @@ enum
wxCMD_LINE_OPTION_MANDATORY = 0x01, // this option must be given wxCMD_LINE_OPTION_MANDATORY = 0x01, // this option must be given
wxCMD_LINE_PARAM_OPTIONAL = 0x02, // the parameter may be omitted wxCMD_LINE_PARAM_OPTIONAL = 0x02, // the parameter may be omitted
wxCMD_LINE_PARAM_MULTIPLE = 0x04, // the parameter may be repeated wxCMD_LINE_PARAM_MULTIPLE = 0x04, // the parameter may be repeated
wxCMD_LINE_OPTION_HELP = 0x08 // this option is a help request wxCMD_LINE_OPTION_HELP = 0x08, // this option is a help request
wxCMD_LINE_NEEDS_SEPARATOR = 0x10, // must have sep before the value
}; };
// an option value or parameter may be a string (the most common case), a // an option value or parameter may be a string (the most common case), a

View File

@@ -512,6 +512,10 @@ public:
// return the wxDateTime object for the current time // return the wxDateTime object for the current time
static inline wxDateTime Now(); static inline wxDateTime Now();
// return the wxDateTime object for the current time with millisecond
// precision (if available on this platform)
static wxDateTime UNow();
// return the wxDateTime object for today midnight: i.e. as Now() but // return the wxDateTime object for today midnight: i.e. as Now() but
// with time set to 0 // with time set to 0
static inline wxDateTime Today(); static inline wxDateTime Today();
@@ -1096,11 +1100,7 @@ public:
// resulting text representation. Notice that only some of format // resulting text representation. Notice that only some of format
// specifiers valid for wxDateTime are valid for wxTimeSpan: hours, // specifiers valid for wxDateTime are valid for wxTimeSpan: hours,
// minutes and seconds make sense, but not "PM/AM" string for example. // minutes and seconds make sense, but not "PM/AM" string for example.
wxString Format(const wxChar *format = _T("%c")) const; wxString Format(const wxChar *format = _T("%H:%M:%S")) const;
// preferred date representation for the current locale
wxString FormatDate() const { return Format(_T("%x")); }
// preferred time representation for the current locale
wxString FormatTime() const { return Format(_T("%X")); }
// implementation // implementation
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------

View File

@@ -324,7 +324,7 @@ inline wxTimeSpan wxDateTime::Subtract(const wxDateTime& datetime) const
{ {
wxASSERT_MSG( IsValid() && datetime.IsValid(), _T("invalid wxDateTime")); wxASSERT_MSG( IsValid() && datetime.IsValid(), _T("invalid wxDateTime"));
return wxTimeSpan(datetime.GetValue() - GetValue()); return wxTimeSpan(GetValue() - datetime.GetValue());
} }
inline wxDateTime wxDateTime::Add(const wxDateSpan& diff) const inline wxDateTime wxDateTime::Add(const wxDateSpan& diff) const

View File

@@ -222,10 +222,13 @@ long WXDLLEXPORT wxGetElapsedTime(bool resetTimer = TRUE);
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Get number of seconds since local time 00:00:00 Jan 1st 1970. // Get number of seconds since local time 00:00:00 Jan 1st 1970.
long WXDLLEXPORT wxGetLocalTime(); extern long WXDLLEXPORT wxGetLocalTime();
// Get number of seconds since GMT 00:00:00, Jan 1st 1970. // Get number of seconds since GMT 00:00:00, Jan 1st 1970.
long WXDLLEXPORT wxGetUTCTime(); extern long WXDLLEXPORT wxGetUTCTime();
// Get number of milliseconds since local time 00:00:00 Jan 1st 1970
extern wxLongLong WXDLLEXPORT wxGetLocalTimeMillis();
#define wxGetCurrentTime() wxGetLocalTime() #define wxGetCurrentTime() wxGetLocalTime()

View File

@@ -485,7 +485,7 @@ int wxCmdLineParser::Parse()
isLong = TRUE; isLong = TRUE;
const wxChar *p = arg.c_str() + 2; const wxChar *p = arg.c_str() + 2;
while ( wxIsalpha(*p) || (*p == _T('-')) ) while ( wxIsalnum(*p) || (*p == _T('_')) || (*p == _T('-')) )
{ {
name += *p++; name += *p++;
} }
@@ -503,7 +503,7 @@ int wxCmdLineParser::Parse()
// a short one: as they can be cumulated, we try to find the // a short one: as they can be cumulated, we try to find the
// longest substring which is a valid option // longest substring which is a valid option
const wxChar *p = arg.c_str() + 1; const wxChar *p = arg.c_str() + 1;
while ( wxIsalpha(*p) ) while ( wxIsalnum(*p) || (*p == _T('_')) )
{ {
name += *p++; name += *p++;
} }
@@ -596,6 +596,7 @@ int wxCmdLineParser::Parse()
{ {
switch ( *p ) switch ( *p )
{ {
case _T('='):
case _T(':'): case _T(':'):
// the value follows // the value follows
p++; p++;
@@ -619,8 +620,15 @@ int wxCmdLineParser::Parse()
break; break;
default: default:
// the value is right here // the value is right here: this may be legal or
; // not depending on the option style
if ( opt.flags & wxCMD_LINE_NEEDS_SEPARATOR )
{
wxLogError(_("Separator expected after the option '%s'."),
name.c_str());
ok = FALSE;
}
} }
} }
@@ -781,13 +789,18 @@ void wxCmdLineParser::Usage()
wxStripExtension(appname); wxStripExtension(appname);
} }
// we ocnstruct the brief cmd line desc on the fly, but not the detailed // we construct the brief cmd line desc on the fly, but not the detailed
// help message below because we want to align the options descriptions // help message below because we want to align the options descriptions
// and for this we must first know the longest one of them // and for this we must first know the longest one of them
wxString brief; wxString brief;
wxArrayString namesOptions, descOptions; wxArrayString namesOptions, descOptions;
brief.Printf(_("Usage: %s"), appname.c_str()); brief.Printf(_("Usage: %s"), appname.c_str());
// the switch char is usually '-' but this can be changed with
// SetSwitchChars() and then the first one of possible chars is used
wxChar chSwitch = !m_data->m_switchChars ? _T('-')
: m_data->m_switchChars[0u];
size_t n, count = m_data->m_options.GetCount(); size_t n, count = m_data->m_options.GetCount();
for ( n = 0; n < count; n++ ) for ( n = 0; n < count; n++ )
{ {
@@ -799,10 +812,10 @@ void wxCmdLineParser::Usage()
brief << _T('['); brief << _T('[');
} }
brief << _T('-') << opt.shortName; brief << chSwitch << opt.shortName;
wxString option; wxString option;
option << _T(" -") << opt.shortName; option << _T(" ") << chSwitch << opt.shortName;
if ( !!opt.longName ) if ( !!opt.longName )
{ {
option << _T(" --") << opt.longName; option << _T(" --") << opt.longName;

View File

@@ -78,6 +78,7 @@
#include <ctype.h> #include <ctype.h>
#include "wx/datetime.h" #include "wx/datetime.h"
#include "wx/timer.h" // for wxGetLocalTimeMillis()
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// conditional compilation // conditional compilation
@@ -98,8 +99,8 @@
#if defined(__BORLANDC__) || defined(__MINGW32__) || defined(__VISAGECPP__) #if defined(__BORLANDC__) || defined(__MINGW32__) || defined(__VISAGECPP__)
#define WX_TIMEZONE _timezone #define WX_TIMEZONE _timezone
#elif defined(__MWERKS__) #elif defined(__MWERKS__)
long wxmw_timezone = 28800; long wxmw_timezone = 28800;
#define WX_TIMEZONE wxmw_timezone ; #define WX_TIMEZONE wxmw_timezone;
#else // unknown platform - try timezone #else // unknown platform - try timezone
#define WX_TIMEZONE timezone #define WX_TIMEZONE timezone
#endif #endif
@@ -1036,6 +1037,12 @@ wxDateTime wxDateTime::GetEndDST(int year, Country country)
// constructors and assignment operators // constructors and assignment operators
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// return the current time with ms precision
/* static */ wxDateTime wxDateTime::UNow()
{
return wxDateTime(wxGetLocalTimeMillis());
}
// the values in the tm structure contain the local time // the values in the tm structure contain the local time
wxDateTime& wxDateTime::Set(const struct tm& tm) wxDateTime& wxDateTime::Set(const struct tm& tm)
{ {
@@ -1211,7 +1218,7 @@ wxDateTime::Tm wxDateTime::GetTm(const TimeZone& tz) const
tm = localtime(&time); tm = localtime(&time);
// should never happen // should never happen
wxCHECK_MSG( tm, Tm(), _T("gmtime() failed") ); wxCHECK_MSG( tm, Tm(), _T("localtime() failed") );
} }
else else
{ {
@@ -1236,7 +1243,11 @@ wxDateTime::Tm wxDateTime::GetTm(const TimeZone& tz) const
if ( tm ) if ( tm )
{ {
return Tm(*tm, tz); // adjust the milliseconds
Tm tm2(*tm, tz);
long timeOnly = (m_time % MILLISECONDS_PER_DAY).ToLong();
tm2.msec = (wxDateTime_t)(timeOnly % 1000);
return tm2;
} }
//else: use generic code below //else: use generic code below
} }
@@ -1760,8 +1771,10 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
{ {
wxCHECK_MSG( format, _T(""), _T("NULL format in wxDateTime::Format") ); wxCHECK_MSG( format, _T(""), _T("NULL format in wxDateTime::Format") );
// we have to use our own implementation if the date is out of range of
// strftime() or if we use non standard specificators
time_t time = GetTicks(); time_t time = GetTicks();
if ( time != (time_t)-1 ) if ( (time != (time_t)-1) && !wxStrstr(format, _T("%l")) )
{ {
// use strftime() // use strftime()
tm *tm; tm *tm;
@@ -1803,7 +1816,8 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
} }
// we only parse ANSI C format specifications here, no POSIX 2 // we only parse ANSI C format specifications here, no POSIX 2
// complications, no GNU extensions // complications, no GNU extensions but we do add support for a "%l" format
// specifier allowing to get the number of milliseconds
Tm tm = GetTm(tz); Tm tm = GetTm(tz);
// used for calls to strftime() when we only deal with time // used for calls to strftime() when we only deal with time
@@ -2023,6 +2037,10 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
res += wxString::Format(fmt, GetDayOfYear(tz)); res += wxString::Format(fmt, GetDayOfYear(tz));
break; break;
case _T('l'): // milliseconds (NOT STANDARD)
res += wxString::Format(fmt, GetMillisecond(tz));
break;
case _T('m'): // month as a number (01-12) case _T('m'): // month as a number (01-12)
res += wxString::Format(fmt, tm.mon + 1); res += wxString::Format(fmt, tm.mon + 1);
break; break;
@@ -3452,46 +3470,46 @@ wxString wxTimeSpan::Format(const wxChar *format) const
wxString str; wxString str;
str.Alloc(wxStrlen(format)); str.Alloc(wxStrlen(format));
for ( const wxChar *pch = format; pch; pch++ ) for ( const wxChar *pch = format; *pch; pch++ )
{ {
wxChar ch = *pch; wxChar ch = *pch;
if ( ch == '%' ) if ( ch == _T('%') )
{ {
wxString tmp; wxString tmp;
ch = *pch++; ch = *++pch; // get the format spec char
switch ( ch ) switch ( ch )
{ {
default: default:
wxFAIL_MSG( _T("invalid format character") ); wxFAIL_MSG( _T("invalid format character") );
// fall through // fall through
case '%': case _T('%'):
// will get to str << ch below // will get to str << ch below
break; break;
case 'D': case _T('D'):
tmp.Printf(_T("%d"), GetDays()); tmp.Printf(_T("%d"), GetDays());
break; break;
case 'E': case _T('E'):
tmp.Printf(_T("%d"), GetWeeks()); tmp.Printf(_T("%d"), GetWeeks());
break; break;
case 'H': case _T('H'):
tmp.Printf(_T("%02d"), GetHours()); tmp.Printf(_T("%02d"), GetHours());
break; break;
case 'l': case _T('l'):
tmp.Printf(_T("%03ld"), GetMilliseconds().ToLong()); tmp.Printf(_T("%03ld"), GetMilliseconds().ToLong());
break; break;
case 'M': case _T('M'):
tmp.Printf(_T("%02d"), GetMinutes()); tmp.Printf(_T("%02d"), GetMinutes());
break; break;
case 'S': case _T('S'):
tmp.Printf(_T("%02ld"), GetSeconds().ToLong()); tmp.Printf(_T("%02ld"), GetSeconds().ToLong());
break; break;
} }

View File

@@ -88,12 +88,6 @@
#endif #endif
#endif // HAVE_GETTIMEOFDAY #endif // HAVE_GETTIMEOFDAY
// ----------------------------------------------------------------------------
// prototypes
// ----------------------------------------------------------------------------
wxLongLong wxGetLocalTimeMillis();
// ============================================================================ // ============================================================================
// implementation // implementation
// ============================================================================ // ============================================================================
@@ -274,7 +268,7 @@ wxLongLong wxGetLocalTimeMillis()
(void)ftime(&tp); (void)ftime(&tp);
val *= tp.time; val *= tp.time;
return (val + tp.millitm); return (val + tp.millitm);
#else #else // no gettimeofday() nor ftime()
// We use wxGetLocalTime() to get the seconds since // We use wxGetLocalTime() to get the seconds since
// 00:00:00 Jan 1st 1970 and then whatever is available // 00:00:00 Jan 1st 1970 and then whatever is available
// to get millisecond resolution. // to get millisecond resolution.
@@ -290,17 +284,17 @@ wxLongLong wxGetLocalTimeMillis()
::DosGetDateTime(&dt); ::DosGetDateTime(&dt);
val += (dt.hundredths*10); val += (dt.hundredths*10);
#elif defined (__WIN32__) #elif defined (__WIN32__)
#warning "Possible clock skew bug in wxStopWatch!" #warning "Possible clock skew bug in wxGetLocalTimeMillis()!"
SYSTEMTIME st; SYSTEMTIME st;
::GetLocalTime(&st); ::GetLocalTime(&st);
val += st.wMilliseconds; val += st.wMilliseconds;
#else #else // !Win32
#if !defined(__VISUALC__) && !defined(__BORLANDC__) #if !defined(__VISUALC__) && !defined(__BORLANDC__)
#warning "wxStopWatch will be up to second resolution!" #warning "wxStopWatch will be up to second resolution!"
#endif #endif
#endif #endif
return val; return val;
#endif #endif // time functions
} }

View File

@@ -135,35 +135,50 @@ int wxMenu::FindAccel(int id) const
void wxMenu::UpdateAccel(wxMenuItem *item) void wxMenu::UpdateAccel(wxMenuItem *item)
{ {
// find the (new) accel for this item if ( item->IsSubMenu() )
wxAcceleratorEntry *accel = wxGetAccelFromString(item->GetText()); {
if ( accel ) wxMenu *submenu = item->GetSubMenu();
accel->m_command = item->GetId(); wxMenuItemList::Node *node = submenu->GetMenuItems().GetFirst();
while ( node )
{
UpdateAccel(node->GetData());
// find the old one node = node->GetNext();
int n = FindAccel(item->GetId()); }
if ( n == wxNOT_FOUND )
{
// no old, add new if any
if ( accel )
m_accels.Add(accel);
else
return; // skipping RebuildAccelTable() below
} }
else else if ( !item->IsSeparator() )
{ {
// replace old with new or just remove the old one if no new // find the (new) accel for this item
delete m_accels[n]; wxAcceleratorEntry *accel = wxGetAccelFromString(item->GetText());
if ( accel ) if ( accel )
m_accels[n] = accel; accel->m_command = item->GetId();
else
m_accels.Remove(n);
}
if ( IsAttached() ) // find the old one
{ int n = FindAccel(item->GetId());
m_menuBar->RebuildAccelTable(); if ( n == wxNOT_FOUND )
{
// no old, add new if any
if ( accel )
m_accels.Add(accel);
else
return; // skipping RebuildAccelTable() below
}
else
{
// replace old with new or just remove the old one if no new
delete m_accels[n];
if ( accel )
m_accels[n] = accel;
else
m_accels.Remove(n);
}
if ( IsAttached() )
{
m_menuBar->RebuildAccelTable();
}
} }
//else: it is a separator, they can't have accels, nothing to do
} }
#endif // wxUSE_ACCEL #endif // wxUSE_ACCEL