--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/ccapplication/ccapp/src/ccaappview.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,796 @@
+/*
+* 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: A class responsible handling the views
+ *
+*/
+
+
+// INCLUDE FILES
+#include "ccappheaders.h"
+#include <mccappviewpluginbase2.h>
+#include "ccappmycardpluginuids.hrh"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CCCAppView::CCCAppView
+// ---------------------------------------------------------------------------
+//
+CCCAppView::CCCAppView( CCCAAppAppUi& aAppUi )
+ : iAppUi ( aAppUi ),
+ iViewChangeInProgress ( EFalse )
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("CCCAppView::CCCAppView"));
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::~CCCAppView
+// ---------------------------------------------------------------------------
+//
+CCCAppView::~CCCAppView()
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("->CCCAppView::~CCCAppView"));
+
+ iPluginUidToBeSynchd.Close();
+
+ if ( iCmsWrapper )
+ {
+ iCmsWrapper->RemoveObserver( *this );
+ iCmsWrapper->Release();
+ }
+ iObservers.Reset();
+ iObservers.Close();
+ delete iPaneHandler;
+ delete iPluginLoader;
+ delete iViewResetter;
+ delete iDelayedConstructor;
+
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::~CCCAppView"));
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::NewL
+// ---------------------------------------------------------------------------
+//
+CCCAppView* CCCAppView::NewL( CCCAAppAppUi& aAppUi )
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("->CCCAppView::NewL"));
+
+ CCCAppView* self = new( ELeave ) CCCAppView( aAppUi );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::NewL"));
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::ConstructL()
+ {
+ //CCA_DP( KCCAppLogFile, CCA_L("->CCCAppView::ConstructL"));
+
+ //CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::ConstructL"));
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::StartView
+// ---------------------------------------------------------------------------
+//
+TInt CCCAppView::StartView( const TUid aUid )
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("->CCCAppView::StartView"));
+ TRAPD( err, StartViewL( aUid ))
+ CCA_DP( KCCAppLogFile, CCA_L("::StartView - StartViewL returned err: %d"), err );
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::StartView"));
+ return err;
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::StartViewL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::StartViewL( const TUid aUid )
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("->CCCAppView::StartViewL"));
+ iDelayedStarting = ETrue;
+
+ // 1st start the contact fetching
+ iCmsWrapper = CCCAppCmsContactFetcherWrapper::CreateInstanceL(
+ &iAppUi.Parameter(), CCCAppCmsContactFetcherWrapper::EFindContactFromOtherStores );
+ iCmsWrapper->AddObserverL( *this );
+
+ // TODO: replace hardcoded uid comparison with better sollution that
+ // supports other mycard views too
+ TBool isUidMyCard = ( aUid ==
+ TUid::Uid( KCCAMyCardPluginImplmentationUid ) );
+
+
+ //In this version support only contact type data (i.e. group data discarded)
+ _LIT8( KCcaOpaqueTag_CNT, "CNT" ); //Contact
+ _LIT8( KCcaOpaqueTag_MCD, "MCD" ); //MyCard
+ _LIT8( KCcaPluginTypeMyCard, "application/x-mycard" );
+
+ TPtrC8 properties( isUidMyCard ? KCcaOpaqueTag_MCD : KCcaOpaqueTag_CNT);
+ TPtrC8 type( KNullDesC8 );
+ if( isUidMyCard )
+ {
+ type.Set( KCcaPluginTypeMyCard );
+ }
+ iPluginLoader = CCCAppPluginLoader::NewL( this, properties, type );
+ CCA_DP( KCCAppLogFile, CCA_L("::ConstructL - iPluginLoader created"));
+ iPaneHandler = CCCAppStatusPaneHandler::NewL( *this );
+ CCA_DP( KCCAppLogFile, CCA_L("::ConstructL - iPaneHandler created"));
+
+ // 2nd start constructing the plugin view with preferred
+ // plugin view (if provided)
+ TInt pluginToFocus = iPluginLoader->SetPluginInFocus( aUid );
+
+ if(pluginToFocus != KErrNotFound)
+ {
+ iPluginLoader->SetPluginVisibility(aUid, CCCAppPluginData::EPluginVisible);
+ }
+ else
+ {
+ //Not found, try set the first plugin
+ pluginToFocus = 0;
+ if(iPluginLoader->PluginAt(pluginToFocus))
+ {
+ iPluginLoader->SetPluginVisibility(
+ iPluginLoader->PluginAt(pluginToFocus)->Plugin().Id(), CCCAppPluginData::EPluginVisible);
+ }
+ }
+
+ //Start plugin and construct CIdle object to call back to finalise
+ //time consuming construction
+ StartPluginL(pluginToFocus);
+ iDelayedConstructor = CIdle::NewL( CActive::EPriorityIdle );
+ iDelayedConstructor->Start( TCallBack( ConstructDelayedCallbackL, this) );
+
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::StartViewL"));
+ }
+
+// ----------------------------------------------------------------------------
+// CCCAppView::ConstructDelayedCallbackL
+//
+// Called from CIdle to finish time consuming construction operations
+// ----------------------------------------------------------------------------
+//
+TInt CCCAppView::ConstructDelayedCallbackL( TAny* aContainer )
+ {
+ CCCAppView* container = static_cast<CCCAppView*>( aContainer );
+ container->DoConstructDelayedL();
+ return 0;
+ }
+
+// ----------------------------------------------------------------------------
+// CCCAppView::DoConstructDelayedL
+//
+// Perform time consuming construction operations
+// ----------------------------------------------------------------------------
+//
+void CCCAppView::DoConstructDelayedL()
+ {
+ if( iDelayState == EDelayedCreateTabs )
+ {
+ iPaneHandler->CreateTabsL();
+ iDelayedConstructor->Start( TCallBack( ConstructDelayedCallbackL, this) );
+ iDelayState=EDelayedCheckVisibilities;
+ }
+ else if( iDelayState == EDelayedCheckVisibilities )
+ {
+ CheckOtherPluginVisibilitiesL();
+ iDelayedConstructor->Start( TCallBack( ConstructDelayedCallbackL, this) );
+ }
+ else if( iDelayState == EDelayedCheckVisibilitiesOk )
+ {
+ TInt tabNbr = 0;
+ CCCAppPluginData* currPluginData = iPluginLoader->PluginInFocus();
+ if( currPluginData )
+ {
+ TUid currentlyVisiblePluginId = currPluginData->Plugin().Id();
+ iPluginLoader->PluginVisibility( currentlyVisiblePluginId, tabNbr );
+ }
+
+ iPaneHandler->ActivateTab( tabNbr );
+ iDelayedConstructor->Start( TCallBack( ConstructDelayedCallbackL, this) );
+ iDelayState=EDelayedFinish;
+ }
+ else
+ {
+ delete iDelayedConstructor;
+ iDelayedConstructor = NULL;
+ iDelayedStarting = EFalse;
+ SynchPluginVisibilityWithTabAfterDelayedStartL();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::CheckOtherPluginVisibilitiesL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::CheckOtherPluginVisibilitiesL()
+ {
+ TBool pluginVisibility(EFalse);
+
+ if(iDelayedPluginVisibilityCheck < iPluginLoader->PluginsCount())
+ {
+ // prepare plugin parameter
+ CCCAppPluginParameter* pluginParam = CCCAppPluginParameter::NewL( *this );
+ CleanupStack::PushL( pluginParam );
+ TRAPD(err, pluginVisibility = iPluginLoader->
+ PluginAt(iDelayedPluginVisibilityCheck)->Plugin().CheckVisibilityL(*pluginParam));
+ CleanupStack::PopAndDestroy( pluginParam );
+ if (KErrNone == err)
+ {
+ if(iPluginLoader->SetPluginVisibility(iPluginLoader->
+ PluginAt(iDelayedPluginVisibilityCheck)->Plugin().Id(), pluginVisibility))
+ {
+ iDelayedVisibilityChanged = ETrue;
+ }
+ }
+ else
+ {
+ CCA_DP( KCCAppLogFile, CCA_L(
+ "CCCAppStatusPaneHandler::CreateTabsL: Plugin %d visibility check failed."),
+ iDelayedPluginVisibilityCheck);
+ //Remove plugin from plugin loader
+ TUid pluginUid = iPluginLoader->PluginAt(iDelayedPluginVisibilityCheck)->Plugin().Id();
+ CCA_DP( KCCAppLogFile, CCA_L("::visibility check - problem plugin uid: %d"), pluginUid.iUid );
+ iPluginLoader->RemovePlugin( pluginUid );
+ iDelayedVisibilityChanged = ETrue;
+ }
+ }
+ else
+ {
+ //All checked. Reset if changes requested by plugins
+ if(iDelayedVisibilityChanged)
+ {
+ iPaneHandler->CreateTabsL();
+ }
+ iDelayState=EDelayedCheckVisibilitiesOk;
+ }
+ iDelayedPluginVisibilityCheck++;
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::StartPluginL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::StartPluginL(TInt aPluginToFocus)
+ {
+ /*
+ * Activating plugin is done in two TRAP-levels. The lower is activating
+ * the plugin and if it fails, takes care of recovering from the
+ * situation. The higher level takes care of exiting the application
+ * if something leaves while recovering from the plugin activation.
+ */
+ CCCAppPluginData* pluginDataInFocus = iPluginLoader->PluginInFocus();
+ User::LeaveIfNull(pluginDataInFocus);
+
+ TRAPD( err, ActivatePluginL( *pluginDataInFocus ));
+ if ( KErrNone == err )
+ {// view started successfully - activate correct tab
+ // activate 1st view plugin in case preferred plugin uid not found
+ iPaneHandler->ActivateTab( KErrNotFound != aPluginToFocus ? aPluginToFocus : 0 );
+ }
+ else
+ {// problem in plugin activation - try to recover
+ CCA_DP( KCCAppLogFile, CCA_L("::StartViewL - problem in plugin activation: err %d"), err );
+ RecoverFromBadPluginL();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::ChangeView
+// ---------------------------------------------------------------------------
+//
+TInt CCCAppView::ChangeView( TBool aForward )
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("->CCCAppView::ChangeView"));
+
+ TInt err = KErrNone;
+
+ //Forward the call to statusPane only if it is ready
+ if ( iPaneHandler )
+ {
+ if ( iPaneHandler->IsTabAvailable() )
+ {
+ TRAP( err, ChangeViewL( aForward ));
+ CCA_DP( KCCAppLogFile, CCA_L("::ChangeView - ChangeViewL returned err: %d"), err );
+ }
+ }
+
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::ChangeView"));
+ return err;
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::ChangeViewL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::ChangeViewL( TBool aForward )
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("->CCCAppView::ChangeViewL"));
+
+ const TInt visiblePluginCount = iPluginLoader->VisiblePluginCount();
+ if ( KCCAppMinPluginCountForTabs > visiblePluginCount // if only 1 plugin, we can stop handling here
+ || iViewChangeInProgress ) // OR view change is in progress
+ return;
+
+ __ASSERT_DEBUG ( iPaneHandler->TabCount() == visiblePluginCount, CCAppPanic( ECCAppPanicObjectCountMismatch ));
+
+ iViewChangeInProgress = ETrue;
+
+ /*
+ * If ActivateTabL changes tab succesfully, it will call TabChangedL,
+ * which then again will do activation the plugin.
+ *
+ * Activating plugin is done in two TRAP-levels. The lower is activating
+ * the plugin and if it fails, takes care of recovering from the
+ * situation. The higher level takes care of exiting the application
+ * if something leaves while recovering from the plugin activation.
+ */
+ TRAPD( err, iPaneHandler->ActivateTabL( aForward ));
+ if ( KErrNone != err)
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("::ChangeViewL - problem in plugin activation: err %d"), err );
+ RecoverFromBadPluginL();
+ }
+
+ iViewChangeInProgress = EFalse;
+
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::ChangeViewL"));
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::TabChangedL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::TabChangedL( TInt aIndex )
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("->CCCAppView::TabChangedL"));
+
+ CCCAppPluginData* pluginDataInFocus = iPluginLoader->VisiblePlugin( aIndex, ETrue );// not owned
+ ActivatePluginL( *pluginDataInFocus );
+
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::TabChangedL"));
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::ActivatePluginL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::ActivatePluginL( CCCAppPluginData& aPluginDataInFocus )
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("->CCCAppView::ActivatePluginL"));
+
+ //PERFORMANCE LOGGING: 6. Plugin activation
+ WriteToPerfLog();
+
+ CCCAppViewPluginBase& plugin = aPluginDataInFocus.Plugin();
+
+ if ( !aPluginDataInFocus.IsPluginPrepared() )
+ {// 1st activation
+ // prepare plugin parameter
+ CCCAppPluginParameter* pluginParam = CCCAppPluginParameter::NewL( *this );
+ CleanupStack::PushL( pluginParam );
+ plugin.PreparePluginViewL( *pluginParam );
+ CleanupStack::PopAndDestroy( pluginParam );
+ iAppUi.AddViewL( &plugin );// transfers ownership to AppUi -framework
+ aPluginDataInFocus.PluginIsPrepared();
+ }
+
+ // activate plugin
+ iAppUi.ActivateLocalViewL( plugin.Id() );
+
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::ActivatePluginL"));
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::AppUi
+// ---------------------------------------------------------------------------
+//
+CCCAAppAppUi& CCCAppView::AppUi()
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("CCCAppView::AppUi"));
+ return iAppUi;
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::EikonEnv
+// ---------------------------------------------------------------------------
+//
+CEikonEnv& CCCAppView::EikonEnv()
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("CCCAppView::AlfEnv"));
+ return iAppUi.EikonEnv();
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::PluginLoader
+// ---------------------------------------------------------------------------
+//
+CCCAppPluginLoader& CCCAppView::PluginLoader()
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("CCCAppView::PluginLoader"));
+ return *iPluginLoader;
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::ContactFieldDataObserverNotifyL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::ContactFieldDataObserverNotifyL(
+ MCCAppContactFieldDataObserver::TParameter& aParameter )
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("->CCCAppView::ContactFieldDataObserverNotifyL"));
+
+ // not interested about other notifications
+ if ( MCCAppContactFieldDataObserver::TParameter::EContactDataFieldAvailable
+ == aParameter.iType && NULL != aParameter.iContactField )
+ {
+ ContactFieldFetchedNotifyL( *aParameter.iContactField );
+ }
+ else if ( MCCAppContactFieldDataObserver::TParameter::EContactDeleted
+ == aParameter.iType )
+ {
+ // Quick fix for the urgent need
+ //
+ // To fix this such manner that CCApplication works as normal Avkon
+ // applications do, let the leave with leave code KLeaveExit
+ // go up to CActive's RunL and return it also through RunError.
+ // Then normal Avkon AppUi functionality AppUi().Exit() will work.
+ AppUi().RunAppShutter();
+ }
+
+
+
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::ContactFieldDataObserverNotifyL"));
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::ContactFieldDataObserverHandleErrorL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::ContactFieldDataObserverHandleErrorL(
+ TInt aState, TInt aError )
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("CCCAppView::ContactFieldDataObserverHandleErrorL"));
+ CCA_DP( KCCAppLogFile, CCA_L("::ContactFieldDataObserverHandleErrorL - aState: %d, aError: %d"), aState, aError );
+ //todo; what kind of behaviour is wanted in error case?
+ // - exit the app if no cms connection/contact is not found?
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::ContactFieldFetchedNotifyL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::ContactFieldFetchedNotifyL(
+ CCmsContactField& aContactField )
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::ContactFieldFetchedNotifyL"));
+
+ if ( CCmsContactFieldItem::ECmsFullName == aContactField.Type() )
+ {// update titlepane with the name
+ CCA_DP( KCCAppLogFile, CCA_L("::ContactFieldFetchedNotifyL - changing title"));
+
+ TPtrC newTxt = aContactField.ItemL( 0 ).Data();
+ iAppUi.SetTitleL( newTxt );
+ }
+
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::ContactFieldFetchedNotifyL"));
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::RecoverFromBadPluginL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::RecoverFromBadPluginL()
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("->CCCAppView::RecoverFromBadPluginL"));
+
+#ifdef _DEBUG
+ CAknInformationNote* informationNote = new ( ELeave ) CAknInformationNote;
+ informationNote->ExecuteLD( _L("Problem in plugin! Check logs!"));
+#endif
+
+ //Remove plugin from plugin loader
+ TUid pluginUid = iPluginLoader->PluginInFocus()->Plugin().Id();
+ CCA_DP( KCCAppLogFile, CCA_L("::RecoverFromBadPluginL - problem plugin uid: %d"), pluginUid.iUid );
+ iPluginLoader->RemovePlugin( pluginUid );
+
+ if ( iPluginLoader->PluginsCount() )
+ {// Plugins available
+ CCA_DP( KCCAppLogFile, CCA_L("::RecoverFromBadPluginL - plugins found"));
+
+ // Reset tabs
+ delete iPaneHandler;
+ iPaneHandler = NULL;
+ iPaneHandler = CCCAppStatusPaneHandler::NewL( *this );
+ iPaneHandler->CreateTabsL();
+
+ // Needed to get the focus in most cases to 1st plugin in array
+ delete iViewResetter;
+ iViewResetter = NULL;
+ iViewResetter = CIdle::NewL( CActive::EPriorityStandard );
+ iViewResetter->Start( TCallBack( ResetViewL, this ));
+ }
+ else
+ {// no plugins left
+ // (should basically never happen, since there should always be working internal plugins)
+ User::Leave( KErrNotFound );
+ }
+
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::RecoverFromBadPluginL"));
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::CurrentPluginBusy
+// ---------------------------------------------------------------------------
+//
+TBool CCCAppView::CurrentPluginBusy()
+ {
+ TBool isBusy = EFalse;
+ if(iPluginLoader)
+ {
+ CCCAppPluginData* pluginData = iPluginLoader->PluginInFocus(); //not owned
+ if ( pluginData != NULL )
+ {
+ CCCAppViewPluginBase& plugin = pluginData->Plugin();
+ MCCAppViewPluginBase2* pluginExtension =
+ reinterpret_cast<MCCAppViewPluginBase2*>(
+ plugin.CCCAppViewPluginBaseExtension( KMCCAppViewPluginBaseExtension2Uid ) );
+ if ( pluginExtension != NULL )
+ {
+ isBusy = pluginExtension->PluginBusy();
+ }
+ }
+ }
+
+ return isBusy;
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::ResetViewL
+// ---------------------------------------------------------------------------
+//
+TInt CCCAppView::ResetViewL( TAny* aSelf )
+ {
+ CCA_DP( KCCAppLogFile, CCA_L("->CCCAppView::ResetViewL"));
+
+ CCCAppView* view = static_cast<CCCAppView*>(aSelf);//not owned
+
+ // Change focus and activate 1st plugin in array
+ CCCAppPluginData* pluginDataInFocus =
+ view->iPluginLoader->PluginAt( 0, ETrue );
+ view->ActivatePluginL( *pluginDataInFocus );
+ view->iPaneHandler->ActivateTab( 0 );
+
+ CCA_DP( KCCAppLogFile, CCA_L("<-CCCAppView::ResetViewL"));
+ return KErrNone;
+ }
+// ---------------------------------------------------------------------------
+// CCCAppView::ContactRelocationL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::CCAppContactEventL()
+ {
+ TInt count = iObservers.Count();
+ for (TInt i = 0; i < count; i++)
+ {
+ // Inform observers of contact event
+ TRAP_IGNORE(iObservers[i]->NotifyPluginOfContactEventL());
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::AddObserverL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::AddObserverL( MCCAppPluginsContactObserver& aObserver )
+ {
+ TInt index = iObservers.Find(&aObserver);
+ if (index == KErrNotFound)
+ {
+ iObservers.AppendL(&aObserver);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::RemoveObserver
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::RemoveObserver( MCCAppPluginsContactObserver& aObserver )
+ {
+ TInt index = iObservers.Find(&aObserver);
+ if (index != KErrNotFound)
+ {
+ iObservers.Remove(index);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::Parameter
+// ---------------------------------------------------------------------------
+//
+MCCAParameter& CCCAppView::Parameter()
+ {
+ return iAppUi.Parameter();
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::ShowPluginL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::ShowPluginL( TUid aUid )
+ {
+ if(iDelayedStarting)
+ {
+ iPluginLoader->SetPluginVisibility(aUid, CCCAppPluginData::EPluginVisible);
+ iPluginUidToBeSynchd.Append(aUid);
+ }
+ else
+ {
+ PerformShowPluginL( aUid );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::PerformShowPluginL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::PerformShowPluginL( TUid aUid )
+ {
+ TInt currentTab(KErrNotFound);
+ CCCAppPluginData* pluginData = iPluginLoader->PluginInFocus( );
+ iPluginLoader->SetPluginVisibility(aUid, CCCAppPluginData::EPluginVisible);
+ iPaneHandler->CreateTabsL();
+
+ if( pluginData )
+ {
+ iPluginLoader->PluginVisibility( pluginData->Plugin().Id(), currentTab );
+ iPaneHandler->ActivateTab( currentTab );
+ }
+ else
+ {
+ iPaneHandler->ActivateTab( 0 );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::HidePluginL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::HidePluginL( TUid aUid )
+ {
+ if(iDelayedStarting)
+ {
+ iPluginLoader->SetPluginVisibility(aUid, CCCAppPluginData::EPluginHidden);
+ iPluginUidToBeSynchd.Append(aUid);
+ }
+ else
+ {
+ PerformHidePluginL( aUid );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCAppView::PerformHidePluginL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::PerformHidePluginL( TUid aUid )
+ {
+ TInt newTab(KErrNotFound);
+
+ //Currently visible plugin
+ TInt currentTab(KErrNotFound);
+ CCCAppPluginData* currPluginData = iPluginLoader->PluginInFocus( );
+ iPluginLoader->PluginVisibility( currPluginData->Plugin().Id(), currentTab );
+
+ //Hide plugin aUid
+ iPluginLoader->SetPluginVisibility(aUid, CCCAppPluginData::EPluginHidden);
+ iPaneHandler->CreateTabsL();
+
+ //Set new visible plugin
+ if( currPluginData )
+ {
+ if(currPluginData->Plugin().Id() == aUid)
+ {
+ //Current will be hidden, bring previous or next to foreground
+ if( CCCAppPluginData* previousPlugin = iPluginLoader->PreviousPlugin( ETrue ))
+ {
+ ActivatePluginL( *previousPlugin );
+ iPluginLoader->PluginVisibility( previousPlugin->Plugin().Id(), newTab );
+ iPaneHandler->ActivateTab( newTab );
+ return;
+ }
+ else if( CCCAppPluginData* nextPlugin = iPluginLoader->NextPlugin( ETrue ))
+ {
+ ActivatePluginL( *nextPlugin );
+ iPluginLoader->PluginVisibility( nextPlugin->Plugin().Id(), newTab );
+ iPaneHandler->ActivateTab( newTab );
+ return;
+ }
+ else
+ {
+ //Nothing to activate properly
+ ResetViewL( this );
+ return;
+ }
+ }
+ else
+ {
+ //Retain current plugin in foreground
+ iPluginLoader->PluginVisibility( currPluginData->Plugin().Id(), newTab );
+ iPaneHandler->ActivateTab( newTab );
+ return;
+ }
+ }
+ //Nothing to activate properly
+ ResetViewL( this );
+ return;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CCCAppView::SynchPluginVisibilityWithTabAfterDelayedStartL
+// ---------------------------------------------------------------------------
+//
+void CCCAppView::SynchPluginVisibilityWithTabAfterDelayedStartL()
+ {
+ CCCAppPluginData* currPluginData = iPluginLoader->PluginInFocus();
+ TBool syncDone = EFalse;
+ TInt pluginsRequireSynch = iPluginUidToBeSynchd.Count();
+ if( currPluginData && pluginsRequireSynch )
+ {
+ TUid currentlyVisiblePluginId = currPluginData->Plugin().Id();
+
+ for ( TInt index=0; index<pluginsRequireSynch; index++ )
+ {
+ if ( currentlyVisiblePluginId == iPluginUidToBeSynchd[index] )
+ {
+ //is there any change in the visibility of the current visible plugin
+ //the only option could be is that it can become invisible
+ //only on the above case we willbe interested
+ TInt tabNbr = 0;
+ if ( !iPluginLoader->PluginVisibility( currentlyVisiblePluginId, tabNbr ) )
+ {
+ //This plugin is no more visible so its better to call just HidePluginL()
+ syncDone = ETrue;
+ HidePluginL( currentlyVisiblePluginId );
+ }
+ break;
+ }
+ }
+
+ if ( !syncDone )
+ {
+ //Still synchronisation has not been done
+ //Possible reason could be is that, this plugin is not the currently visible one
+ //so now it becomes much more easy, so just go ahead and call CreateTabsL
+ //only the tab will be reset and the current active plugin will stay active
+ TInt tabNbr = 0;
+ iPaneHandler->CreateTabsL();
+ //Current the repositioned active tab & activate the same
+ iPluginLoader->PluginVisibility( currentlyVisiblePluginId, tabNbr );
+ iPaneHandler->ActivateTab( tabNbr );
+ }
+ }
+ }
+
+// End of File