--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiAnchorLayout.h Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,786 @@
+/*
+* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Definition for CHuiAnchorLayout. Anchor layouts allow specifying the
+* placement of child visuals using anchors, that can be relative or absolute
+* coordinates and attached to a specific edge of the layout.
+*
+*/
+
+
+
+#ifndef __HUIANCHORLAYOUT_H__
+#define __HUIANCHORLAYOUT_H__
+
+
+#include <e32base.h>
+#include <uiacceltk/HuiLayout.h>
+#include <uiacceltk/HuiTimedPoint.h>
+
+
+/* Forward declarations */
+class CHuiEnv;
+class CHuiLayout;
+class CHuiControl;
+
+
+/** for internal use only */
+enum THuiAnchorBitmask
+ {
+ EHuiAnchorBitmaskHorizontal = 0x000F,
+ EHuiAnchorBitmaskVertical = 0x00F0
+ };
+
+/** for internal use only */
+enum THuiAnchorBitmaskShift
+ {
+ EHuiAnchorBitmaskShiftHorizontal = 0,
+ EHuiAnchorBitmaskShiftVertical = 4
+ };
+
+/** for internal use only */
+enum THuiAnchorAxis
+ {
+ EHuiAnchorAxisHorizontal = 0,
+ EHuiAnchorAxisVertical = 1
+ };
+
+/** for internal use only */
+enum THuiAnchorProximity
+ {
+ EHuiAnchorProximityNone = 0,
+ EHuiAnchorProximitySize,
+ EHuiAnchorProximityNear,
+ EHuiAnchorProximityCenter,
+ EHuiAnchorProximityFar
+ };
+
+/**
+ * Anchor type. Used to determine which edge or corner of a child visual is
+ * defined by an anchor.
+ *
+ * @note that if width or height are used as one anchor, they must be combined
+ * with an appropriate anchor in order to unambiguously determine the size and
+ * position of the child.
+ */
+enum THuiAnchorType
+ {
+ EHuiAnchorTypeNone = EHuiAnchorProximityNone,
+
+ EHuiAnchorTypeWidth = EHuiAnchorProximitySize << EHuiAnchorBitmaskShiftHorizontal,
+ EHuiAnchorTypeLeft = EHuiAnchorProximityNear << EHuiAnchorBitmaskShiftHorizontal,
+ EHuiAnchorTypeHCenter = EHuiAnchorProximityCenter << EHuiAnchorBitmaskShiftHorizontal,
+ EHuiAnchorTypeRight = EHuiAnchorProximityFar << EHuiAnchorBitmaskShiftHorizontal,
+
+ EHuiAnchorTypeHeight = EHuiAnchorProximitySize << EHuiAnchorBitmaskShiftVertical,
+ EHuiAnchorTypeTop = EHuiAnchorProximityNear << EHuiAnchorBitmaskShiftVertical,
+ EHuiAnchorTypeVCenter = EHuiAnchorProximityCenter << EHuiAnchorBitmaskShiftVertical,
+ EHuiAnchorTypeBottom = EHuiAnchorProximityFar << EHuiAnchorBitmaskShiftVertical,
+
+
+ EHuiAnchorTypeSize = EHuiAnchorTypeHeight | EHuiAnchorTypeWidth,
+
+ EHuiAnchorTypeTopLeft = EHuiAnchorTypeTop | EHuiAnchorTypeLeft,
+ EHuiAnchorTypeTopCenter = EHuiAnchorTypeTop | EHuiAnchorTypeHCenter,
+ EHuiAnchorTypeTopRight = EHuiAnchorTypeTop | EHuiAnchorTypeRight,
+
+ EHuiAnchorTypeCenterLeft = EHuiAnchorTypeVCenter | EHuiAnchorTypeLeft,
+ EHuiAnchorTypeCenter = EHuiAnchorTypeVCenter | EHuiAnchorTypeHCenter,
+ EHuiAnchorTypeCenterRight = EHuiAnchorTypeVCenter | EHuiAnchorTypeRight,
+
+ EHuiAnchorTypeBottomLeft = EHuiAnchorTypeBottom | EHuiAnchorTypeLeft,
+ EHuiAnchorTypeBottomCenter = EHuiAnchorTypeBottom | EHuiAnchorTypeHCenter,
+ EHuiAnchorTypeBottomRight = EHuiAnchorTypeBottom | EHuiAnchorTypeRight
+ };
+
+/**
+ * Anchor origin, relative to a particular edge or corner. Direction is
+ * measured along positive x and y axes, as modified by the metric used.
+ */
+enum THuiAnchorAttachmentOrigin
+ {
+ EHuiAnchorAttachmentOriginNone = EHuiAnchorTypeNone,
+
+ EHuiAnchorAttachmentOriginLeft = EHuiAnchorTypeLeft,
+ EHuiAnchorAttachmentOriginHCenter = EHuiAnchorTypeHCenter,
+ EHuiAnchorAttachmentOriginRight = EHuiAnchorTypeRight,
+
+ EHuiAnchorAttachmentOriginTop = EHuiAnchorTypeTop,
+ EHuiAnchorAttachmentOriginVCenter = EHuiAnchorTypeVCenter,
+ EHuiAnchorAttachmentOriginBottom = EHuiAnchorTypeBottom,
+
+ EHuiAnchorAttachmentOriginTopLeft = EHuiAnchorTypeTopLeft,
+ EHuiAnchorAttachmentOriginTopCenter = EHuiAnchorTypeTopCenter,
+ EHuiAnchorAttachmentOriginTopRight = EHuiAnchorTypeTopRight,
+
+ EHuiAnchorAttachmentOriginCenterLeft = EHuiAnchorTypeCenterLeft,
+ EHuiAnchorAttachmentOriginCenter = EHuiAnchorTypeCenter,
+ EHuiAnchorAttachmentOriginCenterRight = EHuiAnchorTypeCenterRight,
+
+ EHuiAnchorAttachmentOriginBottomLeft = EHuiAnchorTypeBottomLeft,
+ EHuiAnchorAttachmentOriginBottomCenter = EHuiAnchorTypeBottomCenter,
+ EHuiAnchorAttachmentOriginBottomRight = EHuiAnchorTypeBottomRight
+ };
+
+/**
+ * Type of attachment point used when attaching an anchor to another
+ * anchor in the same layout.
+ */
+enum THuiAnchorAttachmentType
+ {
+ EHuiAnchorAttachToParent = -1
+ };
+
+
+/**
+ * Determines which corner of a child visual is positioned by the anchor
+ * @deprecated, only retained for use with deprecated SetAnchor routines, use
+ * THuiAnchorAttachmentOrigin instead with new APIs
+ */
+enum THuiAnchor
+ {
+ /** Anchor that defines the top left corner of a visual. */
+ EHuiAnchorTopLeft,
+
+ /** Anchor that defines the bottom right corner of a visual. */
+ EHuiAnchorBottomRight
+ };
+
+
+/**
+ * Anchor origins.
+ * @deprecated, only retained for use with deprecated SetAnchor routines, use
+ * THuiAnchorAttachmentOrigin instead with new APIs
+ */
+enum THuiAnchorOrigin
+ {
+ EHuiAnchorOriginLeft,
+ EHuiAnchorOriginHCenter,
+ EHuiAnchorOriginRight,
+ EHuiAnchorOriginTop,
+ EHuiAnchorOriginVCenter,
+ EHuiAnchorOriginBottom
+ };
+
+
+/**
+ *Anchor metric types, for offsets and sizes.
+ * @deprecated, only retained for use with deprecated SetAnchor routines, use
+ * THuiMetric instead with new APIs
+ */
+enum THuiAnchorMetric
+ {
+ /** Use absolute pixel coordinates to specify the values. */
+ EHuiAnchorMetricAbsolute,
+ /**
+ * Use the size of the visual
+ * either normalized between 0.0 (at origin) and 1.0 (farthest away edge)
+ * or -0.5 (min) and +0.5 (0.0 being always at the origin). For example if you
+ * use EHuiAnchorOriginLeft with EHuiAnchorMetricRelativeToSize, the
+ * left edge is at 0.0, and the right edge at 1.0. But if you use any of
+ * the center origins (EHuiAnchorOriginHCenter or EHuiAnchorOriginVCenter),
+ * then the left/top edge is at -0.5 and right/top edge is at +0.5.
+ */
+ EHuiAnchorMetricRelativeToSize
+ };
+
+
+/**
+ * CHuiAnchorLayout is a layout that allows visuals to be positioned with
+ * flexible relative anchor points.
+ *
+ * To use this class, an anchor layout is created, and then a number of anchor
+ * points are added to it using calls to the SetAnchor() method. The visuals
+ * inside the layout will be stretched between these anchor points.
+ *
+ * By default, each child is set to cover the entire anchor layout area.
+ * @todo This seems to be incorrect. Default behaviour seems to be that
+ * a child is invisible until its anchor points have been set.
+ *
+ * @see CHuiAnchorLayout::SetAnchor() for more information about anchors.
+ */
+NONSHARABLE_CLASS(CHuiAnchorLayout) : public CHuiLayout
+ {
+public:
+
+ /* Constructors and destructor. */
+
+ /**
+ * Construct a new anchor layout and give its ownership to a control.
+ *
+ * @param aOwnerControl Owner control.
+ * @param aParentLayout Parent layout for the new anchor layout.
+ */
+ IMPORT_C static CHuiAnchorLayout* AddNewL(CHuiControl& aOwnerControl,
+ CHuiLayout* aParentLayout = 0);
+
+ /**
+ * Constructor.
+ */
+ CHuiAnchorLayout(MHuiVisualOwner& aOwner);
+
+ /**
+ * Second-phase constructor.
+ */
+ void ConstructL();
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CHuiAnchorLayout();
+
+
+ /* Methods. */
+
+ /**
+ * Resets all the anchors.
+ */
+ IMPORT_C void Reset();
+
+ /**
+ * Anchors a child visual's corner to specific position within this layout.
+ *
+ * @deprecated, use new @c Attach APIs with THuiMetric support.
+ * See the relevant API documentation for an example of how to migrate your code
+ *
+ * Each child can have two anchors: the top left and bottom right corners
+ * of the child visual. These anchors can be fastened to any point within
+ * this layout, as specified by the other parameters.
+ *
+ * In a typical case you set two anchors (both EHuiAnchorTopLeft and
+ * EHuiAnchorBottomRight), which specifies both size and position for the
+ * child. However it is also possible to set only the EHuiAnchorTopLeft
+ * anchor, which only positions the child without affecting it's size.
+ *
+ * @see RemoveAnchor() to remove an achor definition.
+ *
+ * @note After updating anchors, you should call
+ * CHuiLayout::UpdateChildrenLayout(), to cause the anchors to be
+ * applied to child positions and/or sizes.
+ *
+ * For example the following code will anchor child visual number 0 in
+ * the middle of the layout, with a 25% border around the outside:
+ *
+ * \code
+ * // set top left corner position of 1st child ..
+ * iLayout->SetAnchor(EHuiAnchorTopLeft, 0,
+ * EHuiAnchorOriginLeft,
+ * EHuiAnchorOriginTop,
+ * EHuiAnchorMetricRelativeToSize, // With EHuiAnchorOriginLeft means that 0.0 goes to left edge, and 1.0 to the right
+ * EHuiAnchorMetricRelativeToSize, // With EHuiAnchorOriginTop means that 0.0 goes to top edge, and 1.0 to the bottom
+ * THuiTimedPoint(0.25, 0.25));
+ * // .. and set the bottom right corner also to fix the size
+ * iLayout->SetAnchor(EHuiAnchorBottomRight, 0,
+ * EHuiAnchorOriginRight,
+ * EHuiAnchorOriginBottom,
+ * EHuiAnchorMetricRelativeToSize,
+ * EHuiAnchorMetricRelativeToSize,
+ * THuiTimedPoint(-0.25, -0.25));
+ * \endcode
+ *
+ * @todo Specifying a transition in the timed point may be useless:
+ * layouts are evaluated pretty seldom.
+ *
+ * @param aAnchor Type of the anchor (either EHuiAnchorTopLeft for the
+ * top left corner or EHuiAnchorBottomRight for bottom right
+ * corner).
+ * @param aOrdinal Ordinal of the child visual that this anchor applies to.
+ * @param aHorizOrigin Horizontal origin for the anchor position (aPosition).
+ * Defines the point inside the layout on which the
+ * evaluation of the child's placement is based. May be
+ * EHuiAnchorOriginLeft (left edge),
+ * EHuiAnchorOriginHCenter (center) or
+ * EHuiAnchorOriginRight (right edge).
+ * @param aVertOrigin Vertical origin for the anchor position (aPosition).
+ * Defines the point inside the layout on which the
+ * evaluation of the child's placement is based. Possible options
+ * are EHuiAnchorOriginTop (top), EHuiAnchorOriginVCenter
+ * (center) and EHuiAnchorOriginBottom (bottom).
+ * @param aHorizMetric Specifies the metric to use to define the
+ * horizontal position: EHuiAnchorMetricAbsolute to use
+ * absolute pixels or EHuiAnchorMetricRelativeToSize to
+ * use normalized values relative to layout size.
+ * @param aVertMetric Specifies the metric used in the vertical position:
+ * EHuiAnchorMetricAbsolute to use absolute pixels or
+ * EHuiAnchorMetricRelativeToSize to use normalized
+ * values relative to layout size.
+ * @param aPosition The achor position as an offset from the origin point,
+ * applied using the metric specified with aHorizMetric
+ * and aVertMetric.
+ * @return Error code
+ *
+ */
+ IMPORT_C TInt SetAnchor(THuiAnchor aAnchor, TInt aOrdinal,
+ THuiAnchorOrigin aHorizOrigin,
+ THuiAnchorOrigin aVertOrigin,
+ THuiAnchorMetric aHorizMetric,
+ THuiAnchorMetric aVertMetric,
+ const THuiTimedPoint& aPosition);
+ /**
+ * Convenience method for setting top left and bottom right anchors in a single call.
+ *
+ * This method sets size-relative anchors for a single child visual.
+ *
+ * @param aOrdinal Ordinal of child visual to set anchors for.
+ * @param aTlHorizOrigin Horizontal origin for the top left anchor position (aPosition).
+ * Defines the point inside the layout on which the
+ * evaluation of the child's placement is based. May be
+ * EHuiAnchorOriginLeft (left edge),
+ * EHuiAnchorOriginHCenter (center) or
+ * EHuiAnchorOriginRight (right edge).
+ * @param aTlVertOrigin Vertical origin for the top left anchor position (aPosition).
+ * Defines the point inside the layout on which the
+ * evaluation of the child's placement is based. Possible options
+ * are EHuiAnchorOriginTop (top), EHuiAnchorOriginVCenter
+ * (center) and EHuiAnchorOriginBottom (bottom).
+ * @param aTopLeftOffset The achor position as an offset from the origin point,
+ * @param aBrHorizOrigin Horizontal origin for the bottom right anchor position (aPosition).
+ * Defines the point inside the layout on which the
+ * evaluation of the child's placement is based. May be
+ * EHuiAnchorOriginLeft (left edge),
+ * EHuiAnchorOriginHCenter (center) or
+ * EHuiAnchorOriginRight (right edge).
+ * @param aBrVertOrigin Vertical origin for the bottom right anchor position (aPosition).
+ * Defines the point inside the layout on which the
+ * evaluation of the child's placement is based. Possible options
+ * are EHuiAnchorOriginTop (top), EHuiAnchorOriginVCenter
+ * (center) and EHuiAnchorOriginBottom (bottom).
+ * @param aBottomRightOffset The achor position as an offset from the origin point,
+ * @return Error code
+ *
+ * @see CHuiAnchorLayout::SetAnchor() for more information about anchors.
+ */
+ IMPORT_C TInt SetRelativeAnchorRect(TInt aOrdinal,
+ THuiAnchorOrigin aTlHorizOrigin,
+ THuiAnchorOrigin aTlVertOrigin,
+ const THuiRealPoint& aTopLeftOffset,
+ THuiAnchorOrigin aBrHorizOrigin,
+ THuiAnchorOrigin aBrVertOrigin,
+ const THuiRealPoint& aBottomRightOffset);
+
+ /**
+ * Undefines an anchor.
+ * @see SetAnchor()
+ * @deprecated instead use @c Detach and see relevant API documentation for
+ * example code
+ */
+ IMPORT_C void RemoveAnchor(THuiAnchor aAnchor, TInt aOrdinal);
+
+
+ /**
+ * Anchors one or more edges of a child visual to a specific position
+ * within this layout. When combined together, a correctly specified group
+ * of anchors provide sufficient information for the anchor layout to
+ * determine the size and position of the child visual.
+ *
+ * Each child can have up to four anchors, each of which correspond to an
+ * edge. A corner anchor is equivalent to supplying two similar orthogonal
+ * edge anchors, so typically it is easier to use corners. Therefore, each
+ * child can have up to two corner anchors, or a mixture of corners and
+ * edges. Alternatively, four similar edges can be specified in one call by
+ * supplying a box metric.
+ *
+ * In a typical case you set two different corner anchors (for example both
+ * EHuiAnchorTypeTopLeft and EHuiAnchorTypeBottomRight), taking care
+ * to ensure that they are sufficiently orthogonal in order to define all needed
+ * coordinates. However it is also possible to set only one corner anchor,
+ * which only positions the child without affecting it's size. Alternatively,
+ * one anchor can be specified as a corner, and then the other can be
+ * specified as EHuiAnchorTypeSize; similarly the coordinates along
+ * one axis can be specified by an appropriate combination of edge and
+ * width or height anchors.
+ *
+ * The position of each anchor relative to this layout is determined
+ * by the choice of origin (i.e. which point of the layout the
+ * child's is attached to), and the offset position, which is specified
+ * using a THuiMetric or related type. All available features of
+ * THuiMetric may be used to affect the resulting position, providing the
+ * benefit that different metrics can be used for each child. Also note
+ * that the metric used will override the base unit that has been set in
+ * this layout.
+ *
+ * @note if called again to specify the same anchor types
+ * that have been previous set, those definitions will be updated.
+ * However, in order to change type, it is necessary to detach a
+ * previously defined anchor first, as there can only be a maximum
+ * of two anchors along each axis (for a given child).
+ * @note that size anchor type and attachment origins are not
+ * currenly supported.
+ * @note that center anchor type is not currently supported.
+ * @note if an anchor of similar type has already been defined it will be
+ * replaced, however in general it is easier to manage anchors by
+ * removing them all and starting again.
+ * @note After updating anchors, you should call
+ * @c CHuiLayout::UpdateChildrenLayout(), to cause the anchors to be
+ * applied to child positions and/or sizes.
+ *
+ * @see @c Detach() to remove achor definitions for a given ordinal
+ *
+ * For example the following code will anchor three child visuals 0, 1, 2 in
+ * the middle of the layout, with a 25% border around the outside, such that
+ * they all occupy the same position:
+ *
+ * \code
+ * // using edges...
+ * iLayout->Attach(0,
+ * EHuiAnchorTypeLeft,
+ * THuiXYMetric(0.25, EHuiMetricNormalized),
+ * EHuiAnchorAttachmentOriginLeft);
+ * iLayout->Attach(0,
+ * EHuiAnchorTypeRight,
+ * THuiXYMetric(-0.25, EHuiMetricNormalized),
+ * EHuiAnchorAttachmentOriginRight);
+ * iLayout->Attach(0,
+ * EHuiAnchorTypeTop,
+ * THuiXYMetric(0.25, EHuiMetricNormalized),
+ * EHuiAnchorAttachmentOriginTop);
+ * iLayout->Attach(0,
+ * EHuiAnchorTypeBottom,
+ * THuiXYMetric(-0.25, EHuiMetricNormalized),
+ * EHuiAnchorAttachmentOriginBottom);
+ *
+ * // using corners...
+ * iLayout->Attach(1,
+ * EHuiAnchorTypeTopLeft,
+ * THuiXYMetric(0.25, EHuiMetricNormalized),
+ * EHuiAnchorAttachmentOriginTopLeft);
+ * iLayout->Attach(1,
+ * EHuiAnchorTypeBottomRight,
+ * THuiXYMetric(-0.25, EHuiMetricNormalized),
+ * EHuiAnchorAttachmentOriginBottomRight);
+ *
+ * // .. and using a box
+ * iLayout->Attach(2, THuiBoxMetric(
+ * THuiMetric(0.25, EHuiMetricNormalized),
+ * THuiMetric(-0.25, EHuiMetricNormalized),
+ * THuiMetric(0.25, EHuiMetricNormalized),
+ * THuiMetric(-0.25, EHuiMetricNormalized)));
+ * \endcode
+ *
+ * @param aOrdinal Ordinal of the child visual that this anchor applies to
+ * @param aType Type of the anchor, which determines how and where the anchor attaches to this layout
+ * @param aOffset The anchor position as an offset from the origin point,
+ * specifying both the magnitude and units of the offset for the relevant axes.
+ * @param aAttachmentOrigin Origin for the anchor offset.
+ * Defines the point inside the layout from which the
+ * evaluation of the child's placement is based.
+ * @param aAttachmentOrdinal the ordinal of the anchor to which this anchor is attached,
+ * use the default value of EHuiAnchorAttachToParent in order to attach to parent
+ * @return Error code
+ *
+ */
+ IMPORT_C TInt Attach(
+ TInt aOrdinal,
+ THuiAnchorType aType,
+ const THuiMetric& aOffset,
+ THuiAnchorAttachmentOrigin aAttachmentOrigin,
+ TInt aAttachmentOrdinal = EHuiAnchorAttachToParent);
+
+ /**
+ * Attach a corner of a child visual to a specific position
+ * within this layout.
+ *
+ * @see Attach() for all API documentation
+ */
+ IMPORT_C TInt Attach(
+ TInt aOrdinal,
+ THuiAnchorType aType,
+ const THuiXYMetric& aOffset,
+ THuiAnchorAttachmentOrigin aAttachmentOrigin = EHuiAnchorAttachmentOriginTopLeft,
+ TInt aAttachmentOrdinal = EHuiAnchorAttachToParent);
+
+ /**
+ * Attach all four edges of a child visual to a specific position
+ * within this layout.
+ *
+ * @note, will detach all existing edges first. In case of error, all
+ * edges that were successfull added before the error occurred will be
+ * detached.
+ *
+ * @see Attach() for all API documentation
+ * @param aAttachmentOrigin if set to EHuiAnchorAttachmentOriginNone, each edge will
+ * be attached to the corresponding edge
+ */
+ IMPORT_C TInt Attach(
+ TInt aOrdinal,
+ const THuiBoxMetric& aOffset,
+ THuiAnchorAttachmentOrigin aAttachmentOrigin = EHuiAnchorAttachmentOriginNone,
+ TInt aAttachmentOrdinal = EHuiAnchorAttachToParent);
+
+
+ /**
+ * Undefines all anchors for a specified ordinal. Has no effect if the specified ordinal
+ * cannot be found.
+ *
+ * @see Attach()
+ *
+ * @param aOrdinal the ordinal of the anchor to remove
+ */
+ IMPORT_C void Detach(TInt aOrdinal);
+
+ /**
+ * Undefines an anchor. Has no effect if the specified anchor type
+ * cannot be found. For example to detach a corner anchor with ordinal
+ * equal to zero:
+ *
+ * \code
+ * iLayout->Detach(0, EAlfAnchorTypeTopLeft);
+ * \endcode
+ *
+ * @see Attach()
+ * @note can be used to separately remove the edges
+ * that were attached using different combinations of types,
+ * but try to be consistent in using either edges or corners to avoid
+ * confusion.
+ *
+ * @param aOrdinal the ordinal of the anchor to remove
+ * @param aType the edge relating to the anchor to remove
+ */
+ IMPORT_C void Detach(TInt aOrdinal, THuiAnchorType aType);
+
+ /**
+ * Overridden version of size changing updates the layout of child visuals.
+ *
+ * @param aSize New size for the layout.
+ * @param aTransitionTime Time for the transition to new size to take
+ * place.
+ */
+ IMPORT_C void SetSize(const THuiRealSize& aSize, TInt aTransitionTime=0);
+
+ /**
+ * Determines the size of a child visual according to the layout.
+ *
+ * @note if an anchor is defined at the specified ordinal position, the
+ * metric belonging to the anchor will override the metric specified
+ * in this layout's base unit.
+ *
+ * @param aOrdinal Layout ordinal of the child visual.
+ * @param aSize New target size for the child.
+ *
+ * @return <code>ETrue</code>, if a new size was determined. Otherwise,
+ * <code>EFalse</code> is returned and no size changes are
+ * needed.
+ */
+ IMPORT_C virtual TBool ChildSize(TInt aOrdinal, TSize& aSize);
+
+ /**
+ * Determines the position of a child visual according to the layout.
+ *
+ * @note if an anchor is defined at the specified ordinal position, the
+ * metric belonging to the anchor will override the metric specified
+ * in this layout's base unit.
+ *
+ * @param aOrdinal Layout ordinal of the child visual.
+ * @param aPos New position for the child.
+ *
+ * @return <code>ETrue</code>, if a new position was determined.
+ * Otherwise, <code>EFalse</code> is returned and no position
+ * changes are needed.
+ */
+ IMPORT_C virtual TBool ChildPos(TInt aOrdinal, TPoint& aPos);
+
+ /**
+ * Determines the position and size of a child visual according to the layout.
+ * The child position is determined using the base units of the layout. If a
+ * valid anchor has been defined then the size and or position of the
+ * corresponding child will be determined.
+ *
+ * @see CHuiLayout::ChildRect for full documentation
+ */
+ IMPORT_C virtual TInt ChildRect(TInt aOrdinal, THuiRealRect& aRect);
+
+ /**
+ * Returns the name of the class.
+ *
+ * @param aName Name of the layout class.
+ */
+ void GetClassName(TDes& aName) const
+ {
+ aName = _L("CHuiAnchorLayout");
+ }
+
+
+private: // internal data types
+ struct TCornerAnchor;
+ struct TAnchor_deprecated;
+ struct TEdgeAnchor;
+ struct TAnchor;
+ struct TAxis;
+
+private: // methods
+
+ /**
+ * Find the anchor at the given index in this layout's anchor list.
+ *
+ * @param aOrdinal Index into the anchor list.
+ * @return Anchor at the requested ordinal. NULL if ordinal is out of range.
+ *
+ */
+ const TAnchor* Anchor(TInt aOrdinal) const;
+
+ /**
+ * the axis structure specified
+ * @param aAxis the index of the axis required
+ * @return the axis specified
+ */
+ inline TAxis& Axis(THuiAnchorAxis aAxis) const;
+
+ /**
+ * Evaluate anchor along an axis
+ *
+ * @param aAxisId the axis id required
+ * @param aAxis the axis
+ * @param aNear outputs the near side value along the specified axis
+ * @param aFar outputs the far side value along the specified axis
+ * @return a value selected from CHuiLayout::EHuiLayoutChildRect, depending on which sides were updated
+ */
+ TInt EvaluateAxis(THuiAnchorAxis aAxisId, const TAxis& aAxis, TReal32& aNear, TReal32& aFar) const;
+
+ /*
+ * Get the metric reference for an anchor's offset along a specified axis
+ *
+ * @param aAxisID the axis needed
+ * @param aEdge the edge
+ * @return the metric reference value in pixels
+ */
+ TReal32 EdgeOffsetInPixels(THuiAnchorAxis aAxisId, const TEdgeAnchor& aEdge) const;
+
+ /**
+ * Calculate the actual pixel value for the supplied edge's position and size
+ * relative to this layout.
+ *
+ * @param aAxisID the axis needed
+ * @param aEdge the edge to be evaluated
+ * @param aInnerPaddingPx the inner padding for this axis in pixels
+ * @param aOffset the offset in pixels
+ * @param aNearPx near coordinate of the inner rect
+ * @param aNearCalculatedPx returns the near coordinate which will be modified if the edge was relevant
+ * @param aFarPx far coordinate of the inner rect
+ * @param aFarCalculatedPx returns the far coordinate which will be modified if the edge was relevant
+ * @return a value selected from CHuiLayout::EHuiLayoutChildRect, depending on which sides were updated
+ */
+ TInt EvaluateEdgeAnchorInPixels(
+ THuiAnchorAxis aAxisId,
+ const TEdgeAnchor& aEdge,
+ TReal32 aInnerPaddingPx,
+ TReal32 aOffsetPx,
+ TReal32 aNearPx, TReal32& aNearCalculatedPx,
+ TReal32 aFarPx, TReal32& aFarCalculatedPx) const;
+
+ /**
+ * Calculate the actual pixel value for the attached edge's position and size
+ * relative to this layout.
+ *
+ * @param aAxisID the axis needed
+ * @param aEdge the edge to be evaluated
+ * @param aInnerPaddingPx the inner padding for this axis in pixels
+ * @param aNearPx near coordinate of the inner rect
+ * @param aNearCalculatedPx returns the near coordinate which will be modified if the edge was relevant
+ * @param aFarPx far coordinate of the inner rect
+ * @param aFarCalculatedPx returns the far coordinate which will be modified if the edge was relevant
+ * @return a value selected from CHuiLayout::EHuiLayoutChildRect, depending on which sides were updated
+ */
+ TInt EvaluateEdgeAttachmentInPixels(
+ THuiAnchorAxis aAxisId,
+ const TEdgeAnchor& aEdge,
+ TReal32 aInnerPaddingPx,
+ TReal32 aNearPx, TReal32& aNearCalculatedPx,
+ TReal32 aFarPx, TReal32& aFarCalculatedPx) const;
+
+ /**
+ * Detach edge
+ *
+ * @param aOrdinal the anchor to detach
+ * @param aType the type of the edge to detach, must correspond to an edge
+ * type only (i.e. must not be a corner type).
+ */
+ void DetachEdge(TInt aOrdinal, THuiAnchorType aType);
+
+ /*
+ * Look for a cycle in the graph, starting with a specified edge
+ *
+ * @param aStartAxisId the axis of the specified starting edge
+ * @param aStartAnchorProximity the proximity of the specified starting edge
+ * @param aStartOrdinal the ordinal of the specified starting edge
+ * @param aEdge the edge under consideration
+ * @return ETrue if a cycle was found
+ */
+ TBool CheckForCycles(
+ THuiAnchorAxis aStartAxisId,
+ THuiAnchorProximity aStartAnchorProximity,
+ TInt aStartOrdinal,
+ const TEdgeAnchor* aEdge) const;
+
+private: // helper methods for dealing with internal structures
+
+ /**
+ * convert an edge into a proximity.
+ *
+ * @note if the edge is of type EHuiAnchorEdgeNone, then
+ * EHuiAnchorProximityNone will be returned, and aAxis will not be modified.
+ *
+ * @param aType the type
+ * @param aAxis output parameter specifying along which axis the edge was defined
+ * @return the proximity
+ */
+ THuiAnchorProximity ConvertTypeToProximity(THuiAnchorType aType, THuiAnchorAxis& aAxis) const;
+
+ /**
+ * convert an attachment origin into a proximity.
+ *
+ * @note if the edge is of type EHuiAnchorAttachmentOriginNone, then
+ * EHuiAnchorProximityNone will be returned, and aAxis will not be modified.
+ *
+ * @param aAttachmentOrigin the origin
+ * @param aAxis output parameter specifying along which axis the edge was defined
+ * @return the proximity
+ */
+ THuiAnchorProximity ConvertAttachmentOriginToProximity(THuiAnchorAttachmentOrigin aAttachmentOrigin, THuiAnchorAxis& aAxis) const;
+
+ /**
+ * split a corner up into its respective edges
+ *
+ * @param aCorner the corner to convert
+ * @param aEdgeH the horizontal edge
+ * @param aEdgeV the vertical edge
+ */
+ void ConvertCornerToEdges(THuiAnchorType aCorner, THuiAnchorType& aEdgeH, THuiAnchorType& aEdgeV) const;
+
+ /**
+ * split a corner attachment origin up into its respective edge origins
+ *
+ * @param aCornerOrigin the corner origin to convert
+ * @param aEdgeH the horizontal origin
+ * @param aEdgeV the vertical origin
+ */
+ void ConvertCornerAttachmentOriginToEdgeAttachmentOrigins(THuiAnchorAttachmentOrigin aCornerOrigin, THuiAnchorAttachmentOrigin& aEdgeOriginH, THuiAnchorAttachmentOrigin& aEdgeOriginV) const;
+
+private: // helper methods for compatibility with deprecated APIs
+
+ THuiAnchorType ConvertDeprecatedAnchorTypeToType(THuiAnchor aAnchor) const;
+
+ THuiAnchorAttachmentOrigin ConvertDeprecatedOrginToAttachmentOrigin(THuiAnchorOrigin aOrigin) const;
+ THuiAnchorAttachmentOrigin ConvertDeprecatedOriginsToAttachmentOrigin(THuiAnchorOrigin aHorizOrigin, THuiAnchorOrigin aVertOrigin) const;
+
+ THuiMetric ConvertDeprecatedAnchorMetricAndTargetToHuiMetric(THuiAnchorMetric aMetric, TReal32 aTarget) const;
+ THuiXYMetric ConvertDeprecatedAnchorMetricsAndOffsetToHuiMetric(THuiAnchorMetric aHorizMetric, THuiAnchorMetric aVertMetric, const THuiTimedPoint& aOffset) const;
+
+private: // data
+
+ struct THuiAnchorLayoutPrivateData;
+ THuiAnchorLayoutPrivateData* iHuiAnchorLayoutPrivateData; // owned
+ };
+
+#endif // __HUIANCHORLAYOUT_H__
+
+