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:
parent
52980340f4
commit
6d9b671692
@ -259,12 +259,13 @@ public:
|
||||
|
||||
// holidays support
|
||||
//
|
||||
// currently all functions in this section are implemented in the generic
|
||||
// version of the control only and are simply ignored by native ones
|
||||
// currently only the generic version implements all functions in this
|
||||
// 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
|
||||
// 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)
|
||||
virtual void SetHolidayColours(const wxColour& WXUNUSED(colFg),
|
||||
@ -313,7 +314,22 @@ protected:
|
||||
// generate all the events for the selection change from dateOld to current
|
||||
// date: SEL_CHANGED, PAGE_CHANGED if necessary and also one of (deprecated)
|
||||
// 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
|
||||
void EnableYearChange(bool enable = true);
|
||||
|
||||
// corresponds to wxCAL_SHOW_HOLIDAYS bit, generic only
|
||||
virtual void EnableHolidayDisplay(bool display = true);
|
||||
|
||||
|
||||
// customization
|
||||
// -------------
|
||||
@ -215,12 +212,6 @@ private:
|
||||
// change the date inside the same month/year
|
||||
void ChangeDay(const wxDateTime& date);
|
||||
|
||||
// set the attributes for the holidays if needed
|
||||
void SetHolidayAttrs();
|
||||
|
||||
// reset all holidays
|
||||
void ResetHolidayAttrs();
|
||||
|
||||
// deprecated
|
||||
bool AllowYearChange() const
|
||||
{
|
||||
@ -240,6 +231,9 @@ public:
|
||||
wxControl *GetYearControl() const;
|
||||
|
||||
private:
|
||||
virtual void ResetHolidayAttrs();
|
||||
virtual void RefreshHolidays() { Refresh(); }
|
||||
|
||||
// OnPaint helper-methods
|
||||
|
||||
// Highlight the [fromdate : todate] range using pen and brush
|
||||
|
@ -45,6 +45,7 @@ public:
|
||||
virtual bool EnableMonthChange(bool enable = true);
|
||||
|
||||
virtual void Mark(size_t day, bool mark);
|
||||
virtual void SetHoliday(size_t day);
|
||||
|
||||
virtual wxCalendarHitTestResult HitTest(const wxPoint& pos,
|
||||
wxDateTime *date = NULL,
|
||||
@ -63,7 +64,7 @@ protected:
|
||||
void MSWOnDoubleClick(wxMouseEvent& event);
|
||||
|
||||
private:
|
||||
void Init() { m_marks = 0; }
|
||||
void Init();
|
||||
|
||||
// bring the control in sync with m_marks
|
||||
void UpdateMarks();
|
||||
@ -72,6 +73,12 @@ private:
|
||||
// wxCAL_MONDAY_FIRST flag
|
||||
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
|
||||
// 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
|
||||
wxUint32 m_marks;
|
||||
|
||||
// the same but indicating whether a day is a holiday or not
|
||||
wxUint32 m_holidays;
|
||||
|
||||
|
||||
DECLARE_DYNAMIC_CLASS(wxCalendarCtrl)
|
||||
DECLARE_NO_COPY_CLASS(wxCalendarCtrl)
|
||||
|
@ -274,8 +274,8 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_UPDATE_UI(Calendar_Cal_SeqMonth, MyFrame::OnUpdateUIGenericOnly)
|
||||
#ifdef __WXGTK20__
|
||||
EVT_UPDATE_UI(Calendar_Cal_Monday, MyFrame::OnUpdateUIGenericOnly)
|
||||
#endif
|
||||
EVT_UPDATE_UI(Calendar_Cal_Holidays, MyFrame::OnUpdateUIGenericOnly)
|
||||
#endif
|
||||
EVT_UPDATE_UI(Calendar_Cal_Special, MyFrame::OnUpdateUIGenericOnly)
|
||||
EVT_UPDATE_UI(Calendar_Cal_SurroundWeeks, MyFrame::OnUpdateUIGenericOnly)
|
||||
END_EVENT_TABLE()
|
||||
|
@ -60,15 +60,21 @@ bool wxCalendarCtrlBase::EnableMonthChange(bool enable)
|
||||
return true;
|
||||
}
|
||||
|
||||
void wxCalendarCtrlBase::GenerateAllChangeEvents(const wxDateTime& dateOld)
|
||||
bool wxCalendarCtrlBase::GenerateAllChangeEvents(const wxDateTime& dateOld)
|
||||
{
|
||||
const wxDateTime::Tm tm1 = dateOld.GetTm(),
|
||||
tm2 = GetDate().GetTm();
|
||||
|
||||
bool pageChanged = false;
|
||||
|
||||
GenerateEvent(wxEVT_CALENDAR_SEL_CHANGED);
|
||||
if ( tm1.year != tm2.year || tm1.mon != tm2.mon )
|
||||
{
|
||||
GenerateEvent(wxEVT_CALENDAR_PAGE_CHANGED);
|
||||
|
||||
pageChanged = true;
|
||||
}
|
||||
|
||||
// send also one of the deprecated events
|
||||
if ( tm1.year != tm2.year )
|
||||
GenerateEvent(wxEVT_CALENDAR_YEAR_CHANGED);
|
||||
@ -76,6 +82,52 @@ void wxCalendarCtrlBase::GenerateAllChangeEvents(const wxDateTime& dateOld)
|
||||
GenerateEvent(wxEVT_CALENDAR_MONTH_CHANGED);
|
||||
else
|
||||
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
|
||||
|
@ -1760,45 +1760,6 @@ void wxGenericCalendarCtrl::OnChar(wxKeyEvent& event)
|
||||
// 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)
|
||||
{
|
||||
wxCHECK_RET( day > 0 && day < 32, _T("invalid day in SetHoliday") );
|
||||
|
@ -44,6 +44,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxCalendarCtrl, wxControl)
|
||||
// wxCalendarCtrl creation
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxCalendarCtrl::Init()
|
||||
{
|
||||
m_marks =
|
||||
m_holidays = 0;
|
||||
}
|
||||
|
||||
bool
|
||||
wxCalendarCtrl::Create(wxWindow *parent,
|
||||
wxWindowID id,
|
||||
@ -95,7 +101,8 @@ wxCalendarCtrl::Create(wxWindow *parent,
|
||||
|
||||
SetDate(dt.IsValid() ? dt : wxDateTime::Today());
|
||||
|
||||
UpdateMarks();
|
||||
if ( SetHolidayAttrs() )
|
||||
UpdateMarks();
|
||||
|
||||
Connect(wxEVT_LEFT_DOWN,
|
||||
wxMouseEventHandler(wxCalendarCtrl::MSWOnClick));
|
||||
@ -327,6 +334,13 @@ void wxCalendarCtrl::Mark(size_t day, bool mark)
|
||||
UpdateMarks();
|
||||
}
|
||||
|
||||
void wxCalendarCtrl::SetHoliday(size_t day)
|
||||
{
|
||||
wxCHECK_RET( day > 0 && day < 32, "invalid day" );
|
||||
|
||||
m_holidays |= 1 << (day - 1);
|
||||
}
|
||||
|
||||
void wxCalendarCtrl::UpdateMarks()
|
||||
{
|
||||
// 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
|
||||
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) )
|
||||
{
|
||||
@ -377,7 +392,13 @@ bool wxCalendarCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
|
||||
// change anything -- filter it out
|
||||
if ( m_date != dateOld )
|
||||
{
|
||||
GenerateAllChangeEvents(dateOld);
|
||||
if ( GenerateAllChangeEvents(dateOld) )
|
||||
{
|
||||
// month changed, need to update the holidays if we use
|
||||
// them
|
||||
if ( SetHolidayAttrs() )
|
||||
UpdateMarks();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -387,7 +408,7 @@ bool wxCalendarCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
|
||||
const NMDAYSTATE * const ds = (NMDAYSTATE *)lParam;
|
||||
for ( int i = 0; i < ds->cDayState; i++ )
|
||||
{
|
||||
ds->prgDayState[i] = m_marks;
|
||||
ds->prgDayState[i] = m_marks | m_holidays;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user