widgetmodel/alfwidgetmodel/src/alflayoutmanager.cpp
changeset 0 e83bab7cf002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/widgetmodel/alfwidgetmodel/src/alflayoutmanager.cpp	Thu Dec 17 08:56:02 2009 +0200
@@ -0,0 +1,266 @@
+/*
+* Copyright (c) 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:  layoutmanager with focus handling in 1D (next/previous)
+*
+*/
+
+
+#include <alf/alfenv.h>
+#include <alf/alflayout.h>
+#include <alf/alflayoutmanager.h>
+#include <alf/alfexceptions.h>
+#include <alf/alfwidgetcontrol.h>
+#include <alf/ialfwidgetfactory.h>
+#include <alf/alfwidgetenvextension.h>
+#include <osn/ustring.h>
+#include <osn/osnnew.h>
+#include "alf/alfwidget.h"
+#include "alflayoutmanagerimpl.h"
+
+using osncore::UString;
+
+using namespace Alf;
+
+namespace Alf
+    {
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// layout manager constructor
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT AlfLayoutManager::AlfLayoutManager(TAlfLayoutType aLayoutType)
+    {
+    mData.reset(new (EMM) AlfLayoutManagerImpl(aLayoutType));
+    }
+        
+// ---------------------------------------------------------------------------
+// virtual destructor
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT AlfLayoutManager::~AlfLayoutManager()
+    {
+    }
+    
+// ---------------------------------------------------------------------------
+// returns the owner of the layoutmanager
+// ---------------------------------------------------------------------------
+//    
+OSN_EXPORT CAlfWidgetControl& AlfLayoutManager::owner() const
+    {
+    return mData->owner();
+    }
+    
+// ---------------------------------------------------------------------------
+// returns the widget at index aIndex.
+// ---------------------------------------------------------------------------
+//    
+OSN_EXPORT CAlfWidgetControl* AlfLayoutManager::getControl(int aIndex) const
+    {
+    return mData->getControl(aIndex);
+    }
+    
+// ---------------------------------------------------------------------------
+// returns the count of controls in the layoutmanager.
+// ---------------------------------------------------------------------------
+//    
+OSN_EXPORT int AlfLayoutManager::count() const
+    {
+    return mData->count();
+    }    
+    
+// ---------------------------------------------------------------------------
+// from IAlfLayoutManager
+// creates the layout used by this layoutmanager.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT void AlfLayoutManager::createLayout(CAlfWidgetControl& aOwner, 
+    CAlfLayout* aParentLayout, int aLayoutIndex)
+    {
+	mData->createLayout(aOwner, aParentLayout, aLayoutIndex);
+    updateChildrenLayout();
+    }
+    
+// ---------------------------------------------------------------------------
+// from IAlfLayoutManager
+// returns the layout used by this layoutmanager.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT CAlfLayout& AlfLayoutManager::getLayout() const
+    {
+    return mData->getLayout();
+    }
+    
+// ---------------------------------------------------------------------------
+// from IAlfLayoutManager
+// notifies the layout manager, that the child control's layout
+// must be updated.
+// ---------------------------------------------------------------------------
+//    
+OSN_EXPORT void AlfLayoutManager::updateChildLayout(
+    CAlfWidgetControl* aControl)
+    {
+    mData->getLayout(); //checks, that the layout exists, throws exception if not. 
+    doUpdateChildLayout( aControl );
+    }
+    
+// ---------------------------------------------------------------------------
+// from IAlfLayoutManager
+// notifies the layout manager, that all the child controls' layouts
+// must be updated.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT void AlfLayoutManager::updateChildrenLayout()
+    {
+    CAlfLayout& layout = mData->getLayout();
+    mData->updateMainLayout();
+    
+  //  CAlfWidgetControl& container = mData->owner();
+    const int childrenCount = count();
+    
+    // go through all the child controls, and update the layout
+    for (int i = 0; i < childrenCount; i++)
+        {
+        doUpdateChildLayout(getControl(i));
+        }
+    
+    layout.UpdateChildrenLayout();
+    
+    //doUpdateChildLayout changes the visual size and position.
+    //need to notify all the widgets that size and position might have changed. 
+    mData->updateAllWidgetRects();
+    
+    // Inform parent layout manager about the changed presentation size
+    owner().updateParentLayout();
+    }
+    
+// ---------------------------------------------------------------------------
+// from IAlfLayoutManager
+// notifies the layout manager, that the control's has been
+// removed from the layout.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT void AlfLayoutManager::childRemoved(CAlfWidgetControl* aControl)
+    {
+    mData->childRemoved(aControl);
+    }
+   
+// ---------------------------------------------------------------------------
+// notifies the layout manager, that the child control's layout
+// must be updated.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT void AlfLayoutManager::doUpdateChildLayout(
+    CAlfWidgetControl* aControl)
+    {
+    mData->doUpdateChildLayout(aControl);
+    }
+
+// ---------------------------------------------------------------------------
+// returns the size of the widget.
+// ---------------------------------------------------------------------------
+//    
+OSN_EXPORT bool AlfLayoutManager::controlRect(
+    CAlfWidgetControl& aControl, TAlfRealRect& aRect)
+    {
+    return mData->controlRect(aControl, aRect);
+    }
+
+// ---------------------------------------------------------------------------
+// sets the size and position of the widget.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT void AlfLayoutManager::setControlRect(
+    CAlfWidgetControl& aControl, const TAlfRealRect &aRect)
+    {
+    AlfWidget* widget = aControl.widget();
+    if (widget)
+        {
+        const char* name = widget->widgetName(); 
+        IAlfWidget* ownerwidget = AlfWidgetEnvExtension::widgetFactory(aControl.Env()).findWidget(name); 
+        if (ownerwidget)
+            {
+            mData->setWidgetRect(*ownerwidget, aRect);
+            }
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// sets the position of the widget.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT void AlfLayoutManager::setControlPosition(
+    CAlfWidgetControl& aControl, const TAlfRealPoint& aPos)
+    {
+    AlfWidget* widget = aControl.widget();
+    if (widget)
+        {
+        const char* name = widget->widgetName(); 
+        IAlfWidget* ownerwidget = AlfWidgetEnvExtension::widgetFactory(aControl.Env()).findWidget(name); 
+        if (ownerwidget)
+            {
+            mData->setWidgetPosition(*ownerwidget, aPos);
+            }
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// sets the size of the widget.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT void AlfLayoutManager::setControlSize(
+    CAlfWidgetControl& aControl, const TAlfRealPoint &aSize)
+    {
+    AlfWidget* widget = aControl.widget();
+    if (widget)
+        {
+        const char* name = widget->widgetName(); 
+        IAlfWidget* ownerwidget = AlfWidgetEnvExtension::widgetFactory(aControl.Env()).findWidget(name); 
+        if (ownerwidget)
+            {
+            mData->setWidgetSize(*ownerwidget, aSize);
+            }
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// returns layout preferences for aControl
+// ---------------------------------------------------------------------------
+//    
+OSN_EXPORT const IAlfLayoutPreferences* AlfLayoutManager::getLayoutPreferences(
+    CAlfWidgetControl* aControl) const
+    {
+    return mData->getLayoutPreferences(aControl);
+    }
+
+// ---------------------------------------------------------------------------
+// From class IAlfInterfaceBase.
+// Getter for interfaces provided by the element.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT IAlfInterfaceBase* AlfLayoutManager::makeInterface( 
+    const IfId& aType )
+    {
+    UString param(aType.mImplementationId);
+    if (param == IAlfLayoutManager::type().mImplementationId)
+        {
+        return static_cast<IAlfLayoutManager*>(this);
+        }
+        
+
+    // Let the implementation class try the interface creation
+    return mData->makeInterface(aType);
+    }
+ } // Alf