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.
415 lines
12 KiB
C
415 lines
12 KiB
C
2 years ago
|
// XTPMarkupContext.h: interface for the CXTPMarkupBorder 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(__XTPMARKUPCONTEXT_H__)
|
||
|
#define __XTPMARKUPCONTEXT_H__
|
||
|
//}}AFX_CODEJOCK_PRIVATE
|
||
|
|
||
|
#if _MSC_VER > 1000
|
||
|
#pragma once
|
||
|
#endif // _MSC_VER > 1000
|
||
|
|
||
|
class CXTPMarkupObject;
|
||
|
class CXTPImageManager;
|
||
|
class CXTPMarkupUIElement;
|
||
|
class CXTPMarkupInputElement;
|
||
|
class CXTPMarkupContext;
|
||
|
class CXTPMarkupEventHandlerMap;
|
||
|
class CXTPMarkupRoutedEventArgs;
|
||
|
class CXTPMarkupRoutedEvent;
|
||
|
class CXTPMarkupDelegate;
|
||
|
class CXTPMarkupFont;
|
||
|
class CXTPMarkupType;
|
||
|
class CXTPMarkupKeyboardNavigation;
|
||
|
class CXTPToolTipContext;
|
||
|
class CXTPMarkupParser;
|
||
|
class CXTPMarkupBuilder;
|
||
|
|
||
|
class CXTPMarkupDelegateMap;
|
||
|
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// Summary: CXTPMarkupContext is standalone class that used to provide common settings for Markup objects.
|
||
|
//===========================================================================
|
||
|
class _XTP_EXT_CLASS CXTPMarkupContext
|
||
|
{
|
||
|
class CXTPMarkupFontArray;
|
||
|
protected:
|
||
|
class CInputElementCollection;
|
||
|
|
||
|
public:
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Constructs a CXTPMarkupContext object
|
||
|
//-----------------------------------------------------------------------
|
||
|
CXTPMarkupContext();
|
||
|
|
||
|
protected:
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Destroys a CXTPMarkupContext object, handles cleanup and deallocation
|
||
|
//-----------------------------------------------------------------------
|
||
|
virtual ~CXTPMarkupContext();
|
||
|
|
||
|
public:
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Call this method to get default font properties for markup objects
|
||
|
// Returns: LOGFONT object contained properties for default font
|
||
|
//-----------------------------------------------------------------------
|
||
|
LOGFONT* GetDefaultLogFont();
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Call this method to get default text color of text block object
|
||
|
// Returns: Default text color
|
||
|
//-----------------------------------------------------------------------
|
||
|
COLORREF GetDefaultForeground();
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Call this method to set default text color that will be used for TextBlock objects
|
||
|
// Parameters: clr - Default text color
|
||
|
//-----------------------------------------------------------------------
|
||
|
void SetDefaultTextColor(COLORREF clr);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Call this method to set default font that will be used for TextBlock objects
|
||
|
// Parameters: font - Font to be set as default
|
||
|
//-----------------------------------------------------------------------
|
||
|
void SetDefaultFont(HFONT font);
|
||
|
void SetDefaultFont(LOGFONT* font);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Call this method to create Markup tree from its XML sting
|
||
|
// Parameters: lpszBuffer - XML Markup string.
|
||
|
// Returns: Returns toplevel Markup element.
|
||
|
//-----------------------------------------------------------------------
|
||
|
CXTPMarkupUIElement* Parse(LPCSTR lpszBuffer);
|
||
|
CXTPMarkupUIElement* Parse(LPCWSTR lpszBuffer);
|
||
|
|
||
|
CString ValidateXML(LPCWSTR lpszBuffer);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Call this method to connect Markup event with class member or static method delegate
|
||
|
// Parameters:
|
||
|
// pEvent - Event to subscribe
|
||
|
// pDelegate - method Delegate
|
||
|
// Example:
|
||
|
// <code>m_wndStatic.AddHandler(CXTPMarkupHyperlink::m_pClickEvent, CreateMarkupClassDelegate(this, &CMarkupSampleDlg::OnHyperlinkClick)); </code>
|
||
|
//-----------------------------------------------------------------------
|
||
|
void AddHandler(CXTPMarkupRoutedEvent* pEvent, CXTPMarkupDelegate* pDelegate);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Call this method to set Delegate for Markup text event
|
||
|
// Parameters:
|
||
|
// lpszDelegate - Text even delegate
|
||
|
// pDelegate - method Delegate
|
||
|
// Example:
|
||
|
// <code><TextBlock><Hyperlink Click='OnClick'>FTSE 100</Hyperlink></TextBlock></code>
|
||
|
// <code>.... </code>
|
||
|
// <code>pPopup->GetMarkupContext()->SetDelegate(L"OnClick", CreateMarkupFunctionDelegate(&HyperlinkClick));</code>
|
||
|
//-----------------------------------------------------------------------
|
||
|
void SetDelegate(LPWSTR lpszDelegate, CXTPMarkupDelegate* pDelegate);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Call this method to enable/disable GDI+ usage
|
||
|
// Parameters:
|
||
|
// bEnable - TRUE to enable; FALSE to disable GDI+
|
||
|
//-----------------------------------------------------------------------
|
||
|
void EnableGdiPlus(BOOL bEnable);
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Call this method to determin if GDI+ is enabled/disabled.
|
||
|
// Returns: TRUE if enabled; FALSE if GDI+ is disabled.
|
||
|
//-----------------------------------------------------------------------
|
||
|
BOOL IsGdiPlusEnabled() const;
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Call this method to get tooltip context pointer.
|
||
|
//-----------------------------------------------------------------------
|
||
|
CXTPToolTipContext* GetToolTipContext() const;
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Call this method to set isolated image manager for elements inside Markup context.
|
||
|
// Parameters:
|
||
|
// pImageManager - new ImageManager to use
|
||
|
// Example:
|
||
|
// <code>m_pMarkupContext->SetImageManager(new CXTPImageManager());</code>
|
||
|
//-----------------------------------------------------------------------
|
||
|
void SetImageManager(CXTPImageManager* pImageManager);
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Summary:
|
||
|
// Call this method to retrieve image manager associated with context.
|
||
|
// Returns:
|
||
|
// Pointer to CXTPImageManager that selected in context.
|
||
|
// Remarks:
|
||
|
// Function return XTPImageManager(); by default, call SetImageManager to set isolated images
|
||
|
//-----------------------------------------------------------------------
|
||
|
CXTPImageManager* GetImageManager() const;
|
||
|
|
||
|
|
||
|
//{{AFX_CODEJOCK_PRIVATE
|
||
|
// Internal methods
|
||
|
CXTPMarkupFont* GetFont(LOGFONT* pLogFont);
|
||
|
|
||
|
static BOOL AFX_CDECL CompareFont(LOGFONT* pLogFont1, LOGFONT* pLogFont2);
|
||
|
|
||
|
virtual BOOL OnWndMsg(CXTPMarkupUIElement* pUIElement, UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
|
||
|
|
||
|
void RaiseEvent(CXTPMarkupObject* pSource, CXTPMarkupRoutedEventArgs* pEventArgs);
|
||
|
|
||
|
CXTPMarkupDelegate* LookupDelegate(LPCWSTR lpszDelegate) const;
|
||
|
|
||
|
void CaptureMouse(CXTPMarkupInputElement* pUIElement);
|
||
|
void ReleaseMouseCapture(CXTPMarkupInputElement* pUIElement);
|
||
|
CXTPMarkupInputElement* GetMouseCapture() const;
|
||
|
|
||
|
CXTPMarkupKeyboardNavigation* GetKeyboardNavigation() const;
|
||
|
|
||
|
void AddRef();
|
||
|
void Release();
|
||
|
INT_PTR OnToolHitTest(CPoint point, TOOLINFO* pToolInfo);
|
||
|
|
||
|
public:
|
||
|
CRect GetClientBoundingRect(CXTPMarkupInputElement* pUIElement) const;
|
||
|
BOOL IsVisualChild(CXTPMarkupObject* pParent, CXTPMarkupObject* pChild) const;
|
||
|
|
||
|
private:
|
||
|
void HandleMouseMove(CXTPMarkupUIElement* pUIElement, CPoint point);
|
||
|
void HandleMouseEnter(CXTPMarkupInputElement* pUIElement, CPoint point);
|
||
|
BOOL HandleSetCursor();
|
||
|
BOOL HandleMouseWheel(int nDelta);
|
||
|
BOOL HandleMouseUpDown(UINT message, WPARAM wParam, LPARAM lParam);
|
||
|
|
||
|
void BuildInputList(CXTPMarkupObject* pUIElement, CInputElementCollection* list);
|
||
|
|
||
|
void Cleanup();
|
||
|
|
||
|
|
||
|
public:
|
||
|
virtual void OnInvalidateVisual(CXTPMarkupUIElement* pUIElement);
|
||
|
virtual void OnInvalidateArrange(CXTPMarkupUIElement* pUIElement);
|
||
|
|
||
|
public:
|
||
|
CXTPMarkupObject* CreateMarkupObject(CXTPMarkupType* pRuntimeClass);
|
||
|
void FinalizeMarkupObject(CXTPMarkupInputElement* pInputElement);
|
||
|
static void AFX_CDECL RegisterClasses();
|
||
|
|
||
|
public:
|
||
|
HWND m_hContextWnd;
|
||
|
|
||
|
protected:
|
||
|
COLORREF m_clrForeground;
|
||
|
LOGFONT m_logFont;
|
||
|
|
||
|
CXTPMarkupInputElement* m_pMouseOver;
|
||
|
CXTPMarkupInputElement* m_pMouseCapture;
|
||
|
CXTPMarkupUIElement* m_pActiveElement;
|
||
|
|
||
|
CXTPMarkupFontArray* m_pFonts;
|
||
|
|
||
|
CXTPMarkupEventHandlerMap* m_pHandlers;
|
||
|
CXTPMarkupDelegateMap* m_pDelegates;
|
||
|
|
||
|
CXTPMarkupKeyboardNavigation* m_pKeyboardNavigation;
|
||
|
|
||
|
CXTPToolTipContext* m_pToolTipContext;
|
||
|
|
||
|
friend class CXTPMarkupFont;
|
||
|
class CTooltipContext;
|
||
|
long m_dwRef;
|
||
|
|
||
|
CXTPImageManager* m_pImageManager;
|
||
|
|
||
|
BOOL m_bEnableGdiPlus;
|
||
|
//}}AFX_CODEJOCK_PRIVATE
|
||
|
|
||
|
friend class CXTPMarkupInputElement;
|
||
|
};
|
||
|
|
||
|
|
||
|
template<class TYPE>
|
||
|
class CXTPMarkupTypedSimpleStack
|
||
|
{
|
||
|
public:
|
||
|
CXTPMarkupTypedSimpleStack()
|
||
|
{
|
||
|
m_pHead = NULL;
|
||
|
m_pTail = NULL;
|
||
|
}
|
||
|
|
||
|
BOOL IsEmpty() const
|
||
|
{
|
||
|
return m_pHead == NULL;
|
||
|
}
|
||
|
|
||
|
void AddTail(TYPE* pPart)
|
||
|
{
|
||
|
if (m_pTail != NULL)
|
||
|
{
|
||
|
m_pTail->m_pNextChain = pPart;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pTail = m_pHead = pPart;
|
||
|
}
|
||
|
m_pTail = pPart;
|
||
|
}
|
||
|
|
||
|
void AddHead(TYPE* pPart)
|
||
|
{
|
||
|
if (m_pHead != NULL)
|
||
|
{
|
||
|
pPart->m_pNextChain = m_pHead;
|
||
|
m_pHead = pPart;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pTail = m_pHead = pPart;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TYPE* RemoveHead()
|
||
|
{
|
||
|
ASSERT(m_pHead);
|
||
|
if (!m_pHead)
|
||
|
return NULL;
|
||
|
|
||
|
TYPE* pHead = m_pHead;
|
||
|
|
||
|
if (m_pHead == m_pTail)
|
||
|
{
|
||
|
m_pHead = m_pTail = NULL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pHead = pHead->m_pNextChain;
|
||
|
ASSERT(m_pHead);
|
||
|
}
|
||
|
|
||
|
pHead->m_pNextChain = NULL;
|
||
|
|
||
|
return pHead;
|
||
|
}
|
||
|
|
||
|
void RemoveAll()
|
||
|
{
|
||
|
m_pHead = m_pTail = NULL;
|
||
|
}
|
||
|
|
||
|
TYPE* GetHead() const
|
||
|
{
|
||
|
return m_pHead;
|
||
|
}
|
||
|
|
||
|
TYPE* GetTail() const
|
||
|
{
|
||
|
return m_pTail;
|
||
|
}
|
||
|
|
||
|
BOOL Remove(TYPE* p)
|
||
|
{
|
||
|
ASSERT(p != NULL);
|
||
|
if (!p)
|
||
|
return FALSE;
|
||
|
|
||
|
if (m_pHead == m_pTail)
|
||
|
{
|
||
|
if (p != m_pHead)
|
||
|
return FALSE;
|
||
|
|
||
|
p->m_pNextChain = NULL;
|
||
|
m_pHead = m_pTail = NULL;
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
if (m_pHead == p)
|
||
|
{
|
||
|
m_pHead = p->m_pNextChain;
|
||
|
p->m_pNextChain = NULL;
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
TYPE* pTest = m_pHead;
|
||
|
while (pTest != NULL && pTest->m_pNextChain != p)
|
||
|
pTest = pTest->m_pNextChain;
|
||
|
|
||
|
if (pTest != NULL)
|
||
|
{
|
||
|
if (m_pTail == p) m_pTail = pTest;
|
||
|
pTest->m_pNextChain = p->m_pNextChain;
|
||
|
p->m_pNextChain = NULL;
|
||
|
return TRUE;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
TYPE* m_pHead;
|
||
|
TYPE* m_pTail;
|
||
|
};
|
||
|
|
||
|
AFX_INLINE LOGFONT* CXTPMarkupContext::GetDefaultLogFont() {
|
||
|
return &m_logFont;
|
||
|
}
|
||
|
AFX_INLINE COLORREF CXTPMarkupContext::GetDefaultForeground() {
|
||
|
return m_clrForeground;
|
||
|
}
|
||
|
AFX_INLINE void CXTPMarkupContext::SetDefaultTextColor(COLORREF clr) {
|
||
|
m_clrForeground = clr;
|
||
|
}
|
||
|
AFX_INLINE void CXTPMarkupContext::SetDefaultFont(HFONT font) {
|
||
|
LOGFONT lf;
|
||
|
GetObject(font, sizeof(LOGFONT), &lf);
|
||
|
m_logFont = lf;
|
||
|
}
|
||
|
AFX_INLINE void CXTPMarkupContext::SetDefaultFont(LOGFONT* pLogFont) {
|
||
|
m_logFont = *pLogFont;
|
||
|
}
|
||
|
AFX_INLINE CXTPMarkupKeyboardNavigation* CXTPMarkupContext::GetKeyboardNavigation() const {
|
||
|
return m_pKeyboardNavigation;
|
||
|
}
|
||
|
AFX_INLINE CXTPMarkupInputElement* CXTPMarkupContext::GetMouseCapture() const {
|
||
|
return m_pMouseCapture;
|
||
|
}
|
||
|
AFX_INLINE BOOL CXTPMarkupContext::IsGdiPlusEnabled() const {
|
||
|
return m_bEnableGdiPlus;
|
||
|
}
|
||
|
AFX_INLINE CXTPToolTipContext* CXTPMarkupContext::GetToolTipContext() const {
|
||
|
return m_pToolTipContext;
|
||
|
}
|
||
|
|
||
|
#define MARKUP_CREATE(object_class, context) (object_class*)context->CreateMarkupObject(MARKUP_TYPE(object_class))
|
||
|
|
||
|
#endif // !defined(__XTPMARKUPCONTEXT_H__)
|