diff -r 4ea6f81c838a -r 0e9bb658ef58 mulwidgets/alfscrollbarwidget/src/alfscrollbarmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mulwidgets/alfscrollbarwidget/src/alfscrollbarmodel.cpp Wed Sep 01 12:23:18 2010 +0100 @@ -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 +#include "ialfscrollbarbaseelementinternal.h" +#include "alfscrollbardefaultbaseelement.h" + +#include +#include +#include + +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& /*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(this); + } + else if ( param == IAlfModel::type().mImplementationId ) + { + ret = static_cast(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 ( + 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 +