diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/src/HuiFlowLayout.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/coretoolkit/src/HuiFlowLayout.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,207 @@ +/* +* 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: ?Description +* +*/ + + + +#include + +#include "uiacceltk/HuiFlowLayout.h" // Class definition +#include "uiacceltk/HuiControl.h" + + +EXPORT_C CHuiFlowLayout* CHuiFlowLayout::AddNewL(CHuiControl& aOwnerControl, + TFlowDirection aDirection, + CHuiLayout* aParentLayout) + { + CHuiFlowLayout* flow = STATIC_CAST(CHuiFlowLayout*, + aOwnerControl.AppendLayoutL(EHuiLayoutTypeFlow, aParentLayout)); + flow->SetFlowDirection(aDirection); + return flow; + } + + +CHuiFlowLayout::CHuiFlowLayout(MHuiVisualOwner& aOwner) + : CHuiLayout(aOwner), iMode(EFlowHorizontal) + { + } + + +void CHuiFlowLayout::ConstructL() + { + CHuiLayout::ConstructL(); + } + + +EXPORT_C CHuiFlowLayout::~CHuiFlowLayout() + { + } + + +EXPORT_C void CHuiFlowLayout::SetSize(const THuiRealSize& aSize, + TInt aTransitionTime) + { + CHuiLayout::SetSize(aSize, aTransitionTime); + UpdateChildrenLayout(aTransitionTime); + } + + +EXPORT_C TBool CHuiFlowLayout::ChildSize(TInt aOrdinal, TSize& aSize) + { + TBool result(EFalse); + THuiRealRect rect; + TInt childRectStatus(THuiLayoutChildRectUpdateNotNeeded); + childRectStatus = ChildRect(aOrdinal, rect); + if(childRectStatus != THuiLayoutChildRectNotImplemented) + { + result = (childRectStatus & THuiLayoutChildRectSizeUpdateNeeded); + if(result) + { + THuiRealPoint size(rect.Width(), rect.Height()); + aSize = LocalPointInPixels(size).AsSize(); + } + } + return result; + } + + +EXPORT_C TBool CHuiFlowLayout::ChildPos(TInt aOrdinal, TPoint& aPos) + { + TBool result(EFalse); + THuiRealRect rect; + TInt childRectStatus(THuiLayoutChildRectUpdateNotNeeded); + childRectStatus = ChildRect(aOrdinal, rect); + if(childRectStatus != THuiLayoutChildRectNotImplemented) + { + result = (childRectStatus & THuiLayoutChildRectPosUpdateNeeded); + if(result) + { + aPos = LocalPointInPixels(rect.iTl); + } + } + return result; + } + +EXPORT_C TInt CHuiFlowLayout::ChildRect(TInt aOrdinal, THuiRealRect& aRect) + { + THuiRealPoint childTopLeft; + THuiRealSize childSize = Visual(aOrdinal).Size().RealTarget().AsSize(); + THuiRealSize parentSize = InnerSize(); + TReal32 horizDirection = 1.0; + + // By default, flow layout modifies only positions of the children + TInt ret = THuiLayoutChildRectPosUpdateNeeded; + + // Adjust the child size if perpendicular fit is specified + if(iMode & EModeFitPerpendicular) + { + // Expand the child's size to fit the layout rectangle along + // the minor axis. + if(iDirection == EFlowVertical) + { + childSize.iWidth = parentSize.iWidth; + } + else + { + childSize.iHeight = parentSize.iHeight; + } + // Modify also the size of the child. + ret |= THuiLayoutChildRectSizeUpdateNeeded; + } + + // Center the child perpendicular to the flow direction + if(iMode & EModeCenterPerpendicular) + { + if(iDirection == EFlowHorizontal) + { + childTopLeft.iY = parentSize.iHeight/2 - childSize.iHeight/2; + } + else + { + childTopLeft.iX = parentSize.iWidth/2 - childSize.iWidth/2; + } + } + + // Apply parent padding + THuiRealPoint topLeft = InnerTopLeft(); + childTopLeft += topLeft; + + // Iterate through previous children and add their width or height along with + // inner padding to the position. + THuiRealPoint innerPadding = InnerPaddingInBaseUnits(); + for(TInt i = 0; i < aOrdinal; ++i) + { + if(!(Visual(i).Flags() & EHuiVisualFlagManualPosition)) + { + // Take child visual into calculations unless it is manually positioned. + THuiRealSize size = Visual(i).Size().RealTarget().AsSize(); + + if(iDirection == EFlowHorizontal) + { + size.iWidth += innerPadding.iX; + childTopLeft.iX += horizDirection * size.iWidth; + } + else + { + size.iHeight += innerPadding.iY; + childTopLeft.iY += size.iHeight; + } + } + } + + // Compose the final child rectangle + aRect = THuiRealRect(childTopLeft, childSize); + + // Return the bitmask of modified components + return ret; + } + + +EXPORT_C void CHuiFlowLayout::SetFlowDirection(TFlowDirection aDirection) + { + if(iDirection != aDirection) + { + iDirection = aDirection; + SetChanged(); + } + } + + +EXPORT_C void CHuiFlowLayout::SetCentering(TBool aCentering) + { + if(aCentering) + { + iMode |= EModeCenterPerpendicular; + } + else + { + iMode &= ~EModeCenterPerpendicular; + } + SetChanged(); + } + + +EXPORT_C void CHuiFlowLayout::SetMode(TInt aMode) + { + iMode = aMode; + SetChanged(); + } + + +EXPORT_C TInt CHuiFlowLayout::Mode() const + { + return iMode; + }