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++

// 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);
}
}