--- a/widgetmodel/alfwidgetmodel/src/alfwidgetcontrol.cpp Mon Jun 21 16:15:51 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1954 +0,0 @@
-/*
-* 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 base class for all widget controls.
-*
-*/
-
-
-#include <alf/alfevent.h>
-
-#include "alf/alfwidget.h"
-#include <alf/alfwidgetcontrol.h>
-#include <alf/alfmodel.h>
-#include <alf/alfwidgeteventhandler.h>
-#include "alf/alfelement.h"
-#include <alf/alfvarianttype.h>
-#include "alf/alfmodeloperation.h"
-#include <osn/ustring.h>
-#include <osn/alfptrvector.h>
-#include <alf/alfexceptions.h>
-#include <alf/alfenv.h>
-#include <alf/alfcontrolgroup.h>
-#include <alf/ialflayoutmanager.h>
-#include <alf/alfwidgetevents.h>
-#include "alf/ialfattributeowner.h"
-#include <osn/osnnew.h>
-#include <assert.h>
-
-#include "alfhostapiimpl.h"
-#include "alfwidgetcontroleventfilter.h"
-
-using namespace osncore;
-
-namespace Alf
- {
-// ======== INTERNAL DATA TYPES ========
-
-// Forward declared inside the Alf namespace
-
-
-//Internal Class to Store the Element Data
-class ElementData
- {
-public:
- //Default constructor
- ElementData():mElement(0)
- {
- }
- //Destructor
- ~ElementData()
- {
- delete mElement;
- }
- /**
- * The element. Own.
- */
- IAlfElement* mElement;
-
- /**
- * The data id range for the element.
- */
- uint mDataIdRange;
- };
-
-class AlfWidgetControlImpl
- {
-
-public:
- AlfWidgetControlImpl():mWidget(0),mEventFilter(0),mAlfHostAPIImpl(0)
- {
-
- }
- ~AlfWidgetControlImpl()
- {
-
- }
-public:
- /**
- * The element data. Elements are owned by the control.
- */
- AlfPtrVector<ElementData> mElementArray;
-
- /**
- * The event handlers. Event handlers are owned by the control.
- */
- AlfPtrVector<IAlfWidgetEventHandler> mEventHandlerArray;
-
- /**
- * The owner widget.
- */
- AlfWidget* mWidget;
-
- /**
- * PointerUp Event Filter.
- */
- AlfWidgetControlEventFilter *mEventFilter;
-
- /**
- * The state of the control.
- * The state is a combination of binary state flags.
- */
- uint mState;
- /**
- * AlfAPIImpl auto pointer.
- * This will be used to provide container control's functionality by
- * widget control.Owned.
- */
- auto_ptr<AlfHostAPIImpl> mAlfHostAPIImpl;
- };
-
-// ======== MEMBER FUNCTIONS ========
-
-OSN_EXPORT CAlfWidgetControl::CAlfWidgetControl(CAlfEnv& aEnv)
- {
- construct(aEnv);
- }
-
-OSN_EXPORT CAlfWidgetControl::CAlfWidgetControl()
- {
- }
-
-OSN_EXPORT void* CAlfWidgetControl::operator new(
- size_t aSize, newarg /*aEnumVal*/) throw (std::bad_alloc)
- {
- void* ret = 0;
- TRAPD(err, ret = CBase::operator new((TUint)aSize, ELeave));
- if(err != KErrNone)
- {
- throw std::bad_alloc();
- }
- return ret;
- }
-
-OSN_EXPORT void CAlfWidgetControl::construct(
- CAlfEnv& aEnv)
- {
- mWdgtControlData.reset( new (EMM) AlfWidgetControlImpl() );
- mWdgtControlData->mWidget = 0;
- //by default control is focusable and enabled
- mWdgtControlData->mState = IAlfWidgetControl::Focusable |
- IAlfWidgetControl::Enabled;
-
- // Call CAlfControl second phase constructor
- TRAPD(err, CAlfControl::ConstructL( aEnv ));
- if(err != KErrNone)
- {
- ALF_THROW(AlfException, err, "CAlfWidgetControl::construction failed.");
- }
- mWdgtControlData->mElementArray.setAutoDelete(true);
- mWdgtControlData->mEventHandlerArray.setAutoDelete(true);
- mWdgtControlData->mAlfHostAPIImpl.reset(0);
-
- // Instatiate Event filter
- mWdgtControlData->mEventFilter =
- new (EMM) AlfWidgetControlEventFilter();
- addEventHandler(mWdgtControlData->mEventFilter);
- }
-
-OSN_EXPORT CAlfWidgetControl::~CAlfWidgetControl()
- {
- //release all connections
- while (this->ConnectionCount())
- {
- this->RemoveConnection(&(this->Connection(0)));
- }
- mWdgtControlData->mElementArray.setAutoDelete(true);
-
- for(int i = 0; i < mWdgtControlData->mElementArray.count(); ++i)
- {
- // Fetch the element
- IAlfElement *element = mWdgtControlData->mElementArray[i]->mElement;
-
- // If the element is also an event handler
- IAlfWidgetEventHandler* eventHandler =
- IAlfInterfaceBase::makeInterface<IAlfWidgetEventHandler>( element );
- int eventHandlerIndex =
- mWdgtControlData->mEventHandlerArray.findRef( eventHandler );
- if ( eventHandler && eventHandlerIndex != KErrNotFound )
- {
- //cache auto delete state.
- bool autoDeleteState =
- mWdgtControlData->mEventHandlerArray.autoDelete();
- mWdgtControlData->mEventHandlerArray.setAutoDelete(false);
- mWdgtControlData->mEventHandlerArray.remove( eventHandlerIndex );
- //restore auto delete state.
- mWdgtControlData->mEventHandlerArray.setAutoDelete(
- autoDeleteState);
- }
- }
-
- mWdgtControlData->mElementArray.clear();
-
- mWdgtControlData->mEventHandlerArray.setAutoDelete(true);
- mWdgtControlData->mEventHandlerArray.clear();
-
- if(mWdgtControlData->mWidget)
- {
- // false: don't delete twice
- mWdgtControlData->mWidget->setControl(0, false);
- mWdgtControlData->mWidget = 0;
- }
- }
-
-OSN_EXPORT uint CAlfWidgetControl::state() const
- {
- // Verify that the internal state stored in the member variable
- // is in sync with the CAlfWidget state. This might not be the case
- // if someone has called CAlfWidget APIs, e.g. AcquireFocus(), directly.
-
- if ( Focus() )
- {
- mWdgtControlData->mState |= IAlfWidgetControl::Focused;
- }
- else
- {
- mWdgtControlData->mState &= ~IAlfWidgetControl::Focused;
- }
-
- return mWdgtControlData->mState;
- }
-
-OSN_EXPORT void CAlfWidgetControl::setState( uint aState )
- {
- // Checks the state invariants. Throws exceptions if not OK
- checkStateInvariants(aState);
-
- // Visible
- if ( aState & IAlfWidgetControl::Visible )
- {
- enableStateVisible();
- }
- else
- {
- disableStateVisible();
- }
-
- // Enabled
- if ( aState & IAlfWidgetControl::Enabled )
- {
- enableStateEnabled();
- }
- else
- {
- disableStateEnabled();
- }
-
- // Focused
- if ( aState & IAlfWidgetControl::Focused )
- {
- enableStateFocused();
- }
- else
- {
- disableStateFocused();
- }
-
- // Focusable
- if ( aState & IAlfWidgetControl::Focusable )
- {
- enableStateFocusable();
- }
- else
- {
- disableStateFocusable();
- }
- }
-
-OSN_EXPORT void CAlfWidgetControl::enableState( uint aState )
- {
- // Predicts the state and checks the state invariants.
- // Throws exceptions if not OK
- predictAndCheckStateInvariants(aState, true);
-
- // Visible
- if ( aState & IAlfWidgetControl::Visible )
- {
- enableStateVisible();
- }
-
- // Enabled
- if ( aState & IAlfWidgetControl::Enabled )
- {
- enableStateEnabled();
- }
-
- // Set Focusable. This is done first, before putting on fucus
- if ( aState & IAlfWidgetControl::Focusable )
- {
- enableStateFocusable();
- }
-
- // Focused
- if ( aState & IAlfWidgetControl::Focused )
- {
- enableStateFocused();
- }
-
- }
-
-OSN_EXPORT void CAlfWidgetControl::disableState( uint aState )
- {
- // Predicts the state and checks the state invariants.
- // Throws exceptions if not OK
- predictAndCheckStateInvariants(aState, false);
-
- // Visible
- if ( aState & IAlfWidgetControl::Visible )
- {
- disableStateVisible();
- }
-
- // Enabled
- if ( aState & IAlfWidgetControl::Enabled )
- {
- disableStateEnabled();
- }
-
- // Focused
- if ( aState & IAlfWidgetControl::Focused )
- {
- disableStateFocused();
- }
-
- // Focusable
- if ( aState & IAlfWidgetControl::Focusable )
- {
- disableStateFocusable();
- }
- }
-
-OSN_EXPORT bool CAlfWidgetControl::checkState( uint aState ) const
- {
- return ( state() & aState );
- }
-
-OSN_EXPORT int CAlfWidgetControl::numEventHandlers() const
- {
- return mWdgtControlData->mEventHandlerArray.count();
- }
-
-OSN_EXPORT IAlfWidgetEventHandler& CAlfWidgetControl::eventHandler(
- int aIndex )
- {
- return *mWdgtControlData->mEventHandlerArray[aIndex];
- }
-
-OSN_EXPORT int CAlfWidgetControl::eventHandlerIndex(
- IAlfWidgetEventHandler& aEventHandler ) const
- {
- for ( int i = 0; i < mWdgtControlData->mEventHandlerArray.count(); ++i )
- {
- if ( mWdgtControlData->mEventHandlerArray[i] == &aEventHandler )
- {
- return i;
- }
- }
- return -1;
- }
-
-OSN_EXPORT IAlfWidgetEventHandler* CAlfWidgetControl::findEventHandler(
- const TAlfEvent& aEvent )
- {
- for ( int i = 0; i < mWdgtControlData->mEventHandlerArray.count(); ++i )
- {
- if ( mWdgtControlData->mEventHandlerArray[i]->accept( *this, aEvent ) )
- {
- return mWdgtControlData->mEventHandlerArray[i];
- }
- }
- return 0;
- }
-
-OSN_EXPORT void CAlfWidgetControl::addEventHandler(
- IAlfWidgetEventHandler* aEventHandler, int aIndex )
- {
- try
- {
- if ( mWdgtControlData->mEventHandlerArray.findRef( aEventHandler ) ==
- KErrNotFound )
- {
- if ( aIndex == -1 )
- {
- mWdgtControlData->mEventHandlerArray.resize(
- mWdgtControlData->mEventHandlerArray.count()+1);
- mWdgtControlData->mEventHandlerArray.insert(
- mWdgtControlData->mEventHandlerArray.count(),
- aEventHandler );
- }
- else
- {
- mWdgtControlData->mEventHandlerArray.resize(
- mWdgtControlData->mEventHandlerArray.count()+1);
- mWdgtControlData->mEventHandlerArray.insert( aIndex,
- aEventHandler);
- }
- }
- }
- catch (...)
- {
- ALF_THROW(AlfWidgetException,ECommonError,"CAlfWidgetControl: Adding event handler failed.")
- }
- }
-
-OSN_EXPORT void CAlfWidgetControl::removeAndDestroyEventHandler(
- IAlfWidgetEventHandler& aEventHandler )
- {
-
- for (int i =0; i<mWdgtControlData->mEventHandlerArray.count();i++)
- {
- if (mWdgtControlData->mEventHandlerArray[i] == &aEventHandler)
- {
- IAlfWidgetEventHandler *handler =
- mWdgtControlData->mEventHandlerArray[i];
- //check if it is an eventhandler associated with presentation
- if(handler->eventHandlerType() ==
- IAlfWidgetEventHandler::EPresentationEventHandler)
- {
- ElementData* elementData = 0;
- // if the event handller is also an element, remove the
- // corresponding element data from mEventHandlerArray
- elementData = removePesentationElementData(*handler);
- // if the element data does not exist, remove the event handler
- // from mEventHandlerArray and destroy it
- if(!elementData)
- {
- mWdgtControlData->mEventHandlerArray.remove( i );
- }
- // remove the event hanlder from the array but dont destroy it,
- // and then delete element data which in turn will destroy the
- // element and thus the event handler
- else
- {
- // cache auto delete state.
- bool autoDeleteState =
- mWdgtControlData->mEventHandlerArray.autoDelete();
- mWdgtControlData->mEventHandlerArray.setAutoDelete(false);
- mWdgtControlData->mEventHandlerArray.remove( i );
- // restore auto delete state.
- mWdgtControlData->mEventHandlerArray.setAutoDelete(
- autoDeleteState);
- delete elementData;
- }
- }
- else
- {
- mWdgtControlData->mEventHandlerArray.remove( i );
- }
- return;
- }
-
- }
-
- }
-
-OSN_EXPORT void CAlfWidgetControl::removeEventHandler(
- IAlfWidgetEventHandler& aEventHandler )
- {
- for (int i =0; i<mWdgtControlData->mEventHandlerArray.count();i++)
- {
- if (mWdgtControlData->mEventHandlerArray[i] == &aEventHandler)
- {
- // cache auto delete state.
- bool autoDeleteState =
- mWdgtControlData->mEventHandlerArray.autoDelete();
- mWdgtControlData->mEventHandlerArray.setAutoDelete(false);
- mWdgtControlData->mEventHandlerArray.remove( i );
- // restore auto delete state.
- mWdgtControlData->mEventHandlerArray.setAutoDelete(
- autoDeleteState);
- return;
- }
- }
- }
-
-OSN_EXPORT void CAlfWidgetControl::removeAndDestroyEventHandler(
- const UString& aHandlerId )
- {
- for (int i =0; i<mWdgtControlData->mEventHandlerArray.count();i++)
- {
- IAlfWidgetEventHandler* handler =
- mWdgtControlData->mEventHandlerArray[i];
- AlfWidgetEventHandlerInitData* eventData = handler->eventHandlerData();
- if(eventData != 0)
- {
- //check for the event id/name
- if (!aHandlerId.compare(eventData->mWidgetEventHandlerId))
- {
- //check if it is an eventhandler associated with presentation
- if(handler->eventHandlerType() ==
- IAlfWidgetEventHandler::EPresentationEventHandler)
- {
- ElementData* elementData = 0;
- // if the event handller is also an element, remove the
- // corresponding element data from mEventHandlerArray
- elementData = removePesentationElementData(*handler);
- // if the element data does not exist, remove the event
- // handler from mEventHandlerArray and destroy it
- if(!elementData)
- {
- // removes and destoys the event handler
- mWdgtControlData->mEventHandlerArray.remove( i );
- }
- // remove the event hanlder from the array but dont destroy
- // it, and then delete element data which in turn will
- // destroy the element and thus the event handler
- else
- {
- // cache auto delete state.
- bool autoDeleteState =
- mWdgtControlData->mEventHandlerArray.autoDelete();
- mWdgtControlData->mEventHandlerArray.setAutoDelete(
- false);
- mWdgtControlData->mEventHandlerArray.remove( i );
- // restore auto delete state.
- mWdgtControlData->mEventHandlerArray.setAutoDelete(
- autoDeleteState);
- //delete element data
- delete elementData;
- }
- }
- else
- {
- mWdgtControlData->mEventHandlerArray.remove( i );
- }
- return;
- }
- }
-
- }
- }
-
-OSN_EXPORT void CAlfWidgetControl::removeAndDestroyPresentationEventHandlers()
- {
- int i=0;
- while(i<mWdgtControlData->mEventHandlerArray.count())
- {
- IAlfWidgetEventHandler* handler =
- mWdgtControlData->mEventHandlerArray[i];
-
- //check if it is an eventhandler associated with presentation
- if(handler->eventHandlerType() ==
- IAlfWidgetEventHandler::EPresentationEventHandler)
- {
- ElementData* elementData = 0;
- // if the event handller is also an element, remove the
- // corresponding element data from mEventHandlerArray
- elementData = removePesentationElementData(*handler);
- // if the element data does not exist, remove the event handler
- // from mEventHandlerArray and destroy it
- if(!elementData)
- {
- mWdgtControlData->mEventHandlerArray.remove( i );
- }
- // remove the event hanlder from the array but dont destroy it,
- // and then delete element data which in turn will destroy the
- // element and thus the event handler
- else
- {
- // cache auto delete state.
- bool autoDeleteState =
- mWdgtControlData->mEventHandlerArray.autoDelete();
- mWdgtControlData->mEventHandlerArray.setAutoDelete(false);
- mWdgtControlData->mEventHandlerArray.remove( i );
- // restore auto delete state.
- mWdgtControlData->mEventHandlerArray.setAutoDelete(
- autoDeleteState);
- //delete element data
- delete elementData;
- }
- }
- else
- {
- i++;
- }
- }
-
- }
-
-OSN_EXPORT void CAlfWidgetControl::removePresentationEventHandlers()
- {
- int i=0;
- // cache auto delete state.
- bool autoDeleteState = mWdgtControlData->mEventHandlerArray.autoDelete();
- mWdgtControlData->mEventHandlerArray.setAutoDelete(false);
- while(i<mWdgtControlData->mEventHandlerArray.count())
- {
- IAlfWidgetEventHandler* handler =
- mWdgtControlData->mEventHandlerArray[i];
- //check if it is an eventhandler associated with presentation
- if(handler->eventHandlerType() ==
- IAlfWidgetEventHandler::EPresentationEventHandler)
- {
- mWdgtControlData->mEventHandlerArray.remove( i );
- }
- else
- {
- i++;
- }
- }
- // restore auto delete state.
- mWdgtControlData->mEventHandlerArray.setAutoDelete(autoDeleteState);
- }
-
-ElementData* CAlfWidgetControl::removePesentationElementData(
- IAlfWidgetEventHandler& aEventHandler )
- {
- IAlfElement* element =
- IAlfInterfaceBase::makeInterface<IAlfElement>( &aEventHandler );
-
- for ( int i = 0; i < mWdgtControlData->mElementArray.count(); ++i )
- {
- if ( mWdgtControlData->mElementArray[i]->mElement == element )
- {
- // cache auto delete state.
- bool autoDeleteState =
- mWdgtControlData->mElementArray.autoDelete();
- mWdgtControlData->mElementArray.setAutoDelete(false);
- // Store the Element Data which is to be removed.
- // This pointer will be returned to the caller
- ElementData* elementData = mWdgtControlData->mElementArray[i];
- mWdgtControlData->mElementArray.remove( i );
- // restore auto delete state.
- mWdgtControlData->mElementArray.setAutoDelete(autoDeleteState);
- return elementData;;
- }
- }
- return 0;
- }
-
-OSN_EXPORT int CAlfWidgetControl::numElements() const
- {
- return mWdgtControlData->mElementArray.count();
- }
-
-OSN_EXPORT IAlfElement& CAlfWidgetControl::element( int aIndex )
- {
- return *(mWdgtControlData->mElementArray[aIndex]->mElement);
- }
-
-OSN_EXPORT IAlfElement* CAlfWidgetControl::findElement( const char* aName )
- {
- UString name(aName);
- for ( int i = 0; i < mWdgtControlData->mElementArray.count(); ++i )
- {
- IAlfElement* element = mWdgtControlData->mElementArray[i]->mElement;
- if (name == UString(element->name()))
- {
- return element;
- }
- }
- return 0;
- }
-
-OSN_EXPORT void CAlfWidgetControl::addElement( IAlfElement* aElement )
- {
- for ( int i = 0; i < mWdgtControlData->mElementArray.count(); ++i )
- {
- if ( mWdgtControlData->mElementArray[i]->mElement == aElement )
- {
- return; // Already exists
- }
- }
- auto_ptr<ElementData> elemData( new (EMM) ElementData() );
- elemData->mElement = aElement;
- elemData->mDataIdRange = 0xFFFFFFFF;
- try
- {
- mWdgtControlData->mElementArray.resize(
- mWdgtControlData->mElementArray.count()+1);
- mWdgtControlData->mElementArray.insert(
- mWdgtControlData->mElementArray.count(),
- elemData.get() );
- elemData.release(); // ownership transferred
- }
- catch (...)
- {
- // change the element of element data to 0.
- // this will ensure that the element does not get deleted when the
- // elemData gets out of scope, since elemData was not successfully
- // added to the array
- elemData->mElement = 0;
- ALF_THROW(AlfException,ECommonError,"AlfWidgetControl: Adding the element failed.")
- }
- }
-
-OSN_EXPORT void CAlfWidgetControl::removeAndDestroyElement(
- const IAlfElement& aElement )
- {
- for ( int i = 0; i < mWdgtControlData->mElementArray.count(); ++i )
- {
- if (mWdgtControlData->mElementArray[i])
- {
- if ( mWdgtControlData->mElementArray[i]->mElement == &aElement )
- {
- // Remove the element
- IAlfElement *element =
- mWdgtControlData->mElementArray[i]->mElement;
-
- // If the element is also an event handler
- IAlfWidgetEventHandler* eventHandler =
- IAlfInterfaceBase::makeInterface<IAlfWidgetEventHandler>(
- element );
- int eventHandlerIndex =
- mWdgtControlData->mEventHandlerArray.findRef(
- eventHandler );
- if ( eventHandler && eventHandlerIndex != KErrNotFound )
- {
- // cache auto delete state.
- bool autoDeleteState =
- mWdgtControlData->mEventHandlerArray.autoDelete();
- mWdgtControlData->mEventHandlerArray.setAutoDelete(false);
- mWdgtControlData->mEventHandlerArray.remove(
- eventHandlerIndex );
- // restore auto delete state.
- mWdgtControlData->mEventHandlerArray.setAutoDelete(
- autoDeleteState);
- }
- // remove and destroy the element
- mWdgtControlData->mElementArray.remove( i );
- return;
- }
-
- }
- }
- }
-
-OSN_EXPORT void CAlfWidgetControl::removeElement(const IAlfElement& aElement )
- {
- for ( int i = 0; i < mWdgtControlData->mElementArray.count(); ++i )
- {
- if (mWdgtControlData->mElementArray[i])
- {
- if ( mWdgtControlData->mElementArray[i]->mElement == &aElement )
- {
- // make the element pointer of elementData null, and then
- // destroy elementData. This will ensure that the memory
- // allocated for the elementData is freed but the element
- // is not destroyed
- mWdgtControlData->mElementArray[i]->mElement = 0;
- mWdgtControlData->mElementArray.remove(i);
- return;
- }
- }
- }
- }
-
-OSN_EXPORT uint CAlfWidgetControl::elementDataId(
- const IAlfElement& aElement,
- uint aIndex,
- uint aParentDataId )
- {
- uint range = dataIdRange( aElement );
-
- if ( aIndex >= range )
- {
- }
- // In hierarchical element structures this may overflow
- return aParentDataId * range + aIndex;
- }
-
-OSN_EXPORT uint CAlfWidgetControl::parentElementDataId(
- const IAlfElement& aElement,
- uint aDataId )
- {
- uint dataIdRng = dataIdRange( aElement );
- if (0 == dataIdRng) return(0xFFFFFFFF);
- else
- return (uint)( aDataId / dataIdRange( aElement ) );
- }
-
-OSN_EXPORT uint CAlfWidgetControl::dataIdToIndex(
- const IAlfElement& aElement,
- uint aDataId )
- {
- uint dataIdRng = dataIdRange( aElement );
- if (0 == dataIdRng) return(0xFFFFFFFF);
- else
- return aDataId % dataIdRange( aElement );
- }
-
-OSN_EXPORT IAlfVariantType* CAlfWidgetControl::elementData(
- const IAlfElement& aElement, uint aDataId )
- {
- if (!mWdgtControlData->mWidget)
- {
- return 0;
- }
- IAlfModel* widgetModel = mWdgtControlData->mWidget->model();
- if ( !widgetModel )
- {
- return 0;
- }
- IAlfVariantType* modelData = widgetModel->data();
- if ( !modelData || modelData->type() != IAlfVariantType::EMap )
- {
- return 0;
- }
-
- IAlfMap* map = modelData->map();
-
- // Use "current" to traverse elements from the root to the leaf
- const IAlfElement* last = 0;
- while ( last != &aElement )
- {
- int currentDataId = aDataId;
- const IAlfElement* current;
- for ( current = &aElement ;
- current->parentElement() != last ;
- current = current->parentElement() )
- {
- currentDataId = parentElementDataId( *current, currentDataId );
- }
- int index = dataIdToIndex( *current, currentDataId );
- last = current;
-
- IAlfVariantType* data = map->item( UString(current->name()) );
- if ( data->type() == IAlfVariantType::EContainer )
- {
- data = data->container()->item( index );
- }
- if ( current == &aElement )
- {
- return data;
- }
- if ( data->type() == IAlfVariantType::EBranch )
- {
- // Continue with the child data
- map = data->branch()->childData();
- continue;
- }
- if ( data->type() == IAlfVariantType::EMap )
- {
- map = data->map();
- }
- else
- {
- return 0;
- }
- }
-
- return 0;
- }
-
-OSN_EXPORT void CAlfWidgetControl::setDataIdRange(
- const IAlfElement& aElement, uint aRange )
- {
- for ( int i = 0; i < mWdgtControlData->mElementArray.count(); ++i )
- {
- if ( mWdgtControlData->mElementArray[i]->mElement == &aElement )
- {
- mWdgtControlData->mElementArray[i]->mDataIdRange = aRange;
- return;
- }
- }
- }
-
-OSN_EXPORT uint CAlfWidgetControl::dataIdRange( const IAlfElement& aElement )
- {
- for ( int i = 0; i < mWdgtControlData->mElementArray.count(); ++i )
- {
- if ( mWdgtControlData->mElementArray[i]->mElement == &aElement )
- {
- return mWdgtControlData->mElementArray[i]->mDataIdRange;
- }
- }
- return 0;
- }
-
-OSN_EXPORT void CAlfWidgetControl::updatePresentation()
- {
- if ( !mWdgtControlData->mWidget || !mWdgtControlData->mWidget->model() ||
- !mWdgtControlData->mWidget->model()->data() ||
- mWdgtControlData->mWidget->model()->data()->type() !=
- IAlfVariantType::EMap )
- {
- return;
- }
- IAlfMap* map = mWdgtControlData->mWidget->model()->data()->map();
- for ( int i = 0; i < map->count(); ++i )
- {
- IAlfElement* element = findElement( map->name( i ).getUtf8() );
- if ( element )
- {
-
- int childInd = childIndex( *map, i, 0, true );
- IAlfVariantType* data = map->item( i );
- try
- {
- if ( data->type() == IAlfVariantType::EMap ||
- data->type() == IAlfVariantType::EBranch)
- {
- // Data for a single presentation instance (visual tree)
- element->createVisualTree( *data,
- elementDataId( *element, childInd, 0 ),
- element->defaultParentLayout( 0 ), childInd );
- }
- else if ( data->type() == IAlfVariantType::EContainer )
- {
-
- // Data for multiple presentation instances (visual trees)
- IAlfContainer* container = data->container();
- for ( int j = 0; j < container->count(); ++j )
- {
- element->createVisualTree( *container->item( j ),
- elementDataId( *element, childInd + j, 0 ),
- element->defaultParentLayout( 0 ), childInd + j );
- }
- }
- }
- catch (...)
- {
- ALF_THROW(AlfVisualException,ECanNotCreateVisual,"CAlfWidgetControl::updatePresentation failed")
- }
-
- }
-
- }
- }
-
-OSN_EXPORT void CAlfWidgetControl::destroyPresentation( int aTimeMilliseconds )
- {
- (void)aTimeMilliseconds;
-
- for ( int i = 0; i < mWdgtControlData->mElementArray.count(); ++i )
- {
- mWdgtControlData->mElementArray[i]->mElement->removeAndDestroyVisuals(
- aTimeMilliseconds );
- }
- processEvent(TAlfEvent(EEventWidgetPresentationDestroyed));
- }
-
-OSN_EXPORT void CAlfWidgetControl::destroyVisualsAndElements(
- int aTimeMilliseconds )
- {
- (void)aTimeMilliseconds;
-
- // destroy visual trees from elements
- for( int i = 0; i < mWdgtControlData->mElementArray.count(); ++i )
- {
- mWdgtControlData->mElementArray[i]->mElement->removeAndDestroyVisuals(
- aTimeMilliseconds );
- }
- // destroy elements
- while( numElements() )
- {
- removeAndDestroyElement( element(numElements()-1) );
- }
-
- // destroy presentation related event handlers
- removeAndDestroyPresentationEventHandlers();
-
- // send notification
- processEvent(TAlfEvent(EEventWidgetPresentationDestroyed));
- }
-
-OSN_EXPORT void CAlfWidgetControl::updateParentLayout()
- {
- //get the parent control
- CAlfWidgetControl* parent = dynamic_cast<CAlfWidgetControl*>(Host());
- if (parent)
- {
- IAlfLayoutManager* layoutManager =
- CAlfWidgetControl::makeInterface<IAlfLayoutManager>(parent);
- if (layoutManager)
- {
- layoutManager->updateChildLayout(this);
- }
- }
- }
-
-OSN_EXPORT bool CAlfWidgetControl::isContainer() const
- {
- IAlfHostAPI* api = mWdgtControlData->mAlfHostAPIImpl.get();
- return (api && api->getConnectionCount() > 0);
- }
-
-OSN_EXPORT bool CAlfWidgetControl::isFocusable() const
- {
- return checkState(IAlfWidgetControl::Enabled) &&
- checkState(IAlfWidgetControl::Focusable);
- }
-
-void CAlfWidgetControl::setOwnerWidget( AlfWidget* aWidget )
- {
- mWdgtControlData->mWidget = aWidget;
- }
-
-OSN_EXPORT AlfWidget* CAlfWidgetControl::widget()
- {
- return mWdgtControlData->mWidget;
- }
-
-OSN_EXPORT AlfEventStatus CAlfWidgetControl::handleEvent(
- const TAlfEvent& aEvent )
- {
- AlfEventStatus ret = EEventNotHandled;
- if(isContainer())
- {
- CAlfWidgetControl* focused =
- dynamic_cast<CAlfWidgetControl*>(FocusedConnection());
- if(focused && aEvent.IsKeyEvent())
- {
- ret = focused->processEvent(aEvent);
- }
- else if ( aEvent.IsCustomEvent() )
- {
- int eventId = aEvent.CustomParameter();
- switch(eventId)
- {
- case EEventFocusNextWidget:
- {
- if( handleFocusNext() )
- {
- ret = EEventConsumed;
- }
- }
- break;
- case EEventFocusPreviousWidget:
- {
- if( handleFocusPrevious() )
- {
- ret = EEventConsumed;
- }
- }
- break;
- }
- }
- }
- return ret;
-
- }
-
-
-OSN_EXPORT TBool CAlfWidgetControl::OfferEventL( const TAlfEvent& aEvent )
- {
- TBool ret(EFalse);
- try
- {
- ret = processEvent(aEvent);
- }
- catch(AlfException& ae)
- {
- int reason = ae.errorCode();
- User::Leave( reason );
- }
-
- return ret;
- }
-
-
-
-
- OSN_EXPORT AlfEventStatus CAlfWidgetControl::processEvent(
- const TAlfEvent& aEvent )
- {
- AlfEventStatus ret(EEventNotHandled);
-
- /* If the event is not a custom event, stop execution if the widget is
- not in enabled state. For custom event continue execution anyway. */
- if(!(mWdgtControlData->mState & IAlfWidgetControl::Enabled) &&
- !(aEvent.IsCustomEvent()))
- {
- return EEventNotHandled;
- }
-
- // Go through tunneling phase event handlers.
- AlfEventStatus ret2 = ProcessEventHandlingPhase( tunneling, aEvent );
-
- if( ret2 == EEventConsumed )
- {
- return EEventConsumed;
- }
- else if ( ret2 == EEventHandled )
- {
- ret = EEventHandled;
- }
-
- // Execute business logic.
- if(aEvent.IsPointerEvent())
- {
- if (aEvent.PointerDown() && isFocusable() && !Focus())
- {
- AcquireFocus();
- }
- }
-
- ret2 = handleEvent( aEvent );
-
- if( ret2 == EEventConsumed )
- {
- return EEventConsumed;
- }
- else if ( ret2 == EEventHandled )
- {
- ret = EEventHandled;
- }
-
- // Go through bubbling phase event handlers.
- ret2 = ProcessEventHandlingPhase( bubbling, aEvent );
-
- if( ret2 == EEventConsumed )
- {
- return EEventConsumed;
- }
- else if ( ret2 == EEventHandled )
- {
- ret = EEventHandled;
- }
-
- return ret;
- }
-
-AlfEventStatus CAlfWidgetControl::ProcessEventHandlingPhase(
- int aPhase, const TAlfEvent& aEvent )
- {
- // *** Implementation note ***
- //
- // offerEvent implementations may remove event handlers from the array that is
- // being gone through. So that needs to be taken in consideration in the
- // loop implementation.
-
- AlfEventStatus ret = EEventNotHandled;
-
- AlfPtrVector<IAlfWidgetEventHandler>& eventHandlerArray =
- mWdgtControlData->mEventHandlerArray;
-
- for (int i=0; i < eventHandlerArray.count() ; ++i)
- {
- IAlfWidgetEventHandler* eventHandler =
- mWdgtControlData->mEventHandlerArray[i];
-
- int phase = eventHandler->eventExecutionPhase();
-
- bool matchingPhase = false;
- if ( aPhase == bubbling )
- {
- if ( phase == IAlfWidgetEventHandler::
- EBubblingPhaseEventHandler ||
- phase == IAlfWidgetEventHandler::
- ETunnellingAndBubblingPhaseEventHandler )
- {
- matchingPhase = true;
- }
- }
- else if ( aPhase == tunneling )
- {
- if ( phase == IAlfWidgetEventHandler::
- ETunnellingPhaseEventHandler ||
- phase == IAlfWidgetEventHandler::
- ETunnellingAndBubblingPhaseEventHandler )
- {
- matchingPhase = true;
- }
- }
-
- if ( matchingPhase )
- {
- // This is preparation for the situation where event handlers are
- // removed or added during offerEvent call.
- // Store pointer to the event handler at next index.
- IAlfWidgetEventHandler* nextHandler = 0;
-
- if ( i+1 < eventHandlerArray.count() )
- {
- nextHandler = eventHandlerArray[i+1];
- }
-
- // Call offerEvent
- AlfEventStatus ret2 = eventHandler->offerEvent(*this, aEvent);
-
- // Update status in the function return value.
- if( ret2 == EEventConsumed )
- {
- ret = EEventConsumed;
- break;
- }
- else if ( ret2 == EEventHandled )
- {
- ret = EEventHandled;
- }
-
- // Now check whether next handler in the event handler array still
- // matches with the stored pointer.
- if ( nextHandler )
- {
- // Check whether the event handler at index i+1 is still the
- // same as before calling offerEvent. If not, the array has
- // been modified and the variable i needs to be set again.
- if ( i+1 >= eventHandlerArray.count() ||
- (i+1 < eventHandlerArray.count() &&
- eventHandlerArray[i+1] != nextHandler) )
- {
- // Array has changed in offerEvent, the handler at index
- // 'i+1' is not the same any more. Find the index of the
- // current event handler again in the array and fix the
- // loop variable 'i' point to that and continue.
- int newCount = eventHandlerArray.count();
- for ( int j = 0 ; j < newCount ; j++ )
- {
- if ( eventHandlerArray[j] == eventHandler )
- {
- i = j;
- break;
- }
- }
-
- }
- }
- }
- }
-
- return ret;
- }
-
-// from base class IAlfModelChangeObserver
-
-OSN_EXPORT void CAlfWidgetControl::modelChanged( IAlfModel& aModel )
- {
- (void)aModel;
- // This way the model change animation is customizable using event handlers
- // The default event handler could implement this:
- destroyPresentation( 0 );
- updatePresentation();
- updateParentLayout();
- }
-
-OSN_EXPORT void CAlfWidgetControl::dataChanging(
- const AlfPtrVector<AlfModelOperation>& aOperations )
- {
- for ( int i = 0; i < aOperations.count(); ++i )
- {
- dataChanging( *aOperations[i] );
- }
- }
-
-OSN_EXPORT void CAlfWidgetControl::dataChanging(
- const AlfModelOperation& aOperation )
- {
- int numIndices = aOperation.numContainerIndices();
- if ( !mWdgtControlData->mWidget->model() || numIndices <= 0 )
- {
- return;
- }
- uint dataId = 0, parentDataId = 0;
- IAlfElement* element = 0;
- IAlfElement* parentElement = 0;
- IAlfVariantType* data = mWdgtControlData->mWidget->model()->data();
- if(data == 0)
- {
- return;
- }
- IAlfBranch* parentBranch = 0;
- // Traverse the data hierarchy to find the data, dataId and the element
- for ( int i = 0; i < numIndices; ++i )
- {
- int index = aOperation.containerIndex( i );
- if ( data->type() == IAlfVariantType::EMap &&
- index >= 0 && index < data->map()->count() )
- {
- parentElement = element;
- element = findElement( data->map()->name( index ).getUtf8() );
- if ( element == 0 )
- {
- return; // Not found
- }
- IAlfMap* map = data->map();
- data = data->map()->item( index );
-
- if ( data->type() == IAlfVariantType::EContainer )
- {
- ++i;
- int containerIndex = aOperation.containerIndex( i );
- if ( containerIndex < 0 ||
- containerIndex >= data->container()->count() )
- {
- break; // Not found
- }
- int childInd =
- childIndex( *map, index, containerIndex, i == 1 );
- parentDataId = dataId;
- dataId = elementDataId( *element, childInd, parentDataId );
- data = data->container()->item( containerIndex );
- }
- else
- {
- int childInd = childIndex( *map, index, 0, i == 0 );
- parentDataId = dataId;
- dataId = elementDataId( *element, childInd, parentDataId );
- }
- }
- else if ( data->type() == IAlfVariantType::EBranch &&
- index == 0 && i == numIndices - 1 )
- {
- // Changing the parent data
- data = data->branch()->data();
- }
- else if ( data->type() == IAlfVariantType::EBranch && index == 1 )
- {
- parentBranch = data->branch();
- data = data->branch()->childData();
- }
- else
- {
- return; // Not found
- }
- }
-
- // Perform the operation
- if ( aOperation.operation() == AlfModelOperation::EOperationAdd )
- {
- if ( parentBranch )
- {
- // The parent is responsible for it's children
- parentElement->createChildVisualTree(
- element, aOperation.newData(),
- *parentBranch,aOperation.index(),
- parentDataId );
- }
- else
- {
- if(element)
- {
- // Data added to a root element
- try
- {
- element->createVisualTree(
- aOperation.newData(), dataId,
- element->defaultParentLayout( parentDataId ),
- aOperation.index() );
- }
- catch (...)
- {
- ALF_THROW(AlfVisualException,ECanNotCreateVisual,"CAlfWidgetControl::dataChanging failed")
- }
- }
- else
- {
- ALF_THROW(AlfVisualException,ECanNotCreateVisual,"CAlfWidgetControl::dataChanging failed")
- }
-
- }
- }
- else if ( aOperation.operation() == AlfModelOperation::EOperationRemove )
- {
- if ( parentBranch )
- {
- // The parent is responsible for it's children
- parentElement->removeChildVisualTree(
- element, *parentBranch, aOperation.index(), parentDataId );
- }
- else
- {
- if(element)
- {
- // Data removed from a root element
- element->removeVisualTree( *data, dataId );
- }
- }
- }
- else if ( aOperation.operation() == AlfModelOperation::EOperationUpdate )
- {
- if(element)
- {
- element->updateVisualTree( aOperation.newData(), *data, dataId );
- }
- }
- }
-
-OSN_EXPORT void CAlfWidgetControl::dataChanged()
- {
- // The default implementation is empty.
- }
-
-uint CAlfWidgetControl::childIndex(
- IAlfMap& aMap, uint aMapIndex,
- uint aContainerIndex, bool aRoot )
- {
- // This method is only used internally
- const UString& elementName = aMap.name( aMapIndex );
- int index = 0;
- for ( int i = 0; i < aMapIndex && i < aMap.count(); ++i )
- {
- if ( !aRoot || elementName == aMap.name( i ) )
- {
- IAlfVariantType* data = aMap.item( i );
- if ( data->type() == IAlfVariantType::EMap ||
- data->type() == IAlfVariantType::EBranch)
- {
- index++;
- }
- else if ( data->type() == IAlfVariantType::EContainer )
- {
- index += data->container()->count();
- }
- }
- }
- return index + aContainerIndex;
- }
-
-// ---------------------------------------------------------------------------
-// From class IAlfInterfaceBase.
-// Getter for interfaces provided by the control.
-// ---------------------------------------------------------------------------
-//
-OSN_EXPORT IAlfInterfaceBase* CAlfWidgetControl::makeInterface(
- const IfId& aType )
- {
- IAlfInterfaceBase* interface = 0;
- UString param(aType.mImplementationId);
- if ( param == IAlfWidgetControl::type().mImplementationId )
- {
- return static_cast<IAlfWidgetControl*>( this );
- }
- else if (param == IAlfAttributeOwner::type().mImplementationId)
- {
- return 0; // control does not have AttributeOwner instance
- // and do not try get IF from elements in control
- }
- // Let the layout manager create the interface that is queried.
- else if(mWdgtControlData->mAlfHostAPIImpl.get())
- {
- IAlfLayoutManager* layoutManager =
- mWdgtControlData->mAlfHostAPIImpl->getBaseLayout();
- if(layoutManager)
- {
- interface = layoutManager->makeInterface(aType);
- }
- }
-
- if(interface == 0)
- {
- //go through all the elements
- for (int i = 0; i < numElements() && !interface; i++)
- {
- IAlfElement& ele = element(i);
- interface = ele.makeInterface(aType);
- }
- }
-
- return interface;
- }
-
-
-OSN_EXPORT CAlfLayout* CAlfWidgetControl::ContainerLayout(
- const CAlfControl* /*aConnected*/) const
- {
- if(mWdgtControlData->mAlfHostAPIImpl.get() != 0)
- {
- IAlfLayoutManager* layoutManager =
- mWdgtControlData->mAlfHostAPIImpl->getBaseLayout();
- if(layoutManager != 0)
- {
- return &layoutManager->getLayout();
- }
- }
- return 0;
- }
-
-
-OSN_EXPORT void CAlfWidgetControl::AcquireFocus()
- {
- if (!FocusedConnection() && isFocusable())
- {
- if (isContainer())
- {
- IAlfHostAPI& hostApi = hostAPI();
- //select the first connection.
-
- CAlfWidgetControl* firstChild = nextFocusableControl(0);
- if (firstChild)
- {
- firstChild->AcquireFocus();
- }
- }
- else
- {
- CAlfControl::AcquireFocus();
- }
- }
- }
-
-OSN_EXPORT void CAlfWidgetControl::RelinquishFocus()
- {
- if (Focus())
- {
- if (isContainer())
- {
- handleFocusNext();
- }
- else
- {
- //get parent control, check if it can focus next control.
- CAlfWidgetControl* parent =
- dynamic_cast<CAlfWidgetControl*>(Host());
- if (parent)
- {
- parent->handleFocusNext();
- }
-
- CAlfControl::RelinquishFocus();
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// return hostapi. create instance if needed.
-// ---------------------------------------------------------------------------
-//
-IAlfHostAPI& CAlfWidgetControl::hostAPI()
- {
- if (!mWdgtControlData->mAlfHostAPIImpl.get()) // was it already created?
- {
- //late creation
- mWdgtControlData->mAlfHostAPIImpl.reset( new (EMM) AlfHostAPIImpl() );
- mWdgtControlData->mAlfHostAPIImpl->setHostControl(*this);
- }
-
- return *mWdgtControlData->mAlfHostAPIImpl.get();
- }
-
-OSN_EXPORT bool CAlfWidgetControl::handleFocusNext()
- {
- bool focusChanged = false;
- if (isContainer())
- {
- CAlfWidgetControl* focused =
- dynamic_cast<CAlfWidgetControl*>(FocusedConnection());
- if (focused)
- {
- CAlfWidgetControl* nextChild = nextFocusableControl(focused);
-
- if (!nextChild)
- {
- //no next child, change focus to upper level, if that fails,
- //loop to first connection.
- CAlfWidgetControl* parent =
- dynamic_cast<CAlfWidgetControl*>(Host());
- if (parent)
- {
- focusChanged = parent->handleFocusNext();
- }
- if (!focusChanged)
- {
- //loop to first connection.
- nextChild = nextFocusableControl(0);
- }
- }
-
- //go deeper down the widget hierarchy, until a no-container widget
- // is found
- while(nextChild && nextChild->isContainer())
- {
- nextChild = nextChild->nextFocusableControl(0);
- }
-
- if (nextChild)
- {
- nextChild->AcquireFocus();
- focusChanged = true;
- }
- }
- }
- return focusChanged;
- }
-
-OSN_EXPORT bool CAlfWidgetControl::handleFocusPrevious()
- {
- bool focusChanged = false;
- if (isContainer())
- {
-
- CAlfWidgetControl* focused =
- dynamic_cast<CAlfWidgetControl*>(FocusedConnection());
- if (focused)
- {
- CAlfWidgetControl* prevChild = previousFocusableControl(
- focused);
-
- if (!prevChild)
- {
- // no previous child, change focus to upper level, if that
- // fails, loop to last connection.
- CAlfWidgetControl* parent =
- dynamic_cast<CAlfWidgetControl*>(Host());
- if (parent)
- {
- focusChanged = parent->handleFocusPrevious();
- }
- if (!focusChanged)
- {
- //loop to last connection.
- prevChild = previousFocusableControl(0);
- }
- }
- //go deeper down the widget hierarchy, until a no-container widget
- //is found.
- while(prevChild && prevChild->isContainer())
- {
- //in each level, select the last focused widget.
- prevChild = prevChild->previousFocusableControl(0);
- }
-
- if (prevChild)
- {
- prevChild->AcquireFocus();
- focusChanged = true;
- }
- }
- }
-
- return focusChanged;
- }
-
-OSN_EXPORT CAlfWidgetControl* CAlfWidgetControl::getFirstFocusable(
- IAlfContainerWidget& aContainer)
- {
- CAlfWidgetControl* control = 0;
- if (aContainer.widgetCount() > 0)
- {
- control = aContainer.getWidget(0)->control();
- }
- return control;
- }
-
-OSN_EXPORT CAlfWidgetControl* CAlfWidgetControl::getLastFocusable(
- IAlfContainerWidget& aContainer)
- {
- CAlfWidgetControl* control = 0;
- if (aContainer.widgetCount() > 0)
- {
- IAlfWidget* w = aContainer.getWidget(aContainer.widgetCount()-1);
- control = w->control();
- }
- return control;
- }
-
-OSN_EXPORT CAlfWidgetControl* CAlfWidgetControl::getFocusableAfter(
- IAlfContainerWidget& aContainer,
- CAlfWidgetControl& aControl)
- {
- CAlfWidgetControl* control = 0;
- int ind = aContainer.getWidgetIndex(*aControl.widget());
- if (ind >= 0)
- {
- ind++;
- if (ind < aContainer.widgetCount())
- {
- IAlfWidget* w = aContainer.getWidget(ind);
- control = w->control();
- }
- }
-
- return control;
- }
-
-OSN_EXPORT CAlfWidgetControl* CAlfWidgetControl::getFocusableBefore(
- IAlfContainerWidget& aContainer, CAlfWidgetControl& aControl)
- {
- CAlfWidgetControl* control = 0;
- int ind = aContainer.getWidgetIndex(*aControl.widget());
- ind--;
- if (ind >= 0)
- {
- IAlfWidget* w = aContainer.getWidget(ind);
- control = w->control();
- }
-
- return control;
- }
-
-void CAlfWidgetControl::resetControlGroup(CAlfControlGroup& aControlGroup)
- {
- // If control group is already set and its same than the control group
- // given as a parameter there's nothing we need to do.
- if(!ControlGroup() || (ControlGroup() != &aControlGroup))
- {
- // Remove control from previous control group
- if(ControlGroup())
- {
- ControlGroup()->Remove(this);
- }
- // Append control to the new control group
- TRAPD(err, aControlGroup.AppendL(this));
- if(err != KErrNone)
- {
- ALF_THROW(AlfException, err, "CAlfWidgetControl::resetControlGroup - Appending control to a new control group failed.");
- }
- }
- }
-
-void CAlfWidgetControl::resetHierarchyControlGroup(
- CAlfControlGroup& aControlGroup)
- {
- // Append this control to the new control group
- resetControlGroup(aControlGroup);
-
- // Call this recursively to all connected controls
- AlfHostAPIImpl* hostApi = mWdgtControlData->mAlfHostAPIImpl.get();
- if(hostApi != 0)
- {
- for(int i = 0; i < hostApi->getConnectionCount(); ++i)
- {
- CAlfWidgetControl* connectedControl = hostApi->getConnection(i);
- if(connectedControl)
- {
- connectedControl->resetHierarchyControlGroup(aControlGroup);
- }
- }
- }
- }
-
-
-OSN_EXPORT void CAlfWidgetControl::FocusChanged(
- CAlfDisplay& /*aDisplay*/,
- TBool aFocused)
- {
- // Ensure that the state bit remains synched to the toolkit's version
- if (aFocused)
- {
- mWdgtControlData->mState |= IAlfWidgetControl::Focused;
- }
- else
- {
- mWdgtControlData->mState &=~ IAlfWidgetControl::Focused;
- }
-
- if (aFocused)
- {
- processEvent(TAlfEvent(EEventWidgetGainedFocus));
- }
- else
- {
- processEvent(TAlfEvent(EEventWidgetLostFocus));
- }
- }
-
-OSN_EXPORT CAlfWidgetControl* CAlfWidgetControl::nextFocusableControl(
- CAlfWidgetControl* aControl)
- {
- CAlfWidgetControl* control = 0;
-
- if (isContainer())
- {
- IAlfContainerWidget* container =
- IAlfInterfaceBase::makeInterface<IAlfContainerWidget>(widget());
-
- assert(container);
-
- if (!aControl)
- {
- control = getFirstFocusable(*container);
- }
- else
- {
- control = getFocusableAfter(*container, *aControl);
- }
-
- while(control && !control->isFocusable())
- {
- control = control->getFocusableAfter(*container, *control);
- }
- }
-
- return control;
- }
-
-OSN_EXPORT CAlfWidgetControl* CAlfWidgetControl::previousFocusableControl(
- CAlfWidgetControl* aControl)
- {
- CAlfWidgetControl* control = 0;
-
- if (isContainer())
- {
- IAlfContainerWidget* container =
- IAlfInterfaceBase::makeInterface<IAlfContainerWidget>(widget());
-
- assert(container);
-
- if (!aControl)
- {
- control = getLastFocusable(*container);
- }
- else
- {
- control = getFocusableBefore(*container, *aControl);
- }
-
- while(control && !control->isFocusable())
- {
- control = control->getFocusableBefore(*container, *control);
- }
- }
-
- return control;
- }
-
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
-void CAlfWidgetControl::enableStateVisible()
- {
- // Only take action if the current state is different
- if ( !(mWdgtControlData->mState & IAlfWidgetControl::Visible) )
- {
- // Update the new state in member variable
- mWdgtControlData->mState |= IAlfWidgetControl::Visible;
-
- }
- }
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
-void CAlfWidgetControl::disableStateVisible()
- {
- // Only take action if the current state is different
- if ( mWdgtControlData->mState & IAlfWidgetControl::Visible )
- {
- // Update the new state in member variable
- mWdgtControlData->mState &= ~IAlfWidgetControl::Visible;
- }
- }
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
-void CAlfWidgetControl::enableStateEnabled()
- {
- // Only take action if the current state is different
- if ( !(mWdgtControlData->mState & IAlfWidgetControl::Enabled) )
- {
- // Update the new state in member variable
- mWdgtControlData->mState |= IAlfWidgetControl::Enabled;
- }
- }
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
-void CAlfWidgetControl::disableStateEnabled()
- {
- // Only take action if the current state is different
- if ( mWdgtControlData->mState & IAlfWidgetControl::Enabled )
- {
- // Update the new state in member variable
- mWdgtControlData->mState &= ~IAlfWidgetControl::Enabled;
- }
- }
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
-void CAlfWidgetControl::enableStateFocused()
- {
- // Only take action if the current state is different
- if ( !(mWdgtControlData->mState & IAlfWidgetControl::Focused) )
- {
- // Set the new state
- AcquireFocus();
-
- // Update the new state in member variable
- mWdgtControlData->mState |= IAlfWidgetControl::Focused;
- }
- }
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
-void CAlfWidgetControl::disableStateFocused()
- {
- // Only take action if the current state is different
- if ( mWdgtControlData->mState & IAlfWidgetControl::Focused )
- {
- // Set the new state
- RelinquishFocus();
-
- // Update the new state in member variable
- mWdgtControlData->mState &= ~IAlfWidgetControl::Focused;
- }
- }
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
-void CAlfWidgetControl::enableStateFocusable()
- {
- // Only take action if the current state is different
- if ( !(mWdgtControlData->mState & IAlfWidgetControl::Focusable) )
- {
- // Update the new state in member variable
- mWdgtControlData->mState |= IAlfWidgetControl::Focusable;
- }
- }
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
-void CAlfWidgetControl::disableStateFocusable()
- {
- // Only take action if the current state is different
- if ( mWdgtControlData->mState & IAlfWidgetControl::Focusable )
- {
- // Update the new state in member variable
- mWdgtControlData->mState &= ~IAlfWidgetControl::Focusable;
- }
- }
-
-void CAlfWidgetControl::checkStateInvariants(uint aState)
- {
- // To be focused, it needs to be focusable (Focus -> Focusable)
- if(aState & IAlfWidgetControl::Focused
- && !(aState & IAlfWidgetControl::Focusable) )
- {
- ALF_THROW(AlfException, EInvalidArgument, "AlfWidgetControl() - state changing operation. Illegal state would result.");
- }
-
- // To be focusable, it needs to be enabled (Focusable -> Enabled)
- if(aState & IAlfWidgetControl::Focusable
- && !(aState & IAlfWidgetControl::Enabled) )
- {
- ALF_THROW(AlfException, EInvalidArgument, "AlfWidgetControl() - state changing operation. Illegal state would result.");
- }
- }
-
-void CAlfWidgetControl::predictAndCheckStateInvariants(
- uint aChangePattern,
- bool aEnabling) const
- {
- uint predictedState(mWdgtControlData->mState);
- if(aEnabling)
- {
- predictedState |= aChangePattern;
- }
- else
- {
- predictedState &= ~aChangePattern;
- }
- checkStateInvariants(predictedState);
- }
-
-
-} // namespace Alf
-