1432 lines
35 KiB
C++
1432 lines
35 KiB
C++
// // XTPCalendarCaptionBarControl.cpp : implementation file
|
|
//
|
|
// This file is a part of the XTREME CALENDAR MFC class library.
|
|
// (c)1998-2008 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/XTPOffice2007Image.h"
|
|
|
|
#include "XTPCalendarUtils.h"
|
|
#include "XTPCalendarThemeOffice2007.h"
|
|
#include "XTPCalendarControl.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_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);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CXTPCalendarCaptionBarControl, CWnd)
|
|
//{{AFX_MSG_MAP(CXTPCalendarCaptionBarControl)
|
|
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::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);
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
CXTPCalendarCaptionBarTheme::CXTPCalendarCaptionBarTheme()
|
|
{
|
|
m_pCaptionBar = NULL;
|
|
m_pCalendar = NULL;
|
|
m_nCheckHotStateTimerID = 0;
|
|
|
|
m_bIsSwitchViewButtons = TRUE;
|
|
m_bIsScrollDateButtons = TRUE;
|
|
m_bIsDateLabel = TRUE;
|
|
|
|
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);
|
|
|
|
m_pShowWorkWeek->SetText(XTPResourceManager()->LoadString(XTP_IDS_CALENDAR_SHOWWORKWEK));
|
|
m_pShowFullWeek->SetText(XTPResourceManager()->LoadString(XTP_IDS_CALENDAR_SHOWFULLKWEK));
|
|
|
|
m_pShowWorkWeek->SetCheck(1);
|
|
m_pShowFullWeek->SetCheck(0);
|
|
|
|
//---------------------------------
|
|
m_pScrollPrevDate = new CScrollDateButtonPart(this, xtpCalendarCaptionBar_ScrollPrevDate);
|
|
m_pScrollNextDate = new CScrollDateButtonPart(this, xtpCalendarCaptionBar_ScrollNextDate);
|
|
|
|
m_pDateLabel = new CDateLabelPart(this, xtpCalendarCaptionBar_DateLabel);
|
|
|
|
m_nPaintTheme = xtpCalendarThemeOffice2007;
|
|
|
|
RefreshMetrics();
|
|
}
|
|
|
|
CXTPCalendarCaptionBarTheme::~CXTPCalendarCaptionBarTheme()
|
|
{
|
|
m_Sink.UnadviseAll();
|
|
|
|
CMDTARGET_RELEASE(m_pButtonViewDay);
|
|
CMDTARGET_RELEASE(m_pButtonViewWeek);
|
|
CMDTARGET_RELEASE(m_pButtonViewMonth);
|
|
|
|
CMDTARGET_RELEASE(m_pShowWorkWeek);
|
|
CMDTARGET_RELEASE(m_pShowFullWeek);
|
|
|
|
CMDTARGET_RELEASE(m_pScrollPrevDate);
|
|
CMDTARGET_RELEASE(m_pScrollNextDate);
|
|
|
|
CMDTARGET_RELEASE(m_pDateLabel);
|
|
|
|
CMDTARGET_RELEASE(m_pCalendar);
|
|
}
|
|
|
|
void CXTPCalendarCaptionBarTheme::OnBeforeDestroy()
|
|
{
|
|
m_Sink.UnadviseAll();
|
|
CMDTARGET_RELEASE(m_pCalendar);
|
|
}
|
|
|
|
void CXTPCalendarCaptionBarTheme::SetOwner(CXTPCalendarCaptionBarControl* pCaptionBar)
|
|
{
|
|
ASSERT(pCaptionBar);
|
|
if (pCaptionBar)
|
|
{
|
|
m_pCaptionBar = pCaptionBar;
|
|
}
|
|
}
|
|
|
|
void CXTPCalendarCaptionBarTheme::AttachCalendar(CXTPCalendarControl* pCalendar)
|
|
{
|
|
m_Sink.UnadviseAll();
|
|
CMDTARGET_RELEASE(m_pCalendar);
|
|
|
|
m_pCalendar = pCalendar;
|
|
CMDTARGET_ADDREF(m_pCalendar);
|
|
|
|
if (m_pCalendar && m_pCalendar->GetConnection())
|
|
{
|
|
CXTPNotifyConnection* pConn = m_pCalendar->GetConnection();
|
|
|
|
m_Sink.Advise(pConn, XTP_NC_CALENDARVIEWWASCHANGED, &CXTPCalendarCaptionBarTheme::OnEvent_Calendar);
|
|
m_Sink.Advise(pConn, XTP_NC_CALENDAR_THEME_CHANGED, &CXTPCalendarCaptionBarTheme::OnEvent_Calendar);
|
|
|
|
UpdateControlsState();
|
|
|
|
if (XTPOffice2007Images() && XTPOffice2007Images()->GetConnection())
|
|
{
|
|
m_Sink.Advise(XTPOffice2007Images()->GetConnection(), XTP_NC_COMMON_OFFICE2007IMAGES_CHANGED,
|
|
&CXTPCalendarCaptionBarTheme::OnEvent_Office2007ImagesChanged);
|
|
}
|
|
}
|
|
}
|
|
|
|
int CXTPCalendarCaptionBarTheme::GetChildHandlersCount()
|
|
{
|
|
return m_arMembers.GetCount();
|
|
}
|
|
|
|
CXTPCalendarWMHandler* CXTPCalendarCaptionBarTheme::GetChildHandlerAt(int nIndex)
|
|
{
|
|
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)
|
|
GetOwnerWnd()->Invalidate(FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
CRect CXTPCalendarCaptionBarTheme::CalcMinRect(CDC* /*pDC*/)
|
|
{
|
|
if (!IsSwitchViewButtons() &&
|
|
!IsScrollDateButtons() &&
|
|
!IsDateLabel())
|
|
{
|
|
return CRect(0, 0, 0, 0);
|
|
}
|
|
|
|
CRect rc(0, 0, 525, 71);
|
|
|
|
if (!IsSwitchViewButtons())
|
|
rc.bottom -= 27;
|
|
|
|
if (!IsScrollDateButtons() && !IsDateLabel())
|
|
rc.bottom -= 33;
|
|
|
|
return rc;
|
|
};
|
|
|
|
void CXTPCalendarCaptionBarTheme::AdjustLayout(CDC* pDC, const CRect& rcRect)
|
|
{
|
|
if (!pDC && GetOwnerWnd() && GetOwnerWnd()->m_hWnd)
|
|
{
|
|
CClientDC dc(GetOwnerWnd());
|
|
AdjustLayout(&dc, rcRect);
|
|
return;
|
|
}
|
|
|
|
m_rcRect = rcRect;
|
|
CRect rc00(rcRect.left, rcRect.top, rcRect.left, rcRect.top);
|
|
|
|
CRect rc = m_rcRect;
|
|
//rc.DeflateRect(1, 1, 1, 0);
|
|
rc.DeflateRect(0, 1, 0, 0);
|
|
|
|
int nNextY = rc.top;
|
|
|
|
m_pButtonViewDay->SetVisible(IsSwitchViewButtons());
|
|
m_pButtonViewWeek->SetVisible(IsSwitchViewButtons());
|
|
m_pButtonViewMonth->SetVisible(IsSwitchViewButtons());
|
|
|
|
if (IsSwitchViewButtons())
|
|
{
|
|
rc.bottom = rc.top + 26;
|
|
|
|
rc.right = rc.left + 83;
|
|
m_pButtonViewDay->AdjustLayout(pDC, rc);
|
|
|
|
rc.left = m_pButtonViewDay->GetRect().right;
|
|
rc.right = rc.left + 83;
|
|
m_pButtonViewWeek->AdjustLayout(pDC, rc);
|
|
|
|
rc.left = m_pButtonViewWeek->GetRect().right;
|
|
rc.right = rc.left + 83;
|
|
m_pButtonViewMonth->AdjustLayout(pDC, rc);
|
|
|
|
//--------------------------------------
|
|
rc.left = m_pButtonViewMonth->GetRect().right + 21;
|
|
rc.right = rc.left + 5;
|
|
m_pShowWorkWeek->AdjustLayout(pDC, rc);
|
|
|
|
rc.left = m_pShowWorkWeek->GetRect().right + 11;
|
|
rc.right = rc.left + 5;
|
|
m_pShowFullWeek->AdjustLayout(pDC, rc);
|
|
|
|
//--------------------------------------
|
|
// to align next controls
|
|
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->SetVisible(FALSE);
|
|
m_pShowFullWeek->SetVisible(FALSE);
|
|
m_pShowWorkWeek->AdjustLayout(pDC, rc00);
|
|
m_pShowFullWeek->AdjustLayout(pDC, rc00);
|
|
|
|
nNextY = rc.top;
|
|
}
|
|
|
|
int nNextX = rc.left;
|
|
//--------------------------------------
|
|
m_pScrollPrevDate->SetVisible(IsScrollDateButtons());
|
|
m_pScrollNextDate->SetVisible(IsScrollDateButtons());
|
|
|
|
if (IsScrollDateButtons())
|
|
{
|
|
rc.top = nNextY + 12;
|
|
rc.bottom = rc.top + 20;
|
|
rc.left += 20;
|
|
rc.right = rc.left + 20;
|
|
m_pScrollPrevDate->AdjustLayout(pDC, rc);
|
|
|
|
rc.left = m_pScrollPrevDate->GetRect().right + 9;
|
|
rc.right = rc.left + 20;
|
|
m_pScrollNextDate->AdjustLayout(pDC, rc);
|
|
|
|
nNextX = rc.right;
|
|
}
|
|
else
|
|
{
|
|
m_pScrollPrevDate->AdjustLayout(pDC, rc00);
|
|
m_pScrollNextDate->AdjustLayout(pDC, rc00);
|
|
}
|
|
|
|
//--------------------------------------
|
|
m_pDateLabel->SetVisible(IsDateLabel());
|
|
|
|
if (IsDateLabel())
|
|
{
|
|
rc.top = nNextY + 12;
|
|
rc.bottom = rc.top + 20;
|
|
rc.left = nNextX + 11;
|
|
rc.right = m_rcRect.right - 2;
|
|
m_pDateLabel->AdjustLayout(pDC, rc);
|
|
}
|
|
else
|
|
{
|
|
m_pDateLabel->AdjustLayout(pDC, rc00);
|
|
}
|
|
}
|
|
|
|
COLORREF CXTPCalendarCaptionBarTheme::GetColor2(LPCTSTR pcszColorName, COLORREF clrDefault)
|
|
{
|
|
COLORREF clrColor = COLORREF_NULL;
|
|
|
|
if (XTPOffice2007Images()->IsValid())
|
|
{
|
|
clrColor = XTPOffice2007Images()->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;
|
|
|
|
if (GetPaintTheme() >= xtpCalendarThemeOffice2007)
|
|
{
|
|
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(RGB(0, 0, 0));
|
|
|
|
// Try to set default Office 2007 font,
|
|
// otherwise icon font used.
|
|
bUseFont2007 = XTPDrawHelpers()->FontExists(XTP_CALENDAR_OFFICE2007_FONT_NAME);
|
|
}
|
|
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 = DEFAULT_CHARSET;
|
|
lfBaseFont.lfHeight = -11;
|
|
lfBaseFont.lfWeight = FW_NORMAL;
|
|
|
|
if (XTPSystemVersion()->IsClearTypeTextQualitySupported())
|
|
lfBaseFont.lfQuality = 5;
|
|
}
|
|
else
|
|
{
|
|
VERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lfBaseFont), &lfBaseFont, 0));
|
|
}
|
|
|
|
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
|
|
|
|
// Fill SwitchViewBar
|
|
CRect rcTopPart = m_pButtonViewDay->GetRect();
|
|
rcTopPart.right = m_rcRect.right;
|
|
pDC->FillSolidRect(rcTopPart, m_clrSwitchViewBarBk);
|
|
|
|
rcTopPart.top = rcTopPart.bottom;
|
|
rcTopPart.bottom++;
|
|
pDC->FillSolidRect(rcTopPart, m_clrBorders); // m_clrSwitchViewBarBottomBorder);
|
|
|
|
// Fill ScrollDateBar
|
|
CRect rcBottomPart = m_rcRect;
|
|
rcBottomPart.top = rcTopPart.bottom;
|
|
pDC->FillSolidRect(rcBottomPart, m_clrScrollDateBarBk);
|
|
|
|
// Draw borders
|
|
CRect rc = m_rcRect;
|
|
|
|
rc.bottom = rc.top + 1;
|
|
pDC->FillSolidRect(rc, m_clrBorders);
|
|
|
|
// 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);
|
|
}
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
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)
|
|
{
|
|
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;
|
|
}
|
|
|
|
if (GetOwnerWnd())
|
|
GetOwnerWnd()->Invalidate(FALSE);
|
|
}
|
|
|
|
void CXTPCalendarCaptionBarTheme::OnEvent_Office2007ImagesChanged(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(lParam);
|
|
|
|
if (Event == XTP_NC_COMMON_OFFICE2007IMAGES_CHANGED)
|
|
{
|
|
RefreshMetrics();
|
|
|
|
Redraw();
|
|
}
|
|
}
|
|
|
|
void CXTPCalendarCaptionBarTheme::UpdateControlsState()
|
|
{
|
|
if (!GetCalendarCtrl() || !GetCalendarCtrl()->GetActiveView())
|
|
{
|
|
return;
|
|
}
|
|
|
|
m_pShowWorkWeek->SetVisible(FALSE);
|
|
m_pShowFullWeek->SetVisible(FALSE);
|
|
|
|
m_pButtonViewDay->SetCheck(0);
|
|
m_pButtonViewWeek->SetCheck(0);
|
|
m_pButtonViewMonth->SetCheck(0);
|
|
|
|
int nViewType = GetCalendarCtrl()->GetActiveView()->GetViewType();
|
|
|
|
if (nViewType == xtpCalendarDayView)
|
|
{
|
|
m_pButtonViewDay->SetCheck(1);
|
|
}
|
|
else if (nViewType == xtpCalendarMonthView)
|
|
{
|
|
m_pButtonViewMonth->SetCheck(1);
|
|
}
|
|
else if (nViewType == xtpCalendarWeekView)
|
|
{
|
|
// the theme 2003 view type.
|
|
}
|
|
else
|
|
{
|
|
m_pButtonViewWeek->SetCheck(1);
|
|
|
|
if (IsSwitchViewButtons())
|
|
{
|
|
m_pShowWorkWeek->SetVisible(TRUE);
|
|
m_pShowFullWeek->SetVisible(TRUE);
|
|
}
|
|
|
|
if (nViewType == xtpCalendarWorkWeekView)
|
|
{
|
|
m_pShowWorkWeek->SetCheck(1);
|
|
m_pShowFullWeek->SetCheck(0);
|
|
}
|
|
else if (nViewType == xtpCalendarFullWeekView)
|
|
{
|
|
m_pShowWorkWeek->SetCheck(0);
|
|
m_pShowFullWeek->SetCheck(1);
|
|
}
|
|
else {
|
|
ASSERT(FALSE);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CXTPCalendarCaptionBarTheme::OnPartClick(int nPartID)
|
|
{
|
|
// TRACE(_T("%d = CXTPCalendarCaptionBarTheme::OnPartClick(PartID=%d) \n"), dbg_xtp_Counter++, nPartID);
|
|
|
|
if (!GetCalendarCtrl() || !GetCalendarCtrl()->GetActiveView())
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
|
|
if (nPartID == xtpCalendarCaptionBar_ButtonViewDay)
|
|
{
|
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarDayView);
|
|
|
|
GetCalendarCtrl()->SetFocus();
|
|
}
|
|
else if (nPartID == xtpCalendarCaptionBar_ButtonViewWeek)
|
|
{
|
|
if (m_pShowWorkWeek->GetCheck())
|
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarWorkWeekView);
|
|
else
|
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarFullWeekView);
|
|
|
|
GetCalendarCtrl()->SetFocus();
|
|
}
|
|
else if (nPartID == xtpCalendarCaptionBar_ButtonViewMonth)
|
|
{
|
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarMonthView);
|
|
|
|
GetCalendarCtrl()->SetFocus();
|
|
}
|
|
else if (nPartID == xtpCalendarCaptionBar_ShowWorkWeek)
|
|
{
|
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarWorkWeekView);
|
|
|
|
GetCalendarCtrl()->SetFocus();
|
|
}
|
|
else if (nPartID == xtpCalendarCaptionBar_ShowFullWeek)
|
|
{
|
|
GetCalendarCtrl()->SwitchActiveView(xtpCalendarFullWeekView);
|
|
|
|
GetCalendarCtrl()->SetFocus();
|
|
}
|
|
else if (nPartID == xtpCalendarCaptionBar_ScrollPrevDate ||
|
|
nPartID == xtpCalendarCaptionBar_ScrollNextDate)
|
|
{
|
|
CXTPCalendarView* pActiveView = GetCalendarCtrl()->GetActiveView();
|
|
int nViewType = pActiveView->GetViewType();
|
|
BOOL bNext = nPartID == xtpCalendarCaptionBar_ScrollNextDate;
|
|
|
|
COleDateTime dtSelStart, dtSelEnd, dtFirst;
|
|
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);
|
|
}
|
|
else
|
|
{
|
|
ASSERT(FALSE);
|
|
}
|
|
|
|
pActiveView->SetSelection(dtSelStart, dtSelEnd, bAllDay, nGroupIndex);
|
|
|
|
GetCalendarCtrl()->SwitchActiveView((XTPCalendarViewType)nViewType);
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
|
|
UpdateControlsState();
|
|
|
|
if (GetOwnerWnd())
|
|
GetOwnerWnd()->Invalidate(FALSE);
|
|
}
|
|
|
|
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)
|
|
GetOwnerWnd()->Invalidate(FALSE);
|
|
}
|
|
|
|
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;
|
|
|
|
CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(_T("CALENDARCAPTIONBARSWITCHVIEWBUTTON"));
|
|
CRect rcRect = GetRect();
|
|
|
|
ASSERT(pImage);
|
|
if (!pImage || !GetTheme())
|
|
{
|
|
pDC->FillSolidRect(rcRect , RGB(155, 0, 0));
|
|
return;
|
|
}
|
|
|
|
|
|
if (GetPaintTheme() >= xtpCalendarThemeOffice2007)
|
|
{
|
|
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 | //DFCS_FLAT |
|
|
((m_nState & xtpBtnStateChecked) ? DFCS_CHECKED : 0) |
|
|
((m_nState & xtpBtnStatePressed) ? DFCS_PUSHED : 0); // | (bEnabled ? 0 : DFCS_INACTIVE)
|
|
|
|
::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;
|
|
|
|
CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(_GetImageName());
|
|
|
|
ASSERT(pImage);
|
|
if (!pImage || !GetTheme())
|
|
return;
|
|
|
|
CRect rcImage = pImage->GetSource(0, 4);
|
|
|
|
m_rcRect.right = m_rcRect.left + rcImage.Width();
|
|
m_rcRect.bottom = m_rcRect.top + rcImage.Height();
|
|
}
|
|
|
|
void CXTPCalendarCaptionBarTheme::CScrollDateButtonPart::Draw(CDC* pDC)
|
|
{
|
|
if (!IsVisible())
|
|
return;
|
|
|
|
CRect rcRect = GetRect();
|
|
|
|
CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(_GetImageName());
|
|
|
|
ASSERT(pImage);
|
|
if (!pImage || !GetTheme())
|
|
{
|
|
pDC->FillSolidRect(rcRect, RGB(155, 0, 0));
|
|
return;
|
|
}
|
|
|
|
if (GetPaintTheme() == xtpCalendarThemeOffice2007)
|
|
{
|
|
int nImagePart = (m_nState & xtpBtnStatePressed) ? 2 : (m_nState & xtpBtnStateMouseOver) ? 1 : 0;
|
|
|
|
pImage->DrawImage(pDC, rcRect, pImage->GetSource(nImagePart, 4),
|
|
CRect(0, 0, 0, 0), RGB(255, 0, 255));
|
|
|
|
if (m_nState & xtpBtnStateFocused)
|
|
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::CScrollDateButtonPart::_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;
|
|
_DrawTriangle(pDC, ptCenter, CPoint(ptCenter.x + 4, ptCenter.y - 4),
|
|
CPoint(ptCenter.x + 4, ptCenter.y + 4), clrColor);
|
|
}
|
|
else
|
|
{
|
|
ptCenter.x += 2;
|
|
_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);
|
|
}
|
|
|
|
m_rcRect.top += (m_rcRect.Height() - szRadio.cy) / 2 + 1;
|
|
m_rcRect.bottom = m_rcRect.top + szRadio.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.top += (rcRadio.Height() - szRadio.cy) / 2 + 1;
|
|
rcRadio.bottom = rcRadio.top + szRadio.cy;
|
|
rcRadio.right = rcRadio.left + szRadio.cx;
|
|
|
|
if (bThemed)
|
|
{
|
|
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 | //DFCS_FLAT |
|
|
((m_nState & xtpBtnStateChecked) ? DFCS_CHECKED : 0) |
|
|
((m_nState & xtpBtnStatePressed) ? DFCS_PUSHED : 0); // | (bEnabled ? 0 : DFCS_INACTIVE)
|
|
|
|
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.bottom +=1;
|
|
rcText.left = rcRadio.right + 9;
|
|
|
|
pDC->DrawText(GetText(), rcText, DT_BOTTOM | 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);
|
|
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);
|
|
ASSERT(pCalView);
|
|
if (!pCalView || !IsVisible())
|
|
return;
|
|
|
|
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);
|
|
|
|
CRect rcText = GetRect();
|
|
rcText.bottom +=1;
|
|
|
|
UINT uFlags = DT_BOTTOM | DT_SINGLELINE;
|
|
if (GetTheme() && !GetTheme()->IsScrollDateButtons() &&
|
|
GetPaintTheme() < xtpCalendarThemeOffice2007)
|
|
{
|
|
uFlags |= DT_RIGHT;
|
|
rcText.right = max(rcText.left, rcText.right - 9);
|
|
}
|
|
|
|
pDC->DrawText(GetText(), rcText, uFlags);
|
|
}
|
|
|
|
LPCTSTR CXTPCalendarCaptionBarTheme::CDateLabelPart::_AddSpace(CString& rStr)
|
|
{
|
|
if (!rStr.IsEmpty())
|
|
rStr = rStr + _T(' ');
|
|
|
|
return (LPCTSTR)rStr;
|
|
}
|
|
|
|
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_IDATE);
|
|
|
|
CString strDay1(bShowMonthDay ? _T("d") : _T(""));
|
|
CString strDay2(strDay1);
|
|
|
|
CString strMonth1;
|
|
CString strMonth2 = _T("MMMM");
|
|
|
|
if (dtDay1.GetMonth() != dtDay2.GetMonth())
|
|
strMonth1 = _T("MMMM");
|
|
|
|
CString strYear1;
|
|
CString strYear2;
|
|
strYear2 = _T("yyyy");
|
|
if (dtDay1.GetYear() != dtDay2.GetYear())
|
|
strYear1 = _T("yyyy");
|
|
|
|
CString strFormat1, strFormat2;
|
|
|
|
if (nDateOrdering == 1)
|
|
{
|
|
strFormat1.Format(_T("%s%s%s"), _AddSpace(strDay1), _AddSpace(strMonth1), _AddSpace(strYear1));
|
|
strFormat2.Format(_T("%s%s%s"), _AddSpace(strDay2), _AddSpace(strMonth2), (LPCTSTR)strYear2);
|
|
}
|
|
else
|
|
{
|
|
if (!strYear1.IsEmpty() && !strDay1.IsEmpty())
|
|
strDay1 += _T(",");
|
|
|
|
if (!strYear2.IsEmpty() && !strDay2.IsEmpty())
|
|
strDay2 += _T(",");
|
|
|
|
strFormat1.Format(_T("%s%s%s"), _AddSpace(strMonth1), _AddSpace(strDay1), _AddSpace(strYear1));
|
|
strFormat2.Format(_T("%s%s%s"), _AddSpace(strMonth2), _AddSpace(strDay2), (LPCTSTR)strYear2);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
CString strCaption;
|
|
|
|
if (!CXTPCalendarUtils::IsEqual(dtDay1, dtDay2))
|
|
{
|
|
strCaption = CXTPCalendarUtils::GetDateFormat(dtDay1, strFormat1);
|
|
strCaption += _T("- ");
|
|
}
|
|
|
|
strCaption += CXTPCalendarUtils::GetDateFormat(dtDay2, strFormat2);
|
|
|
|
return strCaption;
|
|
}
|