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.
2310 lines
59 KiB
C++
2310 lines
59 KiB
C++
2 years ago
|
// XTPCalendarCaptionBarControl.cpp : implementation file
|
||
|
//
|
||
|
// 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
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "Resource.h"
|
||
|
|
||
|
#include "Common/XTPResourceManager.h"
|
||
|
#include "Common/XTPResourceImage.h"
|
||
|
#include "Common/XTPDrawHelpers.h"
|
||
|
#include "Common/XTPColorManager.h"
|
||
|
#include "Common/XTPNotifyConnection.h"
|
||
|
#include "Common/XTPSmartPtrInternalT.h"
|
||
|
#include "Common/XTPWinThemeWrapper.h"
|
||
|
#include "Common/XTPSystemHelpers.h"
|
||
|
#include "Common/XTPVC80Helpers.h"
|
||
|
|
||
|
#include "XTPCalendarUtils.h"
|
||
|
#include "XTPCalendarDefines.h"
|
||
|
#include "XTPCalendarNotifications.h"
|
||
|
#include "XTPCalendarPtrCollectionT.h"
|
||
|
#include "XTPCalendarViewPart.h"
|
||
|
#include "XTPCalendarView.h"
|
||
|
#include "XTPCalendarTimeLineView.h"
|
||
|
#include "XTPCalendarControl.h"
|
||
|
#include "XTPCalendarMonthView.h"
|
||
|
|
||
|
#include "XTPCalendarCaptionBarControl.h"
|
||
|
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
IMPLEMENT_DYNAMIC(CXTPCalendarCaptionBarControl, CWnd)
|
||
|
IMPLEMENT_DYNAMIC(CXTPCalendarCaptionBarThemePart, CXTPCalendarWMHandler)
|
||
|
IMPLEMENT_DYNCREATE(CXTPCalendarCaptionBarTheme, CXTPCalendarWMHandler)
|
||
|
|
||
|
CXTPCalendarCaptionBarControl::CXTPCalendarCaptionBarControl()
|
||
|
{
|
||
|
RegisterWindowClass();
|
||
|
|
||
|
m_Borders.SetRect(0, 1, 0, 0);
|
||
|
|
||
|
|
||
|
m_pTheme = NULL;
|
||
|
SetTheme(new CXTPCalendarCaptionBarTheme());
|
||
|
}
|
||
|
|
||
|
CXTPCalendarCaptionBarControl::~CXTPCalendarCaptionBarControl()
|
||
|
{
|
||
|
CMDTARGET_RELEASE(m_pTheme);
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarCaptionBarControl::RegisterWindowClass(HINSTANCE hInstance /*= NULL*/)
|
||
|
{
|
||
|
return XTPDrawHelpers()->RegisterWndClass(hInstance,
|
||
|
XTPCALENDARCAPTIONBAR_CLASSNAME, /*CS_DBLCLKS |*/ CS_HREDRAW | CS_VREDRAW);
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarCaptionBarControl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
|
||
|
{
|
||
|
if (!CWnd::Create(XTPCALENDARCAPTIONBAR_CLASSNAME, NULL, dwStyle, rect, pParentWnd, nID))
|
||
|
return FALSE;
|
||
|
|
||
|
AdjustLayout(NULL);
|
||
|
|
||
|
if (m_pTheme)
|
||
|
{
|
||
|
CDC* pDC = GetDC();
|
||
|
if (pDC)
|
||
|
{
|
||
|
m_pTheme->m_dScale = pDC->GetDeviceCaps(LOGPIXELSY) / 96.0;
|
||
|
ReleaseDC(pDC);
|
||
|
}
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CXTPCalendarCaptionBarControl, CWnd)
|
||
|
//{{AFX_MSG_MAP(CXTPCalendarCaptionBarControl)
|
||
|
ON_WM_NCCALCSIZE()
|
||
|
ON_WM_NCPAINT()
|
||
|
ON_WM_PAINT()
|
||
|
ON_WM_ERASEBKGND()
|
||
|
ON_WM_SIZE()
|
||
|
ON_WM_LBUTTONDOWN()
|
||
|
ON_WM_LBUTTONUP()
|
||
|
ON_WM_MOUSEMOVE()
|
||
|
ON_WM_KEYDOWN()
|
||
|
ON_WM_KEYUP()
|
||
|
ON_WM_KILLFOCUS()
|
||
|
ON_WM_DESTROY()
|
||
|
ON_WM_ENABLE()
|
||
|
ON_WM_TIMER()
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::SetButtonText(int iButtonNumber, CString sButtonText)
|
||
|
{
|
||
|
if (!GetTheme())
|
||
|
return;
|
||
|
//0 CSwitchViewButtonPart* m_pButtonViewDay;
|
||
|
//1 CSwitchViewButtonPart* m_pButtonViewWeek;
|
||
|
//2 CSwitchViewButtonPart* m_pButtonViewMonth;
|
||
|
//3 CCheckboxButtonPart* m_pShowTimeline;
|
||
|
//4 CRadioButtonPart* m_pShowWorkWeek;
|
||
|
//5 CRadioButtonPart* m_pShowFullWeek;
|
||
|
//6 CRadioButtonPart* m_pShowMcWeek;
|
||
|
|
||
|
BOOL bShow = !sButtonText.IsEmpty();
|
||
|
|
||
|
if (iButtonNumber == 0)
|
||
|
{
|
||
|
if (GetTheme()->m_pButtonViewDay)
|
||
|
{
|
||
|
GetTheme()->m_pButtonViewDay->SetText(sButtonText);
|
||
|
GetTheme()->m_pButtonViewDay->SetVisible(bShow);
|
||
|
}
|
||
|
}
|
||
|
else if (iButtonNumber == 1)
|
||
|
{
|
||
|
if (GetTheme()->m_pButtonViewWeek)
|
||
|
{
|
||
|
GetTheme()->m_pButtonViewWeek->SetText(sButtonText);
|
||
|
GetTheme()->m_pButtonViewWeek->SetVisible(bShow);
|
||
|
}
|
||
|
}
|
||
|
else if (iButtonNumber == 2)
|
||
|
{
|
||
|
if (GetTheme()->m_pButtonViewMonth)
|
||
|
{
|
||
|
GetTheme()->m_pButtonViewMonth->SetText(sButtonText);
|
||
|
GetTheme()->m_pButtonViewMonth->SetVisible(bShow);
|
||
|
}
|
||
|
}
|
||
|
else if (iButtonNumber == 3)
|
||
|
{
|
||
|
if (GetTheme()->m_pShowTimeline)
|
||
|
{
|
||
|
GetTheme()->m_pShowTimeline->SetText(sButtonText);
|
||
|
GetTheme()->m_pShowTimeline->SetVisible(bShow);
|
||
|
}
|
||
|
}
|
||
|
else if (iButtonNumber == 4)
|
||
|
{
|
||
|
if (GetTheme()->m_pShowWorkWeek)
|
||
|
{
|
||
|
GetTheme()->m_pShowWorkWeek->SetText(sButtonText);
|
||
|
GetTheme()->m_pShowWorkWeek->SetVisible(bShow);
|
||
|
}
|
||
|
}
|
||
|
else if (iButtonNumber == 5)
|
||
|
{
|
||
|
if (GetTheme()->m_pShowFullWeek)
|
||
|
{
|
||
|
GetTheme()->m_pShowFullWeek->SetText(sButtonText);
|
||
|
GetTheme()->m_pShowFullWeek->SetVisible(bShow);
|
||
|
}
|
||
|
}
|
||
|
else if (iButtonNumber == 6)
|
||
|
{
|
||
|
if (GetTheme()->m_pShowMcWeek)
|
||
|
{
|
||
|
GetTheme()->m_pShowMcWeek->SetText(sButtonText);
|
||
|
GetTheme()->m_pShowMcWeek->SetVisible(bShow);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER(bCalcValidRects);
|
||
|
|
||
|
if (!GetTheme())
|
||
|
return;
|
||
|
|
||
|
RECT* pClient = &lpncsp->rgrc[0];
|
||
|
|
||
|
pClient->left += m_Borders.left;
|
||
|
pClient->top += m_Borders.top;
|
||
|
|
||
|
pClient->right = max(pClient->left, pClient->right - m_Borders.right);
|
||
|
pClient->bottom = max(pClient->top, pClient->bottom - m_Borders.bottom);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::OnNcPaint()
|
||
|
{
|
||
|
CXTPWindowRect rc(this);
|
||
|
rc.OffsetRect(-rc.TopLeft());
|
||
|
|
||
|
CWindowDC dc(this);
|
||
|
|
||
|
if (GetTheme())
|
||
|
GetTheme()->DrawBorders(&dc, rc, m_Borders);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::UpdateBorders()
|
||
|
{
|
||
|
if (!GetSafeHwnd())
|
||
|
return;
|
||
|
|
||
|
::SetWindowPos(m_hWnd, NULL, 0, 0, 0, 0,
|
||
|
SWP_DRAWFRAME | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
|
||
|
|
||
|
Invalidate(NULL);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::SetBorders(int nLeft, int nTop, int nRight, int nBottom)
|
||
|
{
|
||
|
m_Borders.SetRect(nLeft, nTop, nRight, nBottom);
|
||
|
UpdateBorders();
|
||
|
}
|
||
|
|
||
|
CRect CXTPCalendarCaptionBarControl::CalcMinRect(BOOL bExactSize)
|
||
|
{
|
||
|
if (!m_pTheme)
|
||
|
return CRect(0, 0, 0, 0);
|
||
|
|
||
|
CRect rcMin = m_pTheme->CalcMinRect(NULL, bExactSize);
|
||
|
if (rcMin.Height() > 0)
|
||
|
{
|
||
|
CRect rcBorders = GetBorders();
|
||
|
|
||
|
rcMin.left += rcBorders.left + rcBorders.right;
|
||
|
rcMin.bottom += rcBorders.top + rcBorders.bottom;
|
||
|
}
|
||
|
|
||
|
return rcMin;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::SetTheme(CXTPCalendarCaptionBarTheme* pTheme)
|
||
|
{
|
||
|
ASSERT(pTheme);
|
||
|
if (pTheme)
|
||
|
{
|
||
|
CMDTARGET_RELEASE(m_pTheme);
|
||
|
m_pTheme = pTheme;
|
||
|
m_pTheme->SetOwner(this);
|
||
|
m_pTheme->RefreshMetrics();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::AdjustLayout(CDC* pDC, const CRect* prcWnd)
|
||
|
{
|
||
|
CXTPClientRect rcClient(this);
|
||
|
|
||
|
if (prcWnd)
|
||
|
((CRect&)rcClient) = *prcWnd;
|
||
|
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->AdjustLayout(pDC, rcClient);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::OnPaint()
|
||
|
{
|
||
|
CXTPClientRect rc(this);
|
||
|
|
||
|
if (rc.IsRectEmpty())
|
||
|
return;
|
||
|
|
||
|
CPaintDC dc(this); // device context for painting
|
||
|
|
||
|
CXTPBufferDC memDC(dc.GetSafeHdc(), rc);
|
||
|
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->Draw(&memDC);
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarCaptionBarControl::OnEraseBkgnd(CDC* /*pDC*/)
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::OnSize(UINT nType, int cx, int cy)
|
||
|
{
|
||
|
CWnd::OnSize(nType, cx, cy);
|
||
|
|
||
|
if (!GetSafeHwnd())
|
||
|
return;
|
||
|
|
||
|
CRect rcRect(0, 0, cx, cy);
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->AdjustLayout(NULL, rcRect);
|
||
|
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::OnLButtonDown(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->OnLButtonDown(nFlags, point);
|
||
|
|
||
|
if (GetCapture() != this)
|
||
|
SetCapture();
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::OnLButtonUp(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->OnLButtonUp(nFlags, point);
|
||
|
|
||
|
if (GetCapture() == this)
|
||
|
ReleaseCapture();
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::OnMouseMove(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->OnMouseMove(nFlags, point);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->OnKeyDown(nChar, nRepCnt, nFlags);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->OnKeyUp(nChar, nRepCnt, nFlags);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::OnTimer(UINT_PTR uTimerID)
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->OnTimer(uTimerID);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::OnDestroy()
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->OnBeforeDestroy();
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::OnKillFocus (CWnd* pNewWnd)
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->OnKillFocus(pNewWnd);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::EnableTimeline(BOOL bEnable)
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->m_bTimelineEnable = bEnable;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarCaptionBarControl::IsTimelineEnable()
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
return m_pTheme->m_bTimelineEnable;
|
||
|
else
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::EnableMulticolumns(BOOL bEnable)
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->m_bMulticolumnsEnable = bEnable;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarCaptionBarControl::IsMulticolumnsEnable()
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
return m_pTheme->m_bMulticolumnsEnable;
|
||
|
else
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarCaptionBarControl::IsUseOneLine()
|
||
|
{
|
||
|
if (GetTheme())
|
||
|
return GetTheme()->m_bIsOneLine;
|
||
|
else
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
#include "XTPCalendarControlView.h"
|
||
|
|
||
|
void CXTPCalendarCaptionBarControl::UseOneLine(BOOL bSet)
|
||
|
{
|
||
|
if (GetTheme())
|
||
|
{
|
||
|
GetTheme()->m_bIsOneLine = bSet;
|
||
|
|
||
|
GetTheme()->RefreshMetrics();
|
||
|
|
||
|
CXTPCalendarControlView* pView = DYNAMIC_DOWNCAST(CXTPCalendarControlView, GetParent());
|
||
|
if (pView)
|
||
|
pView->_ResizeControls();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CXTPCalendarCaptionBarTheme::CXTPCalendarCaptionBarTheme()
|
||
|
{
|
||
|
m_pSink = new CXTPNotifySink();
|
||
|
|
||
|
m_themeButton = new CXTPWinThemeWrapper();
|
||
|
|
||
|
|
||
|
m_pCaptionBar = NULL;
|
||
|
m_pCalendar = NULL;
|
||
|
m_nCheckHotStateTimerID = 0;
|
||
|
|
||
|
m_bIsSwitchViewButtons = TRUE;
|
||
|
m_bIsScrollDateButtons = TRUE;
|
||
|
m_bIsDateLabel = TRUE;
|
||
|
m_bTimelineEnable = TRUE;
|
||
|
m_bMulticolumnsEnable = TRUE;
|
||
|
m_bIsExpandButton = FALSE;
|
||
|
m_bIsOneLine = FALSE; //Old Layout - default
|
||
|
m_pConnection = NULL;
|
||
|
m_dScale = 1.0;
|
||
|
|
||
|
// Init Theme Parts
|
||
|
m_pButtonViewDay = new CSwitchViewButtonPart(this, xtpCalendarCaptionBar_ButtonViewDay);
|
||
|
m_pButtonViewWeek = new CSwitchViewButtonPart(this, xtpCalendarCaptionBar_ButtonViewWeek);
|
||
|
m_pButtonViewMonth = new CSwitchViewButtonPart(this, xtpCalendarCaptionBar_ButtonViewMonth);
|
||
|
|
||
|
m_pButtonViewDay->SetText(XTPResourceManager()->LoadString(XTP_IDS_CALENDAR_DAY));
|
||
|
m_pButtonViewWeek->SetText(XTPResourceManager()->LoadString(XTP_IDS_CALENDAR_WEEK));
|
||
|
m_pButtonViewMonth->SetText(XTPResourceManager()->LoadString(XTP_IDS_CALENDAR_MONTH));
|
||
|
|
||
|
m_pShowWorkWeek = new CRadioButtonPart(this, xtpCalendarCaptionBar_ShowWorkWeek);
|
||
|
m_pShowFullWeek = new CRadioButtonPart(this, xtpCalendarCaptionBar_ShowFullWeek);
|
||
|
|
||
|
CString s = XTPResourceManager()->LoadString(XTP_IDS_CALENDAR_SHOWWORKWEK);
|
||
|
s.Replace(_T("Show w"), _T("W"));
|
||
|
m_pShowWorkWeek->SetText(s);
|
||
|
m_pShowWorkWeek->SetCheck(0);
|
||
|
|
||
|
s = XTPResourceManager()->LoadString(XTP_IDS_CALENDAR_SHOWFULLKWEK);
|
||
|
s.Replace(_T("Show f"), _T("F"));
|
||
|
m_pShowFullWeek->SetText(s);
|
||
|
m_pShowFullWeek->SetCheck(0);
|
||
|
|
||
|
m_pShowTimeline = new CCheckboxButtonPart(this, xtpCalendarCaptionBar_ShowTimeline);
|
||
|
m_pShowTimeline->SetText(_T("TimeLine mode"));
|
||
|
m_pShowTimeline->SetCheck(0);
|
||
|
|
||
|
m_pShowMcWeek = new CCheckboxButtonPart(this, xtpCalendarCaptionBar_MultiColumnsWeek);
|
||
|
//m_pShowMcWeek = new CRadioButtonPart(this, xtpCalendarCaptionBar_MultiColumnsWeek);
|
||
|
m_pShowMcWeek->SetText(_T("MultiColumn mode"));
|
||
|
m_pShowMcWeek->SetCheck(0);
|
||
|
|
||
|
m_pScrollPrevDate = new CScrollDateButtonPart(this, xtpCalendarCaptionBar_ScrollPrevDate);
|
||
|
m_pScrollNextDate = new CScrollDateButtonPart(this, xtpCalendarCaptionBar_ScrollNextDate);
|
||
|
|
||
|
m_pDateLabel = new CDateLabelPart(this, xtpCalendarCaptionBar_DateLabel);
|
||
|
|
||
|
m_pExpandButton = new CExpandButtonPart(this, xtpCalendarCaptionBar_ButtonExpand);
|
||
|
|
||
|
m_nPaintTheme = xtpCalendarThemeResource;
|
||
|
|
||
|
RefreshMetrics();
|
||
|
}
|
||
|
|
||
|
CXTPCalendarCaptionBarTheme::~CXTPCalendarCaptionBarTheme()
|
||
|
{
|
||
|
m_pSink->Delete();
|
||
|
|
||
|
CMDTARGET_RELEASE(m_pConnection);
|
||
|
|
||
|
CMDTARGET_RELEASE(m_pButtonViewDay);
|
||
|
CMDTARGET_RELEASE(m_pButtonViewWeek);
|
||
|
CMDTARGET_RELEASE(m_pButtonViewMonth);
|
||
|
|
||
|
CMDTARGET_RELEASE(m_pShowWorkWeek);
|
||
|
CMDTARGET_RELEASE(m_pShowFullWeek);
|
||
|
|
||
|
CMDTARGET_RELEASE(m_pShowTimeline);
|
||
|
CMDTARGET_RELEASE(m_pShowMcWeek);
|
||
|
|
||
|
CMDTARGET_RELEASE(m_pScrollPrevDate);
|
||
|
CMDTARGET_RELEASE(m_pScrollNextDate);
|
||
|
|
||
|
CMDTARGET_RELEASE(m_pDateLabel);
|
||
|
CMDTARGET_RELEASE(m_pExpandButton);
|
||
|
|
||
|
CMDTARGET_RELEASE(m_pCalendar);
|
||
|
|
||
|
SAFE_DELETE(m_themeButton);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::OnBeforeDestroy()
|
||
|
{
|
||
|
m_pSink->UnadviseAll();
|
||
|
CMDTARGET_RELEASE(m_pCalendar);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::SetOwner(CXTPCalendarCaptionBarControl* pCaptionBar)
|
||
|
{
|
||
|
ASSERT(pCaptionBar);
|
||
|
if (pCaptionBar)
|
||
|
{
|
||
|
m_pCaptionBar = pCaptionBar;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::AttachCalendar(CXTPCalendarControl* pCalendar)
|
||
|
{
|
||
|
m_pSink->UnadviseAll();
|
||
|
CMDTARGET_RELEASE(m_pCalendar);
|
||
|
|
||
|
m_pCalendar = pCalendar;
|
||
|
CMDTARGET_ADDREF(m_pCalendar);
|
||
|
|
||
|
if (m_pCalendar && m_pCalendar->GetConnection())
|
||
|
{
|
||
|
CXTPNotifyConnection* pConnection = m_pCalendar->GetConnection();
|
||
|
|
||
|
m_pSink->Advise(pConnection, XTP_NC_CALENDARVIEWWASCHANGED, CreateNotfySinkClassDelegate(this, &CXTPCalendarCaptionBarTheme::OnEvent_Calendar));
|
||
|
m_pSink->Advise(pConnection, XTP_NC_CALENDAR_THEME_CHANGED, CreateNotfySinkClassDelegate(this, &CXTPCalendarCaptionBarTheme::OnEvent_Calendar));
|
||
|
|
||
|
UpdateControlsState();
|
||
|
|
||
|
if (XTPResourceImages() && XTPResourceImages()->GetConnection())
|
||
|
{
|
||
|
m_pSink->Advise(XTPResourceImages()->GetConnection(), XTP_NC_COMMON_RESOURCEIMAGES_CHANGED,
|
||
|
CreateNotfySinkClassDelegate(this, &CXTPCalendarCaptionBarTheme::OnEvent_ResourceImagesChanged));
|
||
|
}
|
||
|
|
||
|
SetPaintTheme(GetCalendarCtrl()->GetPaintTheme());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CXTPNotifyConnection* CXTPCalendarCaptionBarTheme::GetConnection()
|
||
|
{
|
||
|
if (!m_pConnection)
|
||
|
m_pConnection = new CXTPNotifyConnection();
|
||
|
|
||
|
return m_pConnection;
|
||
|
}
|
||
|
|
||
|
int CXTPCalendarCaptionBarTheme::GetChildHandlersCount() const
|
||
|
{
|
||
|
return m_arMembers.GetCount();
|
||
|
}
|
||
|
|
||
|
CXTPCalendarWMHandler* CXTPCalendarCaptionBarTheme::GetChildHandlerAt(int nIndex) const
|
||
|
{
|
||
|
return m_arMembers.GetAt(nIndex);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::OnMouseMove(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
CXTPCalendarWMHandler::OnMouseMove(nFlags, point);
|
||
|
|
||
|
if (GetOwnerWnd() && m_nCheckHotStateTimerID == 0)
|
||
|
{
|
||
|
m_nCheckHotStateTimerID = GetOwnerWnd()->SetTimer(1, 100, NULL);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarCaptionBarTheme::OnTimer(UINT_PTR uTimerID)
|
||
|
{
|
||
|
if (uTimerID == m_nCheckHotStateTimerID && GetOwnerWnd() &&
|
||
|
::GetCapture() != GetOwnerWnd()->GetSafeHwnd())
|
||
|
{
|
||
|
BOOL bMouseLeave;
|
||
|
BOOL bChanged = _UpdateControlsHotState(&bMouseLeave);
|
||
|
|
||
|
if (bMouseLeave)
|
||
|
{
|
||
|
GetOwnerWnd()->KillTimer(1);
|
||
|
m_nCheckHotStateTimerID = 0;
|
||
|
}
|
||
|
|
||
|
if (bChanged)
|
||
|
Redraw();
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
CRect CXTPCalendarCaptionBarTheme::CalcMinRect(CDC* /*pDC*/, BOOL bExactSize)
|
||
|
{
|
||
|
if (!IsSwitchViewButtons()
|
||
|
&& !IsScrollDateButtons()
|
||
|
&& !IsDateLabel()
|
||
|
&& !IsExpandButton())
|
||
|
return CRect(0, 0, 0, 0);
|
||
|
|
||
|
int nHeight = 0;
|
||
|
if (m_bIsOneLine)
|
||
|
{
|
||
|
nHeight += 27;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (IsSwitchViewButtons())
|
||
|
nHeight += 27;
|
||
|
|
||
|
int nH1 = (IsScrollDateButtons() || IsDateLabel()) ? 32 : 0;
|
||
|
int nH2 = IsExpandButton() ? 30 : 0;
|
||
|
|
||
|
nHeight += max(nH2, nH1);
|
||
|
|
||
|
if (!bExactSize)
|
||
|
nHeight += 11;
|
||
|
}
|
||
|
return CRect(0, 0, 525, nHeight);
|
||
|
};
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::AdjustLayout(CDC* pDC, const CRect& rcRect)
|
||
|
{
|
||
|
if (!pDC && GetOwnerWnd() && GetOwnerWnd()->m_hWnd)
|
||
|
{
|
||
|
CClientDC dc(GetOwnerWnd());
|
||
|
AdjustLayout(&dc, rcRect);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (rcRect.IsRectNull() || rcRect.IsRectEmpty())
|
||
|
return;
|
||
|
|
||
|
m_rcRect = rcRect;
|
||
|
CRect rc00(rcRect.left, rcRect.top, rcRect.left, rcRect.top);
|
||
|
CRect rcClient = m_rcRect;
|
||
|
|
||
|
CRect rc = rcClient;
|
||
|
|
||
|
int nNextY = rc.top;
|
||
|
BOOL bSwitchViewButtons = IsSwitchViewButtons();
|
||
|
BOOL bScrollDateButtons = IsScrollDateButtons();
|
||
|
BOOL bShowExpandButton = IsExpandButton();
|
||
|
BOOL bShowDateLabel = IsDateLabel();
|
||
|
|
||
|
m_pButtonViewDay->SetVisible(bSwitchViewButtons && !m_pButtonViewDay->GetText().IsEmpty());
|
||
|
m_pButtonViewWeek->SetVisible(bSwitchViewButtons && !m_pButtonViewWeek->GetText().IsEmpty());
|
||
|
m_pButtonViewMonth->SetVisible(bSwitchViewButtons && !m_pButtonViewMonth->GetText().IsEmpty());
|
||
|
|
||
|
int iWid1 = 83;
|
||
|
int iWid2 = 20;
|
||
|
int iWid3 = 5;
|
||
|
|
||
|
if (!m_bIsOneLine) //TWO LINE MODE
|
||
|
{
|
||
|
if (bSwitchViewButtons)
|
||
|
{
|
||
|
rc.bottom = rc.top + 26;
|
||
|
|
||
|
if (!m_pButtonViewDay->GetText().IsEmpty())
|
||
|
rc.right = rc.left + iWid1;
|
||
|
else
|
||
|
rc.right = rc.left;
|
||
|
m_pButtonViewDay->AdjustLayout(pDC, rc);
|
||
|
|
||
|
rc.left = m_pButtonViewDay->GetRect().right;
|
||
|
if (!m_pButtonViewWeek->GetText().IsEmpty())
|
||
|
rc.right = rc.left + iWid1;
|
||
|
else
|
||
|
rc.right = rc.left;
|
||
|
m_pButtonViewWeek->AdjustLayout(pDC, rc);
|
||
|
|
||
|
rc.left = m_pButtonViewWeek->GetRect().right;
|
||
|
if (!m_pButtonViewMonth->GetText().IsEmpty())
|
||
|
rc.right = rc.left + iWid1;
|
||
|
else
|
||
|
rc.right = rc.left;
|
||
|
m_pButtonViewMonth->AdjustLayout(pDC, rc);
|
||
|
|
||
|
rc.left = m_pButtonViewMonth->GetRect().right + 21;
|
||
|
rc.right = rc.left + iWid3;
|
||
|
|
||
|
if (m_bTimelineEnable && !m_pShowTimeline->GetText().IsEmpty())
|
||
|
{
|
||
|
m_pShowTimeline->AdjustLayout(pDC, rc);
|
||
|
|
||
|
rc.left = m_pShowTimeline->GetRect().right + 11;
|
||
|
rc.right = rc.left + iWid3;
|
||
|
}
|
||
|
|
||
|
if (!m_pShowWorkWeek->GetText().IsEmpty())
|
||
|
{
|
||
|
m_pShowWorkWeek->AdjustLayout(pDC, rc);
|
||
|
|
||
|
rc.left = m_pShowWorkWeek->GetRect().right + 11;
|
||
|
rc.right = rc.left + iWid3;
|
||
|
}
|
||
|
|
||
|
if (!m_pShowFullWeek->GetText().IsEmpty())
|
||
|
{
|
||
|
m_pShowFullWeek->AdjustLayout(pDC, rc);
|
||
|
rc.left = m_pShowFullWeek->GetRect().right + 11;
|
||
|
rc.right = rc.left + iWid3;
|
||
|
}
|
||
|
|
||
|
if (!m_pShowMcWeek->GetText().IsEmpty())
|
||
|
m_pShowMcWeek->AdjustLayout(pDC, rc);
|
||
|
|
||
|
rc = m_pButtonViewDay->GetRect();
|
||
|
|
||
|
nNextY = rc.bottom + 1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pButtonViewDay->AdjustLayout(pDC, rc00);
|
||
|
m_pButtonViewWeek->AdjustLayout(pDC, rc00);
|
||
|
m_pButtonViewMonth->AdjustLayout(pDC, rc00);
|
||
|
|
||
|
m_pShowWorkWeek->AdjustLayout(pDC, rc00);
|
||
|
m_pShowFullWeek->AdjustLayout(pDC, rc00);
|
||
|
m_pShowTimeline->AdjustLayout(pDC, rc00);
|
||
|
m_pShowMcWeek->AdjustLayout(pDC, rc00);
|
||
|
|
||
|
m_pShowWorkWeek->SetVisible(FALSE);
|
||
|
m_pShowFullWeek->SetVisible(FALSE);
|
||
|
m_pShowTimeline->SetVisible(FALSE);
|
||
|
m_pShowMcWeek->SetVisible(FALSE);
|
||
|
|
||
|
nNextY = rc.top;
|
||
|
}
|
||
|
|
||
|
int nNextX = rc.left;
|
||
|
|
||
|
m_pScrollPrevDate->SetVisible(bScrollDateButtons);
|
||
|
m_pScrollNextDate->SetVisible(bScrollDateButtons);
|
||
|
|
||
|
if (bScrollDateButtons)
|
||
|
{
|
||
|
rc.top = nNextY + 12;
|
||
|
if (rc.top + 20 + 3 > rcClient.bottom)
|
||
|
rc.top = max(nNextY + 3, rcClient.bottom - 23);
|
||
|
|
||
|
rc.bottom = rc.top + 20;
|
||
|
|
||
|
rc.left += m_nScrollDateButtonsMargin;
|
||
|
|
||
|
rc.right = rc.left + iWid2;
|
||
|
|
||
|
m_pScrollPrevDate->AdjustLayout(pDC, rc);
|
||
|
|
||
|
rc.left = m_pScrollPrevDate->GetRect().right + 9;
|
||
|
rc.right = rc.left + iWid2;
|
||
|
|
||
|
m_pScrollNextDate->AdjustLayout(pDC, rc);
|
||
|
|
||
|
nNextX = rc.right;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pScrollPrevDate->AdjustLayout(pDC, rc00);
|
||
|
m_pScrollNextDate->AdjustLayout(pDC, rc00);
|
||
|
}
|
||
|
|
||
|
m_pExpandButton->SetVisible(bShowExpandButton);
|
||
|
|
||
|
int nRightX = rcClient.right;
|
||
|
if (bShowExpandButton)
|
||
|
{
|
||
|
int nDelta = (bScrollDateButtons || bShowDateLabel) ? 5 : 3;
|
||
|
rc.top = nNextY + 13;
|
||
|
if (rc.top + 18 + nDelta > rcClient.bottom)
|
||
|
rc.top = max(nNextY + 1, rcClient.bottom - 18 - nDelta);
|
||
|
|
||
|
rc.bottom = rc.top + 18;
|
||
|
rc.right = rcClient.right - 2;
|
||
|
rc.left = rc.right - 18;
|
||
|
|
||
|
m_pExpandButton->AdjustLayout(pDC, rc);
|
||
|
|
||
|
nRightX = m_pExpandButton->GetRect().left;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pExpandButton->AdjustLayout(pDC, rc00);
|
||
|
}
|
||
|
|
||
|
m_pDateLabel->SetVisible(bShowDateLabel);
|
||
|
|
||
|
if (bShowDateLabel)
|
||
|
{
|
||
|
int nDelta = 3;
|
||
|
rc.top = nNextY + 12;
|
||
|
if (rc.top + 20 + nDelta > rcClient.bottom)
|
||
|
rc.top = max(nNextY + 3, rcClient.bottom - 20 - nDelta);
|
||
|
|
||
|
rc.bottom = rc.top + 22;
|
||
|
rc.left = nNextX + 11;
|
||
|
rc.right = nRightX - 2;
|
||
|
|
||
|
m_pDateLabel->AdjustLayout(pDC, rc);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pDateLabel->AdjustLayout(pDC, rc00);
|
||
|
}
|
||
|
}
|
||
|
else //ONE LINE MODE
|
||
|
{
|
||
|
int nNextX(0);
|
||
|
if (bSwitchViewButtons)
|
||
|
{
|
||
|
if (!m_pButtonViewDay->GetText().IsEmpty())
|
||
|
rc.right = rc.left + iWid1;
|
||
|
else
|
||
|
rc.right = rc.left;
|
||
|
m_pButtonViewDay->AdjustLayout(pDC, rc);
|
||
|
|
||
|
rc.left = m_pButtonViewDay->GetRect().right;
|
||
|
if (!m_pButtonViewWeek->GetText().IsEmpty())
|
||
|
rc.right = rc.left + iWid1;
|
||
|
else
|
||
|
rc.right = rc.left;
|
||
|
m_pButtonViewWeek->AdjustLayout(pDC, rc);
|
||
|
|
||
|
rc.left = m_pButtonViewWeek->GetRect().right;
|
||
|
if (!m_pButtonViewMonth->GetText().IsEmpty())
|
||
|
rc.right = rc.left + iWid1;
|
||
|
else
|
||
|
rc.right = rc.left;
|
||
|
m_pButtonViewMonth->AdjustLayout(pDC, rc);
|
||
|
|
||
|
rc.left = m_pButtonViewMonth->GetRect().right + 21;
|
||
|
rc.right = rc.left + iWid3;
|
||
|
|
||
|
if (m_bTimelineEnable && !m_pShowTimeline->GetText().IsEmpty())
|
||
|
{
|
||
|
m_pShowTimeline->AdjustLayout(pDC, rc);
|
||
|
|
||
|
rc.left = m_pShowTimeline->GetRect().right + 11;
|
||
|
rc.right = rc.left + iWid3;
|
||
|
}
|
||
|
|
||
|
if (!m_pShowWorkWeek->GetText().IsEmpty())
|
||
|
{
|
||
|
m_pShowWorkWeek->AdjustLayout(pDC, rc);
|
||
|
rc.left = m_pShowWorkWeek->GetRect().right + 11;
|
||
|
rc.right = rc.left + iWid3;
|
||
|
}
|
||
|
|
||
|
if (!m_pShowFullWeek->GetText().IsEmpty())
|
||
|
{
|
||
|
m_pShowFullWeek->AdjustLayout(pDC, rc);
|
||
|
rc.left = m_pShowFullWeek->GetRect().right + 11;
|
||
|
rc.right = rc.left + iWid3;
|
||
|
}
|
||
|
|
||
|
if (!m_pShowMcWeek->GetText().IsEmpty())
|
||
|
m_pShowMcWeek->AdjustLayout(pDC, rc);
|
||
|
|
||
|
nNextX = m_pShowMcWeek->GetRect().right + 11;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pButtonViewDay->AdjustLayout(pDC, rc00);
|
||
|
m_pButtonViewWeek->AdjustLayout(pDC, rc00);
|
||
|
m_pButtonViewMonth->AdjustLayout(pDC, rc00);
|
||
|
|
||
|
m_pShowWorkWeek->AdjustLayout(pDC, rc00);
|
||
|
m_pShowFullWeek->AdjustLayout(pDC, rc00);
|
||
|
m_pShowTimeline->AdjustLayout(pDC, rc00);
|
||
|
m_pShowMcWeek->AdjustLayout(pDC, rc00);
|
||
|
|
||
|
m_pShowWorkWeek->SetVisible(FALSE);
|
||
|
m_pShowFullWeek->SetVisible(FALSE);
|
||
|
m_pShowTimeline->SetVisible(FALSE);
|
||
|
m_pShowMcWeek->SetVisible(FALSE);
|
||
|
}
|
||
|
|
||
|
m_pScrollPrevDate->SetVisible(bScrollDateButtons);
|
||
|
m_pScrollNextDate->SetVisible(bScrollDateButtons);
|
||
|
|
||
|
if (bScrollDateButtons)
|
||
|
{
|
||
|
rc.left = nNextX + 20;
|
||
|
rc.right = rc.left + iWid2;
|
||
|
|
||
|
m_pScrollPrevDate->AdjustLayout(pDC, rc);
|
||
|
|
||
|
rc.left = m_pScrollPrevDate->GetRect().right + 9;
|
||
|
rc.right = rc.left + iWid2;
|
||
|
|
||
|
m_pScrollNextDate->AdjustLayout(pDC, rc);
|
||
|
|
||
|
nNextX = rc.right;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pScrollPrevDate->AdjustLayout(pDC, rc00);
|
||
|
m_pScrollNextDate->AdjustLayout(pDC, rc00);
|
||
|
}
|
||
|
|
||
|
m_pExpandButton->SetVisible(bShowExpandButton);
|
||
|
|
||
|
int nRightX = rcClient.right;
|
||
|
if (bShowExpandButton)
|
||
|
{
|
||
|
rc.right = rcClient.right - 2;
|
||
|
rc.left = rc.right - 18;
|
||
|
|
||
|
m_pExpandButton->AdjustLayout(pDC, rc);
|
||
|
|
||
|
nRightX = m_pExpandButton->GetRect().left;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pExpandButton->AdjustLayout(pDC, rc00);
|
||
|
}
|
||
|
m_pDateLabel->SetVisible(bShowDateLabel);
|
||
|
|
||
|
if (bShowDateLabel)
|
||
|
{
|
||
|
rc.left = nNextX + 20;
|
||
|
rc.right = nRightX - 2;
|
||
|
|
||
|
m_pDateLabel->AdjustLayout(pDC, rc);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pDateLabel->AdjustLayout(pDC, rc00);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
COLORREF CXTPCalendarCaptionBarTheme::GetColor2(LPCTSTR pcszColorName, COLORREF clrDefault)
|
||
|
{
|
||
|
COLORREF clrColor = COLORREF_NULL;
|
||
|
|
||
|
CXTPResourceImages* pImages = XTPResourceImages();
|
||
|
|
||
|
if (pImages->IsValid())
|
||
|
{
|
||
|
clrColor = pImages->GetImageColor(_T("CalendarControl"), pcszColorName);
|
||
|
}
|
||
|
|
||
|
if (clrColor == COLORREF_NULL)
|
||
|
{
|
||
|
clrColor = clrDefault;
|
||
|
}
|
||
|
|
||
|
return clrColor;
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::RefreshMetrics()
|
||
|
{
|
||
|
m_themeButton->OpenTheme(0, L"BUTTON");
|
||
|
|
||
|
LOGFONT lfBaseFont;
|
||
|
::ZeroMemory(&lfBaseFont, sizeof(lfBaseFont));
|
||
|
BOOL bUseFont2007 = FALSE;
|
||
|
|
||
|
m_nScrollDateButtonsMargin = 20;
|
||
|
|
||
|
if (GetPaintTheme() >= xtpCalendarThemeResource)
|
||
|
{
|
||
|
m_clrSwitchViewBarBk.SetStandardValue(GetColor2(_T("CaptionBarSwitchViewBarBk"), RGB(173, 209, 255)));
|
||
|
m_clrScrollDateBarBk.SetStandardValue(GetColor2(_T("CaptionBarDateBarBk"), RGB(227, 239, 255)));
|
||
|
|
||
|
m_clrBorders.SetStandardValue(GetColor2(_T("CaptionBarBorders"), RGB(101, 147, 201)));
|
||
|
m_clrTextColor.SetStandardValue(GetColor2(_T("CaptionBarTextColor"), RGB(0, 0, 0)));
|
||
|
|
||
|
// Try to set default Office 2007 font,
|
||
|
// otherwise icon font used.
|
||
|
bUseFont2007 = XTPDrawHelpers()->FontExists(XTP_CALENDAR_OFFICE2007_FONT_NAME);
|
||
|
|
||
|
if (XTPResourceImages()->GetImageInt(_T("CalendarControl"), _T("FlatStyle"), 0))
|
||
|
{
|
||
|
m_nScrollDateButtonsMargin = 4;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//m_clrSwitchViewBarBk.SetStandardValue(RGB(192, 192, 192));
|
||
|
m_clrSwitchViewBarBk.SetStandardValue(GetSysColor(COLOR_BTNFACE));
|
||
|
|
||
|
if (GetPaintTheme() == xtpCalendarThemeOffice2000)
|
||
|
m_clrScrollDateBarBk.SetStandardValue(RGB(146, 146, 146));
|
||
|
else
|
||
|
m_clrScrollDateBarBk.SetStandardValue(RGB(130, 130, 130));
|
||
|
|
||
|
m_clrBorders.SetStandardValue(RGB(130, 130, 130));
|
||
|
m_clrTextColor.SetStandardValue(RGB(255, 255, 255));
|
||
|
}
|
||
|
|
||
|
if (bUseFont2007)
|
||
|
{
|
||
|
STRCPY_S(lfBaseFont.lfFaceName, LF_FACESIZE, XTP_CALENDAR_OFFICE2007_FONT_NAME);
|
||
|
lfBaseFont.lfCharSet = XTPResourceManager()->GetFontCharset();
|
||
|
lfBaseFont.lfHeight = -11;
|
||
|
//lfBaseFont.lfHeight = -10;
|
||
|
lfBaseFont.lfWeight = FW_NORMAL;
|
||
|
|
||
|
if (XTPSystemVersion()->IsClearTypeTextQualitySupported())
|
||
|
lfBaseFont.lfQuality = 5;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
VERIFY(CXTPDrawHelpers::GetIconLogFont(&lfBaseFont));
|
||
|
}
|
||
|
|
||
|
m_fntTextFont.SetStandardValue(&lfBaseFont);
|
||
|
|
||
|
int nCount = m_arMembers.GetCount();
|
||
|
for (int i = 0; i < nCount; i++)
|
||
|
{
|
||
|
CXTPCalendarCaptionBarThemePart* pPart = m_arMembers.GetAt(i);
|
||
|
ASSERT(pPart);
|
||
|
if (pPart)
|
||
|
pPart->RefreshMetrics();
|
||
|
}
|
||
|
|
||
|
AdjustLayout(NULL, GetRect());
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::Draw(CDC* pDC)
|
||
|
{
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
pDC->FillSolidRect(GetRect(), RGB(255, 0, 0));
|
||
|
#endif
|
||
|
|
||
|
CRect rcTopPart = m_pButtonViewDay->GetRect();
|
||
|
|
||
|
if (IsSwitchViewButtons())
|
||
|
{
|
||
|
// Fill SwitchViewBar
|
||
|
rcTopPart.right = m_rcRect.right;
|
||
|
pDC->FillSolidRect(rcTopPart, m_clrSwitchViewBarBk);
|
||
|
|
||
|
rcTopPart.top = rcTopPart.bottom;
|
||
|
rcTopPart.bottom++;
|
||
|
|
||
|
pDC->FillSolidRect(rcTopPart, m_clrBorders);
|
||
|
}
|
||
|
|
||
|
// Fill ScrollDateBar
|
||
|
CRect rcBottomPart = m_rcRect;
|
||
|
rcBottomPart.top = rcTopPart.bottom;
|
||
|
pDC->FillSolidRect(rcBottomPart, m_clrScrollDateBarBk);
|
||
|
|
||
|
//DrawBorders(pDC, m_rcRect, m_rcRect);
|
||
|
|
||
|
// Draw members
|
||
|
int nCount = m_arMembers.GetCount();
|
||
|
for (int i = 0; i < nCount; i++)
|
||
|
{
|
||
|
CXTPCalendarCaptionBarThemePart* pPart = m_arMembers.GetAt(i);
|
||
|
ASSERT(pPart);
|
||
|
if (pPart)
|
||
|
pPart->Draw(pDC);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::DrawBorders(CDC* pDC, const CRect& rcRect, const CRect& Borders)
|
||
|
{
|
||
|
// Draw borders
|
||
|
CRect rc;
|
||
|
if (Borders.top)
|
||
|
{
|
||
|
rc = rcRect;
|
||
|
rc.bottom = rc.top + Borders.top;
|
||
|
pDC->FillSolidRect(rc, m_clrBorders);
|
||
|
}
|
||
|
|
||
|
if (Borders.bottom)
|
||
|
{
|
||
|
rc = rcRect;
|
||
|
rc.top = rc.bottom - Borders.bottom;
|
||
|
pDC->FillSolidRect(rc, m_clrBorders);
|
||
|
}
|
||
|
|
||
|
if (Borders.left)
|
||
|
{
|
||
|
rc = rcRect;
|
||
|
rc.right = rc.left + Borders.left;
|
||
|
pDC->FillSolidRect(rc, m_clrBorders);
|
||
|
}
|
||
|
|
||
|
if (Borders.right)
|
||
|
{
|
||
|
rc = rcRect;
|
||
|
rc.left = rc.right - Borders.right;
|
||
|
pDC->FillSolidRect(rc, m_clrBorders);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
CXTPCalendarCaptionBarThemePart::CXTPCalendarCaptionBarThemePart(CXTPCalendarCaptionBarTheme* pTheme, int nPartID)
|
||
|
{
|
||
|
ASSERT(pTheme);
|
||
|
m_pTheme = pTheme;
|
||
|
m_nPartID = nPartID;
|
||
|
m_nState = xtpBtnStateNormal;
|
||
|
m_bVisible = TRUE;
|
||
|
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->m_arMembers.Add(this, TRUE);
|
||
|
}
|
||
|
|
||
|
CXTPCalendarCaptionBarThemePart::~CXTPCalendarCaptionBarThemePart()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarThemePart::AdjustLayout(CDC* /*pDC*/, const CRect& rcRect)
|
||
|
{
|
||
|
m_rcRect = rcRect;
|
||
|
}
|
||
|
|
||
|
COLORREF CXTPCalendarCaptionBarThemePart::GetTextColor()
|
||
|
{
|
||
|
if (m_clrTextColor.IsDefaultValue() && m_pTheme)
|
||
|
return (COLORREF)m_pTheme->m_clrTextColor;
|
||
|
|
||
|
return (COLORREF)m_clrTextColor;
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarThemePart::Draw(CDC* /*pDC*/)
|
||
|
{
|
||
|
};
|
||
|
|
||
|
BOOL CXTPCalendarCaptionBarThemePart::HitTest(const CPoint& pt) const
|
||
|
{
|
||
|
return IsVisible() && m_rcRect.PtInRect(pt);
|
||
|
};
|
||
|
|
||
|
void CXTPCalendarCaptionBarThemePart::Redraw(BOOL bUpdateNow)
|
||
|
{
|
||
|
if (m_pTheme)
|
||
|
m_pTheme->Redraw(bUpdateNow);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::Redraw(BOOL bUpdateNow)
|
||
|
{
|
||
|
if (GetOwnerWnd() && GetOwnerWnd()->GetSafeHwnd())
|
||
|
{
|
||
|
GetOwnerWnd()->Invalidate(FALSE);
|
||
|
|
||
|
if (bUpdateNow)
|
||
|
GetOwnerWnd()->UpdateWindow();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarThemePart::OnMouseMove(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER(nFlags);
|
||
|
|
||
|
int nStatePrev = m_nState;
|
||
|
|
||
|
if (HitTest(point))
|
||
|
m_nState = m_nState | xtpBtnStateMouseOver;
|
||
|
else
|
||
|
m_nState = m_nState & (~(xtpBtnStateMouseOver));
|
||
|
|
||
|
if (nStatePrev != m_nState)
|
||
|
Redraw();
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarCaptionBarThemePart::OnLButtonDown(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER(nFlags);
|
||
|
|
||
|
int nStatePrev = m_nState;
|
||
|
|
||
|
BOOL bHitTest = HitTest(point);
|
||
|
if (bHitTest)
|
||
|
{
|
||
|
m_nState = m_nState | xtpBtnStatePressed | xtpBtnStateFocused;
|
||
|
}
|
||
|
else
|
||
|
m_nState = m_nState & (~(xtpBtnStatePressed | xtpBtnStateFocused));
|
||
|
|
||
|
if (nStatePrev != m_nState)
|
||
|
Redraw();
|
||
|
|
||
|
return FALSE; // to allow receive this notification for all other parts (to clear state)
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarCaptionBarThemePart::OnLButtonUp(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER(nFlags);
|
||
|
|
||
|
int nStatePrev = m_nState;
|
||
|
BOOL bHitTest = HitTest(point);
|
||
|
|
||
|
if (bHitTest && (m_nState & (xtpBtnStatePressed | xtpBtnStateFocused)))
|
||
|
{
|
||
|
m_nState = m_nState & (~xtpBtnStatePressed);
|
||
|
|
||
|
if (m_pTheme && IsVisible())
|
||
|
m_pTheme->OnPartClick(m_nPartID);
|
||
|
}
|
||
|
|
||
|
m_nState = m_nState & (~xtpBtnStatePressed);
|
||
|
|
||
|
if (nStatePrev != m_nState)
|
||
|
Redraw();
|
||
|
|
||
|
return FALSE; // to allow receive this notification for all other parts (to clear state)
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::OnEvent_Calendar(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(lParam);
|
||
|
|
||
|
|
||
|
if (Event == XTP_NC_CALENDARVIEWWASCHANGED)
|
||
|
{
|
||
|
UpdateControlsState();
|
||
|
}
|
||
|
else if (Event == XTP_NC_CALENDAR_THEME_CHANGED)
|
||
|
{
|
||
|
SetPaintTheme(GetCalendarCtrl()->GetPaintTheme());
|
||
|
}
|
||
|
else {
|
||
|
ASSERT(FALSE);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Redraw();
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::OnEvent_ResourceImagesChanged(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(lParam);
|
||
|
|
||
|
if (Event == XTP_NC_COMMON_RESOURCEIMAGES_CHANGED)
|
||
|
{
|
||
|
RefreshMetrics();
|
||
|
|
||
|
Redraw();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::UpdateControlsState()
|
||
|
{
|
||
|
if (!GetCalendarCtrl() || !GetCalendarCtrl()->GetActiveView())
|
||
|
return;
|
||
|
|
||
|
m_pShowWorkWeek->SetVisible(FALSE);
|
||
|
m_pShowFullWeek->SetVisible(FALSE);
|
||
|
m_pShowMcWeek->SetVisible(FALSE);
|
||
|
|
||
|
m_pButtonViewDay->SetCheck(0);
|
||
|
m_pButtonViewWeek->SetCheck(0);
|
||
|
m_pButtonViewMonth->SetCheck(0);
|
||
|
|
||
|
m_pShowTimeline->SetVisible(m_bTimelineEnable);
|
||
|
|
||
|
int iScale = GetCalendarCtrl()->GetTimeLineScale();
|
||
|
int nViewType = GetCalendarCtrl()->GetActiveView()->GetViewType();
|
||
|
|
||
|
//BOOL bTimelineMode = m_pShowTimeline->GetCheck();
|
||
|
|
||
|
BOOL bTimelineMode = GetCalendarCtrl()->m_bTimelineMode;
|
||
|
m_pShowTimeline->SetCheck(bTimelineMode);
|
||
|
|
||
|
if (nViewType == xtpCalendarDayView ||
|
||
|
(bTimelineMode && iScale == xtpTSPID_Day))
|
||
|
{
|
||
|
m_pButtonViewDay->SetCheck(1);
|
||
|
}
|
||
|
else if (nViewType == xtpCalendarMonthView ||
|
||
|
(bTimelineMode && iScale == xtpTSPID_Month))
|
||
|
{
|
||
|
m_pButtonViewMonth->SetCheck(1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (bTimelineMode &&
|
||
|
(iScale == xtpTSPID_Week || iScale == xtpTSPID_WorkWeek))
|
||
|
m_pButtonViewWeek->SetCheck(1);
|
||
|
|
||
|
if (IsSwitchViewButtons())
|
||
|
{
|
||
|
m_pShowWorkWeek->SetVisible(!m_pShowWorkWeek->GetText().IsEmpty());
|
||
|
m_pShowFullWeek->SetVisible(!m_pShowFullWeek->GetText().IsEmpty());
|
||
|
m_pShowMcWeek->SetVisible(m_bMulticolumnsEnable && !m_pShowMcWeek->GetText().IsEmpty());
|
||
|
m_pShowMcWeek->SetCheck(GetCalendarCtrl()->m_bMultiColumnWeekMode);
|
||
|
}
|
||
|
if (nViewType == xtpCalendarWorkWeekView)
|
||
|
{
|
||
|
m_pShowWorkWeek->SetCheck(1);
|
||
|
m_pShowFullWeek->SetCheck(0);
|
||
|
m_pButtonViewWeek->SetCheck(1);
|
||
|
}
|
||
|
else if (nViewType == xtpCalendarFullWeekView)
|
||
|
{
|
||
|
m_pShowWorkWeek->SetCheck(0);
|
||
|
m_pShowFullWeek->SetCheck(1);
|
||
|
m_pButtonViewWeek->SetCheck(1);
|
||
|
}
|
||
|
else if (nViewType == xtpCalendarWeekView)
|
||
|
{
|
||
|
m_pShowWorkWeek->SetCheck(0);
|
||
|
m_pShowFullWeek->SetCheck(1);
|
||
|
m_pButtonViewWeek->SetCheck(1);
|
||
|
}
|
||
|
else if (nViewType == xtpCalendarTimeLineView)
|
||
|
{
|
||
|
m_pShowTimeline->SetCheck(1);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::OnPartClick(int nPartID)
|
||
|
{
|
||
|
BOOL bCancel = FALSE;
|
||
|
if (m_pConnection)
|
||
|
m_pConnection->SendEvent(XTP_NC_CALENDAR_CAPTIONBARPART_BEFORE_CLICK, (WPARAM)nPartID, (LPARAM)&bCancel);
|
||
|
|
||
|
if (GetCalendarCtrl() && !bCancel)
|
||
|
GetCalendarCtrl()->SendNotification(XTP_NC_CALENDAR_CAPTIONBARPART_BEFORE_CLICK, (WPARAM)nPartID, (LPARAM)&bCancel);
|
||
|
|
||
|
if (bCancel)
|
||
|
return;
|
||
|
|
||
|
if (nPartID == xtpCalendarCaptionBar_ButtonExpand)
|
||
|
{
|
||
|
m_pExpandButton->SetCheck(m_pExpandButton->GetCheck() ? 0 : 1);
|
||
|
|
||
|
Redraw();
|
||
|
}
|
||
|
|
||
|
if (GetCalendarCtrl() && GetCalendarCtrl()->GetActiveView())
|
||
|
{
|
||
|
BOOL bUpdate = TRUE;
|
||
|
BOOL bTimelineMode = m_pShowTimeline->GetCheck();
|
||
|
|
||
|
if (nPartID == xtpCalendarCaptionBar_ButtonViewDay)
|
||
|
{
|
||
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarDayView);
|
||
|
GetCalendarCtrl()->SetFocus();
|
||
|
if (bTimelineMode)
|
||
|
{
|
||
|
GetCalendarCtrl()->m_bTimelineMode = !GetCalendarCtrl()->m_bTimelineMode;
|
||
|
GetCalendarCtrl()->OnCalendarTimeline();
|
||
|
}
|
||
|
}
|
||
|
else if (nPartID == xtpCalendarCaptionBar_ButtonViewWeek)
|
||
|
{
|
||
|
BOOL bMultiColumnWeekMode = GetCalendarCtrl()->m_bMultiColumnWeekMode;
|
||
|
if (bMultiColumnWeekMode)
|
||
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarWorkWeekView);
|
||
|
else
|
||
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarFullWeekView);
|
||
|
GetCalendarCtrl()->SetFocus();
|
||
|
if (bTimelineMode)
|
||
|
{
|
||
|
GetCalendarCtrl()->m_bTimelineMode = !GetCalendarCtrl()->m_bTimelineMode;
|
||
|
GetCalendarCtrl()->OnCalendarTimeline();
|
||
|
}
|
||
|
}
|
||
|
else if (nPartID == xtpCalendarCaptionBar_ButtonViewMonth)
|
||
|
{
|
||
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarMonthView);
|
||
|
GetCalendarCtrl()->SetFocus();
|
||
|
if (bTimelineMode)
|
||
|
{
|
||
|
GetCalendarCtrl()->m_bTimelineMode = !GetCalendarCtrl()->m_bTimelineMode;
|
||
|
GetCalendarCtrl()->OnCalendarTimeline();
|
||
|
}
|
||
|
}
|
||
|
else if (nPartID == xtpCalendarCaptionBar_ShowWorkWeek)
|
||
|
{
|
||
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarWorkWeekView);
|
||
|
m_pShowWorkWeek->SetCheck(1);
|
||
|
m_pShowFullWeek->SetCheck(0);
|
||
|
GetCalendarCtrl()->SetFocus();
|
||
|
if (bTimelineMode)
|
||
|
{
|
||
|
GetCalendarCtrl()->m_bTimelineMode = !GetCalendarCtrl()->m_bTimelineMode;
|
||
|
GetCalendarCtrl()->OnCalendarTimeline();
|
||
|
}
|
||
|
}
|
||
|
else if (nPartID == xtpCalendarCaptionBar_ShowFullWeek)
|
||
|
{
|
||
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarFullWeekView);
|
||
|
m_pShowWorkWeek->SetCheck(0);
|
||
|
m_pShowFullWeek->SetCheck(1);
|
||
|
GetCalendarCtrl()->SetFocus();
|
||
|
if (bTimelineMode)
|
||
|
{
|
||
|
GetCalendarCtrl()->m_bTimelineMode = !GetCalendarCtrl()->m_bTimelineMode;
|
||
|
GetCalendarCtrl()->OnCalendarTimeline();
|
||
|
}
|
||
|
}
|
||
|
else if (nPartID == xtpCalendarCaptionBar_ShowTimeline)
|
||
|
{
|
||
|
m_pShowTimeline->SetCheck(!bTimelineMode);
|
||
|
GetCalendarCtrl()->OnCalendarTimeline();
|
||
|
}
|
||
|
else if (nPartID == xtpCalendarCaptionBar_MultiColumnsWeek)
|
||
|
{
|
||
|
GetCalendarCtrl()->m_bMultiColumnWeekMode = !GetCalendarCtrl()->m_bMultiColumnWeekMode;
|
||
|
int nViewType = GetCalendarCtrl()->GetActiveView()->GetViewType();
|
||
|
if (nViewType == xtpCalendarWeekView)
|
||
|
{
|
||
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarFullWeekView);
|
||
|
m_pShowWorkWeek->SetCheck(0);
|
||
|
m_pShowFullWeek->SetCheck(1);
|
||
|
}
|
||
|
else if (nViewType == xtpCalendarWorkWeekView)
|
||
|
{
|
||
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarWorkWeekView);
|
||
|
m_pShowWorkWeek->SetCheck(1);
|
||
|
m_pShowFullWeek->SetCheck(0);
|
||
|
}
|
||
|
else if (nViewType == xtpCalendarFullWeekView)
|
||
|
{
|
||
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarFullWeekView);
|
||
|
m_pShowWorkWeek->SetCheck(0);
|
||
|
m_pShowFullWeek->SetCheck(1);
|
||
|
}
|
||
|
if (bTimelineMode)
|
||
|
{
|
||
|
GetCalendarCtrl()->m_bTimelineMode = !GetCalendarCtrl()->m_bTimelineMode;
|
||
|
GetCalendarCtrl()->OnCalendarTimeline();
|
||
|
}
|
||
|
}
|
||
|
else if (nPartID == xtpCalendarCaptionBar_ScrollPrevDate ||
|
||
|
nPartID == xtpCalendarCaptionBar_ScrollNextDate)
|
||
|
{
|
||
|
BOOL bNext = nPartID == xtpCalendarCaptionBar_ScrollNextDate;
|
||
|
COleDateTime dtSelStart, dtSelEnd, dtFirst;
|
||
|
CXTPCalendarView* pActiveView = GetCalendarCtrl()->GetActiveView();
|
||
|
int nViewType = pActiveView->GetViewType();
|
||
|
|
||
|
if (nViewType == xtpCalendarTimeLineView)
|
||
|
{
|
||
|
CXTPCalendarTimeLineView* pTimeLineView = (CXTPCalendarTimeLineView*) pActiveView;
|
||
|
int iTimeScaleID = pTimeLineView->GetTimeScaleID();
|
||
|
dtSelStart = pTimeLineView->GetStartViewDate();
|
||
|
if (iTimeScaleID == xtpTSPID_Month)
|
||
|
{
|
||
|
int nSelDay = dtSelStart.GetDay();
|
||
|
CXTPCalendarUtils::ShiftDate_Month(dtSelStart, bNext ? 1 : -1, 1);
|
||
|
CXTPCalendarUtils::UpdateMonthDay(dtSelStart, nSelDay);
|
||
|
}
|
||
|
else if (iTimeScaleID == xtpTSPID_Week)
|
||
|
{
|
||
|
dtSelStart += COleDateTimeSpan(bNext ? 7 : -7);
|
||
|
}
|
||
|
else if (iTimeScaleID == xtpTSPID_Day)
|
||
|
{
|
||
|
dtSelStart += COleDateTimeSpan(bNext ? 1 : -1);
|
||
|
}
|
||
|
pTimeLineView->SetStartViewDate(dtSelStart);
|
||
|
SCROLLINFO SI;
|
||
|
int nScrollStep;
|
||
|
if (pTimeLineView->GetScrollBarInfoH(&SI, &nScrollStep))
|
||
|
{
|
||
|
int newPos = SI.nPos - SI.nPage;
|
||
|
if (bNext)
|
||
|
newPos = SI.nPos + SI.nPage;
|
||
|
pTimeLineView->ScrollH(newPos, newPos);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int nGroupIndex = 0;
|
||
|
BOOL bAllDay = TRUE;
|
||
|
dtFirst = pActiveView->GetViewDayDate(0);
|
||
|
if (!pActiveView->GetSelection(&dtSelStart, &dtSelEnd, &bAllDay, &nGroupIndex))
|
||
|
{
|
||
|
dtSelStart = dtFirst;
|
||
|
dtSelEnd = dtFirst + COleDateTimeSpan(1);
|
||
|
}
|
||
|
|
||
|
if (nViewType == xtpCalendarDayView)
|
||
|
{
|
||
|
int nDays = pActiveView->GetViewDayCount();
|
||
|
dtSelStart += COleDateTimeSpan(bNext ? nDays : -nDays);
|
||
|
dtSelEnd += COleDateTimeSpan(bNext ? nDays : -nDays);
|
||
|
}
|
||
|
else if (nViewType == xtpCalendarWorkWeekView ||
|
||
|
nViewType == xtpCalendarFullWeekView ||
|
||
|
nViewType == xtpCalendarWeekView)
|
||
|
{
|
||
|
dtSelStart += COleDateTimeSpan(bNext ? 7 : -7);
|
||
|
dtSelEnd += COleDateTimeSpan(bNext ? 7 : -7);
|
||
|
}
|
||
|
else if (nViewType == xtpCalendarMonthView)
|
||
|
{
|
||
|
int nSelDay = dtSelStart.GetDay();
|
||
|
CXTPCalendarUtils::ShiftDate_Month(dtSelStart, bNext ? 1 : -1, 1);
|
||
|
CXTPCalendarUtils::UpdateMonthDay(dtSelStart, nSelDay);
|
||
|
|
||
|
dtSelEnd = dtSelStart;// + COleDateTimeSpan(1);
|
||
|
|
||
|
CXTPCalendarMonthView* pMView = (CXTPCalendarMonthView*)pActiveView;
|
||
|
pMView->SetMDayViewLightColorBaseDate(dtSelStart);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ASSERT(FALSE);
|
||
|
}
|
||
|
|
||
|
pActiveView->UnselectAllEvents();
|
||
|
pActiveView->SetSelection(dtSelStart, dtSelEnd, bAllDay, nGroupIndex);
|
||
|
|
||
|
GetCalendarCtrl()->SwitchActiveView((XTPCalendarViewType)nViewType);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
bUpdate = FALSE;
|
||
|
}
|
||
|
|
||
|
if (bUpdate)
|
||
|
{
|
||
|
UpdateControlsState();
|
||
|
Redraw();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (m_pConnection)
|
||
|
m_pConnection->SendEvent(XTP_NC_CALENDAR_CAPTIONBARPART_CLICK, (WPARAM)nPartID, 0);
|
||
|
|
||
|
if (GetCalendarCtrl())
|
||
|
GetCalendarCtrl()->SendNotification(XTP_NC_CALENDAR_CAPTIONBARPART_CLICK, (WPARAM)nPartID, 0);
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarCaptionBarTheme::_UpdateControlsHotState(BOOL* pbMouseLeave)
|
||
|
{
|
||
|
if (pbMouseLeave)
|
||
|
*pbMouseLeave = FALSE;
|
||
|
|
||
|
CPoint ptMouse(0, 0);
|
||
|
|
||
|
if (GetCursorPos(&ptMouse) && GetOwnerWnd())
|
||
|
GetOwnerWnd()->ScreenToClient(&ptMouse);
|
||
|
else
|
||
|
return FALSE;
|
||
|
|
||
|
BOOL bMouseLeave = !m_rcRect.PtInRect(ptMouse);
|
||
|
|
||
|
if (pbMouseLeave)
|
||
|
*pbMouseLeave = bMouseLeave;
|
||
|
|
||
|
if (!bMouseLeave)
|
||
|
return FALSE;
|
||
|
|
||
|
BOOL bResetFocused = CWnd::GetFocus() != GetOwnerWnd();
|
||
|
BOOL bChanged = FALSE;
|
||
|
|
||
|
int nCount = m_arMembers.GetCount();
|
||
|
for (int i = 0; i < nCount; i++)
|
||
|
{
|
||
|
CXTPCalendarCaptionBarThemePart* pPart = m_arMembers.GetAt(i);
|
||
|
ASSERT(pPart);
|
||
|
if (pPart)
|
||
|
{
|
||
|
int nNewState = pPart->GetState() & (~(CXTPCalendarCaptionBarThemePart::xtpBtnStateMouseOver |
|
||
|
CXTPCalendarCaptionBarThemePart::xtpBtnStatePressed));
|
||
|
if (bResetFocused)
|
||
|
nNewState = nNewState & (~CXTPCalendarCaptionBarThemePart::xtpBtnStateFocused);
|
||
|
|
||
|
if (nNewState != pPart->GetState())
|
||
|
{
|
||
|
pPart->SetState(nNewState);
|
||
|
bChanged = TRUE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return bChanged;
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::OnKillFocus (CWnd* pNewWnd)
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER(pNewWnd);
|
||
|
|
||
|
BOOL bChanged = _UpdateControlsHotState();
|
||
|
|
||
|
if (bChanged)
|
||
|
Redraw();
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CSwitchViewButtonPart::RefreshMetrics()
|
||
|
{
|
||
|
if (GetPaintTheme() <= xtpCalendarThemeOffice2003)
|
||
|
m_clrTextColor.SetStandardValue(RGB(0, 0, 0));
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CSwitchViewButtonPart::AdjustLayout(CDC* pDC, const CRect& rcRect)
|
||
|
{
|
||
|
m_rcRect = rcRect;
|
||
|
|
||
|
if (m_rcRect.IsRectEmpty())
|
||
|
return;
|
||
|
|
||
|
if (pDC)
|
||
|
{
|
||
|
CXTPFontDC autoFont(pDC, GetTheme()->m_fntTextFont);
|
||
|
|
||
|
CSize szText = pDC->GetTextExtent(GetText());
|
||
|
|
||
|
if (szText.cx + 8 > m_rcRect.Width())
|
||
|
m_rcRect.right = m_rcRect.left + szText.cx + 8;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CSwitchViewButtonPart::Draw(CDC* pDC)
|
||
|
{
|
||
|
if (!IsVisible())
|
||
|
return;
|
||
|
|
||
|
CXTPResourceImages* pImages = XTPResourceImages();
|
||
|
|
||
|
CXTPResourceImage* pImage = pImages->LoadFile(_T("CALENDARCAPTIONBARSWITCHVIEWBUTTON"));
|
||
|
CRect rcRect = GetRect();
|
||
|
|
||
|
ASSERT(pImage);
|
||
|
if (!pImage || !GetTheme())
|
||
|
{
|
||
|
pDC->FillSolidRect(rcRect , RGB(155, 0, 0));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
if (GetPaintTheme() >= xtpCalendarThemeResource)
|
||
|
{
|
||
|
int nImagePart = (m_nState & xtpBtnStateChecked) ? 3 : 0;
|
||
|
|
||
|
if (m_nState & xtpBtnStatePressed)
|
||
|
{
|
||
|
nImagePart += 2;
|
||
|
}
|
||
|
else if (m_nState & xtpBtnStateMouseOver)
|
||
|
{
|
||
|
nImagePart += 1;
|
||
|
}
|
||
|
|
||
|
pImage->DrawImage(pDC, rcRect, pImage->GetSource(nImagePart, 6), CRect(0, 0, 0, 0));
|
||
|
|
||
|
rcRect.left = rcRect.right - 1;
|
||
|
pDC->FillSolidRect(&rcRect, GetTheme()->m_clrBorders);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (GetTheme()->m_themeButton->IsAppThemed() &&
|
||
|
GetPaintTheme() == xtpCalendarThemeOffice2003)
|
||
|
{
|
||
|
int nState = (m_nState & xtpBtnStatePressed) ? PBS_PRESSED :
|
||
|
(m_nState & xtpBtnStateMouseOver) ? PBS_HOT: PBS_NORMAL;
|
||
|
|
||
|
if (m_nState & xtpBtnStateChecked)
|
||
|
nState = PBS_PRESSED;
|
||
|
|
||
|
GetTheme()->m_themeButton->DrawThemeBackground(pDC->GetSafeHdc(), BP_PUSHBUTTON, nState, rcRect, NULL);
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
UINT uFlags = DFCS_BUTTONPUSH |
|
||
|
((m_nState & xtpBtnStateChecked) ? DFCS_CHECKED : 0) |
|
||
|
((m_nState & xtpBtnStatePressed) ? DFCS_PUSHED : 0);
|
||
|
|
||
|
::DrawFrameControl(pDC->GetSafeHdc(), rcRect, DFC_BUTTON, uFlags);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// drawText
|
||
|
CFont fntTmp;
|
||
|
CXTPFontDC autoFont(pDC, GetTheme()->m_fntTextFont, GetTextColor());
|
||
|
|
||
|
if ((m_nState & xtpBtnStateChecked) && GetPaintTheme() <= xtpCalendarThemeOffice2003)
|
||
|
{
|
||
|
LOGFONT lf;
|
||
|
if (GetTheme()->m_fntTextFont->GetLogFont(&lf))
|
||
|
{
|
||
|
lf.lfWeight = FW_BOLD;
|
||
|
|
||
|
if (fntTmp.CreateFontIndirect(&lf))
|
||
|
autoFont.SetFont(&fntTmp);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CRect rcText = GetRect();
|
||
|
rcText.DeflateRect(1, 1, 1, 1);
|
||
|
|
||
|
pDC->SetBkMode(TRANSPARENT);
|
||
|
pDC->DrawText(GetText(), rcText, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
|
||
|
}
|
||
|
|
||
|
LPCTSTR CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::_GetImageName()
|
||
|
{
|
||
|
if (m_nPartID == xtpCalendarCaptionBar_ScrollNextDate)
|
||
|
return _T("CALENDARCAPTIONBARNEXTDATEBUTTON");
|
||
|
|
||
|
return _T("CALENDARCAPTIONBARPREVDATEBUTTON");
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::AdjustLayout(CDC* /*pDC*/, const CRect& rcRect)
|
||
|
{
|
||
|
m_rcRect = rcRect;
|
||
|
|
||
|
if (m_rcRect.IsRectEmpty())
|
||
|
return;
|
||
|
|
||
|
CXTPResourceImages* pImages = XTPResourceImages();
|
||
|
|
||
|
CXTPResourceImage* pImage =pImages->LoadFile(_GetImageName());
|
||
|
|
||
|
ASSERT(pImage);
|
||
|
if (!pImage || !GetTheme())
|
||
|
return;
|
||
|
|
||
|
CRect rcImage = pImage->GetSource(0, 4);
|
||
|
|
||
|
m_rcRect.right = m_rcRect.left + rcImage.Width();
|
||
|
|
||
|
int C = (m_rcRect.top + m_rcRect.bottom) / 2;
|
||
|
int H = rcImage.Height() / 2;
|
||
|
m_rcRect.top = C - H;
|
||
|
m_rcRect.bottom = C + H;
|
||
|
|
||
|
//m_rcRect.bottom = m_rcRect.top + rcImage.Height();
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::Draw(CDC* pDC)
|
||
|
{
|
||
|
if (!IsVisible())
|
||
|
return;
|
||
|
|
||
|
CRect rcRect = GetRect();
|
||
|
|
||
|
CXTPResourceImages* pImages = XTPResourceImages();
|
||
|
|
||
|
CXTPResourceImage* pImage = pImages->LoadFile(_GetImageName());
|
||
|
|
||
|
ASSERT(pImage);
|
||
|
if (!pImage || !GetTheme())
|
||
|
{
|
||
|
pDC->FillSolidRect(rcRect, RGB(155, 0, 0));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (GetPaintTheme() == xtpCalendarThemeResource)
|
||
|
{
|
||
|
int nImagePart = (m_nState & xtpBtnStatePressed) ? 2 : (m_nState & xtpBtnStateMouseOver) ? 1 : 0;
|
||
|
|
||
|
if (pImage->IsAlphaImage())
|
||
|
pImage->DrawImage(pDC, rcRect, pImage->GetSource(nImagePart, 4));
|
||
|
else
|
||
|
pImage->DrawImage(pDC, rcRect, pImage->GetSource(nImagePart, 4), CRect(0, 0, 0, 0), RGB(255, 0, 255));
|
||
|
|
||
|
if (m_nState & xtpBtnStateFocused)
|
||
|
{
|
||
|
if (pImage->IsAlphaImage())
|
||
|
pImage->DrawImage(pDC, GetRect(), pImage->GetSource(3, 4), CRect(1, 1, 1, 1));
|
||
|
else
|
||
|
pImage->DrawImage(pDC, GetRect(), pImage->GetSource(3, 4), CRect(1, 1, 1, 1), RGB(255, 0, 255));
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (GetTheme()->m_themeButton->IsAppThemed() &&
|
||
|
GetPaintTheme() == xtpCalendarThemeOffice2003)
|
||
|
{
|
||
|
int nState = (m_nState & xtpBtnStatePressed) ? PBS_PRESSED :
|
||
|
(m_nState & xtpBtnStateMouseOver) ? PBS_HOT: PBS_NORMAL;
|
||
|
|
||
|
GetTheme()->m_themeButton->DrawThemeBackground(pDC->GetSafeHdc(), BP_PUSHBUTTON, nState, rcRect, NULL);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
UINT uFlags = DFCS_BUTTONPUSH |
|
||
|
((m_nState & xtpBtnStateChecked) ? DFCS_CHECKED : 0) |
|
||
|
((m_nState & xtpBtnStatePressed) ? DFCS_PUSHED : 0); // | (bEnabled ? 0 : DFCS_INACTIVE)
|
||
|
|
||
|
::DrawFrameControl(pDC->GetSafeHdc(), rcRect, DFC_BUTTON, uFlags);
|
||
|
}
|
||
|
|
||
|
BOOL bLeftDirection = GetPartID() == xtpCalendarCaptionBar_ScrollPrevDate;
|
||
|
DrawScrollTriangle(pDC, rcRect, bLeftDirection, RGB(0, 0, 0));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::_DrawTriangle(CDC* pDC, CPoint pt0, CPoint pt1, CPoint pt2, COLORREF clrColor)
|
||
|
{
|
||
|
CXTPPenDC pen (*pDC, clrColor);
|
||
|
CXTPBrushDC brush (*pDC, clrColor);
|
||
|
|
||
|
CPoint pts[3];
|
||
|
pts[0] = pt0;
|
||
|
pts[1] = pt1;
|
||
|
pts[2] = pt2;
|
||
|
pDC->Polygon(pts, 3);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::DrawScrollTriangle(CDC* pDC, CRect rcRect, BOOL bLeftDirection, COLORREF clrColor)
|
||
|
{
|
||
|
CPoint ptCenter(rcRect.CenterPoint());
|
||
|
ptCenter.y--;
|
||
|
|
||
|
if (bLeftDirection)
|
||
|
{
|
||
|
ptCenter.x -= 3;
|
||
|
GetTheme()->_DrawTriangle(pDC, ptCenter, CPoint(ptCenter.x + 4, ptCenter.y - 4),
|
||
|
CPoint(ptCenter.x + 4, ptCenter.y + 4), clrColor);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ptCenter.x += 2;
|
||
|
GetTheme()->_DrawTriangle(pDC, ptCenter, CPoint(ptCenter.x - 4, ptCenter.y - 4),
|
||
|
CPoint(ptCenter.x - 4, ptCenter.y + 4), clrColor);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::OnLButtonDown(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
CXTPCalendarCaptionBarThemePart::OnLButtonDown(nFlags, point);
|
||
|
|
||
|
if (GetTheme() && GetTheme()->GetOwnerWnd() && HitTest(point) &&
|
||
|
CWnd::GetFocus() != GetTheme()->GetOwnerWnd() )
|
||
|
{
|
||
|
GetTheme()->GetOwnerWnd()->SetFocus();
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER(nRepCnt); UNREFERENCED_PARAMETER(nFlags);
|
||
|
|
||
|
if (!IsVisible())
|
||
|
return;
|
||
|
|
||
|
if ((m_nState & xtpBtnStateFocused) && (m_nState & xtpBtnStatePressed) == 0 &&
|
||
|
nChar == VK_SPACE)
|
||
|
{
|
||
|
m_nState |= xtpBtnStatePressed;
|
||
|
|
||
|
Redraw();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER(nRepCnt); UNREFERENCED_PARAMETER(nFlags);
|
||
|
|
||
|
if (!IsVisible())
|
||
|
return;
|
||
|
|
||
|
int nMask = xtpBtnStateFocused | xtpBtnStatePressed;
|
||
|
|
||
|
if ((m_nState & nMask) == nMask && nChar == VK_SPACE && GetTheme())
|
||
|
{
|
||
|
GetTheme()->OnPartClick(GetPartID());
|
||
|
}
|
||
|
|
||
|
if (nChar == VK_SPACE)
|
||
|
{
|
||
|
m_nState = m_nState & (~xtpBtnStatePressed);
|
||
|
|
||
|
Redraw();
|
||
|
}
|
||
|
}
|
||
|
//------------------------------------------------------------------
|
||
|
void CXTPCalendarCaptionBarTheme::CRadioButtonPart::RefreshMetrics()
|
||
|
{
|
||
|
if (GetPaintTheme() <= xtpCalendarThemeOffice2003)
|
||
|
m_clrTextColor.SetStandardValue(RGB(0, 0, 0));
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CRadioButtonPart::AdjustLayout(CDC* pDC, const CRect& rcRect)
|
||
|
{
|
||
|
m_rcRect = rcRect;
|
||
|
|
||
|
if (m_rcRect.IsRectEmpty())
|
||
|
return;
|
||
|
|
||
|
CSize szRadio(13, 13);
|
||
|
CRect rcRadio = GetRect();
|
||
|
|
||
|
if (GetTheme() && GetTheme()->m_themeButton->IsAppThemed())
|
||
|
GetTheme()->m_themeButton->GetThemePartSize(NULL, BP_RADIOBUTTON, 1, &rcRadio, TS_DRAW, &szRadio);
|
||
|
|
||
|
if (pDC)
|
||
|
{
|
||
|
CXTPFontDC autoFont(pDC, GetTheme()->m_fntTextFont);
|
||
|
CSize szText = pDC->GetTextExtent(GetText());
|
||
|
|
||
|
if (szRadio.cx + 9 + szText.cx + 8 > m_rcRect.Width())
|
||
|
m_rcRect.right = m_rcRect.left + szRadio.cx + 9 + szText.cx + 8;
|
||
|
|
||
|
szRadio.cy = max(szRadio.cy, szText.cy);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CRadioButtonPart::Draw(CDC* pDC)
|
||
|
{
|
||
|
if (!IsVisible())
|
||
|
return;
|
||
|
|
||
|
CSize szRadio(13, 13);
|
||
|
CRect rcRadio = GetRect();
|
||
|
|
||
|
BOOL bThemed = GetTheme() && GetTheme()->m_themeButton->IsAppThemed() &&
|
||
|
GetPaintTheme() >= xtpCalendarThemeOffice2003;
|
||
|
if (bThemed)
|
||
|
GetTheme()->m_themeButton->GetThemePartSize(NULL, BP_RADIOBUTTON, 1, &rcRadio, TS_DRAW, &szRadio);
|
||
|
|
||
|
rcRadio.right = rcRadio.left + szRadio.cx;
|
||
|
|
||
|
if (bThemed)
|
||
|
{
|
||
|
int md = rcRadio.CenterPoint().y;
|
||
|
int ht = (int) (rcRadio.Height() / (2 * GetTheme()->m_dScale));
|
||
|
rcRadio.top = md - ht;
|
||
|
rcRadio.bottom = md + ht;
|
||
|
|
||
|
GetTheme()->m_themeButton->GetThemePartSize(NULL, BP_RADIOBUTTON, 1, &rcRadio, TS_DRAW, &szRadio);
|
||
|
|
||
|
int nState = (m_nState & xtpBtnStatePressed) ? RBS_UNCHECKEDPRESSED :
|
||
|
(m_nState & xtpBtnStateMouseOver) ? RBS_UNCHECKEDHOT : RBS_UNCHECKEDNORMAL;
|
||
|
|
||
|
if (m_nState & xtpBtnStateChecked)
|
||
|
nState += 4;
|
||
|
|
||
|
GetTheme()->m_themeButton->DrawThemeBackground(pDC->GetSafeHdc(), BP_RADIOBUTTON, nState, rcRadio, NULL);
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
UINT uFlags = DFCS_BUTTONRADIO |
|
||
|
((m_nState & xtpBtnStateChecked) ? DFCS_CHECKED : 0) |
|
||
|
((m_nState & xtpBtnStatePressed) ? DFCS_PUSHED : 0);
|
||
|
|
||
|
if (GetPaintTheme() > xtpCalendarThemeOffice2000)
|
||
|
uFlags |= DFCS_FLAT;
|
||
|
|
||
|
::DrawFrameControl(pDC->GetSafeHdc(), rcRadio, DFC_BUTTON, uFlags);
|
||
|
}
|
||
|
|
||
|
// drawText
|
||
|
CXTPFontDC autoFont(pDC, GetTheme()->m_fntTextFont, GetTextColor());
|
||
|
pDC->SetBkMode(TRANSPARENT);
|
||
|
|
||
|
CRect rcText = GetRect();
|
||
|
rcText.left = rcRadio.right + 9;
|
||
|
|
||
|
pDC->DrawText(GetText(), rcText, DT_VCENTER | DT_LEFT | DT_SINGLELINE);
|
||
|
|
||
|
rcText.left--;
|
||
|
rcText.right++;
|
||
|
|
||
|
if (m_nState & xtpBtnStatePressed)
|
||
|
pDC->DrawFocusRect(rcText);
|
||
|
}
|
||
|
//------------------------------------------------------------------
|
||
|
void CXTPCalendarCaptionBarTheme::CCheckboxButtonPart::RefreshMetrics()
|
||
|
{
|
||
|
if (GetPaintTheme() <= xtpCalendarThemeOffice2003)
|
||
|
m_clrTextColor.SetStandardValue(RGB(0, 0, 0));
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CCheckboxButtonPart::AdjustLayout(CDC* pDC, const CRect& rcRect)
|
||
|
{
|
||
|
m_rcRect = rcRect;
|
||
|
|
||
|
if (m_rcRect.IsRectEmpty())
|
||
|
return;
|
||
|
|
||
|
CSize szRadio(13, 13);
|
||
|
CRect rcRadio = GetRect();
|
||
|
|
||
|
if (GetTheme() && GetTheme()->m_themeButton->IsAppThemed())
|
||
|
GetTheme()->m_themeButton->GetThemePartSize(NULL, BP_CHECKBOX, 1, &rcRadio, TS_DRAW, &szRadio);
|
||
|
|
||
|
if (pDC)
|
||
|
{
|
||
|
CXTPFontDC autoFont(pDC, GetTheme()->m_fntTextFont);
|
||
|
CSize szText = pDC->GetTextExtent(GetText());
|
||
|
|
||
|
if (szRadio.cx + 9 + szText.cx + 8 > m_rcRect.Width())
|
||
|
m_rcRect.right = m_rcRect.left + szRadio.cx + 9 + szText.cx + 8;
|
||
|
|
||
|
szRadio.cy = max(szRadio.cy, szText.cy);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CCheckboxButtonPart::Draw(CDC* pDC)
|
||
|
{
|
||
|
if (!IsVisible())
|
||
|
return;
|
||
|
|
||
|
CSize szRadio(13, 13);
|
||
|
CRect rcRadio = GetRect();
|
||
|
|
||
|
BOOL bThemed = GetTheme() && GetTheme()->m_themeButton->IsAppThemed() &&
|
||
|
GetPaintTheme() >= xtpCalendarThemeOffice2003;
|
||
|
if (bThemed)
|
||
|
GetTheme()->m_themeButton->GetThemePartSize(NULL, BP_CHECKBOX, 1, &rcRadio, TS_DRAW, &szRadio);
|
||
|
|
||
|
rcRadio.right = rcRadio.left + szRadio.cx;
|
||
|
|
||
|
if (bThemed)
|
||
|
{
|
||
|
int md = rcRadio.CenterPoint().y;
|
||
|
int ht = (int) (rcRadio.Height() / (2 * GetTheme()->m_dScale));
|
||
|
rcRadio.top = md - ht;
|
||
|
rcRadio.bottom = md + ht;
|
||
|
|
||
|
GetTheme()->m_themeButton->GetThemePartSize(NULL, BP_CHECKBOX, 1, &rcRadio, TS_DRAW, &szRadio);
|
||
|
|
||
|
int nState = (m_nState & xtpBtnStatePressed) ? RBS_UNCHECKEDPRESSED :
|
||
|
(m_nState & xtpBtnStateMouseOver) ? RBS_UNCHECKEDHOT: RBS_UNCHECKEDNORMAL;
|
||
|
|
||
|
if (m_nState & xtpBtnStateChecked)
|
||
|
nState += 4;
|
||
|
|
||
|
GetTheme()->m_themeButton->DrawThemeBackground(pDC->GetSafeHdc(), BP_CHECKBOX, nState, rcRadio, NULL);
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
UINT uFlags = DFCS_BUTTONCHECK |
|
||
|
((m_nState & xtpBtnStateChecked) ? DFCS_CHECKED : 0) |
|
||
|
((m_nState & xtpBtnStatePressed) ? DFCS_PUSHED : 0);
|
||
|
|
||
|
if (GetPaintTheme() > xtpCalendarThemeOffice2000)
|
||
|
uFlags |= DFCS_FLAT;
|
||
|
|
||
|
::DrawFrameControl(pDC->GetSafeHdc(), rcRadio, DFC_BUTTON, uFlags);
|
||
|
}
|
||
|
|
||
|
// drawText
|
||
|
CXTPFontDC autoFont(pDC, GetTheme()->m_fntTextFont, GetTextColor());
|
||
|
pDC->SetBkMode(TRANSPARENT);
|
||
|
|
||
|
CRect rcText = GetRect();
|
||
|
rcText.left = rcRadio.right + 9;
|
||
|
|
||
|
pDC->DrawText(GetText(), rcText, DT_VCENTER | DT_LEFT | DT_SINGLELINE);
|
||
|
|
||
|
rcText.left--;
|
||
|
rcText.right++;
|
||
|
|
||
|
if (m_nState & xtpBtnStatePressed)
|
||
|
pDC->DrawFocusRect(rcText);
|
||
|
}
|
||
|
//------------------------------------------------------------------
|
||
|
void CXTPCalendarCaptionBarTheme::CDateLabelPart::RefreshMetrics()
|
||
|
{
|
||
|
if (!GetTheme())
|
||
|
return;
|
||
|
|
||
|
m_clrTextColor.SetStandardValue(GetTheme()->m_clrTextColor);
|
||
|
|
||
|
LOGFONT lfBaseFont;
|
||
|
::ZeroMemory(&lfBaseFont, sizeof(lfBaseFont));
|
||
|
|
||
|
GetTheme()->m_fntTextFont->GetLogFont(&lfBaseFont);
|
||
|
|
||
|
if (GetTheme()->IsOneLine())
|
||
|
{
|
||
|
if (XTPSystemVersion()->IsWinVistaOrGreater())
|
||
|
lfBaseFont.lfHeight = -14;
|
||
|
else
|
||
|
lfBaseFont.lfHeight = -18;
|
||
|
}
|
||
|
else
|
||
|
lfBaseFont.lfHeight = -20;
|
||
|
|
||
|
m_fntTextFont.SetStandardValue(&lfBaseFont);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CDateLabelPart::Draw(CDC* pDC)
|
||
|
{
|
||
|
if (!IsVisible())
|
||
|
return;
|
||
|
|
||
|
CXTPFontDC autoFont(pDC, m_fntTextFont, m_clrTextColor);
|
||
|
pDC->SetBkMode(TRANSPARENT);
|
||
|
|
||
|
CXTPCalendarView* pCalView = XTP_SAFE_GET2(GetTheme(), GetCalendarCtrl(), GetActiveView(), NULL);
|
||
|
|
||
|
if (pCalView)
|
||
|
{
|
||
|
BOOL bShowMonthDay = pCalView->GetViewType() != xtpCalendarMonthView;
|
||
|
COleDateTime dtDay1 = pCalView->GetViewDayDate(0);
|
||
|
COleDateTime dtDay2 = pCalView->GetViewDayDate(max(0, pCalView->GetViewDayCount() - 1));
|
||
|
|
||
|
m_strText = _FormatDate(dtDay1, dtDay2, bShowMonthDay);
|
||
|
}
|
||
|
|
||
|
if (m_strText.IsEmpty())
|
||
|
return;
|
||
|
|
||
|
CRect rcText = GetRect();
|
||
|
rcText.top -= 6;
|
||
|
|
||
|
UINT uFlags = DT_VCENTER | DT_SINGLELINE;
|
||
|
if (GetTheme() && !GetTheme()->IsScrollDateButtons()
|
||
|
&& GetPaintTheme() < xtpCalendarThemeResource)
|
||
|
{
|
||
|
uFlags |= DT_CENTER;
|
||
|
rcText.right = max(rcText.left, rcText.right - 9);
|
||
|
}
|
||
|
|
||
|
pDC->DrawText(GetText(), rcText, uFlags);
|
||
|
}
|
||
|
|
||
|
CString CXTPCalendarCaptionBarTheme::CDateLabelPart::_FormatDate(COleDateTime dtDay1, COleDateTime dtDay2, BOOL bShowMonthDay)
|
||
|
{
|
||
|
//LOCALE_IDATE - short date format ordering
|
||
|
// 0 Month-Day-Year
|
||
|
// 1 Day-Month-Year
|
||
|
// 2 Year-Month-Day
|
||
|
int nDateOrdering = CXTPCalendarUtils::GetLocaleLong(LOCALE_ILDATE);
|
||
|
|
||
|
CString strFormat1 = CXTPCalendarUtils::GetLocaleString(LOCALE_SLONGDATE, 256);
|
||
|
CString strFormat2 = CXTPCalendarUtils::GetLocaleString(LOCALE_SLONGDATE, 256);
|
||
|
|
||
|
strFormat1 = CXTPCalendarUtils::RemoveFormatPart(strFormat1, _T('g'));
|
||
|
strFormat1 = CXTPCalendarUtils::RemoveFormatPart(strFormat1, _T("ddd"));
|
||
|
strFormat1 = CXTPCalendarUtils::RemoveFormatPart(strFormat1, _T("dddd"));
|
||
|
|
||
|
strFormat2 = CXTPCalendarUtils::RemoveFormatPart(strFormat2, _T('g'));
|
||
|
strFormat2 = CXTPCalendarUtils::RemoveFormatPart(strFormat2, _T("ddd"));
|
||
|
strFormat2 = CXTPCalendarUtils::RemoveFormatPart(strFormat2, _T("dddd"));
|
||
|
|
||
|
if (!bShowMonthDay)
|
||
|
{
|
||
|
strFormat1 = CXTPCalendarUtils::RemoveFormatPart(strFormat1, _T('d'));
|
||
|
strFormat2 = CXTPCalendarUtils::RemoveFormatPart(strFormat2, _T('d'));
|
||
|
}
|
||
|
CString strCaption;
|
||
|
|
||
|
if (!CXTPCalendarUtils::IsEqual(dtDay1, dtDay2))
|
||
|
{
|
||
|
//CString strFormat2(strFormat1);
|
||
|
|
||
|
if (dtDay1.GetMonth() == dtDay2.GetMonth())
|
||
|
{
|
||
|
if (nDateOrdering == 1)
|
||
|
strFormat1 = CXTPCalendarUtils::RemoveFormatPart(strFormat1, _T('M'));
|
||
|
else
|
||
|
strFormat2 = CXTPCalendarUtils::RemoveFormatPart(strFormat2, _T('M'));
|
||
|
}
|
||
|
|
||
|
if (dtDay1.GetYear() == dtDay2.GetYear())
|
||
|
{
|
||
|
if (nDateOrdering == 2)
|
||
|
strFormat2 = CXTPCalendarUtils::RemoveFormatPart(strFormat2, _T('y'));
|
||
|
else
|
||
|
strFormat1 = CXTPCalendarUtils::RemoveFormatPart(strFormat1, _T('y'));
|
||
|
}
|
||
|
|
||
|
if (!strFormat1.IsEmpty())
|
||
|
strCaption = CXTPCalendarUtils::GetDateFormat(dtDay1, strFormat1);
|
||
|
|
||
|
if (!strFormat1.IsEmpty() && !strFormat2.IsEmpty())
|
||
|
strCaption += _T(" - ");
|
||
|
|
||
|
if (!strFormat2.IsEmpty())
|
||
|
strCaption += CXTPCalendarUtils::GetDateFormat(dtDay2, strFormat2);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strCaption = CXTPCalendarUtils::GetDateFormat(dtDay1, strFormat1);
|
||
|
}
|
||
|
|
||
|
UserAction_FormatCaptionBarLabel(strCaption, dtDay1);
|
||
|
return strCaption;
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CDateLabelPart::UserAction_FormatCaptionBarLabel(CString& strCaption, COleDateTime dtDay1)
|
||
|
{
|
||
|
DWORD dwFlags = XTP_SAFE_GET2(GetTheme(), GetCalendarCtrl(), GetAskItemTextFlags(), 0);
|
||
|
CXTPCalendarView* pActiveView = XTP_SAFE_GET2(GetTheme(), GetCalendarCtrl(), GetActiveView(), NULL);
|
||
|
if(pActiveView == NULL)
|
||
|
return;
|
||
|
|
||
|
XTPCalendarViewType activeViewType = pActiveView->GetViewType();
|
||
|
|
||
|
XTP_CALENDAR_GETITEMTEXT_PARAMS objRequest;
|
||
|
::ZeroMemory(&objRequest, sizeof(objRequest));
|
||
|
objRequest.pstrText = &strCaption;
|
||
|
objRequest.nWeekNum = CXTPCalendarUtils::GetWeekOfYear(dtDay1);
|
||
|
|
||
|
if ((dwFlags & xtpCalendarItemText_CaptionBarDayViewDateLabel) && activeViewType == xtpCalendarDayView)
|
||
|
objRequest.nItem = (int)xtpCalendarItemText_CaptionBarDayViewDateLabel;
|
||
|
|
||
|
if ((dwFlags & xtpCalendarItemText_CaptionBarWeekViewDateLabel)
|
||
|
&& (activeViewType == xtpCalendarWeekView || activeViewType == xtpCalendarFullWeekView || activeViewType == xtpCalendarWorkWeekView))
|
||
|
objRequest.nItem = (int)xtpCalendarItemText_CaptionBarWeekViewDateLabel;
|
||
|
|
||
|
if ((dwFlags & xtpCalendarItemText_CaptionBarMonthViewDateLabel) && activeViewType == xtpCalendarMonthView)
|
||
|
objRequest.nItem = (int)xtpCalendarItemText_CaptionBarMonthViewDateLabel;
|
||
|
|
||
|
if(objRequest.nItem != 0)
|
||
|
XTP_SAFE_CALL2(GetTheme(), GetCalendarCtrl(), SendNotificationAlways(XTP_NC_CALENDAR_GETITEMTEXT, (WPARAM)&objRequest, 0));
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CExpandButtonPart::AdjustLayout(CDC* /*pDC*/, const CRect& rcRect)
|
||
|
{
|
||
|
m_rcRect = rcRect;
|
||
|
|
||
|
if (m_rcRect.IsRectEmpty())
|
||
|
return;
|
||
|
|
||
|
CXTPResourceImages* pImages = XTPResourceImages();
|
||
|
|
||
|
CXTPResourceImage* pImage = pImages->LoadFile(_T("CALENDARCAPTIONBAREXPANDBUTTON"));
|
||
|
|
||
|
ASSERT(pImage);
|
||
|
if (!pImage || !GetTheme())
|
||
|
return;
|
||
|
|
||
|
CRect rcImage = pImage->GetSource(0, 6);
|
||
|
|
||
|
m_rcRect.left = m_rcRect.right - rcImage.Width();
|
||
|
m_rcRect.top = m_rcRect.top + m_rcRect.Height() / 2 - rcImage.Height() / 2;
|
||
|
m_rcRect.bottom = m_rcRect.top + rcImage.Height();
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CExpandButtonPart::Draw(CDC* pDC)
|
||
|
{
|
||
|
if (!IsVisible())
|
||
|
return;
|
||
|
|
||
|
CRect rcRect = GetRect();
|
||
|
|
||
|
CXTPResourceImages* pImages = XTPResourceImages();
|
||
|
|
||
|
CXTPResourceImage* pImage = pImages->LoadFile(_T("CALENDARCAPTIONBAREXPANDBUTTON"));
|
||
|
|
||
|
ASSERT(pImage);
|
||
|
if (!pImage || !GetTheme())
|
||
|
{
|
||
|
pDC->FillSolidRect(rcRect, RGB(155, 0, 0));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (GetPaintTheme() == xtpCalendarThemeResource)
|
||
|
{
|
||
|
int nImagePart = (m_nState & xtpBtnStateChecked) ? 3 : 0;
|
||
|
if (m_nState & xtpBtnStatePressed)
|
||
|
nImagePart += 2;
|
||
|
else if (m_nState & xtpBtnStateMouseOver)
|
||
|
nImagePart += 1;
|
||
|
|
||
|
pImage->DrawImage(pDC, rcRect, pImage->GetSource(nImagePart, 6), CRect(0, 0, 0, 0), RGB(255, 0, 255));
|
||
|
//pImage->DrawImage(pDC, rcRect, pImage->GetSource(nImagePart, 6));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (GetTheme()->m_themeButton->IsAppThemed() &&
|
||
|
GetPaintTheme() == xtpCalendarThemeOffice2003)
|
||
|
{
|
||
|
int nState = (m_nState & xtpBtnStatePressed) ? PBS_PRESSED :
|
||
|
(m_nState & xtpBtnStateMouseOver) ? PBS_HOT: PBS_NORMAL;
|
||
|
|
||
|
GetTheme()->m_themeButton->DrawThemeBackground(pDC->GetSafeHdc(), BP_PUSHBUTTON, nState, rcRect, NULL);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
UINT uFlags = DFCS_BUTTONPUSH |
|
||
|
((m_nState & xtpBtnStateChecked) ? DFCS_CHECKED : 0) |
|
||
|
((m_nState & xtpBtnStatePressed) ? DFCS_PUSHED : 0);
|
||
|
|
||
|
::DrawFrameControl(pDC->GetSafeHdc(), rcRect, DFC_BUTTON, uFlags);
|
||
|
}
|
||
|
|
||
|
BOOL bDownDirection = (m_nState & xtpBtnStateChecked) == 0;
|
||
|
DrawExpandTriangle(pDC, rcRect, bDownDirection, RGB(0, 0, 0));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarCaptionBarTheme::CExpandButtonPart::DrawExpandTriangle(CDC* pDC, CRect rcRect, BOOL bDownDirection, COLORREF clrColor)
|
||
|
{
|
||
|
CPoint ptCenter(rcRect.CenterPoint());
|
||
|
if (bDownDirection)
|
||
|
{
|
||
|
ptCenter.y += 2;
|
||
|
GetTheme()->_DrawTriangle(pDC, ptCenter, CPoint(ptCenter.x + 4, ptCenter.y - 4),
|
||
|
CPoint(ptCenter.x - 4, ptCenter.y - 4), clrColor);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ptCenter.y -= 2;
|
||
|
GetTheme()->_DrawTriangle(pDC, ptCenter, CPoint(ptCenter.x + 4, ptCenter.y + 4),
|
||
|
CPoint(ptCenter.x - 4, ptCenter.y + 4), clrColor);
|
||
|
}
|
||
|
}
|