mark holidays if wxCAL_SHOW_HOLIDAYS is on (replaces #9155)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54971 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -259,12 +259,13 @@ public:
|
|||||||
|
|
||||||
// holidays support
|
// holidays support
|
||||||
//
|
//
|
||||||
// currently all functions in this section are implemented in the generic
|
// currently only the generic version implements all functions in this
|
||||||
// version of the control only and are simply ignored by native ones
|
// section; wxMSW implements simple support for holidays (they can be
|
||||||
|
// just enabled or disabled) and wxGTK doesn't support them at all
|
||||||
|
|
||||||
// equivalent to changing wxCAL_SHOW_HOLIDAYS flag but should be called
|
// equivalent to changing wxCAL_SHOW_HOLIDAYS flag but should be called
|
||||||
// instead of just changing it
|
// instead of just changing it
|
||||||
virtual void EnableHolidayDisplay(bool WXUNUSED(display) = true) { }
|
virtual void EnableHolidayDisplay(bool display = true);
|
||||||
|
|
||||||
// set/get the colours to use for holidays (if they're enabled)
|
// set/get the colours to use for holidays (if they're enabled)
|
||||||
virtual void SetHolidayColours(const wxColour& WXUNUSED(colFg),
|
virtual void SetHolidayColours(const wxColour& WXUNUSED(colFg),
|
||||||
@@ -313,7 +314,22 @@ protected:
|
|||||||
// generate all the events for the selection change from dateOld to current
|
// generate all the events for the selection change from dateOld to current
|
||||||
// date: SEL_CHANGED, PAGE_CHANGED if necessary and also one of (deprecated)
|
// date: SEL_CHANGED, PAGE_CHANGED if necessary and also one of (deprecated)
|
||||||
// YEAR/MONTH/DAY_CHANGED ones
|
// YEAR/MONTH/DAY_CHANGED ones
|
||||||
void GenerateAllChangeEvents(const wxDateTime& dateOld);
|
//
|
||||||
|
// returns true if page changed event was generated, false if the new date
|
||||||
|
// is still in the same month as before
|
||||||
|
bool GenerateAllChangeEvents(const wxDateTime& dateOld);
|
||||||
|
|
||||||
|
// call SetHoliday() for all holidays in the current month
|
||||||
|
//
|
||||||
|
// should be called on month change, does nothing if wxCAL_SHOW_HOLIDAYS is
|
||||||
|
// not set and returns false in this case, true if we do show them
|
||||||
|
bool SetHolidayAttrs();
|
||||||
|
|
||||||
|
// called by SetHolidayAttrs() to forget the previously set holidays
|
||||||
|
virtual void ResetHolidayAttrs() { }
|
||||||
|
|
||||||
|
// called by EnableHolidayDisplay()
|
||||||
|
virtual void RefreshHolidays() { }
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -84,9 +84,6 @@ public:
|
|||||||
// corresponds to wxCAL_NO_YEAR_CHANGE bit, deprecated, generic only
|
// corresponds to wxCAL_NO_YEAR_CHANGE bit, deprecated, generic only
|
||||||
void EnableYearChange(bool enable = true);
|
void EnableYearChange(bool enable = true);
|
||||||
|
|
||||||
// corresponds to wxCAL_SHOW_HOLIDAYS bit, generic only
|
|
||||||
virtual void EnableHolidayDisplay(bool display = true);
|
|
||||||
|
|
||||||
|
|
||||||
// customization
|
// customization
|
||||||
// -------------
|
// -------------
|
||||||
@@ -215,12 +212,6 @@ private:
|
|||||||
// change the date inside the same month/year
|
// change the date inside the same month/year
|
||||||
void ChangeDay(const wxDateTime& date);
|
void ChangeDay(const wxDateTime& date);
|
||||||
|
|
||||||
// set the attributes for the holidays if needed
|
|
||||||
void SetHolidayAttrs();
|
|
||||||
|
|
||||||
// reset all holidays
|
|
||||||
void ResetHolidayAttrs();
|
|
||||||
|
|
||||||
// deprecated
|
// deprecated
|
||||||
bool AllowYearChange() const
|
bool AllowYearChange() const
|
||||||
{
|
{
|
||||||
@@ -240,6 +231,9 @@ public:
|
|||||||
wxControl *GetYearControl() const;
|
wxControl *GetYearControl() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
virtual void ResetHolidayAttrs();
|
||||||
|
virtual void RefreshHolidays() { Refresh(); }
|
||||||
|
|
||||||
// OnPaint helper-methods
|
// OnPaint helper-methods
|
||||||
|
|
||||||
// Highlight the [fromdate : todate] range using pen and brush
|
// Highlight the [fromdate : todate] range using pen and brush
|
||||||
|
@@ -45,6 +45,7 @@ public:
|
|||||||
virtual bool EnableMonthChange(bool enable = true);
|
virtual bool EnableMonthChange(bool enable = true);
|
||||||
|
|
||||||
virtual void Mark(size_t day, bool mark);
|
virtual void Mark(size_t day, bool mark);
|
||||||
|
virtual void SetHoliday(size_t day);
|
||||||
|
|
||||||
virtual wxCalendarHitTestResult HitTest(const wxPoint& pos,
|
virtual wxCalendarHitTestResult HitTest(const wxPoint& pos,
|
||||||
wxDateTime *date = NULL,
|
wxDateTime *date = NULL,
|
||||||
@@ -63,7 +64,7 @@ protected:
|
|||||||
void MSWOnDoubleClick(wxMouseEvent& event);
|
void MSWOnDoubleClick(wxMouseEvent& event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Init() { m_marks = 0; }
|
void Init();
|
||||||
|
|
||||||
// bring the control in sync with m_marks
|
// bring the control in sync with m_marks
|
||||||
void UpdateMarks();
|
void UpdateMarks();
|
||||||
@@ -72,6 +73,12 @@ private:
|
|||||||
// wxCAL_MONDAY_FIRST flag
|
// wxCAL_MONDAY_FIRST flag
|
||||||
void UpdateFirstDayOfWeek();
|
void UpdateFirstDayOfWeek();
|
||||||
|
|
||||||
|
// reset holiday information
|
||||||
|
virtual void ResetHolidayAttrs() { m_holidays = 0; }
|
||||||
|
|
||||||
|
// redisplay holidays
|
||||||
|
virtual void RefreshHolidays() { UpdateMarks(); }
|
||||||
|
|
||||||
|
|
||||||
// current date, we need to store it instead of simply retrieving it from
|
// current date, we need to store it instead of simply retrieving it from
|
||||||
// the control as needed in order to be able to generate the correct events
|
// the control as needed in order to be able to generate the correct events
|
||||||
@@ -81,6 +88,9 @@ private:
|
|||||||
// bit field containing the state (marked or not) of all days in the month
|
// bit field containing the state (marked or not) of all days in the month
|
||||||
wxUint32 m_marks;
|
wxUint32 m_marks;
|
||||||
|
|
||||||
|
// the same but indicating whether a day is a holiday or not
|
||||||
|
wxUint32 m_holidays;
|
||||||
|
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxCalendarCtrl)
|
DECLARE_DYNAMIC_CLASS(wxCalendarCtrl)
|
||||||
DECLARE_NO_COPY_CLASS(wxCalendarCtrl)
|
DECLARE_NO_COPY_CLASS(wxCalendarCtrl)
|
||||||
|
@@ -274,8 +274,8 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
|||||||
EVT_UPDATE_UI(Calendar_Cal_SeqMonth, MyFrame::OnUpdateUIGenericOnly)
|
EVT_UPDATE_UI(Calendar_Cal_SeqMonth, MyFrame::OnUpdateUIGenericOnly)
|
||||||
#ifdef __WXGTK20__
|
#ifdef __WXGTK20__
|
||||||
EVT_UPDATE_UI(Calendar_Cal_Monday, MyFrame::OnUpdateUIGenericOnly)
|
EVT_UPDATE_UI(Calendar_Cal_Monday, MyFrame::OnUpdateUIGenericOnly)
|
||||||
#endif
|
|
||||||
EVT_UPDATE_UI(Calendar_Cal_Holidays, MyFrame::OnUpdateUIGenericOnly)
|
EVT_UPDATE_UI(Calendar_Cal_Holidays, MyFrame::OnUpdateUIGenericOnly)
|
||||||
|
#endif
|
||||||
EVT_UPDATE_UI(Calendar_Cal_Special, MyFrame::OnUpdateUIGenericOnly)
|
EVT_UPDATE_UI(Calendar_Cal_Special, MyFrame::OnUpdateUIGenericOnly)
|
||||||
EVT_UPDATE_UI(Calendar_Cal_SurroundWeeks, MyFrame::OnUpdateUIGenericOnly)
|
EVT_UPDATE_UI(Calendar_Cal_SurroundWeeks, MyFrame::OnUpdateUIGenericOnly)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
@@ -60,15 +60,21 @@ bool wxCalendarCtrlBase::EnableMonthChange(bool enable)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxCalendarCtrlBase::GenerateAllChangeEvents(const wxDateTime& dateOld)
|
bool wxCalendarCtrlBase::GenerateAllChangeEvents(const wxDateTime& dateOld)
|
||||||
{
|
{
|
||||||
const wxDateTime::Tm tm1 = dateOld.GetTm(),
|
const wxDateTime::Tm tm1 = dateOld.GetTm(),
|
||||||
tm2 = GetDate().GetTm();
|
tm2 = GetDate().GetTm();
|
||||||
|
|
||||||
|
bool pageChanged = false;
|
||||||
|
|
||||||
GenerateEvent(wxEVT_CALENDAR_SEL_CHANGED);
|
GenerateEvent(wxEVT_CALENDAR_SEL_CHANGED);
|
||||||
if ( tm1.year != tm2.year || tm1.mon != tm2.mon )
|
if ( tm1.year != tm2.year || tm1.mon != tm2.mon )
|
||||||
|
{
|
||||||
GenerateEvent(wxEVT_CALENDAR_PAGE_CHANGED);
|
GenerateEvent(wxEVT_CALENDAR_PAGE_CHANGED);
|
||||||
|
|
||||||
|
pageChanged = true;
|
||||||
|
}
|
||||||
|
|
||||||
// send also one of the deprecated events
|
// send also one of the deprecated events
|
||||||
if ( tm1.year != tm2.year )
|
if ( tm1.year != tm2.year )
|
||||||
GenerateEvent(wxEVT_CALENDAR_YEAR_CHANGED);
|
GenerateEvent(wxEVT_CALENDAR_YEAR_CHANGED);
|
||||||
@@ -76,6 +82,52 @@ void wxCalendarCtrlBase::GenerateAllChangeEvents(const wxDateTime& dateOld)
|
|||||||
GenerateEvent(wxEVT_CALENDAR_MONTH_CHANGED);
|
GenerateEvent(wxEVT_CALENDAR_MONTH_CHANGED);
|
||||||
else
|
else
|
||||||
GenerateEvent(wxEVT_CALENDAR_DAY_CHANGED);
|
GenerateEvent(wxEVT_CALENDAR_DAY_CHANGED);
|
||||||
|
|
||||||
|
return pageChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCalendarCtrlBase::EnableHolidayDisplay(bool display)
|
||||||
|
{
|
||||||
|
long style = GetWindowStyle();
|
||||||
|
if ( display )
|
||||||
|
style |= wxCAL_SHOW_HOLIDAYS;
|
||||||
|
else
|
||||||
|
style &= ~wxCAL_SHOW_HOLIDAYS;
|
||||||
|
|
||||||
|
if ( style == GetWindowStyle() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
SetWindowStyle(style);
|
||||||
|
|
||||||
|
if ( display )
|
||||||
|
SetHolidayAttrs();
|
||||||
|
else
|
||||||
|
ResetHolidayAttrs();
|
||||||
|
|
||||||
|
RefreshHolidays();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxCalendarCtrlBase::SetHolidayAttrs()
|
||||||
|
{
|
||||||
|
if ( !HasFlag(wxCAL_SHOW_HOLIDAYS) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ResetHolidayAttrs();
|
||||||
|
|
||||||
|
wxDateTime::Tm tm = GetDate().GetTm();
|
||||||
|
wxDateTime dtStart(1, tm.mon, tm.year),
|
||||||
|
dtEnd = dtStart.GetLastMonthDay();
|
||||||
|
|
||||||
|
wxDateTimeArray hol;
|
||||||
|
wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart, dtEnd, hol);
|
||||||
|
|
||||||
|
const size_t count = hol.GetCount();
|
||||||
|
for ( size_t n = 0; n < count; n++ )
|
||||||
|
{
|
||||||
|
SetHoliday(hol[n].GetDay());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // wxUSE_CALENDARCTRL
|
#endif // wxUSE_CALENDARCTRL
|
||||||
|
@@ -1760,45 +1760,6 @@ void wxGenericCalendarCtrl::OnChar(wxKeyEvent& event)
|
|||||||
// holidays handling
|
// holidays handling
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void wxGenericCalendarCtrl::EnableHolidayDisplay(bool display)
|
|
||||||
{
|
|
||||||
long style = GetWindowStyle();
|
|
||||||
if ( display )
|
|
||||||
style |= wxCAL_SHOW_HOLIDAYS;
|
|
||||||
else
|
|
||||||
style &= ~wxCAL_SHOW_HOLIDAYS;
|
|
||||||
|
|
||||||
SetWindowStyle(style);
|
|
||||||
|
|
||||||
if ( display )
|
|
||||||
SetHolidayAttrs();
|
|
||||||
else
|
|
||||||
ResetHolidayAttrs();
|
|
||||||
|
|
||||||
Refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxGenericCalendarCtrl::SetHolidayAttrs()
|
|
||||||
{
|
|
||||||
if ( GetWindowStyle() & wxCAL_SHOW_HOLIDAYS )
|
|
||||||
{
|
|
||||||
ResetHolidayAttrs();
|
|
||||||
|
|
||||||
wxDateTime::Tm tm = m_date.GetTm();
|
|
||||||
wxDateTime dtStart(1, tm.mon, tm.year),
|
|
||||||
dtEnd = dtStart.GetLastMonthDay();
|
|
||||||
|
|
||||||
wxDateTimeArray hol;
|
|
||||||
wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart, dtEnd, hol);
|
|
||||||
|
|
||||||
size_t count = hol.GetCount();
|
|
||||||
for ( size_t n = 0; n < count; n++ )
|
|
||||||
{
|
|
||||||
SetHoliday(hol[n].GetDay());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxGenericCalendarCtrl::SetHoliday(size_t day)
|
void wxGenericCalendarCtrl::SetHoliday(size_t day)
|
||||||
{
|
{
|
||||||
wxCHECK_RET( day > 0 && day < 32, _T("invalid day in SetHoliday") );
|
wxCHECK_RET( day > 0 && day < 32, _T("invalid day in SetHoliday") );
|
||||||
|
@@ -44,6 +44,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxCalendarCtrl, wxControl)
|
|||||||
// wxCalendarCtrl creation
|
// wxCalendarCtrl creation
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxCalendarCtrl::Init()
|
||||||
|
{
|
||||||
|
m_marks =
|
||||||
|
m_holidays = 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
wxCalendarCtrl::Create(wxWindow *parent,
|
wxCalendarCtrl::Create(wxWindow *parent,
|
||||||
wxWindowID id,
|
wxWindowID id,
|
||||||
@@ -95,7 +101,8 @@ wxCalendarCtrl::Create(wxWindow *parent,
|
|||||||
|
|
||||||
SetDate(dt.IsValid() ? dt : wxDateTime::Today());
|
SetDate(dt.IsValid() ? dt : wxDateTime::Today());
|
||||||
|
|
||||||
UpdateMarks();
|
if ( SetHolidayAttrs() )
|
||||||
|
UpdateMarks();
|
||||||
|
|
||||||
Connect(wxEVT_LEFT_DOWN,
|
Connect(wxEVT_LEFT_DOWN,
|
||||||
wxMouseEventHandler(wxCalendarCtrl::MSWOnClick));
|
wxMouseEventHandler(wxCalendarCtrl::MSWOnClick));
|
||||||
@@ -327,6 +334,13 @@ void wxCalendarCtrl::Mark(size_t day, bool mark)
|
|||||||
UpdateMarks();
|
UpdateMarks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxCalendarCtrl::SetHoliday(size_t day)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( day > 0 && day < 32, "invalid day" );
|
||||||
|
|
||||||
|
m_holidays |= 1 << (day - 1);
|
||||||
|
}
|
||||||
|
|
||||||
void wxCalendarCtrl::UpdateMarks()
|
void wxCalendarCtrl::UpdateMarks()
|
||||||
{
|
{
|
||||||
// we show only one full month but there can be some days from the month
|
// we show only one full month but there can be some days from the month
|
||||||
@@ -342,7 +356,8 @@ void wxCalendarCtrl::UpdateMarks()
|
|||||||
// shows it on 6 lines and the number of visible months is still 3
|
// shows it on 6 lines and the number of visible months is still 3
|
||||||
wxCHECK_RET( nMonths == (int)WXSIZEOF(states), "unexpected months range" );
|
wxCHECK_RET( nMonths == (int)WXSIZEOF(states), "unexpected months range" );
|
||||||
|
|
||||||
states[1] = m_marks; // the fully visible month is the one in the middle
|
// the fully visible month is the one in the middle
|
||||||
|
states[1] = m_marks | m_holidays;
|
||||||
|
|
||||||
if ( !MonthCal_SetDayState(GetHwnd(), nMonths, states) )
|
if ( !MonthCal_SetDayState(GetHwnd(), nMonths, states) )
|
||||||
{
|
{
|
||||||
@@ -377,7 +392,13 @@ bool wxCalendarCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
|
|||||||
// change anything -- filter it out
|
// change anything -- filter it out
|
||||||
if ( m_date != dateOld )
|
if ( m_date != dateOld )
|
||||||
{
|
{
|
||||||
GenerateAllChangeEvents(dateOld);
|
if ( GenerateAllChangeEvents(dateOld) )
|
||||||
|
{
|
||||||
|
// month changed, need to update the holidays if we use
|
||||||
|
// them
|
||||||
|
if ( SetHolidayAttrs() )
|
||||||
|
UpdateMarks();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -387,7 +408,7 @@ bool wxCalendarCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
|
|||||||
const NMDAYSTATE * const ds = (NMDAYSTATE *)lParam;
|
const NMDAYSTATE * const ds = (NMDAYSTATE *)lParam;
|
||||||
for ( int i = 0; i < ds->cDayState; i++ )
|
for ( int i = 0; i < ds->cDayState; i++ )
|
||||||
{
|
{
|
||||||
ds->prgDayState[i] = m_marks;
|
ds->prgDayState[i] = m_marks | m_holidays;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user