widgetmodel/alfwidgetmodel/src/alfwidgetimpl.cpp
changeset 0 e83bab7cf002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/widgetmodel/alfwidgetmodel/src/alfwidgetimpl.cpp	Thu Dec 17 08:56:02 2009 +0200
@@ -0,0 +1,204 @@
+/*
+* 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:  The private implementation of CAlfWidget.
+*
+*/
+
+
+#include "alfwidgetimpl.h"
+#include <alf/alfwidgetcontrol.h>
+#include <alf/alfmodel.h>
+#include <alf/alfcontrolgroup.h>
+#include "alf/alfwidget.h"
+#include "alf/alfattribute.h"
+#include "alf/alfattributevaluetype.h"
+#include <alf/alfexceptions.h>
+#include <libc/string.h>
+#include <alf/ialfelement.h>
+
+#include "alfwidgetattributeownerimpl.h"
+
+
+namespace Alf
+    {
+
+AlfWidgetImpl::AlfWidgetImpl()
+    {
+    mControl = NULL;
+    mModel = NULL;
+    mAttributeList.setAutoDelete(true);
+    mWidgets.setAutoDelete(false);
+    mTakesModelOwnership=false;
+    }
+
+AlfWidgetImpl::~AlfWidgetImpl()
+    {
+    setControl( NULL, true );
+    
+    if (mTakesModelOwnership)
+        {
+        delete mModel;
+        mModel = NULL;
+        }        
+    mAttributeList.clear();
+    mWidgets.clear();
+    }
+
+void AlfWidgetImpl::setWidgetName( const UString& aWidgetName )
+    {
+    mWidgetName = aWidgetName;
+    }
+
+const UString& AlfWidgetImpl::widgetName() const
+    {
+    return mWidgetName;
+    }
+
+
+CAlfWidgetControl* AlfWidgetImpl::control()
+    {
+    return mControl;
+    }	
+
+void AlfWidgetImpl::setControl( CAlfWidgetControl* aControl,bool aDeletePreviousControl)
+    {    
+    if ( mControl != aControl )
+        {
+        if( mControl )
+            {
+            if( mModel )
+                {
+                // Remove model change observer from control
+                mModel->removeModelChangeObserver( *mControl );
+                }
+            if( aDeletePreviousControl )
+                {
+                // Delete control from possible control group to avoid double deletion
+                if(mControl->ControlGroup())
+                    {
+                    mControl->ControlGroup()->Remove(mControl);
+                    }
+                // Delete the control
+                delete mControl;
+                mControl = NULL;
+                }
+            }
+
+        // Set the new control.
+        mControl = aControl;
+
+        // Add the new control as an observer for model changes.
+        if( mControl )
+            {
+            if( mModel )
+                {
+                mModel->addModelChangeObserver( *mControl );
+                }
+            mAttributeOwnerImpl.reset(new (EMM) AlfWidgetAttributeOwnerImpl(mControl));
+            }
+        }
+    }
+
+IAlfModel* AlfWidgetImpl::model()
+    {
+    return mModel;
+    }
+
+void AlfWidgetImpl::setModel( IAlfModel* aModel,bool aTakeOwnerShip )
+    {
+    if ( mModel != aModel )
+        {
+        // Release the old model.
+        if (mTakesModelOwnership)
+            {
+            delete mModel;
+            }
+
+        else if (mModel&&mControl)
+            {
+            mModel->removeModelChangeObserver(*mControl);
+            }
+
+        // Set the new model.
+        mModel = aModel;
+        mTakesModelOwnership=aTakeOwnerShip;
+        // Add the control as an observer for model changes.
+        if ( mModel && mControl )
+            {
+            mModel->addModelChangeObserver( *mControl );
+            }
+        }
+    else // just copy the ownership flag 
+        { 
+        if (mModel != NULL)
+            {
+            mTakesModelOwnership=aTakeOwnerShip;
+            }
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void AlfWidgetImpl::addWidget(AlfWidget *aWidget)
+    {
+    for (int i=0 ; i< mWidgets.count(); i++ )
+        {
+        if (mWidgets.findRef(aWidget) >=0)
+            {
+            //widget already there.
+            return;
+            }
+        }
+    mWidgets.resize(mWidgets.count()+1);
+    mWidgets.insert(mWidgets.count(),aWidget);
+    }
+
+int  AlfWidgetImpl::widgetCount()
+    {
+    return mWidgets.count();
+    }
+
+AlfWidget* AlfWidgetImpl::getWidget(int aIndex)
+    {
+    if (aIndex>=0 && aIndex < mWidgets.count())
+        return mWidgets[aIndex];
+    return 0;
+    }
+
+int AlfWidgetImpl::findWidget(AlfWidget* aWidget)
+    {
+    return mWidgets.findRef(aWidget);
+    }
+
+void AlfWidgetImpl::removeWidget(int aIndex)
+    {
+    if (aIndex >=0 and aIndex < mWidgets.count())
+        mWidgets.remove(aIndex);
+    }
+    
+// ---------------------------------------------------------------------------
+//  Returns attribute owner interface.
+// ---------------------------------------------------------------------------
+//
+AlfWidgetAttributeOwnerImpl* AlfWidgetImpl::getAttributeOwner()
+    {
+    return mAttributeOwnerImpl.get();
+    }
+
+    } //namespace alf
+
+
+