1. some minor compilation fixes in datetime.cppm
2. implemented wxTreeCtrl::Insert(size_t index) 3. draft of wxCalendarCtrl git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5135 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -91,19 +91,21 @@ class WXDLLEXPORT wxDateSpan;
|
|||||||
the copy of the object with the changed sign.
|
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
|
// wxDateTime represents an absolute moment in the time
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
class WXDLLEXPORT wxDateTime
|
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:
|
public:
|
||||||
// types
|
// types
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
@@ -617,7 +619,7 @@ public:
|
|||||||
// set to the next week day following this one
|
// set to the next week day following this one
|
||||||
wxDateTime& SetToNextWeekDay(WeekDay weekday);
|
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);
|
wxDateTime& SetToPrevWeekDay(WeekDay weekday);
|
||||||
|
|
||||||
// set to Nth occurence of given weekday in the given month of the
|
// set to Nth occurence of given weekday in the given month of the
|
||||||
@@ -722,9 +724,8 @@ public:
|
|||||||
// result of timezone shift)
|
// result of timezone shift)
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
// is the date valid (FALSE for uninitialized objects as well as after
|
// is the date valid (TRUE even for non initialized objects)?
|
||||||
// the functions which failed to convert the date to supported range)
|
inline bool IsValid() const { return this != &wxInvalidDateTime; }
|
||||||
inline bool IsValid() const { return this != &ms_InvDateTime; }
|
|
||||||
|
|
||||||
// get the broken down date/time representation in the given timezone
|
// get the broken down date/time representation in the given timezone
|
||||||
//
|
//
|
||||||
@@ -860,7 +861,7 @@ public:
|
|||||||
// default to Today() otherwise)
|
// default to Today() otherwise)
|
||||||
const wxChar *ParseFormat(const wxChar *date,
|
const wxChar *ParseFormat(const wxChar *date,
|
||||||
const wxChar *format = _T("%c"),
|
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
|
// parse a string containing the date/time in "free" format, this
|
||||||
// function will try to make an educated guess at the string contents
|
// function will try to make an educated guess at the string contents
|
||||||
const wxChar *ParseDateTime(const wxChar *datetime);
|
const wxChar *ParseDateTime(const wxChar *datetime);
|
||||||
|
101
include/wx/generic/calctrl.h
Normal file
101
include/wx/generic/calctrl.h
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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
|
@@ -337,9 +337,9 @@ public:
|
|||||||
int image = -1, int selectedImage = -1,
|
int image = -1, int selectedImage = -1,
|
||||||
wxTreeItemData *data = NULL);
|
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,
|
wxTreeItemId InsertItem(const wxTreeItemId& parent,
|
||||||
size_t before,
|
size_t index,
|
||||||
const wxString& text,
|
const wxString& text,
|
||||||
int image = -1, int selectedImage = -1,
|
int image = -1, int selectedImage = -1,
|
||||||
wxTreeItemData *data = NULL);
|
wxTreeItemData *data = NULL);
|
||||||
|
@@ -319,6 +319,13 @@ public:
|
|||||||
int image = -1, int selectedImage = -1,
|
int image = -1, int selectedImage = -1,
|
||||||
wxTreeItemData *data = NULL);
|
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
|
// insert a new item in as the last child of the parent
|
||||||
wxTreeItemId AppendItem(const wxTreeItemId& parent,
|
wxTreeItemId AppendItem(const wxTreeItemId& parent,
|
||||||
const wxString& text,
|
const wxString& text,
|
||||||
|
@@ -137,13 +137,23 @@ static const wxDateTime::wxDateTime_t gs_cumulatedDays[2][MONTHS_IN_YEAR] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// 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
|
// a critical section is needed to protect GetTimeZone() static
|
||||||
// variable in MT case
|
// variable in MT case
|
||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
wxCriticalSection gs_critsectTimezone;
|
static wxCriticalSection gs_critsectTimezone;
|
||||||
#endif // wxUSE_THREADS
|
#endif // wxUSE_THREADS
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -364,13 +374,6 @@ static wxString GetAlphaToken(const wxChar*& p)
|
|||||||
// implementation of wxDateTime
|
// implementation of wxDateTime
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// static data
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
wxDateTime::Country wxDateTime::ms_country = wxDateTime::Country_Unknown;
|
|
||||||
wxDateTime wxDateTime::ms_InvDateTime;
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// struct Tm
|
// struct Tm
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -424,7 +427,7 @@ void wxDateTime::Tm::AddMonths(int monDiff)
|
|||||||
monDiff += MONTHS_IN_YEAR;
|
monDiff += MONTHS_IN_YEAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ( monDiff + mon > MONTHS_IN_YEAR )
|
while ( monDiff + mon >= MONTHS_IN_YEAR )
|
||||||
{
|
{
|
||||||
year++;
|
year++;
|
||||||
|
|
||||||
@@ -817,7 +820,7 @@ wxDateTime wxDateTime::GetBeginDST(int year, Country country)
|
|||||||
|
|
||||||
if ( !IsDSTApplicable(year, country) )
|
if ( !IsDSTApplicable(year, country) )
|
||||||
{
|
{
|
||||||
return ms_InvDateTime;
|
return wxInvalidDateTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxDateTime dt;
|
wxDateTime dt;
|
||||||
@@ -918,7 +921,7 @@ wxDateTime wxDateTime::GetEndDST(int year, Country country)
|
|||||||
|
|
||||||
if ( !IsDSTApplicable(year, country) )
|
if ( !IsDSTApplicable(year, country) )
|
||||||
{
|
{
|
||||||
return ms_InvDateTime;
|
return wxInvalidDateTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxDateTime dt;
|
wxDateTime dt;
|
||||||
@@ -1010,7 +1013,7 @@ wxDateTime& wxDateTime::Set(const struct tm& tm)
|
|||||||
|
|
||||||
wxFAIL_MSG( _T("mktime() failed") );
|
wxFAIL_MSG( _T("mktime() failed") );
|
||||||
|
|
||||||
return ms_InvDateTime;
|
return wxInvalidDateTime;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1028,14 +1031,14 @@ wxDateTime& wxDateTime::Set(wxDateTime_t hour,
|
|||||||
// we allow seconds to be 61 to account for the leap seconds, even if we
|
// we allow seconds to be 61 to account for the leap seconds, even if we
|
||||||
// don't use them really
|
// don't use them really
|
||||||
wxCHECK_MSG( hour < 24 && second < 62 && minute < 60 && millisec < 1000,
|
wxCHECK_MSG( hour < 24 && second < 62 && minute < 60 && millisec < 1000,
|
||||||
ms_InvDateTime,
|
wxInvalidDateTime,
|
||||||
_T("Invalid time in wxDateTime::Set()") );
|
_T("Invalid time in wxDateTime::Set()") );
|
||||||
|
|
||||||
// get the current date from system
|
// get the current date from system
|
||||||
time_t timet = GetTimeNow();
|
time_t timet = GetTimeNow();
|
||||||
struct tm *tm = localtime(&timet);
|
struct tm *tm = localtime(&timet);
|
||||||
|
|
||||||
wxCHECK_MSG( tm, ms_InvDateTime, _T("localtime() failed") );
|
wxCHECK_MSG( tm, wxInvalidDateTime, _T("localtime() failed") );
|
||||||
|
|
||||||
// adjust the time
|
// adjust the time
|
||||||
tm->tm_hour = hour;
|
tm->tm_hour = hour;
|
||||||
@@ -1059,13 +1062,13 @@ wxDateTime& wxDateTime::Set(wxDateTime_t day,
|
|||||||
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
|
||||||
|
|
||||||
wxCHECK_MSG( hour < 24 && second < 62 && minute < 60 && millisec < 1000,
|
wxCHECK_MSG( hour < 24 && second < 62 && minute < 60 && millisec < 1000,
|
||||||
ms_InvDateTime,
|
wxInvalidDateTime,
|
||||||
_T("Invalid time in wxDateTime::Set()") );
|
_T("Invalid time in wxDateTime::Set()") );
|
||||||
|
|
||||||
ReplaceDefaultYearMonthWithCurrent(&year, &month);
|
ReplaceDefaultYearMonthWithCurrent(&year, &month);
|
||||||
|
|
||||||
wxCHECK_MSG( (0 < day) && (day <= GetNumberOfDays(month, year)),
|
wxCHECK_MSG( (0 < day) && (day <= GetNumberOfDays(month, year)),
|
||||||
ms_InvDateTime,
|
wxInvalidDateTime,
|
||||||
_T("Invalid date in wxDateTime::Set()") );
|
_T("Invalid date in wxDateTime::Set()") );
|
||||||
|
|
||||||
// the range of time_t type (inclusive)
|
// the range of time_t type (inclusive)
|
||||||
@@ -1364,7 +1367,7 @@ wxDateTime& wxDateTime::SetToLastMonthDay(Month month,
|
|||||||
|
|
||||||
wxDateTime& wxDateTime::SetToWeekDayInSameWeek(WeekDay weekday)
|
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();
|
WeekDay wdayThis = GetWeekDay();
|
||||||
if ( weekday == wdayThis )
|
if ( weekday == wdayThis )
|
||||||
@@ -1384,7 +1387,7 @@ wxDateTime& wxDateTime::SetToWeekDayInSameWeek(WeekDay weekday)
|
|||||||
|
|
||||||
wxDateTime& wxDateTime::SetToNextWeekDay(WeekDay weekday)
|
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;
|
int diff;
|
||||||
WeekDay wdayThis = GetWeekDay();
|
WeekDay wdayThis = GetWeekDay();
|
||||||
@@ -1408,7 +1411,7 @@ wxDateTime& wxDateTime::SetToNextWeekDay(WeekDay weekday)
|
|||||||
|
|
||||||
wxDateTime& wxDateTime::SetToPrevWeekDay(WeekDay weekday)
|
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;
|
int diff;
|
||||||
WeekDay wdayThis = GetWeekDay();
|
WeekDay wdayThis = GetWeekDay();
|
||||||
@@ -1555,7 +1558,7 @@ wxDateTime& wxDateTime::SetToYearDay(wxDateTime::wxDateTime_t yday)
|
|||||||
{
|
{
|
||||||
int year = GetYear();
|
int year = GetYear();
|
||||||
wxCHECK_MSG( (0 < yday) && (yday <= GetNumberOfDays(year)),
|
wxCHECK_MSG( (0 < yday) && (yday <= GetNumberOfDays(year)),
|
||||||
ms_InvDateTime, _T("invalid year day") );
|
wxInvalidDateTime, _T("invalid year day") );
|
||||||
|
|
||||||
bool isLeap = IsLeapYear(year);
|
bool isLeap = IsLeapYear(year);
|
||||||
for ( Month mon = Jan; mon < Inv_Month; wxNextMonth(mon) )
|
for ( Month mon = Jan; mon < Inv_Month; wxNextMonth(mon) )
|
||||||
|
258
src/generic/calctrl.cpp
Normal file
258
src/generic/calctrl.cpp
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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);
|
||||||
|
}
|
@@ -1052,6 +1052,30 @@ wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent,
|
|||||||
return DoInsertItem(parent, idPrevious, text, image, selectedImage, data);
|
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,
|
wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parent,
|
||||||
const wxString& text,
|
const wxString& text,
|
||||||
int image, int selectedImage,
|
int image, int selectedImage,
|
||||||
|
Reference in New Issue
Block a user