appinstaller/AppMngr2/src/appmngr2listview.cpp
author Simon Howkins <simonh@symbian.org>
Mon, 22 Nov 2010 12:04:39 +0000
branchRCL_3
changeset 84 e6c5e34cd9b9
parent 66 8b7f4e561641
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

/*
* Copyright (c) 2008-2010 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:   Base class for different AppMngr2 list views
*
*/


#include "appmngr2listview.h"           // CAppMngr2ListView
#include "appmngr2listcontainer.h"      // CAppMngr2ListContainer
#include "appmngr2appui.h"              // CAppMngr2AppUi
#include "appmngr2model.h"              // CAppMngr2Model
#include "appmngr2log.h"                // CAppMngr2Log
#include "appmngr2.hrh"                 // Command IDs
#include <appmngr2runtime.h>            // CAppMngr2Runtime
#include <appmngr2infobase.h>           // CAppMngr2InfoBase
#include <appmngr2cleanuputils.h>       // CleanupResetAndDestroyPushL
#include <appmngr2debugutils.h>         // FLOG macros
#include <appmngr2common.hrh>           // generic command ids
#include <data_caging_path_literals.hrh> // KDC_RESOURCE_FILES_DIR
#include <featmgr.h>                    // FeatureManager
#include <bautils.h>                    // BaflUtils
#include <eikenv.h>                     // CEikonEnv
#include <aknViewAppUi.h>               // CAknViewAppUi
#include <eikmenub.h>                   // CEikMenuBar, CEikMenuPane
#include <eikmenup.h>                   // CEikMenuPaneItem
#include <akntitle.h>                   // CAknTitlePane
#include <StringLoader.h>               // StringLoader
#include <appmngr2.rsg>                 // Resource IDs

const TUid KStatusPaneUid = { EEikStatusPaneUidTitle };


// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
// CAppMngr2ListView::ConstructL()
// ---------------------------------------------------------------------------
//
void CAppMngr2ListView::ConstructL( TInt aResourceId )
    {
    FLOG( "CAppMngr2ListView::ConstructL( 0x%08x )", aResourceId );

    BaseConstructL( aResourceId );
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::~CAppMngr2ListView()
// ---------------------------------------------------------------------------
//
CAppMngr2ListView::~CAppMngr2ListView()
    {
    FLOG( "CAppMngr2ListView::~CAppMngr2ListView" );

    if( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        delete iContainer;
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::RefreshL()
// ---------------------------------------------------------------------------
//
void CAppMngr2ListView::RefreshL( TInt aMoreRefreshesExpected )
    {
    if( iContainer )
        {
        FLOG( "CAppMngr2ListView::RefreshL( %d ) begin", aMoreRefreshesExpected );

        TBool selectedItemChanged = EFalse;
        iContainer->RefreshL( iMaintainFocus, selectedItemChanged, aMoreRefreshesExpected );
        if( selectedItemChanged )
            {
            UpdateMiddleSoftkeyCommandL();
            StopDisplayingMenuBar();
            iMaintainFocus = EFalse;
            }
            
        FLOG( "CAppMngr2ListView::RefreshL() end" );
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::UpdateMiddleSoftkeyCommandL()
// ---------------------------------------------------------------------------
//
void CAppMngr2ListView::UpdateMiddleSoftkeyCommandL()
    {
    FLOG_PERF_STATIC_BEGIN( UpdateMiddleSoftkeyCommandL );

    if( iContainer && !iContainer->IsListEmpty() )
        {
        // add item-specific MSK if the current item has one
        CAppMngr2InfoBase& currentItem = iContainer->CurrentItem();
        TInt resourceId = 0;
        TInt commandId = 0;
        currentItem.GetMiddleSoftkeyCommandL( resourceId, commandId );
        if( resourceId && commandId )
            {
            SetMiddleSoftkeyCommandL( resourceId, commandId );
            }
        else
            {
            SetDefaultMiddleSoftkeyCommandL();
            }
        }
    else
        {
        // list is empty, remove old MSK if it has been added and set the default
        CEikButtonGroupContainer* cba = Cba();
        if( iMiddleSoftkeyCommandId && cba )
            {
            cba->RemoveCommandFromStack( CEikButtonGroupContainer::EMiddleSoftkeyPosition,
                    iMiddleSoftkeyCommandId );
            }
        SetDefaultMiddleSoftkeyCommandL();
        }

    FLOG_PERF_STATIC_END( UpdateMiddleSoftkeyCommandL )
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::CurrentItemSelectedByUser()
// ---------------------------------------------------------------------------
//
void CAppMngr2ListView::CurrentItemSelectedByUser( TBool aMaintainFocus )
    {
    iMaintainFocus = aMaintainFocus;
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::HandleViewRectChange()
// ---------------------------------------------------------------------------
//
void CAppMngr2ListView::HandleViewRectChange()
    {
    if( iContainer )
        {
        iContainer->SetRect( ClientRect() );
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::HandleCommandL()
// ---------------------------------------------------------------------------
//
void CAppMngr2ListView::HandleCommandL( TInt aCommand )
    {
    FLOG( "CAppMngr2ListView::HandleCommandL( %d )", aCommand );

    switch( aCommand )
        {
        case EAknSoftkeyBack:
            AppUi()->HandleCommandL( EAknSoftkeyExit );
            break;

        case EAppMngr2CmdLog:
            {
            CAppMngr2Log* log = CAppMngr2Log::NewLC();
            log->ShowInstallationLogL();
            CleanupStack::PopAndDestroy( log );
            }
            break;

        case EAknCmdHelp:
        case EAknCmdExit:
            AppUi()->HandleCommandL( aCommand );
            break;

        default:
            Model().HandleCommandL( iContainer->CurrentItem(), aCommand );
            break;
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::DynInitMenuPaneL()
// ---------------------------------------------------------------------------
//
void CAppMngr2ListView::DynInitMenuPaneL( TInt aResourceId,
        CEikMenuPane* aMenuPane )
    {
    if( aResourceId == R_APPMNGR2_INSTALLED_MENU
            || aResourceId == R_APPMNGR2_PACKAGES_MENU )
        {
        if( !FeatureManager::FeatureSupported( KFeatureIdHelp ) )
            {
            aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
            }

        // Keep the currently selected item focused in forthcoming list refreshes.
        iMaintainFocus = ETrue;
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::DoActivateL()
// ---------------------------------------------------------------------------
//
void CAppMngr2ListView::DoActivateL( const TVwsViewId& /*aPrevViewId*/,
        TUid /*aCustomMessageId*/, const TDesC8& /*aCustomMessage*/ )
    {
    FLOG( "CAppMngr2ListView::DoActivateL, id 0x%08x", Id().iUid );

    CAknTitlePane* titlePane = NULL;
    titlePane = static_cast<CAknTitlePane*>( StatusPane()->ControlL( KStatusPaneUid ) );
    SetTitleL( *titlePane );

    if( iContainer == NULL )
        {
        iContainer = CreateContainerL();
        iContainer->SetMopParent( this );
        AppUi()->AddToViewStackL( *this, iContainer );
        iContainer->ActivateL();
        }
    UpdateMiddleSoftkeyCommandL();

    // Note Infopopup is removed and replaced with wait dialog.         
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::DoDeactivate()
// ---------------------------------------------------------------------------
//
void CAppMngr2ListView::DoDeactivate()
    {
    FLOG( "CAppMngr2ListView::DoDeactivate, id 0x%08x", Id().iUid );

    if( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        delete iContainer;
        iContainer = NULL;
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::Model()
// ---------------------------------------------------------------------------
//
CAppMngr2Model& CAppMngr2ListView::Model() const
    {
    return reinterpret_cast<CAppMngr2AppUi*>( iEikonEnv->EikAppUi() )->Model();
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::AddDynamicMenuItemsL()
// ---------------------------------------------------------------------------
//
void CAppMngr2ListView::AddDynamicMenuItemsL( CAppMngr2InfoBase& aCurrentItem,
        CEikMenuPane* aMenuPane )
    {
    if( aMenuPane )
        {
        FLOG_PERF_STATIC_BEGIN( AddDynamicMenuItemsL );

        TInt position = 0;
        if( aMenuPane->MenuItemExists( EAppMngr2PlaceForPluginSpecificCmds, position ) )
            {
            aMenuPane->DeleteMenuItem( EAppMngr2PlaceForPluginSpecificCmds );

            RPointerArray<CEikMenuPaneItem::SData> menuItems;
            CleanupResetAndDestroyPushL( menuItems );

            TRAPD( err, aCurrentItem.GetMenuItemsL( menuItems ) );
            if( !err )
                {
                TInt count = menuItems.Count();
                for( TInt index = 0; index < count; index++ )
                    {
                    aMenuPane->InsertMenuItemL( *( menuItems[ index ] ), position++ );
                    aMenuPane->SetItemSpecific( menuItems[ index ]->iCommandId, ETrue );
                    }
                }

            CleanupStack::PopAndDestroy( &menuItems );
            }

        FLOG_PERF_STATIC_END( AddDynamicMenuItemsL )
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::SetMiddleSoftkeyCommandL()
// ---------------------------------------------------------------------------
//
void CAppMngr2ListView::SetMiddleSoftkeyCommandL( TInt aResourceId, TInt aCommandId )
    {
    CEikButtonGroupContainer* cba = Cba();
    if( cba )
        {
        // remove old command from the stack if it is already added
        if( iMiddleSoftkeyCommandId )
            {
            cba->RemoveCommandFromStack( CEikButtonGroupContainer::EMiddleSoftkeyPosition,
                    iMiddleSoftkeyCommandId );
            }
        HBufC* middleSoftkeyLabel = StringLoader::LoadLC( aResourceId );
        cba->AddCommandToStackL( CEikButtonGroupContainer::EMiddleSoftkeyPosition,
                aCommandId, *middleSoftkeyLabel );
        CleanupStack::PopAndDestroy( middleSoftkeyLabel );
        iMiddleSoftkeyCommandId = aCommandId;
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2ListView::CAppMngr2ListView()
// ---------------------------------------------------------------------------
//
CAppMngr2ListView::CAppMngr2ListView()
    {
    }