--- /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
+