mediasettings/mediasettingsapp/src/MPSettingsAppUi.cpp
changeset 0 96612d01cf9f
child 1 6711b85517b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mediasettings/mediasettingsapp/src/MPSettingsAppUi.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,414 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:   Application UI class required by AVKON application architecture.*
+*/
+
+
+// Version : %version: 7 %
+
+
+
+// INCLUDE FILES
+#include    <MediaSettings.rsg>
+#include    <avkon.hrh>
+#include    <barsread.h>
+#include    <akntabgrp.h>
+#include    <featmgr.h>
+#include    <hlplch.h>
+#include    <StringLoader.h>
+#include    <AknsUtils.h>
+#include    <mediasettings.mbg>
+
+#include    "mediasettings.hrh"
+#include    "MPSettingsAppUi.h"
+#include    "MPSettingsMainView.h"
+#include    "MPSettingsVideoView.h"
+#include    "MPSettingsStreamingView.h"
+#include    "MPSettingsProxyView.h"
+#include    "MPSettingsNetworkView.h"
+#include    "MPSettingsConstants.h"
+#include    "MPSettingsPluginView.h"
+#include    "MPSettingsAdvancedBwView.h"
+#include    "MPSettingsDocument.h"    
+#include    "mpsettingsmodel.h"
+#include    "MPSettingsModelForROP.h"
+#include    "mpxlog.h"
+#include    "feedsettingsview.h"
+
+// CONSTANTS
+const TInt KMPSettViewIdArrayGranularity = 3;
+
+// ================= MEMBER FUNCTIONS =======================
+//
+
+// -----------------------------------------------------------------------------
+// CMPSettingsAppUi::CMPSettingsAppUi
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMPSettingsAppUi::CMPSettingsAppUi() : iConstructAsGsPlugin(EFalse)
+    {
+    MPX_DEBUG1(_L("#MS# CMPSettingsAppUi::CMPSettingsAppUi()"));
+    }
+
+// ----------------------------------------------------------
+// CMPSettingsAppUi::ConstructL()
+// Symbian OS default constructor.
+// ----------------------------------------------------------
+//
+void CMPSettingsAppUi::ConstructL() 
+    {
+    MPX_DEBUG1(_L("#MS# CMPSettingsAppUi::ConstructL()"));
+    // Enable skin support in base construction
+    BaseConstructL( EAknEnableSkin | EAknEnableMSK | EAknSingleClickCompatible ); 
+
+    // Sets up TLS, must be done before FeatureManager is used.
+    FeatureManager::InitializeLibL();   
+
+    CMPSettingsDocument* doc = static_cast<CMPSettingsDocument*>(static_cast<CEikAppUi*>
+        (CEikonEnv::Static()->AppUi())->Document());
+    iModel = doc->SettingsModel();
+    iRopModel = static_cast<CMPSettingsModelForROP*>(iModel);
+
+    // Fetch pointer to the default navi pane control
+    CEikStatusPane* sp = StatusPane();
+    iNaviPane = static_cast<CAknNavigationControlContainer*>
+        (sp->ControlL(TUid::Uid(EEikStatusPaneUidNavi)));
+
+    // Construct navipane tabs 
+    iDecoratedTabGroup = iNaviPane->CreateTabGroupL(this);
+
+    // Construct tabs
+    AddTabSettingsGroupL();
+
+    // Create vector which contains view id's for all setting folders. 
+    iViewIds = new(ELeave) CArrayFixFlat<TUid>(KMPSettViewIdArrayGranularity);
+    iViewIds->AppendL(KMPSettVideoViewId);
+    iViewIds->AppendL(KMPSettStreamingViewId);
+    iViewIds->AppendL(KMPSettFeedsViewId);
+
+    // * Create application views *
+
+    CAknView* view;  
+
+    view = CMPSettingsMainView::NewLC(iViewIds,iRopModel,iConstructAsGsPlugin);
+    AddViewL(view);      // transfer ownership to CAknViewAppUi
+    CleanupStack::Pop();    // view
+
+    // iMainView is not owned, i.e. it is not deleted in the destructor ->
+    // main view cannot be directly creted to iMainView, as it's against the coding
+    // conventions to place class' pointers to cleanup stack => static_cast.
+    iMainView = static_cast<CMPSettingsMainView*>(view);
+
+    view = CMPSettingsVideoView::NewLC(iRopModel);
+    AddViewL(view);      // transfer ownership to CAknViewAppUi
+    CleanupStack::Pop();    // view
+
+    view = CMPSettingsStreamingView::NewLC(iRopModel);
+    AddViewL(view);      // transfer ownership to CAknViewAppUi
+    CleanupStack::Pop();    // view 
+
+    view = CVcxNsSettingsView::NewLC();
+    AddViewL(view);      // transfer ownership to CAknViewAppUi
+    CleanupStack::Pop();    // view 
+    
+    view = CMPSettingsProxyView::NewLC(iRopModel,iConstructAsGsPlugin);
+    AddViewL(view);      // transfer ownership to CAknViewAppUi
+    CleanupStack::Pop();    // view 
+
+    view = CMPSettingsNetworkView::NewLC(iRopModel,iConstructAsGsPlugin);
+    AddViewL(view);      // transfer ownership to CAknViewAppUi
+    CleanupStack::Pop();    // view 
+
+    view = CMPSettingsAdvancedBwView::NewLC(iRopModel,iConstructAsGsPlugin);
+    AddViewL(view);      // transfer ownership to CAknViewAppUi
+    CleanupStack::Pop();    // view 
+
+
+    // Construct plug-in views (if any exists)
+    CMPSettingsPluginView::ListImplementationsL(iImplInfoArray);
+    TInt count = iImplInfoArray.Count();
+
+    if (count > 0)
+        {
+        CMPSettingsPluginView* pluginView = NULL;
+
+        for (TInt ii(0); ii < count; ++ii)
+            {
+            TUid uid = iImplInfoArray[ii]->ImplementationUid();
+            pluginView = CMPSettingsPluginView::NewL(uid);
+            CleanupStack::PushL(pluginView);
+            AddViewL(pluginView);
+            CleanupStack::Pop();    // pluginView
+
+            if (pluginView->OpenedFromMainView())
+                {
+                iViewIds->AppendL(pluginView->Id());
+                }
+            }
+
+        // Sort UID array to rising order
+        TKeyArrayFix sortKey(0, ECmpTUint);
+        User::LeaveIfError(iViewIds->Sort(sortKey));
+        }
+ 
+    SetDefaultViewL(*iMainView);
+    }
+
+// ----------------------------------------------------
+// CMPSettingsAppUi::~CMPSettingsAppUi
+// Destructor
+// Frees reserved resources
+// ----------------------------------------------------
+//
+CMPSettingsAppUi::~CMPSettingsAppUi()
+    {
+    MPX_DEBUG1(_L("#MS# CMPSettingsAppUi::~CMPSettingsAppUi()"));
+    if (iDecoratedTabGroup) 
+        {
+        delete iDecoratedTabGroup;
+        }
+
+    if (iDoorObserver)
+        {
+        iDoorObserver->NotifyExit(MApaEmbeddedDocObserver::EEmpty);
+        }
+
+    if (iViewIds) 
+        {
+        delete iViewIds;
+        }
+
+    iImplInfoArray.ResetAndDestroy();
+    FeatureManager::UnInitializeLib();
+    }
+
+// ----------------------------------------------------
+// CMPSettingsAppUi::HandleCommandL
+// ----------------------------------------------------
+//
+void CMPSettingsAppUi::HandleCommandL(TInt aCommand)
+    {
+    MPX_DEBUG2(_L("#MS# CMPSettingsAppUi::HandleCommandL(%d)"),aCommand);
+    switch (aCommand)
+        {
+        case EEikCmdExit:
+            Exit();
+            break;
+        case EMPSettCmdHelp:
+        case EAknCmdHelp:
+            HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), 
+			                                     AppHelpContextL() );
+            break;
+        default:
+            CAknViewAppUi::HandleCommandL(aCommand);
+            break;      
+        }
+    }
+
+// ----------------------------------------------------
+// CMPSettingsAppUi::HandleResourceChangeL
+// ----------------------------------------------------
+//
+void CMPSettingsAppUi::HandleResourceChangeL( TInt aType )
+    {
+    MPX_DEBUG2(_L("#MS# CMPSettingsAppUi::HandleResourceChangeL(0x%X)"),aType);
+    CAknViewAppUi::HandleResourceChangeL( aType ); 
+ 
+    if( aType == KAknsMessageSkinChange )
+        {
+        AddTabSettingsGroupL();
+        }
+    }
+ 
+
+// ----------------------------------------------------
+// CMPSettingsAppUi::TabChangedL
+// MAknTabObserver callback for handling tab changed event.
+// ----------------------------------------------------
+//
+void CMPSettingsAppUi::TabChangedL(TInt aIndex)
+    {
+    MPX_DEBUG2(_L("#MS# CMPSettingsAppUi::TabChangedL(%d)"),aIndex);
+    iMainView->SetActiveFolder(aIndex);
+    ActivateLocalViewL(iViewIds->At(aIndex));
+    }
+
+// ----------------------------------------------------
+// CMPSettingsAppUi::NaviContainer
+// ----------------------------------------------------
+//
+CAknNavigationControlContainer* CMPSettingsAppUi::NaviContainer() const
+    {
+    MPX_DEBUG1(_L("#MS# CMPSettingsAppUi::NaviContainer()"));
+    return iNaviPane;
+    }
+
+// ----------------------------------------------------
+// CMPSettingsAppUi::MPTabGroup
+// ----------------------------------------------------
+//
+CAknNavigationDecorator* CMPSettingsAppUi::MPTabGroup() const
+    {
+    MPX_DEBUG1(_L("#MS# CMPSettingsAppUi::MPTabGroup()"));
+    return iDecoratedTabGroup;
+    }
+
+// ----------------------------------------------------
+// CMPSettingsAppUi::UpdateTabIndex
+// Updates tabgroup.
+// ----------------------------------------------------
+//
+void CMPSettingsAppUi::UpdateTabIndex()
+    {
+    MPX_DEBUG1(_L("#MS# CMPSettingsAppUi::UpdateTabIndex()"));
+    iTabGroup->SetActiveTabByIndex(iMainView->ActiveFolder());
+    }
+
+// ------------------------------------------------------------------------------
+// CMPSettingsAppUi::DynInitMenuPaneL
+//  This function is called by the AVKON framework just before it displays
+//  a menu pane. Its default implementation is empty, and by overriding it,
+//  the application can set the state of menu items dynamically according
+//  to the state of application data.
+// ------------------------------------------------------------------------------
+//
+void CMPSettingsAppUi::DynInitMenuPaneL(
+    TInt /*aResourceId*/,CEikMenuPane* /*aMenuPane*/)
+    {
+    MPX_DEBUG1(_L("#MS# CMPSettingsAppUi::DynInitMenuPaneL()"));
+    }
+
+// ----------------------------------------------------
+// CMPSettingsAppUi::HandleKeyEventL
+// Forwards key events to tabgroup when appropriate.
+// ----------------------------------------------------
+//
+TKeyResponse CMPSettingsAppUi::HandleKeyEventL(
+    const TKeyEvent& aKeyEvent, TEventCode aType)
+    {
+    MPX_DEBUG1(_L("#MS# CMPSettingsAppUi::HandleKeyEventL()"));
+    // Check if the event should be handled by iTabGroup
+    if (aType != EEventKey ||  iNaviPane->Top() != iDecoratedTabGroup)
+        {
+        return EKeyWasNotConsumed;
+        }
+
+    return iTabGroup->OfferKeyEventL(aKeyEvent, aType);
+    }
+
+
+// ----------------------------------------------------
+// CMPSettingsAppUi::AddTabSettingsGroupL()
+// (Re)create tab group with skin support
+// ----------------------------------------------------
+//
+void CMPSettingsAppUi::AddTabSettingsGroupL()
+    {
+    MPX_DEBUG1(_L("#MS# CMPSettingsAppUi::AddTabSettingsGroupL()"));
+    TBool iPushed = EFalse;
+    TFileName fileName;
+
+    // switch view if in tab
+    if(iNaviPane->Top() == iDecoratedTabGroup)
+        {
+        iNaviPane->PushDefaultL();
+        iPushed = ETrue;
+        }
+
+    iTabGroup = static_cast<CAknTabGroup*>
+        (iDecoratedTabGroup->DecoratedControl());
+
+    iTabGroup->SetTabFixedWidthL(KTabWidthWithThreeTabs);
+
+    HBufC* mbmpath = StringLoader::LoadLC(R_MPSETT_ICON_MBM_FILE);
+
+    // This is done to ensure upgraded file is used first. 
+    // If no upgraded file is found, default file in Z: drive will be used.
+    TFindFile find( CCoeEnv::Static()->FsSession() );
+    TInt err = find.FindByDir( *mbmpath, KNullDesC );
+    
+    if ( err )
+        {
+        fileName.Append( *mbmpath );        
+        }
+    else
+        {
+        fileName.Append( find.File() );    
+        }
+
+    // Create skinnable tabs
+    AddTabSettingsL(KAknsIIDQgnPropSetMpVideoTab3,
+        fileName,
+        EMbmMediasettingsQgn_prop_set_mp_video_tab2,
+        EMbmMediasettingsQgn_prop_set_mp_video_tab2_mask,
+        EMPViewVideoTab);
+
+    AddTabSettingsL(KAknsIIDQgnPropSetMpStreamTab3,
+        fileName,
+        EMbmMediasettingsQgn_prop_set_mp_stream_tab2,
+        EMbmMediasettingsQgn_prop_set_mp_stream_tab2_mask,
+        EMPViewStreamTab);
+
+    AddTabSettingsL(KAknsIIDQgnPropSetMpStreamTab3,
+        fileName,
+        EMbmMediasettingsQgn_prop_set_mp_video_tab3,
+        EMbmMediasettingsQgn_prop_set_mp_video_tab3_mask,
+        EMPViewFeedsTab);
+    
+    CleanupStack::PopAndDestroy();  // mbmpath
+
+    // return to previous view & update correct tab index
+    if (iPushed) 
+        {
+        iNaviPane->PushL(*iDecoratedTabGroup);
+        UpdateTabIndex();
+        }
+    }
+
+// ----------------------------------------------------
+// CMPSettingsAppUi::AddTabSettingsL
+// Adds individual tabs.
+// ----------------------------------------------------
+//
+void CMPSettingsAppUi::AddTabSettingsL(
+    const TAknsItemID& aID,
+    const TDesC& aMbmFile,
+    TInt aBitmapId,
+    TInt aMaskId,
+    TInt aTabId)
+    {
+    
+    MPX_DEBUG1(_L("#MS# CMPSettingsAppUi::AddTabSettingsL()"));
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+
+    AknsUtils::CreateIconLC(skin, aID,
+        bitmap, mask, aMbmFile, aBitmapId, aMaskId);
+
+    // delete if exists
+    if(iTabGroup->TabIndexFromId(aTabId) >= 0)
+        {
+        iTabGroup->DeleteTabL(aTabId);
+        }
+
+    iTabGroup->AddTabL(aTabId, bitmap, mask);
+    
+    CleanupStack::Pop(2); // bitmap, mask
+    }
+
+// End of File