You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
467 lines
19 KiB
C
467 lines
19 KiB
C
2 years ago
|
// XTPCalendarController.h: interface for the CXTPCalendarController class.
|
||
|
//
|
||
|
// This file is a part of the XTREME CALENDAR MFC class library.
|
||
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
||
|
//
|
||
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
||
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
||
|
// CONSENT OF CODEJOCK SOFTWARE.
|
||
|
//
|
||
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
||
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
||
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
||
|
// SINGLE COMPUTER.
|
||
|
//
|
||
|
// CONTACT INFORMATION:
|
||
|
// support@codejock.com
|
||
|
// http://www.codejock.com
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
//{{AFX_CODEJOCK_PRIVATE
|
||
|
#if !defined(_XTPCALENDARCONTROLLER_H__)
|
||
|
#define _XTPCALENDARCONTROLLER_H__
|
||
|
|
||
|
#if _MSC_VER > 1000
|
||
|
#pragma once
|
||
|
#endif // _MSC_VER > 1000
|
||
|
//}}AFX_CODEJOCK_PRIVATE
|
||
|
|
||
|
|
||
|
|
||
|
class CXTPDatePickerControl;
|
||
|
class CXTPCalendarControl;
|
||
|
class CXTPCalendarResourcesNf;
|
||
|
class CXTPNotifySink;
|
||
|
|
||
|
struct XTP_DAYITEM_METRICS;
|
||
|
|
||
|
//===========================================================================
|
||
|
// Summary:
|
||
|
// Class CXTPCalendarController provides a connection between a
|
||
|
// CXTPCalendarControl object and a CXTPDatePickerControl object.
|
||
|
// Remarks:
|
||
|
// A CXTPCalendarController object provides a synchronization
|
||
|
// facilities between CXTPCalendarControl and CXTPDatePickerControl
|
||
|
// controls. It works as a "glue" between both controls and
|
||
|
// reflects changes on one of them to the corresponded changes on the
|
||
|
// second one.
|
||
|
// See Also: CXTPCalendarControl, CXTPDatePickerControl
|
||
|
//===========================================================================
|
||
|
class _XTP_EXT_CLASS CXTPCalendarController : public CXTPCmdTarget
|
||
|
{
|
||
|
//{{AFX_CODEJOCK_PRIVATE
|
||
|
DECLARE_DYNCREATE(CXTPCalendarController)
|
||
|
//}}AFX_CODEJOCK_PRIVATE
|
||
|
public:
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Constructs a CXTPCalendarController object.
|
||
|
// Remarks:
|
||
|
// Construction of the CXTPCalendarController object defines
|
||
|
// a point of synchronization between CXTPCalendarControl and
|
||
|
// CXTPDatePickerControl controls. It can be constructed both
|
||
|
// in the same scope with controls which would provide us with
|
||
|
// full live objects time synchronization, and in the local scope
|
||
|
// for short time synchronization.
|
||
|
//
|
||
|
// Example:
|
||
|
// <code>
|
||
|
// Declare a local CXTPCalendarController object.
|
||
|
// CXTPCalendarController myCalendarController;
|
||
|
//
|
||
|
// // Assigns CXTPCalendarControl instance to the object.
|
||
|
// myCalendarController.SetCalendar(&m_wndCalendar);
|
||
|
//
|
||
|
// // Assigns CXTPDatePickerControl instance to the object.
|
||
|
// myCalendarController.SetDatePicker(&m_wndDatePicker);
|
||
|
// </code>
|
||
|
// See Also: SetCalendar, SetDatePicker
|
||
|
//-----------------------------------------------------------------------
|
||
|
CXTPCalendarController();
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Destroys a CXTPCalendarController object, handles cleanup and
|
||
|
// de-allocation.
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual ~CXTPCalendarController();
|
||
|
|
||
|
// Attributes
|
||
|
public:
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function associates a custom calendar control
|
||
|
// with the controller.
|
||
|
// Parameters:
|
||
|
// pCalendarCtrl - A pointer to the user's CXTPCalendarControl object.
|
||
|
// Remarks:
|
||
|
// Call this member function to associate your CXTPCalendarControl
|
||
|
// object with this calendar controller.
|
||
|
// See Also: CXTPCalendarControl overview, SetDatePicker
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void SetCalendar(CXTPCalendarControl* pCalendarCtrl);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function associates a custom date picker control
|
||
|
// with the controller.
|
||
|
// Parameters:
|
||
|
// pDatePickerCtrl - Pointer to the user's CXTPDatePickerControl object.
|
||
|
// Remarks:
|
||
|
// Call this member function to associate your CXTPDatePickerControl
|
||
|
// object with this calendar controller.
|
||
|
// See Also: CXTPDatePickerControl overview, SetCalendar
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void SetDatePicker(CXTPDatePickerControl* pDatePickerCtrl);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Get a calendar control object associated with the controller.
|
||
|
// Returns:
|
||
|
// A pointer to calendar control.
|
||
|
// Remarks:
|
||
|
// A pointer to calendar control object associated with the
|
||
|
// controller or NULL.
|
||
|
// See Also: SetCalendar, SetDatePicker, GetDatePicker
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual CXTPCalendarControl* GetCalendar() const;
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Get a date picker control object associated with the controller.
|
||
|
// Returns:
|
||
|
// A pointer to the date picker control.
|
||
|
// Remarks:
|
||
|
// A pointer to date picker control object associated with the
|
||
|
// controller or NULL.
|
||
|
// See Also: SetCalendar, SetDatePicker, GetCalendar
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual CXTPDatePickerControl* GetDatePicker() const;
|
||
|
|
||
|
|
||
|
public:
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function used to determine whether Bold font is used
|
||
|
// for days in DatePicker which have corresponding Calendar events.
|
||
|
// Returns:
|
||
|
// TRUE when Bold font is used, FALSE otherwise.
|
||
|
// See Also:
|
||
|
// SetBoldDaysWithEvents
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual BOOL IsBoldDaysWithEvents() const;
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function enables or disables Bold font usage for
|
||
|
// displaying days in DatePicker which have corresponding Calendar
|
||
|
// events.
|
||
|
// Parameters:
|
||
|
// bBold - TRUE to enable; FALSE to disable.
|
||
|
// Remarks:
|
||
|
// Disabling this parameter could be useful in cases when determining
|
||
|
// whether a particular day has events takes a long time.
|
||
|
// See Also:
|
||
|
// IsBoldDaysWithEvents
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void SetBoldDaysWithEvents(BOOL bBold);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Is BoldDaysOnIdle option enabled or disabled.
|
||
|
// Returns:
|
||
|
// TRUE if enabled retrieve days state (bold or regular)
|
||
|
// on idle (by timer) for the associated DatePicker.
|
||
|
// See Also:
|
||
|
// SetBoldDaysOnIdle, GetBoldDaysPerIdleStep, GetBoldDaysIdleStepTime_ms,
|
||
|
// SetBoldDaysPerIdleStep, SetBoldDaysIdleStepTime_ms.
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual BOOL IsBoldDaysOnIdle() const;
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Enable or Disable retrieve days state (bold or regular)
|
||
|
// on idle (by timer) for the associated DatePicker.
|
||
|
// Parameters:
|
||
|
// bBoldDaysOnIdle - Set as TRUE to Enable or FALSE to Disable retrieve
|
||
|
// days state on idle.
|
||
|
// See Also:
|
||
|
// IsBoldDaysOnIdle, GetBoldDaysPerIdleStep, GetBoldDaysIdleStepTime_ms,
|
||
|
// SetBoldDaysPerIdleStep, SetBoldDaysIdleStepTime_ms.
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void SetBoldDaysOnIdle(BOOL bBoldDaysOnIdle);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Returns Amount of days for the associated DatePicker to update state
|
||
|
// in one idle step.
|
||
|
// Returns:
|
||
|
// Amount of days for the associated DatePicker to update state in one
|
||
|
// idle step.
|
||
|
// See Also:
|
||
|
// SetBoldDaysOnIdle, IsBoldDaysOnIdle, GetBoldDaysIdleStepTime_ms,
|
||
|
// SetBoldDaysPerIdleStep, SetBoldDaysIdleStepTime_ms.
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual long GetBoldDaysPerIdleStep() const;
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Returns time between idle steps to update days state (bold or regular)
|
||
|
// for the associated DatePicker.
|
||
|
// Returns:
|
||
|
// Time between idle steps in milliseconds.
|
||
|
// See Also:
|
||
|
// SetBoldDaysOnIdle, IsBoldDaysOnIdle, GetBoldDaysPerIdleStep,
|
||
|
// SetBoldDaysPerIdleStep, SetBoldDaysIdleStepTime_ms.
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual long GetBoldDaysIdleStepTime_ms() const;
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Set amount of days for the associated DatePicker to update state
|
||
|
// in one idle step.
|
||
|
// Parameters:
|
||
|
// nDaysPerStep - An amount of days to update in one step.
|
||
|
// See Also:
|
||
|
// SetBoldDaysOnIdle, IsBoldDaysOnIdle, GetBoldDaysIdleStepTime_ms,
|
||
|
// GetBoldDaysPerIdleStep, SetBoldDaysIdleStepTime_ms.
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void SetBoldDaysPerIdleStep(long nDaysPerStep);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Set time (in milliseconds) between idle steps to update days state
|
||
|
// (bold or regular) for the associated DatePicker.
|
||
|
// Parameters:
|
||
|
// nStepTime_ms - An idle step in milliseconds.
|
||
|
// See Also:
|
||
|
// SetBoldDaysOnIdle, IsBoldDaysOnIdle, GetBoldDaysPerIdleStep,
|
||
|
// SetBoldDaysPerIdleStep, GetBoldDaysIdleStepTime_ms.
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void SetBoldDaysIdleStepTime_ms(long nStepTime_ms);
|
||
|
|
||
|
// Implementation
|
||
|
protected:
|
||
|
|
||
|
//{{AFX_CODEJOCK_PRIVATE
|
||
|
CXTPNotifySink* m_pSink;
|
||
|
//}}AFX_CODEJOCK_PRIVATE
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function subscribes itself for all necessary notifications.
|
||
|
// Remarks:
|
||
|
// This member function is called when controller object wants to
|
||
|
// reinitialize its event subscriptions from associated controls.
|
||
|
// See Also: CXTPCalendarController overview
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void AdviseToNotifications();
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function get first day of week from the calendar control
|
||
|
// and set the same value to the date picker control.
|
||
|
// See Also: OnEvent_CalendarOptionsChanged(), CXTPCalendarController overview
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void SetFirstDayOfWeekToDatePicker();
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function used to determine is Compressed Weekend Day -
|
||
|
// Sunday, used as first day of week in the active calendar view.
|
||
|
// Remarks:
|
||
|
// It means that first day of week is automatically shifted from
|
||
|
// Sunday to Monday because Sunday is compressed with Saturday and
|
||
|
// it cannot be shown as first day of week in the active calendar view.
|
||
|
// See Also: CXTPCalendarWeekView, CXTPCalendarMonthView,
|
||
|
// CXTPCalendarControl::MonthView_IsCompressWeekendDays(),
|
||
|
// CXTPCalendarControl::GetFirstDayOfWeek()
|
||
|
//-----------------------------------------------------------------------
|
||
|
//virtual BOOL IsFirstDayOfWeekShifted_FromSun2Mon();
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function catches all the events from the associated
|
||
|
// calendar control and its view.
|
||
|
// Parameters:
|
||
|
// Event - Events code
|
||
|
// wParam - First user's parameter.
|
||
|
// lParam - Second user's parameter.
|
||
|
// Remarks:
|
||
|
// This member function is called when an event is fired from the
|
||
|
// associated CXTPCalendarControl object or from its view.
|
||
|
// See Also: AdviseToNotifications
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void OnEvent_CalendarView(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function catches all the events when calendar control
|
||
|
// options were changed.
|
||
|
// Parameters:
|
||
|
// Event - Events code
|
||
|
// wParam - First user's parameter.
|
||
|
// lParam - Second user's parameter.
|
||
|
// Remarks:
|
||
|
// This member function is called when an event is fired when calendar
|
||
|
// control options where changed..
|
||
|
// See Also: AdviseToNotifications
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void OnEvent_CalendarOptionsChanged(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function catches all the events when resource
|
||
|
// configuration was changed in the CalendarControl.
|
||
|
// Parameters:
|
||
|
// Event - Events code
|
||
|
// wParam - First user's parameter.
|
||
|
// lParam - Second user's parameter.
|
||
|
// See Also: AdviseToNotifications
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void OnEvent_CalendarResourcesChanged(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function catches the XTP_NC_CALENDAR_THEME_CHANGED event.
|
||
|
// Parameters:
|
||
|
// Event - Events code
|
||
|
// wParam - First user's parameter.
|
||
|
// lParam - Second user's parameter.
|
||
|
// See Also: AdviseToNotifications
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void OnEvent_CalendarThemeChanged(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function catches all the events from the associated
|
||
|
// date picker control.
|
||
|
// Parameters:
|
||
|
// Event - Events code.
|
||
|
// wParam - First user's parameter.
|
||
|
// lParam - Second user's parameter.
|
||
|
// Remarks:
|
||
|
// This member function is called when an event is fired from the
|
||
|
// associated CXTPDatePickerControl object.
|
||
|
// See Also: AdviseToNotifications
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual void OnEvent_DatePicker(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam);
|
||
|
virtual void OnEvent_DtPickGetItemMetrics(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam); //<COMBINE OnEvent_DatePicker>
|
||
|
|
||
|
protected:
|
||
|
CXTPCalendarControl* m_pCalendarCtrl; // Pointer to the associated Calendar control.
|
||
|
CXTPDatePickerControl* m_pDatePickerCtrl; // Pointer to the associated DatePicker control.
|
||
|
|
||
|
BOOL m_bBoldDaysWithEvents; // TRUE to use Bold for days with events in the associated DatePicker.
|
||
|
BOOL m_bUseActiveViewResoucesForBold; // If true - active view resources are used, if FALSE - calendar control Resources are used.
|
||
|
|
||
|
BOOL m_bBoldDaysOnIdle; // TRUE to retrieve days state (bold or regular) on idle (by timer) for the associated DatePicker.
|
||
|
long m_nBoldDaysPerIdleStep; // Amount of days for the associated DatePicker to update state in one idle step.
|
||
|
long m_nBoldDaysIdleStepTime_ms; // Time between idle steps to update days state (bold or regular) for the associated DatePicker.
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// This member function used to determine has the specified day events or not.
|
||
|
// Parameters:
|
||
|
// dtDay - A COleDateTime object that contains the day's date.
|
||
|
// Returns:
|
||
|
// TRUE if the specified day has events, FALSE otherwise.
|
||
|
//-----------------------------------------------------------------------
|
||
|
BOOL _HasEvents(COleDateTime dtDay);
|
||
|
|
||
|
private:
|
||
|
void _AdviseToDataChanged();
|
||
|
void _UnadviseFromDataChanged();
|
||
|
|
||
|
virtual void OnEvent_CalendarDataChanged(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam);
|
||
|
|
||
|
BOOL m_bAdjustingView;
|
||
|
|
||
|
CXTPCalendarResourcesNf* m_pResourcesNf;
|
||
|
int m_eLastActiveView;
|
||
|
|
||
|
XTP_CONNECTION_ID m_cnidEventAdded;
|
||
|
XTP_CONNECTION_ID m_cnidEventChanged;
|
||
|
XTP_CONNECTION_ID m_cnidEventDeleted;
|
||
|
|
||
|
//
|
||
|
class CXTPDayInfoCache
|
||
|
{
|
||
|
struct XTPDayInfo
|
||
|
{
|
||
|
BOOL bHasEvents;
|
||
|
DATE dtLastAccessTime;
|
||
|
};
|
||
|
CMap<long, long, XTPDayInfo, XTPDayInfo&> m_mapDaysInfo;
|
||
|
CMap<long, long, UINT, UINT> m_mapDaysToRefresh;
|
||
|
|
||
|
CXTPCalendarController* m_pOwner;
|
||
|
UINT_PTR m_uTimerID;
|
||
|
DWORD m_dwLastRedrawTime;
|
||
|
DWORD m_dwLastSelfClearTime;
|
||
|
DWORD m_dwWaitingDataTime;
|
||
|
|
||
|
UINT m_uActivePriority;
|
||
|
public:
|
||
|
CXTPDayInfoCache();
|
||
|
virtual ~CXTPDayInfoCache();
|
||
|
|
||
|
BOOL HasEvents(DATE dtDay);
|
||
|
|
||
|
void Init(CXTPCalendarController* pOwner);
|
||
|
void Clear();
|
||
|
|
||
|
void ClearDays(COleDateTime dtDayFrom, COleDateTime dtDayTo);
|
||
|
void RequestToRefreshDays(COleDateTime dtDayFrom, COleDateTime dtDayTo);
|
||
|
|
||
|
UINT UpActivePriority();
|
||
|
protected:
|
||
|
void UpdateDayInfo(DATE dtDay, BOOL bHasEvents);
|
||
|
void KillTimer();
|
||
|
|
||
|
void _RequestToRefreshDays(COleDateTime dtDayFrom, COleDateTime dtDayTo, UINT uPriority = 0);
|
||
|
|
||
|
void OnRefreshDays(int nDaysCountToRefresh = 1);
|
||
|
void OnSelfClearOld();
|
||
|
|
||
|
static VOID CALLBACK OnTimerCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
|
||
|
|
||
|
typedef CMap<UINT_PTR, UINT_PTR, CXTPDayInfoCache*, CXTPDayInfoCache*> CXTPMapTimers;
|
||
|
static CXTPMapTimers m_mapTimers;
|
||
|
|
||
|
};
|
||
|
friend class CXTPDayInfoCache;
|
||
|
|
||
|
CXTPDayInfoCache m_DayInfoCache;
|
||
|
|
||
|
|
||
|
};
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
AFX_INLINE BOOL CXTPCalendarController::IsBoldDaysWithEvents() const {
|
||
|
return m_bBoldDaysWithEvents;
|
||
|
}
|
||
|
AFX_INLINE BOOL CXTPCalendarController::IsBoldDaysOnIdle() const {
|
||
|
return m_bBoldDaysOnIdle;
|
||
|
}
|
||
|
AFX_INLINE void CXTPCalendarController::SetBoldDaysOnIdle(BOOL bBoldDaysOnIdle) {
|
||
|
m_bBoldDaysOnIdle = bBoldDaysOnIdle;
|
||
|
m_DayInfoCache.Clear();
|
||
|
}
|
||
|
AFX_INLINE long CXTPCalendarController::GetBoldDaysPerIdleStep() const {
|
||
|
return m_nBoldDaysPerIdleStep;
|
||
|
}
|
||
|
AFX_INLINE void CXTPCalendarController::SetBoldDaysPerIdleStep(long nDaysPerStep) {
|
||
|
m_nBoldDaysPerIdleStep = nDaysPerStep;
|
||
|
}
|
||
|
AFX_INLINE long CXTPCalendarController::GetBoldDaysIdleStepTime_ms() const {
|
||
|
return m_nBoldDaysIdleStepTime_ms;
|
||
|
}
|
||
|
AFX_INLINE void CXTPCalendarController::SetBoldDaysIdleStepTime_ms(long nStepTime_ms) {
|
||
|
m_nBoldDaysIdleStepTime_ms = nStepTime_ms;
|
||
|
}
|
||
|
|
||
|
#endif // !defined(_XTPCALENDARCONTROLLER_H__)
|