idlehomescreen/xmluirendering/uiengine/src/xnviewadapter.cpp
branchRCL_3
changeset 34 5456b4e8b3a8
child 35 3321d3e205b6
--- /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