--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluirendering/uiengine/src/xnviewadapter.cpp Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,1029 @@
+/*
+* Copyright (c) 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: Xuikon view adapter source file
+*
+*/
+
+// System includes
+#include <aknViewAppUi.h>
+#include <eikbtgpc.h>
+#include <avkon.rsg>
+
+// User includes
+#include "xnappuiadapter.h"
+#include "xnviewmanager.h"
+#include "xnviewdata.h"
+#include "xnuiengine.h"
+
+#include "xnkeyeventdispatcher.h"
+#include "xncontroladapter.h"
+
+#include "xndomdocument.h"
+#include "xndomnode.h"
+#include "xndomlist.h"
+#include "xnodt.h"
+#include "xnproperty.h"
+#include "xnnodeimpl.h"
+#include "xnnode.h"
+#include "xntype.h"
+#include "xnfocuscontrol.h"
+#include "xneditor.h"
+#include "xnbackgroundmanager.h"
+#include "xneffectmanager.h"
+#include "xnwallpaperview.h"
+
+#include "xnviewadapter.h"
+#include "xnmenu.h"
+#include "xneditmode.h"
+#include "xnrootdata.h"
+
+#include "debug.h"
+
+// Constants
+const TUid KXmlViewUid = { 1 };
+
+_LIT8( KActivateDefaultView, "activatedefault" );
+_LIT8( KSetWallpaper, "setwallpaper" );
+
+_LIT8( KMenuBar, "menubar" );
+
+// Data types
+enum
+ {
+ EIsActivated,
+ EIsInCall,
+ EIsLightsOn,
+ EIsForeground,
+ EIsControlsAwake,
+ EIsDestructionRunning
+ };
+
+enum TAction
+ {
+ ENoAction = 0,
+ EActivateDefault,
+ ESetWallpaper
+ };
+
+// ============================= LOCAL FUNCTIONS ===============================
+// -----------------------------------------------------------------------------
+// CleanupEffect
+// -----------------------------------------------------------------------------
+//
+static void CleanupEffect( TAny* aAny )
+ {
+ static_cast< CXnEffectManager* >( aAny )->CleanupControlEffect();
+ }
+
+// -----------------------------------------------------------------------------
+// DetermineStatusPaneLayout
+// -----------------------------------------------------------------------------
+//
+static TInt DetermineStatusPaneLayout( CXnProperty* aProperty )
+ {
+ TInt spane( KErrNotFound );
+
+ if ( aProperty )
+ {
+ const TDesC8& value( aProperty->StringValue() );
+
+ // Currently supported status pane layout
+ if ( value == XnPropertyNames::view::statuspanelayout::KNone )
+ {
+ spane = R_AVKON_STATUS_PANE_LAYOUT_EMPTY;
+ }
+ if ( value == XnPropertyNames::view::statuspanelayout::KBasic )
+ {
+ spane = R_AVKON_STATUS_PANE_LAYOUT_IDLE;
+ }
+ else if ( value == XnPropertyNames::view::statuspanelayout::KBasicFlat )
+ {
+ spane = R_AVKON_STATUS_PANE_LAYOUT_IDLE_FLAT;
+ }
+ else if ( value ==
+ XnPropertyNames::view::statuspanelayout::KWideScreen )
+ {
+ spane = R_AVKON_WIDESCREEN_PANE_LAYOUT_IDLE;
+ }
+ else if ( value ==
+ XnPropertyNames::view::statuspanelayout::KWideScreenFlat )
+ {
+ spane = R_AVKON_WIDESCREEN_PANE_LAYOUT_IDLE_FLAT;
+ }
+ else if ( value ==
+ XnPropertyNames::view::statuspanelayout::
+ KWideScreenFlat3Softkeys )
+ {
+ spane = R_AVKON_WIDESCREEN_PANE_LAYOUT_IDLE_FLAT_NO_SOFTKEYS;
+ }
+ }
+
+ return spane;
+ }
+
+// -----------------------------------------------------------------------------
+// BuildTriggerL
+// -----------------------------------------------------------------------------
+//
+static CXnNode* BuildTriggerL(
+ CXnUiEngine& aUiEngine,
+ const TDesC8& aTriggerName )
+ {
+ CXnNode* node = CXnNode::NewL();
+ CleanupStack::PushL( node );
+ CXnType* type = CXnType::NewL( XnPropertyNames::action::KTrigger );
+ CleanupStack::PushL( type );
+ CXnNodeImpl* impl = CXnNodeImpl::NewL( type );
+ CleanupStack::Pop( type );
+ node->SetImpl( impl );
+ node->SetUiEngine( aUiEngine );
+
+ CXnDomPropertyValue* nameValue = CXnDomPropertyValue::NewL(
+ aUiEngine.ODT()->DomDocument().StringPool() );
+ CleanupStack::PushL( nameValue );
+ nameValue->SetStringValueL( CXnDomPropertyValue::EString, aTriggerName );
+ CXnProperty* name = CXnProperty::NewL(
+ XnPropertyNames::action::trigger::KName,
+ nameValue,
+ *aUiEngine.ODT()->DomDocument().StringPool() );
+ CleanupStack::Pop( nameValue );
+ CleanupStack::PushL( name );
+ node->SetPropertyL( name );
+ CleanupStack::Pop( 2, node ); // name
+
+ return node;
+ }
+
+// -----------------------------------------------------------------------------
+// BuildActivateTriggerL
+// -----------------------------------------------------------------------------
+//
+static CXnNode* BuildActivateTriggerL( CXnUiEngine& aUiEngine )
+ {
+ return BuildTriggerL(
+ aUiEngine, XnPropertyNames::action::trigger::name::KViewActivate );
+ }
+
+// -----------------------------------------------------------------------------
+// BuildDeactivateTriggerL
+// -----------------------------------------------------------------------------
+//
+static CXnNode* BuildDeactivateTriggerL( CXnUiEngine& aUiEngine )
+ {
+ return BuildTriggerL(
+ aUiEngine, XnPropertyNames::action::trigger::name::KViewDeactivate );
+ }
+
+// -----------------------------------------------------------------------------
+// BuildEditStateTriggerL
+// -----------------------------------------------------------------------------
+//
+static CXnNode* BuildEditStateTriggerL( CXnUiEngine& aUiEngine )
+ {
+ CXnDomStringPool* sp( aUiEngine.ODT()->DomDocument().StringPool() );
+
+ CXnProperty* value = CXnProperty::NewL(
+ XnPropertyNames::action::KValue,
+ KNullDesC8, CXnDomPropertyValue::EString, *sp );
+ CleanupStack::PushL( value );
+
+ CXnNode* trigger( BuildTriggerL(
+ aUiEngine, XnPropertyNames::action::trigger::name::KEditMode ) );
+ CleanupStack::PushL( trigger );
+
+ trigger->SetPropertyL( value );
+ CleanupStack::Pop( 2, value ); // trigger
+
+ return trigger;
+ }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::CXnViewAdapter
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CXnViewAdapter::CXnViewAdapter( CXnAppUiAdapter& aAdapter )
+ : iAppUiAdapter( aAdapter )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::~CXnViewAdapter
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CXnViewAdapter::~CXnViewAdapter()
+ {
+ delete iTimer;
+ delete iActivate;
+ delete iDeactivate;
+ delete iEditState;
+ delete iBgManager;
+ delete iFocusControl;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::NewL
+// 2nd phase construction.
+// -----------------------------------------------------------------------------
+//
+CXnViewAdapter* CXnViewAdapter::NewL( CXnAppUiAdapter& aAdapter )
+ {
+ CXnViewAdapter* self = new ( ELeave ) CXnViewAdapter( aAdapter );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::ConstructL
+// 2nd phase construction.
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::ConstructL()
+ {
+ BaseConstructL();
+
+ iTimer = CPeriodic::NewL( CActive::EPriorityIdle );
+
+ // Base class CAknViewAppUi takes ownership of iViewAdapter
+ iAppUiAdapter.AddViewL( this );
+ iAppUiAdapter.SetDefaultViewL( *this );
+
+ iBgManager = CXnBackgroundManager::NewL( iAppUiAdapter.ViewManager(),
+ iAppUiAdapter.ViewManager().Editor().HspsWrapper() );
+
+ iFocusControl = CXnFocusControl::NewL( iAppUiAdapter );
+
+ iEventDispatcher =
+ CXnKeyEventDispatcher::NewL( iAppUiAdapter.UiEngine() );
+
+ iAppUiAdapter.UiEngine().SetEventDispatcher( iEventDispatcher );
+
+ iAppUiAdapter.UiStateListener().AddObserver( *this );
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::ReloadUiL
+// Called when application UI is reloaded
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::ReloadUiL()
+ {
+ iTimer->Cancel();
+ iAction = ENoAction;
+
+ DeactivateContainerL();
+
+ iAppUiAdapter.RemoveFromStack( iEventDispatcher );
+
+ delete iEventDispatcher;
+ iEventDispatcher = NULL;
+
+ delete iActivate;
+ iActivate = NULL;
+
+ delete iDeactivate;
+ iDeactivate = NULL;
+
+ delete iEditState;
+ iEditState = NULL;
+
+ iEventDispatcher = CXnKeyEventDispatcher::NewL( iAppUiAdapter.UiEngine() );
+
+ iAppUiAdapter.UiEngine().SetEventDispatcher( iEventDispatcher );
+
+ if ( iFlags.IsSet( EIsActivated ) )
+ {
+ iAppUiAdapter.AddToStackL( *this, iEventDispatcher );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::PrepareToExit
+// Sets view to be destroyed
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::PrepareToExit()
+ {
+ iAppUiAdapter.RemoveFromStack( iEventDispatcher );
+
+ delete iEventDispatcher;
+ iEventDispatcher = NULL;
+
+ iAppUiAdapter.UiEngine().SetEventDispatcher( NULL );
+
+ iContainer = NULL;
+
+ iFlags.Set( EIsDestructionRunning );
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::EventDispatcher
+// Get event dispatcher
+// -----------------------------------------------------------------------------
+//
+CXnKeyEventDispatcher* CXnViewAdapter::EventDispatcher() const
+ {
+ return iEventDispatcher;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::BgManager
+// Returns background manager.
+// -----------------------------------------------------------------------------
+//
+CXnBackgroundManager& CXnViewAdapter::BgManager() const
+ {
+ return *iBgManager;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::FocusControl
+// Returns focus control.
+// -----------------------------------------------------------------------------
+//
+CXnFocusControl& CXnViewAdapter::FocusControl() const
+ {
+ return *iFocusControl;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::Id
+// Returns view uid.
+// -----------------------------------------------------------------------------
+//
+TUid CXnViewAdapter::Id() const
+ {
+ return KXmlViewUid;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::DoActivateL
+// Activates view.
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::DoActivateL( const TVwsViewId& /*aPrevViewId*/,
+ TUid /*aCustomMessageId*/,
+ const TDesC8& aCustomMessage )
+ {
+ if ( iFlags.IsSet( EIsDestructionRunning ) )
+ {
+ return;
+ }
+
+ __TICK( "CXnViewAdapter::DoActivateL" );
+ __TIME_MARK( time );
+
+ TBool wasActive( iFlags.IsSet( EIsActivated ) );
+
+ iFlags.Set( EIsActivated );
+
+ iEventDispatcher->ClearStateL();
+
+ iAppUiAdapter.RemoveFromStack( iEventDispatcher );
+ iAppUiAdapter.AddToStackL( *this, iEventDispatcher );
+
+ CEikButtonGroupContainer* bgc( iAppUiAdapter.Cba() );
+
+ if ( bgc )
+ {
+ // EventDispatcher will handle sotkey keyevents
+ CEikCba* cba(
+ static_cast< CEikCba* >( bgc->ButtonGroup() ) );
+
+ iAppUiAdapter.RemoveFromStack( cba );
+ }
+
+ iBgManager->MakeVisible( ETrue );
+
+ CXnViewData& viewData( iAppUiAdapter.ViewManager().ActiveViewData() );
+
+ if ( !wasActive )
+ {
+ // Set status pane layout
+ CXnProperty* prop( viewData.Node()->LayoutNode()->GetPropertyL(
+ XnPropertyNames::view::KStatusPaneLayout ) );
+
+ CEikStatusPane* sp( iAppUiAdapter.StatusPane() );
+
+ // Is there status pane declaration available
+ TInt spane( DetermineStatusPaneLayout( prop ) );
+
+ if ( spane != KErrNotFound )
+ {
+ if ( sp && sp->CurrentLayoutResId() != spane )
+ {
+ sp->SwitchLayoutL( spane );
+ sp->ApplyCurrentSettingsL();
+ }
+ }
+
+ // enable statuspane transparancy
+ if ( sp && !sp->IsTransparent() )
+ {
+ sp->EnableTransparent( ETrue );
+ sp->DrawNow();
+ }
+ }
+
+ if ( aCustomMessage == KSetWallpaper )
+ {
+ iAction = ESetWallpaper;
+
+ iTimer->Cancel();
+ iTimer->Start( 1000, 1000, TCallBack( TimerCallback, this ) );
+ }
+
+ // Set the active container
+ if ( aCustomMessage == KActivateDefaultView )
+ {
+ __PRINTS( "*** CXnViewAdapter::DoActivateL - activating default container" );
+
+ ActivateDefaultContainerL();
+
+ iAction = EActivateDefault;
+
+ iTimer->Cancel();
+ iTimer->Start( 1000, 1000, TCallBack( TimerCallback, this ) );
+ }
+ else
+ {
+ __PRINTS( "*** CXnViewAdapter::DoActivateL - activating container" );
+
+ ActivateContainerL( viewData );
+ }
+
+ __TIME_ENDMARK( "CXnViewAdapter::DoActivateL, done", time );
+
+ __TICK( "CXnViewAdapter::DoActivateL - HS UI Ready" );
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::TimerCallback
+//
+// -----------------------------------------------------------------------------
+//
+TInt CXnViewAdapter::TimerCallback( TAny *aPtr )
+ {
+ __PRINTS( "*** CXnViewAdapter::TimerCallback" );
+
+ CXnViewAdapter* self = reinterpret_cast< CXnViewAdapter* >( aPtr );
+ self->iTimer->Cancel();
+
+ if ( self->iAction == EActivateDefault )
+ {
+ self->iCoeEnv->WsSession().SetWindowGroupOrdinalPosition(
+ self->iCoeEnv->RootWin().Identifier(), 0 );
+ }
+ else if ( self->iAction == ESetWallpaper )
+ {
+ CAknViewAppUi& appui = static_cast< CAknViewAppUi& >( self->iAppUiAdapter );
+
+ CXnWallpaperView* view =
+ static_cast< CXnWallpaperView* >( appui.View( KWallpaperViewUid ) );
+
+ if ( view )
+ {
+ TFileName filename( KNullDesC );
+
+ // Get selected wallpaper
+ view->SelectedWallpaper( filename );
+
+ if ( filename != KNullDesC )
+ {
+ if ( self->BgManager().SetWallpaper( filename ) )
+ {
+ self->iAppUiAdapter.EffectManager()->BgAppearEffect(
+ self->iBgManager, ETrue );
+ }
+ }
+ }
+ }
+
+ self->iAction = ENoAction;
+
+ __PRINTS( "*** CXnViewAdapter::TimerCallback, done" );
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::DoDeactivate
+// Deactivates view.
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::DoDeactivate()
+ {
+ if ( iFlags.IsSet( EIsDestructionRunning ) )
+ {
+ return;
+ }
+
+ __PRINTS( "*** CXnViewAdapter::DoDeactivate" );
+ __TIME_MARK( time );
+
+ iAppUiAdapter.RemoveFromStack( iEventDispatcher );
+
+ TRAP_IGNORE( DeactivateContainerL() );
+
+ iBgManager->MakeVisible( EFalse );
+
+ iFocusControl->MakeVisible( EFalse );
+
+ iFlags.Clear( EIsActivated );
+
+ __TIME_ENDMARK( "CXnViewAdapter::DoDeactivate, done", time );
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::ActivateContainerL
+// Activates container
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::ActivateContainerL( CXnViewData& aContainer,
+ TBool aEnterEditState, TUid aEffect )
+ {
+ // Returns if the container remains the same and activation is not forced
+ // Otherwise the old container is deactivated and the new is activated
+ if ( iFlags.IsSet( EIsDestructionRunning ) || iContainer == &aContainer )
+ {
+ return;
+ }
+
+ if ( iFlags.IsClear( EIsActivated ) )
+ {
+ // Some other view than this in this appui is currently active,
+ // postpone container activation
+ return;
+ }
+
+ const CXnViewData& active( iAppUiAdapter.ViewManager().ActiveViewData() );
+
+ CXnEffectManager* mgr( iAppUiAdapter.EffectManager() );
+
+ CleanupStack::PushL( TCleanupItem( CleanupEffect, mgr ) );
+
+ TBool started(
+ mgr->BeginActivateViewEffect( active, aContainer, aEffect ) );
+
+ DeactivateContainerL( EFalse );
+
+ // Update
+ iContainer = &aContainer;
+
+ // Disable layout and redraw until container activation is done
+ iAppUiAdapter.UiEngine().DisableRenderUiLC();
+
+ // Try exit controls from powersave mode
+ ChangeControlsStateL( ETrue );
+
+ if ( !iActivate )
+ {
+ iActivate = BuildActivateTriggerL( iAppUiAdapter.UiEngine() );
+ }
+
+ CXnNode* node( aContainer.Node()->LayoutNode() );
+
+ CXnDomStringPool* sp( node->DomNode()->StringPool() );
+
+ CXnProperty* prop = CXnProperty::NewL(
+ XnPropertyNames::style::common::KDisplay,
+ XnPropertyNames::style::common::display::KBlock,
+ CXnDomPropertyValue::EString, *sp );
+ CleanupStack::PushL( prop );
+
+ node->SetPropertyWithoutNotificationL( prop );
+ CleanupStack::Pop( prop );
+
+ node->ReportXuikonEventL( *iActivate );
+
+ if ( iFlags.IsSet( EIsInCall ) )
+ {
+ iFlags.Clear( EIsInCall );
+
+ // This container is in-call state
+ NotifyInCallStateChaged( ETrue );
+ }
+
+ if ( aEnterEditState || iAppUiAdapter.UiEngine().IsEditMode() )
+ {
+ EnterEditStateL( aContainer, ETrue );
+ }
+ else
+ {
+ EnterEditStateL( aContainer, EFalse );
+ }
+
+ CXnControlAdapter* adapter( node->Control() );
+ adapter->MakeVisible( ETrue );
+
+ iAppUiAdapter.ViewManager().NotifyContainerChangedL( aContainer );
+
+ iBgManager->ChangeWallpaper( active, aContainer, !started );
+
+ iAppUiAdapter.UiEngine().RenderUIL();
+
+ CleanupStack::PopAndDestroy(); // DisableRenderUiLC
+
+ mgr->EndActivateViewEffect( active, aContainer, aEffect );
+
+ CleanupStack::PopAndDestroy(); // cleanupitem
+
+ iAppUiAdapter.ViewManager().UpdatePageManagementInformationL();
+
+ if ( iEventDispatcher )
+ {
+ iEventDispatcher->SetMenuNodeL(
+ iAppUiAdapter.UiEngine().MenuBarNode() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::ActivateDefaultContainerL
+// Activates default container
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::ActivateDefaultContainerL( TBool aEnterEditState )
+ {
+ CXnRootData& rootData( iAppUiAdapter.ViewManager().ActiveAppData() );
+
+ RPointerArray< CXnPluginData >& views( rootData.PluginData() );
+
+ if ( !views.Count() )
+ {
+ return;
+ }
+
+ // first view is default
+ CXnViewData* viewData = static_cast<CXnViewData*>( views[0] );
+
+ if ( viewData )
+ {
+ EnterEditStateL( *viewData, aEnterEditState );
+ // Deactivate container even though it hasn't changed to close all
+ // popups and other windows
+ ActivateContainerL( *viewData, aEnterEditState );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::EnterEditStateL
+// Sets edit state property
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::EnterEditStateL( CXnViewData& aView, TBool aEnter )
+ {
+ if ( !iEditState )
+ {
+ iEditState = BuildEditStateTriggerL( iAppUiAdapter.UiEngine() );
+ }
+
+ CXnProperty* prop( iEditState->GetPropertyL(
+ XnPropertyNames::action::KValue ) );
+
+ if ( !prop )
+ {
+ return;
+ }
+
+ if ( aEnter )
+ {
+ static_cast< CXnDomPropertyValue* >(
+ prop->Property()->PropertyValueList().Item( 0 ) )
+ ->SetStringValueL( CXnDomPropertyValue::EString,
+ XnPropertyNames::action::trigger::name::editmode::KEnter() );
+ }
+ else
+ {
+ static_cast< CXnDomPropertyValue* >(
+ prop->Property()->PropertyValueList().Item( 0 ) )
+ ->SetStringValueL( CXnDomPropertyValue::EString,
+ XnPropertyNames::action::trigger::name::editmode::KExit() );
+ }
+
+ if ( aView.Node() && aView.Node()->LayoutNode() )
+ {
+ aView.Node()->LayoutNode()->ReportXuikonEventL( *iEditState );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::DeactivateContainerL
+// Deactivates current container
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::DeactivateContainerL( TBool aHide )
+ {
+ if ( !iContainer || iFlags.IsSet( EIsDestructionRunning ) )
+ {
+ return;
+ }
+
+ CloseAllPopupsL();
+
+ // Run controls to powersave mode
+ ChangeControlsStateL( EFalse );
+
+ CXnNode* node( iContainer->Node()->LayoutNode() );
+
+ CXnDomStringPool* sp( node->DomNode()->StringPool() );
+
+ CXnProperty* prop = CXnProperty::NewL(
+ XnPropertyNames::style::common::KDisplay,
+ XnPropertyNames::style::common::display::KNone,
+ CXnDomPropertyValue::EString, *sp );
+ CleanupStack::PushL( prop );
+
+ node->SetPropertyWithoutNotificationL( prop );
+ CleanupStack::Pop( prop );
+
+ if ( !iDeactivate )
+ {
+ iDeactivate = BuildDeactivateTriggerL( iAppUiAdapter.UiEngine() );
+ }
+
+ node->ReportXuikonEventL( *iDeactivate );
+
+ if ( aHide )
+ {
+ node->Control()->MakeVisible( EFalse );
+ }
+
+ iContainer = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::NotifyForegroundChanged
+//
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::NotifyForegroundChanged(
+ MXnUiStateObserver::TForegroundStatus aStatus )
+ {
+ if ( aStatus == MXnUiStateObserver::EPartialForeground ||
+ aStatus == MXnUiStateObserver::EBackground )
+ {
+ iFlags.Clear( EIsForeground );
+
+ CXnEditMode* editMode = iAppUiAdapter.UiEngine().EditMode();
+ if( editMode )
+ {
+ TRAP_IGNORE( editMode->StopDraggingL() );
+ }
+
+ iFocusControl->MakeVisible( EFalse );
+
+ TRAP_IGNORE( ChangeControlsStateL( EFalse ) );
+ }
+ else
+ {
+ iFlags.Set( EIsForeground );
+
+ TRAP_IGNORE( ChangeControlsStateL( ETrue ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::NotifyLightStatusChanged
+//
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::NotifyLightStatusChanged( TBool aLightsOn )
+ {
+ if ( aLightsOn )
+ {
+ iFlags.Set( EIsLightsOn );
+
+ TRAP_IGNORE( ChangeControlsStateL( ETrue ) );
+ }
+ else
+ {
+ iFlags.Clear( EIsLightsOn );
+
+ TRAP_IGNORE( ChangeControlsStateL( EFalse ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::NotifyInCallStateChaged
+//
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::NotifyInCallStateChaged( TBool aInCall )
+ {
+ if ( !iContainer )
+ {
+ return;
+ }
+
+ TBool incallNow( iFlags.IsSet( EIsInCall ) ? ETrue : EFalse );
+
+ if ( incallNow == aInCall )
+ {
+ return;
+ }
+
+ if ( aInCall )
+ {
+ iFlags.Set( EIsInCall );
+ }
+ else
+ {
+ iFlags.Clear( EIsInCall );
+ }
+
+ CXnViewData& view( iAppUiAdapter.ViewManager().ActiveViewData() );
+
+ TRAP_IGNORE( UpdateRskByUiStateL( view ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::ChangeControlsStateL
+//
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::ChangeControlsStateL( TBool aAwake )
+ {
+ if ( !iContainer )
+ {
+ return;
+ }
+
+ TBool awakeNow( iFlags.IsSet( EIsControlsAwake ) ? ETrue : EFalse );
+
+ if ( aAwake == awakeNow )
+ {
+ // No change in the state
+ return;
+ }
+
+ TBool changeState( EFalse );
+
+ if ( aAwake )
+ {
+ if ( iFlags.IsSet( EIsForeground ) && iFlags.IsSet( EIsLightsOn ) )
+ {
+ iFlags.Set( EIsControlsAwake );
+ changeState = ETrue;
+ }
+ }
+ else
+ {
+ iFlags.Clear( EIsControlsAwake );
+ changeState = ETrue;
+ }
+
+ if( changeState )
+ {
+ RPointerArray< CXnControlAdapter > controls;
+ CleanupClosePushL( controls );
+
+ iContainer->ControlsL( controls );
+
+ for ( TInt i = 0; i < controls.Count(); i++ )
+ {
+ if ( aAwake )
+ {
+ controls[i]->ExitPowerSaveModeL();
+ }
+ else
+ {
+ controls[i]->EnterPowerSaveModeL();
+ if ( controls[i]->LongTapDetector() &&
+ controls[i]->LongTapDetector()->IsActive() )
+ {
+ controls[i]->LongTapDetector()->Cancel();
+ }
+ }
+ }
+
+ CleanupStack::PopAndDestroy( &controls );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::UpdateRskByUiStateL()
+//
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::UpdateRskByUiStateL( const CXnViewData& aViewData )
+ {
+ CXnNode* menubar( NULL );
+
+ CXnDomNode* view( aViewData.Node() );
+
+ if ( view && view->LayoutNode() )
+ {
+ RPointerArray< CXnNode >& children( view->LayoutNode()->Children() );
+
+ for ( TInt count = children.Count() - 1; count >= 0 ; --count )
+ {
+ CXnNode* node( children[count] );
+
+ // Check that the given type of a control is parent
+ // (or ancestor) of this control
+ const TDesC8& type( node->Type()->Type() );
+
+ if ( type == KMenuBar )
+ {
+ menubar = node;
+ break;
+ }
+ }
+ }
+
+ if( menubar )
+ {
+ const TDesC8* state( NULL );
+
+ if( iAppUiAdapter.UiEngine().IsEditMode() )
+ {
+ state = &XnPropertyNames::softkey::mode::KModeEdit;
+ }
+ else if( iFlags.IsSet( EIsInCall ) )
+ {
+ state = &XnPropertyNames::softkey::mode::KModeCallActive;
+ }
+ else
+ {
+ state = &XnPropertyNames::softkey::mode::KModeCallInactive;
+ }
+
+ XnMenuInterface::MXnMenuInterface* menuIf( NULL );
+ XnComponentInterface::MakeInterfaceL( menuIf, menubar->AppIfL() );
+
+ RPointerArray<CXnNode>& childrens( menubar->Children() );
+
+ for( TInt i=0; i < childrens.Count(); i++ )
+ {
+ CXnNode* node = childrens[i];
+
+ if( node && node->Type()->Type() == XnPropertyNames::softkey::KNodeName )
+ {
+ CXnProperty* mode = node->GetPropertyL( XnPropertyNames::softkey::KModeAttribute );
+ CXnProperty* type = node->GetPropertyL( XnPropertyNames::softkey::KTypeAttribute );
+
+ if( ( mode && *state == mode->StringValue() ) &&
+ ( type && type->StringValue().Compare( XnPropertyNames::softkey::type::KRight ) == 0 ) )
+ {
+ menuIf->SetSoftKeyL( &node->PluginIfL() , XnMenuInterface::MXnMenuInterface::ERight );
+ node->SetDirtyL( XnDirtyLevel::ERender );
+
+ TRAP_IGNORE( iAppUiAdapter.UiEngine().RefreshMenuL() );
+ }
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::CloseAllPopupsL()
+//
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::CloseAllPopupsL()
+ {
+ if ( !iContainer )
+ {
+ return;
+ }
+
+ RPointerArray< CXnNode > popups;
+ CleanupClosePushL( popups );
+
+ iContainer->PopupNodesL( popups );
+
+ for ( TInt i = 0; i < popups.Count(); i++ )
+ {
+ CXnProperty* display = CXnProperty::NewL(
+ XnPropertyNames::style::common::KDisplay,
+ XnPropertyNames::style::common::display::KNone,
+ CXnDomPropertyValue::EString,
+ *iAppUiAdapter.UiEngine().ODT()->DomDocument().StringPool() );
+
+ CleanupStack::PushL( display );
+ popups[i]->SetPropertyL(display);
+ CleanupStack::Pop( display );
+ }
+
+ CleanupStack::PopAndDestroy( &popups );
+ }
+
+
+// End of file