mulwidgets/alfscrollbarwidget/src/alfscrollbarmodel.cpp
changeset 0 e83bab7cf002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mulwidgets/alfscrollbarwidget/src/alfscrollbarmodel.cpp	Thu Dec 17 08:56:02 2009 +0200
@@ -0,0 +1,554 @@
+/*
+* Copyright (c) 2007, 2008 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:  Model implementation with utilities for scrollbar widget.
+*
+*/
+//User Includes
+#include "alfscrollbarmodel.h"
+#include "alfscrollbarwidget.h"
+
+//Widget includes
+#include <alf/ialfscrollbardefaultbaseelement.h>
+#include "ialfscrollbarbaseelementinternal.h"
+#include "alfscrollbardefaultbaseelement.h"
+
+#include <alf/ialfscrollbarwidget.h>
+#include <alf/alfmodel.h>
+#include <alf/alfexception.h>
+
+namespace Alf
+    {
+    	
+/*
+ * To store data required in the model class
+ */
+struct ScrollbarModelDataImpl
+    {
+    int mTotalLength;
+    int mViewLength;
+    int mViewStartPosition;
+    };
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+//  C++ default constructor.
+// ---------------------------------------------------------------------------
+//
+AlfScrollBarModel::AlfScrollBarModel(IAlfVariantType* aDataSource):
+    mModel ( NULL )
+    {
+    construct ( aDataSource );
+    
+     // Create an instance of model specific data
+    mModelData = new (EMM) ScrollbarModelDataImpl();
+    
+    // Initialise model data with default values
+    mModelData->mTotalLength       = 0;
+    mModelData->mViewLength        = 0;
+    mModelData->mViewStartPosition = 0;
+    
+    mScrollWidget = NULL;
+    }//End of AlfScrollBarModel function.
+
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+AlfScrollBarModel::~AlfScrollBarModel()
+    {
+    if(mModelData)
+        delete mModelData;
+        
+    delete mModel;
+    }//End of ~AlfScrollBarModel function.
+
+
+// ---------------------------------------------------------------------------
+//  Second Phase Constructor.
+// ---------------------------------------------------------------------------
+//
+void AlfScrollBarModel::construct ( IAlfVariantType* /*aDataSource */)
+    {
+
+    }//End of construct function.
+
+
+// ---------------------------------------------------------------------------
+// From class IAlfModel.
+// Add a new observer to be notified of any changes in the model.
+// ---------------------------------------------------------------------------
+//
+void AlfScrollBarModel::addModelChangeObserver(
+    IAlfModelChangeObserver& /*aObserver*/)
+    {
+    
+    }//End of addModelChangeObserver function.
+
+    
+// ---------------------------------------------------------------------------
+// From class IAlfModel.
+// Add a new observer to be notified of any changes in the model.
+// ---------------------------------------------------------------------------
+//
+void AlfScrollBarModel::removeModelChangeObserver(
+    IAlfModelChangeObserver& /*aObserver*/ )
+    {
+    
+    }//End of function.
+
+
+// ---------------------------------------------------------------------------
+// From class IAlfModel.
+// Api to change the model completely at one short.
+// ---------------------------------------------------------------------------
+//    
+void AlfScrollBarModel::setData ( IAlfVariantType* /*aData*/ )
+    {
+        
+    }//End of removeModelChangeObserver function.
+
+
+// ---------------------------------------------------------------------------
+// From class IAlfModel.
+// Change a given  of data fields in the model.
+// ---------------------------------------------------------------------------
+//
+void AlfScrollBarModel::updateData(
+    TInt /*aNumContainerIndices*/,
+    TInt* /*aContainerIndices*/,
+    IAlfVariantType* /*aData*/)
+    {
+    ALF_THROW(AlfException,EInvalidArgument,"updateData")        
+    }//End of updateData function.
+
+    
+// ---------------------------------------------------------------------------
+// From class IAlfModel.
+// Add a number of data fields in the model data.
+// ---------------------------------------------------------------------------
+//
+void AlfScrollBarModel::addData(
+    TInt /*aNumContainerIndices*/,
+    TInt* /*aContainerIndices*/,
+    IAlfVariantType* /*aData*/)
+    {
+    ALF_THROW(AlfException,EInvalidArgument,"addData")        
+    }//End of addData function.
+
+
+// ---------------------------------------------------------------------------
+// From class IAlfModel.
+// Remove a  number of data fields in the model data.
+// ---------------------------------------------------------------------------
+//  
+void AlfScrollBarModel::removeData(
+    TInt /*aNumContainerIndices*/,
+    TInt* /*aContainerIndices*/ )
+    {
+    ALF_THROW(AlfException,EInvalidArgument,"removeData")        
+    }//End of removeData function.
+
+
+// ---------------------------------------------------------------------------
+// From class IAlfModel.
+// Api for executing batch operations.
+// ---------------------------------------------------------------------------
+//  
+void AlfScrollBarModel::executeOperations(
+    AlfPtrVector<AlfModelOperation>& /*aOperationsArray*/)
+    {
+    ALF_THROW(AlfException,EInvalidArgument,"executeOperations")    
+    }//End of executeOperations function.
+
+
+// ---------------------------------------------------------------------------
+// From class IAlfModel.
+// Api for executing one operation at a Time.
+// ---------------------------------------------------------------------------
+//  
+void AlfScrollBarModel::executeOperation(AlfModelOperation* /*aOperation*/)
+    {
+    ALF_THROW(AlfException,EInvalidArgument,"executeOperation")    
+    }//End of executeOperation function.
+
+
+// ---------------------------------------------------------------------------
+// From class IAlfModel.
+// Clears the Model.
+// ---------------------------------------------------------------------------
+//  
+void AlfScrollBarModel::clearModel()
+    {
+    
+    }//End of clearModel function.
+
+
+// ---------------------------------------------------------------------------
+// From class IAlfModel.
+// Get the root data object of this model.
+// ---------------------------------------------------------------------------
+//  
+IAlfVariantType* AlfScrollBarModel::data() const
+    {
+    return NULL;
+    }//End of data function.
+
+
+// ---------------------------------------------------------------------------
+// From class IAlfInterfaceBase.
+// Getter for interfaces provided by the scrollbar model.
+// ---------------------------------------------------------------------------
+IAlfInterfaceBase* AlfScrollBarModel::makeInterface(const IfId& aType)
+    {
+    IAlfInterfaceBase* ret ( 0 );
+    UString param ( aType.mImplementationId );
+
+    if ( param == IAlfScrollBarModel::type().mImplementationId )
+        {
+        ret = static_cast<IAlfScrollBarModel*>(this);
+        }
+    else if ( param == IAlfModel::type().mImplementationId )
+        {
+        ret = static_cast<IAlfModel*>(this);
+        }
+    else
+        {
+        //do nothing
+        }
+
+    return ret;
+    }//End of makeInterface function.
+
+// ---------------------------------------------------------------------------
+// From class IAlfScrollBarModel.
+// Create the default data structure for a ScrollBar widget.
+// ---------------------------------------------------------------------------
+//
+void AlfScrollBarModel::initializeData(
+    int aTotalLength,
+    int aViewLengthInSteps,
+    int aViewStartPosition)
+    {
+
+    validateAllData(aTotalLength, 
+        aViewLengthInSteps,
+        aViewStartPosition);
+    
+    // Initialise model with the data provided
+    mModelData->mTotalLength       = aTotalLength;
+    mModelData->mViewLength        = aViewLengthInSteps;
+    mModelData->mViewStartPosition = aViewStartPosition;
+   
+    changeData(
+        mModelData->mTotalLength,
+        mModelData->mViewLength,
+        mModelData->mViewStartPosition);
+
+    }//End of function.
+
+// ---------------------------------------------------------------------------
+// Set Total Length .
+// ---------------------------------------------------------------------------
+//
+void AlfScrollBarModel::setTotalLength(int aTotalLength)
+    {
+    int viewLength = getViewLength();
+    int viewStartPos = getViewStartPosition();
+       
+    if (validateAllData(aTotalLength, 
+            viewLength, 
+            viewStartPos))
+        {
+        updateScrollBarModel(aTotalLength, -1, -1 );
+        }
+    else
+        {
+        updateScrollBarModel(aTotalLength, viewLength, viewStartPos);
+        }
+    }//End of setTotalLength function.
+
+// ---------------------------------------------------------------------------
+// Set ViewLength.
+// ---------------------------------------------------------------------------
+//
+void AlfScrollBarModel::setViewLength(int aViewLengthInSteps)
+    {
+    validateViewLength(aViewLengthInSteps);
+    updateScrollBarModel ( -1, aViewLengthInSteps, -1);
+    
+    }//End of setViewLength function.
+
+
+// ---------------------------------------------------------------------------
+// Set Thumb Position.
+// ---------------------------------------------------------------------------
+//
+void AlfScrollBarModel::setViewStartPosition ( int aViewStartPosition )
+    {
+    validateViewStartPos(aViewStartPosition);
+    updateScrollBarModel (-1, -1, aViewStartPosition);
+    }//End of setViewStartPosition function.
+
+// ---------------------------------------------------------------------------
+// Changes all the data of model with new values.
+// ---------------------------------------------------------------------------
+//
+void AlfScrollBarModel::changeData(
+    int aTotalLength,
+    int aViewLength,
+    int aViewStartPosition )
+    {
+    
+    validateAllData(aTotalLength,
+        aViewLength,
+        aViewStartPosition);
+          
+     if(getViewStartPosition() == aViewStartPosition && 
+        getTotalLength() == aTotalLength && 
+        getViewLength() == aViewLength)
+        { 
+        // nothing is changed
+        return ;
+        }
+    else
+	    {
+	    updateScrollBarModel(
+	            aTotalLength,
+	            aViewLength,
+	            aViewStartPosition);
+	    }
+            
+  
+    }//End of changeData function.
+
+// ---------------------------------------------------------------------------
+// getTotalLength.
+// ---------------------------------------------------------------------------
+//
+int AlfScrollBarModel::getTotalLength() const
+    {
+    return mModelData->mTotalLength;
+    }//End of getTotalLength function.
+
+
+// ---------------------------------------------------------------------------
+// Returns ViewLength.
+// ---------------------------------------------------------------------------
+//
+int AlfScrollBarModel::getViewLength() const
+    {
+    
+    return mModelData->mViewLength;
+    }//End of getViewLength function.
+
+    
+// ---------------------------------------------------------------------------
+// Returns ViewStartPosition.
+// ---------------------------------------------------------------------------
+//
+int AlfScrollBarModel::getViewStartPosition() const
+    {
+    return mModelData->mViewStartPosition;
+    }//End of getViewStartPosition function.
+
+// ---------------------------------------------------------------------------
+// Updates the ScrollBar visualization
+// according to the model data.
+// ---------------------------------------------------------------------------
+//
+void AlfScrollBarModel::updateScrollBarVisualization()
+    {
+     //updateVisualization with new model
+     IAlfElement* element = (mScrollWidget)->control()->findElement("BaseElement");
+     IAlfScrollBarDefaultBaseElement* defaultLCTBaseElement = static_cast<IAlfScrollBarDefaultBaseElement*> (
+    		 element->makeInterface (IAlfScrollBarDefaultBaseElement::type() ) );
+     AlfScrollBarDefaultBaseElement* baseElement = (AlfScrollBarDefaultBaseElement*)defaultLCTBaseElement;
+     
+     baseElement->updateVisualization();
+    }
+
+// ---------------------------------------------------------------------------
+// Updates the ScrollBar model according to the parameters.
+// ---------------------------------------------------------------------------
+//
+void AlfScrollBarModel::updateScrollBarModel(
+    int aTotalLength,
+    int aViewLength,
+    int aViewStartPosition)
+    {
+    //change only if the parameters are non negative . 
+    
+    if(aTotalLength!=-1)
+        {
+        mModelData->mTotalLength = aTotalLength;
+        }
+    else
+        {
+        // Do Nothing
+        }
+    
+    if(aViewLength!=-1)
+        {
+        mModelData->mViewLength =  aViewLength; 
+        }
+    else
+        {
+        // Do Nothing 
+        }
+        
+    
+    if(aViewStartPosition!=-1)
+        {
+        mModelData->mViewStartPosition = aViewStartPosition;  
+        }
+    else
+        {
+        // Do Nothing  
+        }
+ 
+    //updateVisualization with new model    
+    updateScrollBarVisualization();
+    }//End of updateScrollBarModel function.
+
+// ---------------------------------------------------------------------------
+// validateViewLength
+// ---------------------------------------------------------------------------
+//
+bool AlfScrollBarModel::validateViewLength(int & aViewLength)
+    {
+    bool ret = true;
+    
+    if (aViewLength <= 0)
+        {
+        // Minimum view length
+        aViewLength = 1;
+        ret = false;
+        }
+    else
+        {
+        int totalLength = getTotalLength();
+        if (aViewLength > totalLength)
+            {
+            aViewLength = totalLength;
+            ret = false;
+            }
+        else
+            {
+            // do nothing
+            }
+        }
+    
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// validateViewStartPos
+// ---------------------------------------------------------------------------
+//
+bool AlfScrollBarModel::validateViewStartPos(int & aViewStartPos)
+    {
+    bool ret = true;
+    
+    if (aViewStartPos < 0)
+        {
+        aViewStartPos = 0;
+        ret = false;
+        }
+    else
+        {
+        int totalLength = getTotalLength();
+        int viewLength = getViewLength();     
+        if (aViewStartPos > (totalLength-viewLength))
+            {
+            // Maximum value
+            aViewStartPos = totalLength-viewLength;            
+            ret = false;
+            }
+        else
+            {
+            // do nothing
+            }        
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// validateAllData
+// ---------------------------------------------------------------------------
+//    
+bool AlfScrollBarModel::validateAllData(int & aTotalLength, 
+        int & aViewLength, 
+        int & aViewStartPos)
+    {
+     bool ret = true;
+     if (aTotalLength <= 0)
+        {
+        aTotalLength = 1;
+        ret = false;
+        }
+     else
+        {
+        // do nothing
+        }
+     
+     // validate view length   
+     if (aViewLength <= 0)
+        {
+        aViewLength = 1;
+        ret = false;
+        }
+     else if (aViewLength > aTotalLength)
+        {
+        // Setting maximum possible value of View Length
+        aViewLength = aTotalLength;
+        ret = false;
+        }
+     else
+        {
+        // do nothing
+        }
+     
+     // validate view start pos
+     if (aViewStartPos < 0)
+        {
+        aViewStartPos = 0;
+        ret = false;
+        }
+     else if (aViewStartPos > (aTotalLength-aViewLength) )
+        {
+        // Setting maximum possible value of View Length
+        aViewStartPos = aTotalLength-aViewLength;        
+        ret = false;
+        }
+     else
+        {
+        // do nothing
+        }
+        
+     // No need to validate aFocusPos for now
+    return ret;
+    }
+    
+// ---------------------------------------------------------------------------
+// StoreWidget
+// ---------------------------------------------------------------------------
+//    
+void AlfScrollBarModel::storeWidget(AlfScrollBarWidget* aWidget)
+    {
+    mScrollWidget = aWidget;
+    }
+}//Namespace Alf
+