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.

491 lines
12 KiB
C++

2 years ago
// XTPCalendarViewPart.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 "Common/XTPColorManager.h"
#include "Common/XTPVC80Helpers.h"
#include "Common/XTPPropExchange.h"
#include "Common/XTPSmartPtrInternalT.h"
#include "XTPCalendarPtrCollectionT.h"
#include "XTPCalendarEventLabel.h"
#include "XTPCalendarViewPart.h"
#include "XTPCalendarDefines.h"
#include "XTPCalendarPaintManager.h"
#include "XTPCalendarControl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CXTPCalendarViewPart
CXTPCalendarViewPart::CXTPCalendarViewPart(CXTPCalendarViewPart* pParentPart)
: m_pParentPart(pParentPart)
{
m_pPaintManager = NULL;
}
CXTPCalendarViewPart::~CXTPCalendarViewPart()
{
}
CXTPCalendarControl* CXTPCalendarViewPart::GetCalendarControl() const
{
return XTP_SAFE_GET1(m_pPaintManager, m_pControl, NULL);
}
void CXTPCalendarViewPart::RefreshMetrics()
{
}
COLORREF CXTPCalendarViewPart::GetBackgroundColor()
{
CXTPCalendarViewPart* pViewPart = this;
while (pViewPart != NULL)
{
if (!pViewPart->m_clrBackground.IsDefaultValue())
return pViewPart->m_clrBackground;
pViewPart = pViewPart->m_pParentPart;
ASSERT(pViewPart);
};
return 0;
}
COLORREF CXTPCalendarViewPart::GetTextColor()
{
CXTPCalendarViewPart* pViewPart = this;
while (pViewPart != NULL)
{
if (!pViewPart->m_clrTextColor.IsDefaultValue())
return pViewPart->m_clrTextColor;
pViewPart = pViewPart->m_pParentPart;
ASSERT(pViewPart);
};
return 0;
}
CFont& CXTPCalendarViewPart::GetTextFont()
{
CXTPCalendarViewPart* pViewPart = this;
while (pViewPart != NULL)
{
if (!pViewPart->m_fntText.IsDefaultValue())
return pViewPart->m_fntText;
pViewPart = pViewPart->m_pParentPart;
ASSERT(pViewPart);
};
return m_fntText;
}
BOOL AFX_CDECL PX_Font(CXTPPropExchange* pPX, LPCTSTR pcszPropName, LOGFONT& rLogFont)
{
CXTPPropExchangeSection secLF(pPX->GetSection(pcszPropName));
if (pPX->IsLoading())
{
::ZeroMemory(&rLogFont, sizeof(rLogFont));
}
else
{
secLF->EmptySection();
}
long nVersion = 1;
PX_Long(&secLF, _T("Version"), nVersion, 1);
if (nVersion != 1 && pPX->IsLoading())
{
ASSERT(FALSE);
return FALSE;
}
PX_Long(&secLF, _T("Height"), rLogFont.lfHeight, 0);
PX_Long(&secLF, _T("Width"), rLogFont.lfWidth, 0);
PX_Long(&secLF, _T("Escapement"), rLogFont.lfEscapement, 0);
PX_Long(&secLF, _T("Orientation"), rLogFont.lfOrientation, 0);
PX_Long(&secLF, _T("Weight"), rLogFont.lfWeight, 0);
PX_Byte(&secLF, _T("Italic"), rLogFont.lfItalic, 0);
PX_Byte(&secLF, _T("Underline"), rLogFont.lfUnderline, 0);
PX_Byte(&secLF, _T("StrikeOut"), rLogFont.lfStrikeOut, 0);
PX_Byte(&secLF, _T("CharSet"), rLogFont.lfCharSet, 0);
PX_Byte(&secLF, _T("OutPrecision"), rLogFont.lfOutPrecision, 0);
PX_Byte(&secLF, _T("ClipPrecision"), rLogFont.lfClipPrecision, 0);
PX_Byte(&secLF, _T("Quality"), rLogFont.lfQuality, 0);
PX_Byte(&secLF, _T("PitchAndFamily"), rLogFont.lfPitchAndFamily, 0);
CString strFaceName;
if (pPX->IsStoring())
{
strFaceName = rLogFont.lfFaceName;
PX_String(&secLF, _T("FaceName"), strFaceName);
}
else
{
PX_String(&secLF, _T("FaceName"), strFaceName);
STRCPY_S(rLogFont.lfFaceName, LF_FACESIZE, strFaceName);
}
return TRUE;
}
BOOL AFX_CDECL PX_Font(CXTPPropExchange* pPX, LPCTSTR pcszPropName,
CXTPCalendarThemeFontValue& refFont)
{
CFont* pFontStandard = refFont.GetStandardValue();
CFont* pFontCustom = refFont.IsCustomValue() ? refFont.GetValue() : NULL;
LOGFONT lfStandard0, lfCustom0;
if (!pFontStandard || !pFontStandard->GetLogFont(&lfStandard0))
{
::ZeroMemory(&lfStandard0, sizeof(lfStandard0));
}
if (!pFontCustom || !pFontCustom->GetLogFont(&lfCustom0))
{
::ZeroMemory(&lfCustom0, sizeof(lfCustom0));
}
//-------------------------------------------------------------------
CXTPPropExchangeSection secData(pPX->GetSection(pcszPropName));
if (pPX->IsStoring())
{
secData->EmptySection();
PX_Font(&secData, _T("Standard"), lfStandard0);
PX_Font(&secData, _T("Custom"), lfCustom0);
}
else
{
ASSERT(pPX->IsLoading());
LOGFONT lfStandard, lfCustom;
PX_Font(&secData, _T("Standard"), lfStandard);
PX_Font(&secData, _T("Custom"), lfCustom);
if (memcmp(&lfStandard, &lfStandard0, sizeof(lfStandard)))
{
if ((lfStandard.lfHeight || lfStandard.lfWidth || lfStandard.lfFaceName[0]) )
refFont.SetStandardValue(&lfStandard);
else
refFont.SetStandardValue((CFont*)NULL);
}
if (memcmp(&lfCustom, &lfCustom0, sizeof(lfCustom)))
{
if (lfCustom.lfHeight || lfCustom.lfWidth || lfCustom.lfFaceName[0] )
refFont.SetCustomValue(&lfCustom);
else
refFont.SetDefaultValue();
}
}
return TRUE;
}
BOOL AFX_CDECL PX_Color(CXTPPropExchange* pPX, LPCTSTR pcszPropName, COLORREF& refColor)
{
ASSERT(pPX && pcszPropName);
if (!pPX || !pcszPropName)
return FALSE;
CString strColor;
// save/load color as hex number
if (pPX->IsStoring())
{
if (refColor == COLORREF_NULL)
strColor = _T("-1");
else
strColor.Format(_T("%06X"), refColor);
return PX_String(pPX, pcszPropName, strColor);
}
else
{
PX_String(pPX, pcszPropName, strColor, _T("-1"));
strColor.Remove(_T(' '));
if (strColor == _T("-1"))
{
refColor = COLORREF_NULL;
}
else
{
TCHAR* pEnd = NULL;
refColor = (COLORREF)_tcstol(strColor, &pEnd, 16);
}
}
return TRUE;
}
BOOL AFX_CDECL PX_Color(CXTPPropExchange* pPX, LPCTSTR pcszPropName, CXTPPaintManagerColor& refColor)
{
class CXTPPaintManagerColor_accesser: public CXTPPaintManagerColor
{
public:
void doPX(CXTPPropExchange* pPX, LPCTSTR pcszPropName)
{
CXTPPropExchangeSection secCLR(pPX->GetSection(pcszPropName));
if (pPX->IsStoring())
secCLR->EmptySection();
PX_Color(&secCLR, _T("Standard"), m_clrStandardValue);
PX_Color(&secCLR, _T("Custom"), m_clrCustomValue);
}
};
CXTPPaintManagerColor_accesser* pClrEx = (CXTPPaintManagerColor_accesser*)&refColor;
pClrEx->doPX(pPX, pcszPropName);
return TRUE;
}
BOOL AFX_CDECL PX_GrColor(CXTPPropExchange* pPX, LPCTSTR psczPropName,
CXTPPaintManagerColorGradient& refGrColor)
{
CXTPPropExchangeSection secData(pPX->GetSection(psczPropName));
if (pPX->IsStoring())
secData->EmptySection();
PX_Color(&secData, _T("LightColor"), refGrColor.clrLight);
PX_Color(&secData, _T("DarkColor"), refGrColor.clrDark);
PX_Float(&secData, _T("GradientFactor"), refGrColor.fGradientFactor, 0.5);
return TRUE;
}
void CXTPCalendarThemeFontValue::Serialize(CArchive& ar)
{
LOGFONT lfStandard0, lfCustom0;
const UINT cnLogFont_size = sizeof(LOGFONT);
if (!m_pValueStandard || !m_pValueStandard->GetLogFont(&lfStandard0))
{
::ZeroMemory(&lfStandard0, cnLogFont_size);
}
if (!m_pValueCustom || !m_pValueCustom->GetLogFont(&lfCustom0))
{
::ZeroMemory(&lfCustom0, cnLogFont_size);
}
//-------------------------------------------------------------------
if (ar.IsStoring())
{
ar.Write((void*)&lfStandard0, cnLogFont_size);
ar.Write((void*)&lfCustom0, cnLogFont_size);
}
else
{
ASSERT(ar.IsLoading());
LOGFONT lfStandard, lfCustom;
ar.Read((void*)&lfStandard, cnLogFont_size);
ar.Read((void*)&lfCustom, cnLogFont_size);
if (memcmp(&lfStandard, &lfStandard0, cnLogFont_size))
{
if ((lfStandard.lfHeight || lfStandard.lfWidth || lfStandard.lfFaceName[0]) )
SetStandardValue(&lfStandard);
else
SetStandardValue((CFont*)NULL);
}
if (memcmp(&lfCustom, &lfCustom0, cnLogFont_size))
{
if (lfCustom.lfHeight || lfCustom.lfWidth || lfCustom.lfFaceName[0] )
SetCustomValue(&lfCustom);
else
SetDefaultValue();
}
}
}
//////////////////////////////////////////////////////////////////////////
// CXTPCalendarThemeStringValue
void CXTPCalendarThemeStringValue::DoPropExchange(CXTPPropExchange* pPX, LPCTSTR pcszPropName)
{
if (!pPX || !pcszPropName)
{
ASSERT(FALSE);
return;
}
CXTPPropExchangeSection secData(pPX->GetSection(pcszPropName));
if (pPX->IsStoring())
secData->EmptySection();
PX_Bool(&secData, _T("IsStandardSet"), m_bIsStandardSet);
PX_Bool(&secData, _T("IsCustomSet"), m_bIsCustomSet);
DoPX_Value(&secData, _T("Standard"), m_ValueStandard, TRUE);
DoPX_Value(&secData, _T("Custom"), m_ValueCustom, FALSE);
}
void CXTPCalendarThemeStringValue::DoPX_Value(CXTPPropExchange* pPX, LPCTSTR pcszPropName, CString& rXValue, BOOL bStandard)
{
if (pPX->IsStoring())
{
if (bStandard && !m_bIsStandardSet ||
!bStandard && !m_bIsCustomSet)
{
rXValue.Empty();
}
}
PX_String(pPX, pcszPropName, rXValue);
}
//////////////////////////////////////////////////////////////////////////
// CXTPCalendarThemeIntValue
void CXTPCalendarThemeIntValue::DoPropExchange(CXTPPropExchange* pPX, LPCTSTR pcszPropName)
{
if (!pPX || !pcszPropName)
{
ASSERT(FALSE);
return;
}
CXTPPropExchangeSection secData(pPX->GetSection(pcszPropName));
if (pPX->IsStoring())
secData->EmptySection();
PX_Bool(&secData, _T("IsStandardSet"), m_bIsStandardSet);
PX_Bool(&secData, _T("IsCustomSet"), m_bIsCustomSet);
DoPX_Value(&secData, _T("Standard"), m_ValueStandard, TRUE);
DoPX_Value(&secData, _T("Custom"), m_ValueCustom, FALSE);
}
void CXTPCalendarThemeIntValue::DoPX_Value(CXTPPropExchange* pPX, LPCTSTR pcszPropName, int& rXValue, BOOL bStandard)
{
if (pPX->IsStoring())
{
if (bStandard && !m_bIsStandardSet ||
!bStandard && !m_bIsCustomSet)
{
rXValue = 0;
}
}
PX_Int(pPX, pcszPropName, rXValue);
}
//////////////////////////////////////////////////////////////////////////
// CXTPCalendarThemeBOOLValue
void CXTPCalendarThemeBOOLValue::DoPropExchange(CXTPPropExchange* pPX, LPCTSTR pcszPropName)
{
if (!pPX || !pcszPropName)
{
ASSERT(FALSE);
return;
}
CXTPPropExchangeSection secData(pPX->GetSection(pcszPropName));
if (pPX->IsStoring())
secData->EmptySection();
PX_Bool(&secData, _T("IsStandardSet"), m_bIsStandardSet);
PX_Bool(&secData, _T("IsCustomSet"), m_bIsCustomSet);
DoPX_Value(&secData, _T("Standard"), m_ValueStandard, TRUE);
DoPX_Value(&secData, _T("Custom"), m_ValueCustom, FALSE);
}
void CXTPCalendarThemeBOOLValue::DoPX_Value(CXTPPropExchange* pPX, LPCTSTR pcszPropName, BOOL& rXValue, BOOL bStandard)
{
if (pPX->IsStoring())
{
if (bStandard && !m_bIsStandardSet ||
!bStandard && !m_bIsCustomSet)
{
rXValue = FALSE;
}
}
PX_Bool(pPX, pcszPropName, rXValue);
}
//////////////////////////////////////////////////////////////////////////
// CXTPCalendarThemeRectValue
void CXTPCalendarThemeRectValue::DoPropExchange(CXTPPropExchange* pPX, LPCTSTR pcszPropName)
{
if (!pPX || !pcszPropName)
{
ASSERT(FALSE);
return;
}
CXTPPropExchangeSection secData(pPX->GetSection(pcszPropName));
if (pPX->IsStoring())
secData->EmptySection();
PX_Bool(&secData, _T("IsStandardSet"), m_bIsStandardSet);
PX_Bool(&secData, _T("IsCustomSet"), m_bIsCustomSet);
DoPX_Value(&secData, _T("Standard"), m_ValueStandard, TRUE);
DoPX_Value(&secData, _T("Custom"), m_ValueCustom, FALSE);
}
void CXTPCalendarThemeRectValue::DoPX_Value(CXTPPropExchange* pPX, LPCTSTR pcszPropName, CRect& rXValue, BOOL bStandard)
{
const CRect crcZero(0, 0, 0, 0);
if (pPX->IsStoring())
{
if (bStandard && !m_bIsStandardSet ||
!bStandard && !m_bIsCustomSet)
{
rXValue = crcZero;
}
}
PX_Rect(pPX, pcszPropName, rXValue, crcZero);
}