the copy of the object with the changed sign.
*/
+// an invalid/default date time object which may be used as the default
+// argument for arguments of type wxDateTime; it is also returned by all
+// functions returning wxDateTime on failure (this is why it is also called
+// wxInvalidDateTime)
+class WXDLLEXPORT wxDateTime;
+
+WXDLLEXPORT_DATA(extern wxDateTime&) wxDefaultDateTime;
+#define wxInvalidDateTime wxDefaultDateTime
+
// ----------------------------------------------------------------------------
// wxDateTime represents an absolute moment in the time
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxDateTime
{
-private:
- // invalid wxDateTime object - returned by all functions which return
- // "wxDateTime &" on failure.
- // This variable has to be declared at the start of the class,
- // or some compilers (e.g. Watcom C++) won't like it being used further down.
- static wxDateTime ms_InvDateTime;
-
public:
// types
// ------------------------------------------------------------------------
// set to the next week day following this one
wxDateTime& SetToNextWeekDay(WeekDay weekday);
- // set to the previous week day following this one
+ // set to the previous week day before this one
wxDateTime& SetToPrevWeekDay(WeekDay weekday);
// set to Nth occurence of given weekday in the given month of the
// result of timezone shift)
// ------------------------------------------------------------------------
- // is the date valid (FALSE for uninitialized objects as well as after
- // the functions which failed to convert the date to supported range)
- inline bool IsValid() const { return this != &ms_InvDateTime; }
+ // is the date valid (TRUE even for non initialized objects)?
+ inline bool IsValid() const { return this != &wxInvalidDateTime; }
// get the broken down date/time representation in the given timezone
//
// default to Today() otherwise)
const wxChar *ParseFormat(const wxChar *date,
const wxChar *format = _T("%c"),
- const wxDateTime& dateDef = wxDateTime::ms_InvDateTime);
+ const wxDateTime& dateDef = wxDefaultDateTime);
// parse a string containing the date/time in "free" format, this
// function will try to make an educated guess at the string contents
const wxChar *ParseDateTime(const wxChar *datetime);
--- /dev/null
+///////////////////////////////////////////////////////////////////////////////
+// Name: generic/calctrl.h
+// Purpose: generic implementation of date-picker control
+// Author: Vadim Zeitlin
+// Modified by:
+// Created: 29.12.99
+// RCS-ID: $Id$
+// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
+// Licence: wxWindows license
+///////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+ #pragma interface "calctrl.h"
+#endif
+
+#ifndef _WX_GENERIC_CALCTRL_H
+#define _WX_GENERIC_CALCTRL_H
+
+#include "wx/control.h" // the base class
+
+#include "wx/datetime.h" // for m_date
+#include "wx/combobox.h" // for m_comboMonth
+#include "wx/spinctrl.h" // for m_spinYear
+
+#define wxCalendarNameStr _T("CalendarCtrl")
+
+// ----------------------------------------------------------------------------
+// wxCalendarCtrl: a control allowing the user to pick a date interactively
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxCalendarCtrl : public wxControl
+{
+public:
+ // construction
+ wxCalendarCtrl() { Init(); }
+ wxCalendarCtrl(wxWindow *parent,
+ wxWindowID id,
+ const wxDateTime& date = wxDefaultDateTime,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxString& name = wxCalendarNameStr)
+ : wxControl(parent, id, pos, size, style, wxDefaultValidator, name)
+ {
+ Init();
+
+ (void)Create(parent, id, date, pos, size, style, name);
+ }
+
+ bool Create(wxWindow *parent,
+ wxWindowID id,
+ const wxDateTime& date = wxDefaultDateTime,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxString& name = wxCalendarNameStr);
+
+ // set/get the current date
+ void SetDate(const wxDateTime& date);
+ const wxDateTime& GetDate() const { return m_date; }
+
+ // returns TRUE if the given point is on a day and fills date with its
+ // value
+ bool HitTest(const wxPoint& pos, wxDateTime *date);
+
+ // implementation only from now on
+ // -------------------------------
+
+ void OnPaint(wxPaintEvent& event);
+ void OnClick(wxMouseEvent& event);
+
+private:
+ // common part of all ctors
+ void Init();
+
+ // override some base class virtuals
+ virtual wxSize DoGetBestSize() const;
+ virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags);
+ virtual void DoMoveWindow(int x, int y, int width, int height);
+
+ // get the date from which we start drawing days
+ wxDateTime GetStartDate() const;
+
+ // is this date shown?
+ bool IsDateShown(const wxDateTime& date) const;
+
+ // the subcontrols
+ wxComboBox *m_comboMonth;
+ wxSpinCtrl *m_spinYear;
+
+ wxDateTime m_date;
+
+ // the width and height of one column/row in the calendar
+ wxCoord m_widthCol,
+ m_heightRow;
+
+ DECLARE_DYNAMIC_CLASS(wxCalendarCtrl)
+ DECLARE_EVENT_TABLE()
+};
+
+#endif // _WX_GENERIC_CALCTRL_H
int image = -1, int selectedImage = -1,
wxTreeItemData *data = NULL);
- // insert a new item before a given one
+ // insert a new item before the one with the given index
wxTreeItemId InsertItem(const wxTreeItemId& parent,
- size_t before,
+ size_t index,
const wxString& text,
int image = -1, int selectedImage = -1,
wxTreeItemData *data = NULL);
int image = -1, int selectedImage = -1,
wxTreeItemData *data = NULL);
+ // insert a new item before the one with the given index
+ wxTreeItemId InsertItem(const wxTreeItemId& parent,
+ size_t index,
+ const wxString& text,
+ int image = -1, int selectedImage = -1,
+ wxTreeItemData *data = NULL);
+
// insert a new item in as the last child of the parent
wxTreeItemId AppendItem(const wxTreeItemId& parent,
const wxString& text,
};
// ----------------------------------------------------------------------------
-// globals
+// global data
+// ----------------------------------------------------------------------------
+
+static wxDateTime gs_dtDefault;
+
+wxDateTime& wxDefaultDateTime = gs_dtDefault;
+
+wxDateTime::Country wxDateTime::ms_country = wxDateTime::Country_Unknown;
+
+// ----------------------------------------------------------------------------
+// private globals
// ----------------------------------------------------------------------------
// a critical section is needed to protect GetTimeZone() static
// variable in MT case
#if wxUSE_THREADS
- wxCriticalSection gs_critsectTimezone;
+ static wxCriticalSection gs_critsectTimezone;
#endif // wxUSE_THREADS
// ----------------------------------------------------------------------------
// implementation of wxDateTime
// ============================================================================
-// ----------------------------------------------------------------------------
-// static data
-// ----------------------------------------------------------------------------
-
-wxDateTime::Country wxDateTime::ms_country = wxDateTime::Country_Unknown;
-wxDateTime wxDateTime::ms_InvDateTime;
-
// ----------------------------------------------------------------------------
// struct Tm
// ----------------------------------------------------------------------------
monDiff += MONTHS_IN_YEAR;
}
- while ( monDiff + mon > MONTHS_IN_YEAR )
+ while ( monDiff + mon >= MONTHS_IN_YEAR )
{
year++;
if ( !IsDSTApplicable(year, country) )
{
- return ms_InvDateTime;
+ return wxInvalidDateTime;
}
wxDateTime dt;
if ( !IsDSTApplicable(year, country) )
{
- return ms_InvDateTime;
+ return wxInvalidDateTime;
}
wxDateTime dt;
wxFAIL_MSG( _T("mktime() failed") );
- return ms_InvDateTime;
+ return wxInvalidDateTime;
}
else
{
// 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,
- ms_InvDateTime,
+ wxInvalidDateTime,
_T("Invalid time in wxDateTime::Set()") );
// get the current date from system
time_t timet = GetTimeNow();
struct tm *tm = localtime(&timet);
- wxCHECK_MSG( tm, ms_InvDateTime, _T("localtime() failed") );
+ wxCHECK_MSG( tm, wxInvalidDateTime, _T("localtime() failed") );
// adjust the time
tm->tm_hour = hour;
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
wxCHECK_MSG( hour < 24 && second < 62 && minute < 60 && millisec < 1000,
- ms_InvDateTime,
+ wxInvalidDateTime,
_T("Invalid time in wxDateTime::Set()") );
ReplaceDefaultYearMonthWithCurrent(&year, &month);
wxCHECK_MSG( (0 < day) && (day <= GetNumberOfDays(month, year)),
- ms_InvDateTime,
+ wxInvalidDateTime,
_T("Invalid date in wxDateTime::Set()") );
// the range of time_t type (inclusive)
wxDateTime& wxDateTime::SetToWeekDayInSameWeek(WeekDay weekday)
{
- wxCHECK_MSG( weekday != Inv_WeekDay, ms_InvDateTime, _T("invalid weekday") );
+ wxCHECK_MSG( weekday != Inv_WeekDay, wxInvalidDateTime, _T("invalid weekday") );
WeekDay wdayThis = GetWeekDay();
if ( weekday == wdayThis )
wxDateTime& wxDateTime::SetToNextWeekDay(WeekDay weekday)
{
- wxCHECK_MSG( weekday != Inv_WeekDay, ms_InvDateTime, _T("invalid weekday") );
+ wxCHECK_MSG( weekday != Inv_WeekDay, wxInvalidDateTime, _T("invalid weekday") );
int diff;
WeekDay wdayThis = GetWeekDay();
wxDateTime& wxDateTime::SetToPrevWeekDay(WeekDay weekday)
{
- wxCHECK_MSG( weekday != Inv_WeekDay, ms_InvDateTime, _T("invalid weekday") );
+ wxCHECK_MSG( weekday != Inv_WeekDay, wxInvalidDateTime, _T("invalid weekday") );
int diff;
WeekDay wdayThis = GetWeekDay();
{
int year = GetYear();
wxCHECK_MSG( (0 < yday) && (yday <= GetNumberOfDays(year)),
- ms_InvDateTime, _T("invalid year day") );
+ wxInvalidDateTime, _T("invalid year day") );
bool isLeap = IsLeapYear(year);
for ( Month mon = Jan; mon < Inv_Month; wxNextMonth(mon) )
--- /dev/null
+///////////////////////////////////////////////////////////////////////////////
+// Name: generic/calctrl.cpp
+// Purpose: implementation fo the generic wxCalendarCtrl
+// Author: Vadim Zeitlin
+// Modified by:
+// Created: 29.12.99
+// RCS-ID: $Id$
+// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
+// Licence: wxWindows license
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+#ifdef __GNUG__
+ #pragma implementation "calctrl.h"
+#endif
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#endif //WX_PRECOMP
+
+#include "wx/generic/calctrl.h"
+
+// ----------------------------------------------------------------------------
+// wxWin macros
+// ----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(wxCalendarCtrl, wxControl)
+ EVT_PAINT(wxCalendarCtrl::OnPaint)
+
+ EVT_LEFT_DOWN(wxCalendarCtrl::OnClick)
+END_EVENT_TABLE()
+
+IMPLEMENT_DYNAMIC_CLASS(wxCalendarCtrl, wxControl)
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxCalendarCtrl
+// ----------------------------------------------------------------------------
+
+void wxCalendarCtrl::Init()
+{
+ m_comboMonth = NULL;
+ m_spinYear = NULL;
+
+ m_widthCol =
+ m_heightRow = 0;
+}
+
+bool wxCalendarCtrl::Create(wxWindow *parent,
+ wxWindowID id,
+ const wxDateTime& date,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name)
+{
+ m_date = date.IsValid() ? date : wxDateTime::Today();
+
+ wxSize sizeReal;
+ if ( size.x == -1 || size.y == -1 )
+ {
+ sizeReal = DoGetBestSize();
+ if ( size.x != -1 )
+ sizeReal.x = size.x;
+ if ( size.y != -1 )
+ sizeReal.y = size.y;
+ }
+ else
+ {
+ sizeReal = size;
+ }
+
+ SetSize(sizeReal);
+
+ SetBackgroundColour(*wxWHITE);
+
+ return TRUE;
+}
+
+// ----------------------------------------------------------------------------
+// date helpers
+// ----------------------------------------------------------------------------
+
+wxDateTime wxCalendarCtrl::GetStartDate() const
+{
+ wxDateTime::Tm tm = m_date.GetTm();
+
+ wxDateTime date = wxDateTime(1, tm.mon, tm.year);
+ date.SetToPrevWeekDay(wxDateTime::Sun);
+
+ return date;
+}
+
+bool wxCalendarCtrl::IsDateShown(const wxDateTime& date) const
+{
+ return date.GetMonth() == m_date.GetMonth();
+}
+
+// ----------------------------------------------------------------------------
+// size management
+// ----------------------------------------------------------------------------
+
+wxSize wxCalendarCtrl::DoGetBestSize() const
+{
+ return wxSize(230, 200);
+}
+
+void wxCalendarCtrl::DoSetSize(int x, int y,
+ int width, int height,
+ int sizeFlags)
+{
+ wxControl::DoSetSize(x, y, width, height, sizeFlags);
+}
+
+void wxCalendarCtrl::DoMoveWindow(int x, int y, int width, int height)
+{
+ wxControl::DoMoveWindow(x, y, width, height);
+}
+
+// ----------------------------------------------------------------------------
+// drawing
+// ----------------------------------------------------------------------------
+
+void wxCalendarCtrl::OnPaint(wxPaintEvent& event)
+{
+ wxPaintDC dc(this);
+
+ wxDateTime::WeekDay wd;
+ wxString weekdays[7];
+
+ dc.SetFont(*wxSWISS_FONT);
+
+ // determine the column width (we assume that the weekday names are always
+ // wider (in any language) than the numbers)
+ m_widthCol = 0;
+ for ( wd = wxDateTime::Sun; wd < wxDateTime::Inv_WeekDay; wxNextWDay(wd) )
+ {
+ weekdays[wd] = wxDateTime::GetWeekDayName(wd, wxDateTime::Name_Abbr);
+
+ wxCoord width;
+ dc.GetTextExtent(weekdays[wd], &width, &m_heightRow);
+ if ( width > m_widthCol )
+ {
+ m_widthCol = width;
+ }
+ }
+
+ // leave some margins
+ m_widthCol += 2;
+ m_heightRow += 2;
+
+ // first draw the week days
+ dc.SetTextForeground(*wxBLUE);
+ dc.SetBrush(wxBrush(*wxLIGHT_GREY, wxSOLID));
+ dc.SetBackgroundMode(wxTRANSPARENT);
+ dc.SetPen(*wxWHITE_PEN);
+ dc.DrawRectangle(0, 0, 7*m_widthCol - 1, m_heightRow);
+ for ( wd = wxDateTime::Sun; wd < wxDateTime::Inv_WeekDay; wxNextWDay(wd) )
+ {
+ dc.DrawText(weekdays[wd], wd*m_widthCol + 1, 0);
+ }
+
+ // then the calendar itself
+ dc.SetTextForeground(*wxBLACK);
+ //dc.SetFont(*wxNORMAL_FONT);
+
+ wxCoord y = m_heightRow;
+
+ wxDateTime date = GetStartDate();
+ dc.SetBackgroundMode(wxSOLID);
+ for ( size_t nWeek = 0; nWeek < 6; nWeek++ )
+ {
+ for ( wd = wxDateTime::Sun; wd < wxDateTime::Inv_WeekDay; wxNextWDay(wd) )
+ {
+ if ( IsDateShown(date) )
+ {
+ wxString day = wxString::Format(_T("%u"), date.GetDay());
+ wxCoord width;
+ dc.GetTextExtent(day, &width, (wxCoord *)NULL);
+
+ bool isSel = m_date == date;
+ if ( isSel )
+ {
+ dc.SetTextForeground(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHTTEXT));
+ dc.SetTextBackground(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT));
+ }
+
+ dc.DrawText(day, wd*m_widthCol + (m_widthCol - width) / 2, y);
+
+ if ( isSel )
+ {
+ dc.SetTextForeground(*wxBLACK);
+ dc.SetTextBackground(m_backgroundColour);
+ }
+ }
+ //else: just don't draw it
+
+ date += wxDateSpan::Day();
+ }
+
+ y += m_heightRow;
+ }
+}
+
+// ----------------------------------------------------------------------------
+// mouse handling
+// ----------------------------------------------------------------------------
+
+void wxCalendarCtrl::OnClick(wxMouseEvent& event)
+{
+ wxDateTime date;
+ if ( !HitTest(event.GetPosition(), &date) )
+ {
+ event.Skip();
+ }
+ else
+ {
+ m_date = date;
+
+ Refresh();
+ }
+}
+
+bool wxCalendarCtrl::HitTest(const wxPoint& pos, wxDateTime *date)
+{
+ wxCoord y = pos.y;
+ if ( y < m_heightRow )
+ return FALSE;
+
+ y -= m_heightRow;
+ int week = y / m_heightRow,
+ wday = pos.x / m_widthCol;
+
+ if ( week >= 6 || wday >= 7 )
+ return FALSE;
+
+ wxCHECK_MSG( date, FALSE, _T("bad pointer in wxCalendarCtrl::HitTest") );
+
+ *date = GetStartDate();
+ *date += wxDateSpan::Days(7*week + wday);
+ return IsDateShown(*date);
+}
return DoInsertItem(parent, idPrevious, text, image, selectedImage, data);
}
+wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent,
+ size_t index,
+ const wxString& text,
+ int image, int selectedImage,
+ wxTreeItemData *data)
+{
+ // find the item from index
+ long cookie;
+ wxTreeItemId idPrev, idCur = GetFirstChild(parent, cookie);
+ while ( index != 0 && idCur.IsOk() )
+ {
+ index--;
+
+ idPrev = idCur;
+ idCur = GetNextChild(parent, cookie);
+ }
+
+ // assert, not check: if the index is invalid, we will append the item
+ // to the end
+ wxASSERT_MSG( index == 0, _T("bad index in wxTreeCtrl::InsertItem") );
+
+ return DoInsertItem(parent, idPrev, text, image, selectedImage, data);
+}
+
wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parent,
const wxString& text,
int image, int selectedImage,