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.

688 lines
18 KiB
C

2 years ago
// XTPMarkupObject.h: interface for the CXTPMarkupObject class.
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
//{{AFX_CODEJOCK_PRIVATE
#if !defined(__XTPMARKUPOBJECT_H__)
#define __XTPMARKUPOBJECT_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CXTPMarkupDrawingContext;
class CXTPMarkupDependencyProperty;
class CXTPMarkupObject;
class CXTPMarkupBuilder;
class CXTPMarkupPropertyFromNameMap;
class CXTPMarkupPropertyChangedEventArgs;
class CXTPMarkupContext;
class CXTPMarkupProperties;
class CXTPMarkupType;
class CXTPMarkupStyle;
class CXTPMarkupBuilder;
enum XTPMarkupTextAlignment
{
xtpMarkupTextAlignmentLeft,
xtpMarkupTextAlignmentRight,
xtpMarkupTextAlignmentCenter,
xtpMarkupTextAlignmentJustify
};
enum XTPMarkupHorizontalAlignment
{
xtpMarkupHorizontalAlignmentLeft,
xtpMarkupHorizontalAlignmentCenter,
xtpMarkupHorizontalAlignmentRight,
xtpMarkupHorizontalAlignmentStretch
};
enum XTPMarkupVerticalAlignment
{
xtpMarkupVerticalAlignmentTop,
xtpMarkupVerticalAlignmentCenter,
xtpMarkupVerticalAlignmentBottom,
xtpMarkupVerticalAlignmentStretch
};
enum XTPMarkupOrientation
{
xtpMarkupOrientationHorizontal,
xtpMarkupOrientationVertical
};
enum XTPMarkupBaselineAlignment
{
xtpMarkupBaselineTop,
xtpMarkupBaselineCenter,
xtpMarkupBaselineBottom,
xtpMarkupBaseline,
xtpMarkupBaselineTextTop,
xtpMarkupBaselineTextBottom,
xtpMarkupBaselineSubscript,
xtpMarkupBaselineSuperscript
};
enum XTPMarkupVisibility
{
xtpMarkupVisibilityVisible = 0,
xtpMarkupVisibilityHidden = 1,
xtpMarkupVisibilityCollapsed = 2
};
enum XTPMarkupLineCap
{
xtpMarkupLineCapFlat,
xtpMarkupLineCapSquare,
xtpMarkupLineCapRound,
xtpMarkupLineCapTriangle
};
enum XTPMarkupLineJoin
{
xtpMarkupLineJoinMiter,
xtpMarkupLineJoinBevel,
xtpMarkupLineJoinRound
};
typedef CXTPMarkupObject* (*PFNCONVERTFROM)(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pObject);
typedef void (*PFNPROPERTYCHANGED)(CXTPMarkupObject* d, CXTPMarkupPropertyChangedEventArgs* e);
class _XTP_EXT_CLASS CXTPMarkupPropertyMetadata
{
public:
enum MetadataFlags
{
flagInherited = 1,
flagAffectsArrange = 2,
flagAffectsMeasure = 4,
flagAffectsParentArrange = 8,
flagAffectsParentMeasure = 16,
flagAffectsRender = 32,
};
public:
CXTPMarkupPropertyMetadata(CXTPMarkupObject* pDefaultValue, DWORD dwFlags = 0);
CXTPMarkupPropertyMetadata(CXTPMarkupObject* pDefaultValue, PFNCONVERTFROM pConverter, DWORD dwFlags = 0);
CXTPMarkupPropertyMetadata(CXTPMarkupObject* pDefaultValue, PFNPROPERTYCHANGED pPropertyChanged, DWORD dwFlags = 0);
CXTPMarkupPropertyMetadata(CXTPMarkupObject* pDefaultValue, PFNCONVERTFROM pConverter, PFNPROPERTYCHANGED pPropertyChanged, DWORD dwFlags = 0);
virtual ~CXTPMarkupPropertyMetadata();
public:
CXTPMarkupObject* m_pDefaultValue;
PFNCONVERTFROM m_pConverter;
PFNPROPERTYCHANGED m_pPropertyChanged;
DWORD m_dwFlags;
friend class CXTPMarkupObject;
};
#define MARKUP_RELEASE(x) if (x) { x->Release(); x = 0;}
#define MARKUP_ADDREF(x) if (x) { x->AddRef(); }
#define MARKUP_TYPE(class_name) ((CXTPMarkupType*)(class_name::type##class_name))
#define DECLARE_MARKUPCLASS(class_name) \
public: \
static CXTPMarkupType* AFX_CDECL GetMarkupBaseType(); \
static CXTPMarkupObject* AFX_CDECL CreateMarkupObject();\
static void AFX_CDECL RegisterMarkupClass(); \
virtual CXTPMarkupType* GetType() const; \
static void AFX_CDECL RegisterType(); \
static const CXTPMarkupType* type##class_name; \
#define IMPLEMENT_MARKUPCLASS(class_tag, class_name, base_class_name) \
CXTPMarkupObject* AFX_CDECL class_name::CreateMarkupObject() \
{ return new class_name; } \
CXTPMarkupType* AFX_CDECL class_name::GetMarkupBaseType() \
{ return MARKUP_TYPE(base_class_name); } \
const CXTPMarkupType* class_name::type##class_name = new CXTPMarkupType( \
class_tag, L#class_name, &class_name::CreateMarkupObject, &class_name::GetMarkupBaseType, &class_name::RegisterMarkupClass); \
CXTPMarkupType* class_name::GetType() const \
{ return MARKUP_TYPE(class_name); } \
void AFX_CDECL class_name::RegisterType() { MARKUP_TYPE(class_name)->Register(); }
#ifdef _DEBUG
#define MARKUP_STATICCAST(class_name, object) \
((class_name*)CXTPMarkupType::StaticDownCast(MARKUP_TYPE(class_name), object))
#else
#define MARKUP_STATICCAST(class_name, object) ((class_name*)object)
#endif
#undef MARKUP_DYNAMICCAST
#define MARKUP_DYNAMICCAST(class_name, object) \
(class_name*)CXTPMarkupType::DynamicDownCast(MARKUP_TYPE(class_name), object)
class _XTP_EXT_CLASS CXTPMarkupObject
{
DECLARE_MARKUPCLASS(CXTPMarkupObject);
public:
CXTPMarkupObject();
protected:
virtual ~CXTPMarkupObject();
public:
void SetValue(CXTPMarkupDependencyProperty* pProperty, CXTPMarkupObject* pValue);
CXTPMarkupObject* GetValue(CXTPMarkupDependencyProperty* pProperty) const;
CXTPMarkupObject* GetValueSource(CXTPMarkupDependencyProperty* pProperty) const;
virtual CXTPMarkupObject* GetValueCore(CXTPMarkupDependencyProperty* pProperty) const;
void SetLogicalParent(CXTPMarkupObject* pObject);
CXTPMarkupObject* GetLogicalParent() const;
BOOL IsKindOf(const CXTPMarkupType* pClass) const;
public:
DWORD AddRef();
DWORD Release();
public:
virtual UINT GetHashKey() const;
virtual BOOL IsEqual(const CXTPMarkupObject* pObject) const;
BOOL operator==(const CXTPMarkupObject* pObject) const;
public:
CXTPMarkupObject* FindName(LPCWSTR lpszName);
virtual int GetLogicalChildrenCount() const;
virtual CXTPMarkupObject* GetLogicalChild(int nIndex) const;
public:
virtual void SetContentObject(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pContent);
virtual void SetPropertyObject(CXTPMarkupBuilder* pBuilder, CXTPMarkupDependencyProperty* pProperty, CXTPMarkupObject* pValue);
virtual CXTPMarkupObject* ConvertFrom(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pObject) const;
virtual BOOL HasContentObject() const;
virtual BOOL AllowWhiteSpaceContent() const;
protected:
virtual void OnPropertyChanged(CXTPMarkupDependencyProperty* pProperty, CXTPMarkupObject* pOldValue, CXTPMarkupObject* pNewValue);
void RecursePropertyChanged(CXTPMarkupDependencyProperty* pProperty, CXTPMarkupObject* pOldValue, CXTPMarkupObject* pNewValue);
protected:
virtual void OnFinalRelease();
protected:
CXTPMarkupObject* m_pLogicalParent;
CXTPMarkupProperties* m_pProperties;
LPWSTR m_lpMarkupTag;
long m_dwRef;
protected:
friend class CXTPMarkupBuilder;
friend class CXTPMarkupStyle;
static CXTPMarkupDependencyProperty* m_pNameProperty;
static CXTPMarkupDependencyProperty* m_pKeyProperty;
friend class CXTPMarkupProperties;
};
typedef CXTPMarkupObject* CXTPMarkupObjectPtr;
class _XTP_EXT_CLASS CXTPMarkupDependencyProperty : public CXTPMarkupObject
{
DECLARE_MARKUPCLASS(CXTPMarkupDependencyProperty);
protected:
CXTPMarkupDependencyProperty();
public:
virtual ~CXTPMarkupDependencyProperty();
public:
static CXTPMarkupDependencyProperty* Register(LPCWSTR lpszName, CXTPMarkupType* pPropetyType, CXTPMarkupType* pOwnerType, CXTPMarkupPropertyMetadata* pMetadata = NULL);
static CXTPMarkupDependencyProperty* RegisterAttached(LPCWSTR lpszName, CXTPMarkupType* pPropetyType, CXTPMarkupType* pOwnerType, CXTPMarkupPropertyMetadata* pMetadata = NULL);
CXTPMarkupDependencyProperty* AddOwner(CXTPMarkupType* pOwnerType);
public:
LPCWSTR GetName() const;
CXTPMarkupType* GetPropetyType() const;
CXTPMarkupType* GetOwnerType() const;
CXTPMarkupPropertyMetadata* GetMetadata() const;
BOOL IsAttached() const;
virtual BOOL IsEvent() const;
DWORD GetFlags() const;
public:
static CXTPMarkupDependencyProperty* AFX_CDECL FindProperty(CXTPMarkupType* pRuntimeClass, LPCWSTR lpszAttribute);
protected:
static CXTPMarkupPropertyFromNameMap* GetPropertyMap();
static CXTPMarkupDependencyProperty* RegisterCommon(CXTPMarkupDependencyProperty* dp, LPCWSTR lpszName, CXTPMarkupType* pPropetyType, CXTPMarkupType* pOwnerType, BOOL bAttached);
private:
LPCWSTR m_lpszName;
CXTPMarkupType* m_pPropetyType;
CXTPMarkupType* m_pOwnerType;
CXTPMarkupPropertyMetadata* m_pMetadata;
BOOL m_bAttached;
int m_nIndex;
static int s_nCount;
friend class CXTPMarkupBuilder;
friend class CXTPMarkupRoutedEvent;
friend class CXTPMarkupProperties;
};
class _XTP_EXT_CLASS CXTPMarkupPropertyChangedEventArgs
{
public:
CXTPMarkupPropertyChangedEventArgs(CXTPMarkupDependencyProperty* pProperty, CXTPMarkupObject* pOldValue, CXTPMarkupObject* pNewValue);
public:
CXTPMarkupDependencyProperty* m_pProperty;
CXTPMarkupObject* m_pOldValue;
CXTPMarkupObject* m_pNewValue;
};
class _XTP_EXT_CLASS CXTPMarkupInt : public CXTPMarkupObject
{
DECLARE_MARKUPCLASS(CXTPMarkupInt);
public:
CXTPMarkupInt(int nValue = 0);
operator int() const
{
return m_nValue;
}
int GetValue() const
{
return m_nValue;
}
public:
CXTPMarkupObject* ConvertFrom(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pObject) const;
public:
virtual BOOL IsEqual(const CXTPMarkupObject* pObject) const;
protected:
int m_nValue;
};
class _XTP_EXT_CLASS CXTPMarkupDouble : public CXTPMarkupObject
{
DECLARE_MARKUPCLASS(CXTPMarkupDouble);
public:
CXTPMarkupDouble(double dValue = 0);
operator double() const {
return m_dValue;
}
public:
CXTPMarkupObject* ConvertFrom(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pObject) const;
public:
virtual BOOL IsEqual(const CXTPMarkupObject* pObject) const;
protected:
double m_dValue;
};
class _XTP_EXT_CLASS CXTPMarkupEnum : public CXTPMarkupObject
{
DECLARE_MARKUPCLASS(CXTPMarkupEnum);
public:
CXTPMarkupEnum(int nValue = 0);
operator int() const {
return m_nValue;
}
public:
static CXTPMarkupEnum* AFX_CDECL CreateValue(int nValue);
public:
CXTPMarkupObject* ConvertFrom(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pObject) const;
public:
virtual BOOL IsEqual(const CXTPMarkupObject* pObject) const;
protected:
int m_nValue;
};
class _XTP_EXT_CLASS CXTPMarkupBool : public CXTPMarkupObject
{
DECLARE_MARKUPCLASS(CXTPMarkupBool);
public:
CXTPMarkupBool(BOOL bValue = FALSE);
operator BOOL() const {
return m_bValue;
}
public:
static CXTPMarkupBool* AFX_CDECL CreateTrueValue();
static CXTPMarkupBool* AFX_CDECL CreateFalseValue();
static CXTPMarkupBool* AFX_CDECL CreateValue(BOOL bValue);
public:
CXTPMarkupObject* ConvertFrom(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pObject) const;
public:
virtual UINT GetHashKey() const;
virtual BOOL IsEqual(const CXTPMarkupObject* pObject) const;
protected:
BOOL m_bValue;
};
class _XTP_EXT_CLASS CXTPMarkupColor : public CXTPMarkupObject
{
DECLARE_MARKUPCLASS(CXTPMarkupColor);
public:
CXTPMarkupColor(COLORREF nValue = 0);
CXTPMarkupColor(BYTE bAlpha, COLORREF nValue);
operator COLORREF() const {
return m_nValue;
}
CXTPMarkupObject* ConvertFrom(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pObject) const;
public:
static BOOL AFX_CDECL ConvertFromString(LPCWSTR lpszValue, COLORREF& clr);
public:
virtual BOOL IsEqual(const CXTPMarkupObject* pObject) const;
protected:
void SetContentObject(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* /*pContent*/);
protected:
COLORREF m_nValue;
};
class _XTP_EXT_CLASS CXTPMarkupString : public CXTPMarkupObject
{
DECLARE_MARKUPCLASS(CXTPMarkupString);
public:
CXTPMarkupString(LPCSTR lpszValue);
CXTPMarkupString(LPCWSTR lpszValue = NULL, int nLength = -1);
private:
~CXTPMarkupString();
public:
operator LPCWSTR() const {
return m_lpszValue;
}
int GetLength() const {
return m_nLength;
}
public:
static CXTPMarkupString* AFX_CDECL CreateValue(LPCWSTR lpszString, int nLength = -1);
public:
virtual UINT GetHashKey() const;
virtual BOOL IsEqual(const CXTPMarkupObject* pObject) const;
private:
void Init(LPCWSTR lpszValue, int nLength);
protected:
LPWSTR m_lpszValue;
int m_nLength;
};
class _XTP_EXT_CLASS CXTPMarkupType : public CXTPMarkupObject
{
DECLARE_MARKUPCLASS(CXTPMarkupType);
protected:
class CClassList;
static CClassList* GetClassList();
public:
typedef CXTPMarkupObject* (AFX_CDECL* PFNCREATEOBJECT)();
typedef CXTPMarkupType* (AFX_CDECL* PFNGETBASETYPE)();
typedef void (AFX_CDECL* PFNREGISTERMARKUPCLASS)();
CXTPMarkupObject* CreateObject() const;
static void AFX_CDECL RegisterAll();
public:
CXTPMarkupType();
CXTPMarkupType(LPCWSTR lpszTag, LPCWSTR lpszClassName, PFNCREATEOBJECT pfnCreateObject, PFNGETBASETYPE pfnGetBaseType, PFNREGISTERMARKUPCLASS pfnRegisterMarkupClass);
private:
~CXTPMarkupType();
public:
BOOL IsDerivedFrom(const CXTPMarkupType* pBaseClass) const;
static CXTPMarkupObject* AFX_CDECL DynamicDownCast(CXTPMarkupType* pType, CXTPMarkupObject* pObject);
static CXTPMarkupObject* AFX_CDECL StaticDownCast(CXTPMarkupType* pType, CXTPMarkupObject* pObject);
static CXTPMarkupType* AFX_CDECL LookupTag(LPCWSTR lpszTag);
void Register();
CXTPMarkupStyle* GetTypeStyle() const;
void SetTypeStyle(CXTPMarkupStyle* pStyle);
CXTPMarkupType* GetBaseType() const;
protected:
CXTPMarkupObject* ConvertFrom(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pObject) const;
public:
LPCWSTR m_lpszTag;
LPCWSTR m_lpszClassName;
CXTPMarkupType* m_pNextType;
protected:
BOOL m_bRegister;
PFNCREATEOBJECT m_pfnCreateObject;
PFNGETBASETYPE m_pfnGetBaseType;
PFNREGISTERMARKUPCLASS m_pfnRegisterMarkupClass;
CXTPMarkupStyle* m_pTypeStyle;
};
AFX_INLINE BOOL IsStringObject(CXTPMarkupObject* pObject)
{
return pObject && pObject->GetType() == MARKUP_TYPE(CXTPMarkupString);
}
class _XTP_EXT_CLASS CXTPMarkupCollection : public CXTPMarkupObject
{
DECLARE_MARKUPCLASS(CXTPMarkupCollection);
public:
CXTPMarkupCollection();
~CXTPMarkupCollection();
public:
int GetCount() const;
void Add(CXTPMarkupObject* pElement);
void Insert(int nIndex, CXTPMarkupObject* pElement);
void RemoveAll();
void Remove(int nIndex);
int IndexOf(CXTPMarkupObject* pElement) const;
public:
void SetContentObject(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pContent);
BOOL HasContentObject() const;
CXTPMarkupType* GetElementType() const;
virtual int GetLogicalChildrenCount() const;
virtual CXTPMarkupObject* GetLogicalChild(int nIndex) const;
protected:
virtual void OnItemAdded(CXTPMarkupObject* pItem, int nIndex);
virtual void OnChanged();
protected:
CArray<CXTPMarkupObject*, CXTPMarkupObject*> m_arrItems;
CXTPMarkupType* m_pElementType;
BOOL m_bLogicalParent;
};
class CXTPMarkupProperties : public CXTPMarkupObject
{
public:
CXTPMarkupProperties(CXTPMarkupObject* pOwner);
~CXTPMarkupProperties();
public:
BOOL IsPropertyValid(CXTPMarkupDependencyProperty* pProperty) const;
CXTPMarkupObject* Lookup(CXTPMarkupDependencyProperty* pProperty) const;
void Copy(CXTPMarkupProperties* pOwner);
void Set(CXTPMarkupDependencyProperty* pProperty, CXTPMarkupObject* pValue);
protected:
CXTPMarkupObject** m_pTable;
int m_nTableSize;
CXTPMarkupObject* m_pOwner;
};
class CXTPMarkupAutoPtr
{
public:
CXTPMarkupAutoPtr(CXTPMarkupObject* pObject = NULL);
~CXTPMarkupAutoPtr();
public:
CXTPMarkupObject* AddRef() const;
CXTPMarkupObject* operator->() const;
public:
CXTPMarkupObject* m_pObject;
};
class _XTP_EXT_CLASS CXTPMarkupDoubleCollection : public CXTPMarkupObject
{
DECLARE_MARKUPCLASS(CXTPMarkupDoubleCollection)
public:
typedef CArray<float, float&> CDoubleArray;
public:
CXTPMarkupDoubleCollection();
CXTPMarkupDoubleCollection(CDoubleArray& arr);
public:
int GetCount() const;
const float* GetData() const;
float GetAt(int nIndex) const;
void RemoveAll();
void Remove(int nIndex);
void Add(float fValue);
protected:
CXTPMarkupObject* ConvertFrom(CXTPMarkupBuilder* pBuilder, CXTPMarkupObject* pObject) const;
static BOOL AFX_CDECL ConvertFromString(LPCWSTR lpszValue, CDoubleArray& arr);
static BOOL AFX_CDECL GetNextValue(LPCWSTR& lpszValue, float& nValue);
protected:
CDoubleArray m_arr;
};
AFX_INLINE CXTPMarkupStyle* CXTPMarkupType::GetTypeStyle() const {
return m_pTypeStyle;
}
AFX_INLINE int CXTPMarkupCollection::GetCount() const {
return (int)m_arrItems.GetSize();
}
AFX_INLINE CXTPMarkupType* CXTPMarkupCollection::GetElementType() const {
return m_pElementType;
}
AFX_INLINE LPCWSTR CXTPMarkupDependencyProperty::GetName() const {
return m_lpszName;
}
AFX_INLINE CXTPMarkupType* CXTPMarkupDependencyProperty::GetPropetyType() const {
return m_pPropetyType;
}
AFX_INLINE CXTPMarkupType* CXTPMarkupDependencyProperty::GetOwnerType() const {
return m_pOwnerType;
}
AFX_INLINE CXTPMarkupPropertyMetadata* CXTPMarkupDependencyProperty::GetMetadata() const {
return m_pMetadata;
}
AFX_INLINE BOOL CXTPMarkupDependencyProperty::IsAttached() const {
return m_bAttached;
}
AFX_INLINE BOOL CXTPMarkupDependencyProperty::IsEvent() const {
return FALSE;
}
AFX_INLINE DWORD CXTPMarkupDependencyProperty::GetFlags() const {
return m_pMetadata ? m_pMetadata->m_dwFlags : 0;
}
AFX_INLINE UINT CXTPMarkupObject::GetHashKey() const {
return (UINT)(UINT_PTR)this;
}
AFX_INLINE BOOL CXTPMarkupObject::IsEqual(const CXTPMarkupObject* pObject) const {
return pObject == this;
}
AFX_INLINE BOOL CXTPMarkupObject::operator==(const CXTPMarkupObject* pObject) const {
return IsEqual(pObject);
}
AFX_INLINE bool AFXAPI operator==(const CXTPMarkupObject& s1, const CXTPMarkupObject& s2) {
return s1.IsEqual(&s2) ? true : false;
}
template<> AFX_INLINE UINT AFXAPI HashKey(CXTPMarkupObject* key)
{
return key->GetHashKey();
}
template<> AFX_INLINE BOOL AFXAPI CompareElements(const CXTPMarkupObjectPtr* pElement1, const CXTPMarkupObjectPtr* pElement2)
{
return (*pElement1)->IsEqual(*pElement2);
}
AFX_INLINE BOOL IsEqual(CXTPMarkupObject* pNewValue, CXTPMarkupObject* pOldValue) {
if (pNewValue == NULL && pOldValue == NULL)
return TRUE;
if (pNewValue != NULL || pOldValue != NULL)
return FALSE;
return pNewValue->IsEqual(pOldValue);
}
#endif // !defined(__XTPMARKUPOBJECT_H__)