idlehomescreen/xmluirendering/uiengine/src/xnviewadapter.cpp
changeset 0 f72a12da539e
child 2 08c6ee43b396
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluirendering/uiengine/src/xnviewadapter.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,654 @@
+/*
+* 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>
+
+// 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 "xnbgcontrol.h"
+#include "xnfocuscontrol.h"
+
+#include "xnviewadapter.h"
+#include "xnmenu.h"
+
+// Constants
+const TUid KXmlViewUid = { 1 };
+
+// Data types
+enum 
+    {
+    EIsActivated,
+    EIsInCall,
+    EIsLightsOn,
+    EIsForeground,    
+    EIsControlsAwake,    
+    EIsDestructionRunning
+    };
+
+// ============================= LOCAL FUNCTIONS ===============================
+// -----------------------------------------------------------------------------
+// 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 iActivate;
+    delete iDeactivate;
+    delete iEditState;
+    delete iBgControl;
+    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();
+    
+    // Base class CAknViewAppUi takes ownership of iViewAdapter
+    iAppUiAdapter.AddViewL( this );    
+    
+    iBgControl = CXnBgControl::NewL();
+    iBgControl->SetMopParent( this );
+
+    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()
+    {
+    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::PrepareDestroy
+// Sets view to be destroyed
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::PrepareDestroy()
+    {
+    iAppUiAdapter.UiStateListener().RemoveObserver( *this );
+    
+    TRAP_IGNORE( DeactivateContainerL() );
+    
+    iAppUiAdapter.RemoveFromStack( iEventDispatcher );
+    delete iEventDispatcher;
+    iEventDispatcher = NULL;
+    
+    iContainer = NULL;
+    
+    iFlags.Set( EIsDestructionRunning );    
+    }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::EventDispatcher
+// Get event dispatcher
+// -----------------------------------------------------------------------------
+//
+CXnKeyEventDispatcher* CXnViewAdapter::EventDispatcher() const
+    {
+    return iEventDispatcher;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::BgControl
+// Returns bg control.
+// -----------------------------------------------------------------------------
+//
+CCoeControl& CXnViewAdapter::BgControl() const
+    {
+    return *iBgControl;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::BgControl
+// 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;
+        }
+    
+    iFlags.Set( EIsActivated );
+    
+    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 );        
+        }
+    
+    iBgControl->MakeVisible( ETrue );
+    
+    // Set the active container
+    ActivateContainerL( iAppUiAdapter.ViewManager().ActiveViewData() );             
+    }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::DoDeactivate
+// Deactivates view.
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::DoDeactivate()
+    {        
+    if ( iFlags.IsSet( EIsDestructionRunning ) )
+        {
+        return;
+        }
+    
+    iAppUiAdapter.RemoveFromStack( iEventDispatcher );
+
+    TRAP_IGNORE( DeactivateContainerL() );
+    
+    iBgControl->MakeVisible( EFalse );
+    iFocusControl->MakeVisible( EFalse );
+    
+    iFlags.Clear( EIsActivated );
+    }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::ActivateContainerL
+// Activates container
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::ActivateContainerL( CXnViewData& aContainer, 
+    TBool aEnterEditState )
+    {                       
+    if ( iContainer == &aContainer )    
+        {            
+        return;
+        }
+
+    // Deactivate previous
+    DeactivateContainerL();
+    
+    if ( iFlags.IsClear( EIsActivated ) )
+        {
+        // Some other view than this in this appui is currently active,
+        // postpone container activation
+        return;
+        }
+    
+    // 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() );
+    
+    node->ReportXuikonEventL( *iActivate );
+                           
+    if ( iFlags.IsSet( EIsInCall ) )
+        {
+        iFlags.Clear( EIsInCall );
+        
+        // This container is in-call state
+        NotifyInCallStateChaged( ETrue );        
+        }
+                 
+    iAppUiAdapter.ViewManager().NotifyContainerChangedL( aContainer );
+    
+    if ( !iEditState )
+        {
+        iEditState = BuildEditStateTriggerL( iAppUiAdapter.UiEngine() ); 
+        }
+    
+    CXnProperty* prop( iEditState->GetPropertyL( 
+        XnPropertyNames::action::KValue ) );
+    
+    if ( aEnterEditState || iAppUiAdapter.UiEngine().IsEditMode() )
+        {
+        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() );                                
+        }
+    
+    node->ReportXuikonEventL( *iEditState );
+    
+    CXnControlAdapter* adapter( node->Control() );
+    
+    iBgControl->SetCompoundControl( adapter );
+            
+    iAppUiAdapter.UiEngine().RenderUIL();
+    
+    CleanupStack::PopAndDestroy(); // DisableRenderUiLC        
+    }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::DeactivateContainerL
+// Deactivates current container
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::DeactivateContainerL()
+    {
+    if ( !iContainer )    
+        {
+        return;
+        }
+    
+    // Run controls to powersave mode
+    ChangeControlsStateL( EFalse );
+
+    if ( !iDeactivate )
+        {
+        iDeactivate = BuildDeactivateTriggerL( iAppUiAdapter.UiEngine() );
+        }
+
+    CXnNode* node( iContainer->Node()->LayoutNode() );
+                
+    node->ReportXuikonEventL( *iDeactivate );
+
+    iBgControl->SetCompoundControl( NULL );
+    
+    iContainer = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::NotifyForegroundChanged
+// 
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::NotifyForegroundChanged( 
+    MXnUiStateObserver::TForegroundStatus aStatus ) 
+    {     
+    if ( aStatus == MXnUiStateObserver::EPartialForeground || 
+         aStatus == MXnUiStateObserver::EBackground )
+        {
+        iFlags.Clear( EIsForeground );
+        
+        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 );
+        }
+    
+    TRAP_IGNORE( UpdateRskByModeL() );
+    }
+
+// -----------------------------------------------------------------------------
+// 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();
+                }               
+            }
+            
+        CleanupStack::PopAndDestroy( &controls );            
+        }           
+    }
+
+// -----------------------------------------------------------------------------
+// CXnViewAdapter::UpdateRskByModeL()
+// 
+// -----------------------------------------------------------------------------
+//
+void CXnViewAdapter::UpdateRskByModeL()
+    {
+    CXnNode* menubar( iAppUiAdapter.UiEngine().MenuBarNode() );
+    
+    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 );
+                    } 
+                }
+            }
+        }
+    }
+
+
+// End of file