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.

388 lines
19 KiB
C

2 years ago
// XTPMarkupUIElement.h: interface for the CXTPMarkupUIElement 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(__XTPMARKUPUIELEMENT_H__)
#define __XTPMARKUPUIELEMENT_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CXTPMarkupContext;
//===========================================================================
// Summary: Provides rendering support for XML Markup, which includes hit testing,
// coordinate transformation, and bounding box calculations.
//===========================================================================
class _XTP_EXT_CLASS CXTPMarkupVisual : public CXTPMarkupInputElement
{
DECLARE_MARKUPCLASS(CXTPMarkupVisual);
public:
//-------------------------------------------------------------------------
// Summary: Provides the base initialization for objects derived from the
// CXTPMarkupVisual class.
//-------------------------------------------------------------------------
CXTPMarkupVisual();
public:
//-------------------------------------------------------------------------
// Summary: Call this method to draw Visual object inside drawing context.
// Parameters: drawingContext - Drawing context to draw in.
//-------------------------------------------------------------------------
void Render(CXTPMarkupDrawingContext* drawingContext);
//-----------------------------------------------------------------------
// Input: point - Point to test.
// Summary: Detects if a point belongs to this object.
// Returns: The CXTPMarkupInputElement at the specified point.
//-----------------------------------------------------------------------
CXTPMarkupInputElement* InputHitTest(CPoint point) const;
public:
//-----------------------------------------------------------------------
// Summary: Gets the number of child elements for the Visual.
// Remarks: By default, a Visual has no children. Therefore, the default
// implementation always returns 0.
// Returns: The number of child elements.
//-----------------------------------------------------------------------
virtual int GetVisualChildrenCount() const;
//-----------------------------------------------------------------------
// Input: nIndex - The index of the visual object in the VisualCollection.
// Summary: Returns the specified Visual in the parent VisualCollection.
// Returns: The child in the VisualCollection at the specified index value.
//-----------------------------------------------------------------------
virtual CXTPMarkupVisual* GetVisualChild(int nIndex) const;
//-----------------------------------------------------------------------
// Summary: Number of child elements of object
// Returns: The number of logical child elements of this object.
//-----------------------------------------------------------------------
virtual int GetLogicalChildrenCount() const;
//-----------------------------------------------------------------------
// Summary: Returns logical child elements of this object.
// Parameters: nIndex - The index of the object in the logical objects tree.
// Returns: Returns the specified logical child object in the parent collection
// Remarks: LogicalChildren allows you to iterate over child elements.
// This is useful for elements that may not have a defined, dedicated collection but still contain more than one child element
//-----------------------------------------------------------------------
virtual CXTPMarkupObject* GetLogicalChild(int nIndex) const;
//-----------------------------------------------------------------------
// Summary: Returns bounding rectangle of the element
// Returns: Bounding rectangle of the element
//-----------------------------------------------------------------------
CRect GetBoundRect() const;
//-----------------------------------------------------------------------
// Summary: Gets the final render size of this element.
// Returns: The rendered size for this element.
//-----------------------------------------------------------------------
CSize GetRenderSize() const;
//-----------------------------------------------------------------------
// Summary: Gets or sets the offset value of the visual object.
// Returns: The offset value of the visual object.
//-----------------------------------------------------------------------
CPoint GetVisualOffset() const;
//-----------------------------------------------------------------------
// Input: rc - The available size provided by the element.
// Summary: Returns an alternative clipping geometry.
// Returns: The potential clipping geometry.
//-----------------------------------------------------------------------
virtual BOOL GetLayoutClip(CRect& rc) const;
//-----------------------------------------------------------------------
// Summary: Gets the visual tree parent of the visual object.
// Returns: The Visual parent.
//-----------------------------------------------------------------------
CXTPMarkupVisual* GetVisualParent() const;
protected:
//-----------------------------------------------------------------------
// Summary: When overridden in a derived class, participates in rendering operations that are directed by the layout system
// Parameters: drawingContext - Drawing context to draw in.
//-----------------------------------------------------------------------
virtual void OnRender(CXTPMarkupDrawingContext* drawingContext);
//-----------------------------------------------------------------------
// Summary: This method is called to render focus rectangle of focused object
// Parameters: drawingContext - Drawing context to draw in.
//-----------------------------------------------------------------------
virtual void OnRenderFocusVisual(CXTPMarkupDrawingContext* drawingContext);
//-----------------------------------------------------------------------
// Summary: Override this method in derived class to provide visual hit testing of child object
// Parameters: point - POisiotn of cursor to test.
//-----------------------------------------------------------------------
virtual CXTPMarkupInputElement* InputHitTestOverride(CPoint point) const;
virtual void RenderClipped(CXTPMarkupDrawingContext* drawingContext);
//{{AFX_CODEJOCK_PRIVATE
// Internal methods
protected:
void UpdateBoundRect();
//}}AFX_CODEJOCK_PRIVATE
protected:
CPoint m_ptVisualOffset; // The offset value of the visual object.
CSize m_szRenderSize; // The rendered size for this element.
CRect m_rcBoundRect; // Bounding rectangle of the element
};
//===========================================================================
// Summary: Base class for XML Markup core level implementations.
//===========================================================================
class _XTP_EXT_CLASS CXTPMarkupUIElement : public CXTPMarkupVisual
{
DECLARE_MARKUPCLASS(CXTPMarkupUIElement);
protected:
//-------------------------------------------------------------------------
// Summary: Initializes a new instance of the CXTPMarkupUIElement class.
//-------------------------------------------------------------------------
CXTPMarkupUIElement();
//-----------------------------------------------------------------------
// Summary:
// Destroys a CXTPMarkupUIElement object, handles cleanup and deallocation
//-----------------------------------------------------------------------
virtual ~CXTPMarkupUIElement();
public:
//-----------------------------------------------------------------------
// Input: rcFinalRect - The final size that the parent computes for the child
// element, provided as a CRect instance.
// Summary: Positions child elements and determines a size for a CXTPMarkupUIElement.
// Parent elements call this method from their ArrangeOverride implementation
// to form a recursive layout update. This method constitutes the
// second pass of a layout update.
//-----------------------------------------------------------------------
void Arrange(CRect rcFinalRect);
//-----------------------------------------------------------------------
// Input: pDC - Pointer to a CXTPMarkupDrawingContext.
// szAvailableSize - The available space that a parent element can allocate
// a child element. A child element can request a larger
// space than what is available; the provided size might
// be accommodated if scrolling is possible in the
// content model for the current element.
// Summary: Updates the DesiredSize of a CXTPMarkupUIElement. Parent elements call
// this method from their own MeasureOvveride implementations to form
// a recursive layout update. Calling this method constitutes
// the first pass (the "Measure" pass) of a layout update.
//-----------------------------------------------------------------------
void Measure(CXTPMarkupDrawingContext* pDC, CSize szAvailableSize);
public:
//-----------------------------------------------------------------------
// Summary: Gets the size that this element computed during the measure pass of the layout process.
// Returns: The computed size, which becomes the desired size for the arrange pass.
// Remarks: DesiredSize is typically checked as one of the measurement
// factors when you implement layout behavior overrides such
// as ArrangeOverride, MeasureOverride or OnRender.
//-----------------------------------------------------------------------
CSize GetDesiredSize() const;
//-----------------------------------------------------------------------
// Summary: Gets the final render size of this element.
// Returns: The rendered size for this element.
//-----------------------------------------------------------------------
CRect GetFinalRect() const;
//-----------------------------------------------------------------------
// Summary: Gets the user interface (UI) visibility of this element. This
// is a dependency property.
// Returns: XTPMarkupVisibility enumerator.
//-----------------------------------------------------------------------
XTPMarkupVisibility GetVisibility() const;
//-----------------------------------------------------------------------
// Input: visibility - A value of the XTPMarkupVisibility enumeration. The default value is Visible.
// Summary: Sets the user interface (UI) visibility of this element. This
// is a dependency property.
//-----------------------------------------------------------------------
void SetVisibility(XTPMarkupVisibility visibility);
//-----------------------------------------------------------------------
// Summary: Gets or sets a value that indicates whether the element can
// receive focus. This is a dependency property.
// Returns: TRUE if the element is focusable; otherwise false. The
// default is false, but see Remarks.
//-----------------------------------------------------------------------
BOOL IsFocusable() const;
//-----------------------------------------------------------------------
// Summary: Gets a value indicating whether this element is visible in
// the user interface (UI). This is a dependency property.
// Returns: true if the element is visible; otherwise, false.
//-----------------------------------------------------------------------
BOOL IsVisible() const;
//-----------------------------------------------------------------------
// Summary: Gets or sets a value indicating whether this element is
// enabled in the user interface (UI). This is a dependency property.
// Returns: true if the element is enabled; otherwise, false. The
// default value is true.
//-----------------------------------------------------------------------
BOOL IsEnabled() const;
public:
//-------------------------------------------------------------------------
// Summary: Invalidates the arrange state (layout) for the element.
// Remarks: Frequent calls to InvalidateArrange have significant performance
// consequences. Therefore, avoid calling this method unless you
// absolutely require precise layout state for subsequent calls to
// other APIs in your code.
//-------------------------------------------------------------------------
virtual void InvalidateArrange();
//-------------------------------------------------------------------------
// Summary: Invalidates the rendering of the element, and forces a complete
// new layout pass. OnRender is called after the layout cycle is completed.
// Remarks: This method calls InvalidateArrange internally.
//-------------------------------------------------------------------------
virtual void InvalidateVisual();
//-------------------------------------------------------------------------
// Summary: Invalidates the measurement state (layout) for the element.
// Remarks: Calling this method also calls InvalidateArrange internally,
// there is no need to call InvalidateMeasure and
// InvalidateArrange in succession.
//-------------------------------------------------------------------------
virtual void InvalidateMeasure();
protected:
//-----------------------------------------------------------------------
// Input: rcFinalRect - The final area within the parent that element
// should use to arrange itself and its child elements.
// Summary: Defines the template for the core-level arrange layout definition.
//-----------------------------------------------------------------------
virtual void ArrangeCore(CRect rcFinalRect);
//-----------------------------------------------------------------------
// Input: szAvailableSize - The available size that the parent element can
// allocate for the child.
// pDC - Device context.
// Summary: When overridden in a derived class, provides measurement logic
// for sizing this element properly, with consideration of the
// size of any child element content.
// Returns: The desired size of this element in layout.
//-----------------------------------------------------------------------
virtual CSize MeasureCore(CXTPMarkupDrawingContext* pDC, CSize szAvailableSize);
//-----------------------------------------------------------------------
// Input: rc - The available size provided by the element.
// Summary: Returns an alternative clipping geometry that represents the
// region that would be clipped if m_pClipToBoundsProperty were set to true.
// Returns: The potential clipping geometry.
//-----------------------------------------------------------------------
virtual BOOL GetLayoutClip(CRect& rc) const;
//-----------------------------------------------------------------------
// Summary: Override this method to provide custom reaction on InvalidateMeasure call.
// Parameters: pDC - Device context to measure.
//-----------------------------------------------------------------------
virtual void InvalidateMeasureOverride(CXTPMarkupDrawingContext* pDC);
protected:
CSize m_szDesiredSize; // Gets the size that this element computed during the measure pass of the layout process.
CRect m_rcFinalRect; // Final position of visual element
BOOL m_bMeasureDirty; // TRUE if object haven't recalculate its size
BOOL m_bNeverMeasured; // TRUE if object never run Measure to update its size
CSize m_szPreviousAvailableSize; // Previous available size of measure call
BOOL m_bArrangeDirty; // TRUE if object position can be invalid
BOOL m_bNeverArranged; // TRUE if Arrange never called for this object
BOOL m_bArrangeInProgress; // TRUE if Arrange is currently executed.
BOOL m_bMeasureInProgress; // TRUE if Measure is currently executed.
public:
static CXTPMarkupDependencyProperty* m_pClipToBoundsProperty; // Gets or sets a value indicating whether to
// clip the content of this element (or content
// coming from the child elements of this element)
// to fit into the size of the containing element. This is a dependency property.
static CXTPMarkupDependencyProperty* m_pVisibilityProperty; // A value indicating whether this element is visible in the user interface (UI).
static CXTPMarkupDependencyProperty* m_pFocusableProperty; // A value that indicates whether the element can receive focus.
static CXTPMarkupDependencyProperty* m_pIsEnabledProperty; // A value indicating whether this element is enabled in the user interface (UI).
};
AFX_INLINE void CXTPMarkupVisual::OnRender(CXTPMarkupDrawingContext* /*drawingContext*/) {
}
AFX_INLINE void CXTPMarkupVisual::OnRenderFocusVisual(CXTPMarkupDrawingContext* /*drawingContext*/) {
}
AFX_INLINE CSize CXTPMarkupVisual::GetRenderSize() const {
return m_szRenderSize;
}
AFX_INLINE CRect CXTPMarkupVisual::GetBoundRect() const {
return m_rcBoundRect;
}
AFX_INLINE CPoint CXTPMarkupVisual::GetVisualOffset() const {
return m_ptVisualOffset;
}
AFX_INLINE CSize CXTPMarkupUIElement::GetDesiredSize() const {
return m_szDesiredSize;
}
AFX_INLINE CRect CXTPMarkupUIElement::GetFinalRect() const {
return m_rcFinalRect;
}
AFX_INLINE XTPMarkupVisibility CXTPMarkupUIElement::GetVisibility() const {
CXTPMarkupEnum* pValue = MARKUP_STATICCAST(CXTPMarkupEnum, GetValue(m_pVisibilityProperty));
return pValue ? (XTPMarkupVisibility)(int)*pValue : xtpMarkupVisibilityVisible;
}
AFX_INLINE void CXTPMarkupUIElement::SetVisibility(XTPMarkupVisibility visibility) {
SetValue(m_pVisibilityProperty, CXTPMarkupEnum::CreateValue(visibility));
}
AFX_INLINE BOOL CXTPMarkupUIElement::IsFocusable() const {
CXTPMarkupBool* pValue = MARKUP_STATICCAST(CXTPMarkupBool, GetValue(m_pFocusableProperty));
return pValue ? (BOOL)*pValue : FALSE;
}
AFX_INLINE BOOL CXTPMarkupUIElement::IsVisible() const {
return GetVisibility() == xtpMarkupVisibilityVisible;
}
AFX_INLINE BOOL CXTPMarkupUIElement::IsEnabled() const {
CXTPMarkupBool* pValue = MARKUP_STATICCAST(CXTPMarkupBool, GetValue(m_pIsEnabledProperty));
return pValue ? (BOOL)*pValue : TRUE;
}
#endif // !defined(__XTPMARKUPUIELEMENT_H__)