--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/iaupdate/IAD/ui/src/iaupdatemainview.cpp Tue Jan 26 12:06:03 2010 +0200
@@ -0,0 +1,1029 @@
+/*
+* Copyright (c) 2007-2009 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: This module contains the implementation of CIAUpdateMainView class
+* member functions.
+*
+*/
+
+
+
+#include <eikmenup.h>
+#include <aknViewAppUi.h>
+#include <akntitle.h>
+#include <aknnavi.h> // CAknNavigationControlContainer
+#include <aknnavide.h> // CAknNavigationDecorator
+#include <AknUtils.h>
+#include <aknmessagequerydialog.h> // CAknMessageQueryDialog
+#include <akntoolbar.h>
+#include <StringLoader.h>
+#include <featmgr.h>
+#include <iaupdate.rsg>
+
+#include "iaupdate.hrh"
+#include "iaupdatemainview.h"
+#include "iaupdatemaincontainer.h"
+#include "iaupdatenode.h"
+#include "iaupdatefwnode.h"
+#include "iaupdatebasenode.h"
+#include "iaupdatedialogutil.h"
+#include "iaupdatestatusdialog.h"
+#include "iaupdateappui.h"
+#include "iaupdateuicontroller.h"
+#include "iaupdatedeputils.h"
+#include "iaupdatedebug.h"
+#include "iaupdatefwupdatehandler.h"
+
+//CONSTANTS
+const TInt KKiloByte = 1024;
+const TInt KMegaByte = 1024 * 1024;
+const TInt KMaxShownInKiloBytes = 10 * KMegaByte;
+const TInt KSelInfoArrayGranularity = 3;
+
+//MACROS
+_LIT( KSpace, " " );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CIAUpdateMainView* CIAUpdateMainView::NewL( const TRect& aRect )
+ {
+ CIAUpdateMainView* self = CIAUpdateMainView::NewLC( aRect );
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::NewLC
+//
+// -----------------------------------------------------------------------------
+//
+CIAUpdateMainView* CIAUpdateMainView::NewLC( const TRect& aRect )
+ {
+ CIAUpdateMainView* self = new (ELeave) CIAUpdateMainView();
+ CleanupStack::PushL( self );
+ self->ConstructL( aRect );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::CIAUpdateMainView
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CIAUpdateMainView::CIAUpdateMainView()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::~CIAUpdateMainView
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CIAUpdateMainView::~CIAUpdateMainView()
+ {
+ delete iDecorator;
+ iAllNodes.Close();
+ if ( iContainer )
+ {
+ AppUi()->RemoveFromStack( iContainer );
+ delete iContainer;
+ }
+ delete iFwUpdateHandler;
+ }
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateMainView::ConstructL( const TRect& /*aRect*/ )
+ {
+ BaseConstructL( R_IAUPDATE_MAIN_VIEW );
+ Toolbar()->SetItemDimmed( EIAUpdateCmdStartUpdate, ETrue, ETrue );
+ Toolbar()->SetItemDimmed( EIAUpdateCmdMarkedUpdateDetails, ETrue, ETrue );
+ Toolbar()->SetItemDimmed( EIAUpdateCmdUpdateHistory, ETrue, ETrue );
+ Toolbar()->SetToolbarObserver( this );
+ iFwUpdateHandler = CIAUpdateFWUpdateHandler::NewL();
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::RefreshL
+// Refreshes update list
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateMainView::RefreshL( const RPointerArray<MIAUpdateNode>& aNodes,
+ const RPointerArray<MIAUpdateFwNode>& aFwNodes,
+ TInt aError )
+ {
+ IAUPDATE_TRACE("[IAUPDATE] CIAUpdateMainView::RefreshL begin");
+ iRefreshError = aError;
+ iAllNodes.Reset();
+
+ if ( aFwNodes.Count() > 0 )
+ {
+ IAUPDATE_TRACE("[IAUPDATE] CIAUpdateMainView::RefreshL hard code importance");
+ //hardcode the importance of firmware as Critical
+ for ( TInt i = 0; i < aFwNodes.Count(); i++ )
+ {
+ aFwNodes[i]->Base().SetImportance( MIAUpdateBaseNode::ECritical );
+ }
+
+ //either NSU or FOTA available
+ if ( aFwNodes.Count() == 1 )
+ {
+ IAUPDATE_TRACE("[IAUPDATE] CIAUpdateMainView::RefreshL either NSU or FOTA available");
+ MIAUpdateAnyNode* node = aFwNodes[0];
+ User::LeaveIfError( iAllNodes.Append( node ) );
+ }
+
+ //both NSU and FOTA available, show only FOTA node
+ if ( aFwNodes.Count() == 2 )
+ {
+ IAUPDATE_TRACE("[IAUPDATE] CIAUpdateMainView::RefreshL both NSU and FOTA available");
+ MIAUpdateAnyNode* node1 = aFwNodes[0];
+ MIAUpdateFwNode* fwnode = static_cast<MIAUpdateFwNode*>( node1 );
+ if ( fwnode->FwType() == MIAUpdateFwNode::EFotaDp2 )
+ {
+ User::LeaveIfError( iAllNodes.Append( node1 ) );
+ }
+ else
+ {
+ MIAUpdateAnyNode* node2 = aFwNodes[1];
+ User::LeaveIfError( iAllNodes.Append( node2 ) );
+ }
+ }
+ }
+
+
+ for( TInt i = 0; i < aNodes.Count(); ++i )
+ {
+ MIAUpdateAnyNode* node = aNodes[i];
+ User::LeaveIfError( iAllNodes.Append( node ) );
+ }
+
+ if( iContainer )
+ {
+ iContainer->RefreshL( iAllNodes, iRefreshError );
+ SetSelectedIndicesL();
+ DynInitToolbarL( R_IAUPDATE_MAIN_TOOLBAR, Toolbar() );
+ }
+ Toolbar()->SetItemDimmed( EIAUpdateCmdUpdateHistory, EFalse, ETrue );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::GetCurrentNode
+//
+// -----------------------------------------------------------------------------
+//
+MIAUpdateAnyNode* CIAUpdateMainView::GetCurrentNode()
+ {
+ if ( iContainer )
+ {
+ return iContainer->GetCurrentNode( iAllNodes );
+ }
+ return NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::GetSelectedNode
+//
+// -----------------------------------------------------------------------------
+//
+MIAUpdateAnyNode* CIAUpdateMainView::GetSelectedNode()
+ {
+ MIAUpdateAnyNode* selectedNode = NULL;
+ for( TInt i = 0; i < iAllNodes.Count() && !selectedNode ; ++i )
+ {
+ if ( iAllNodes[i]->Base().IsSelected() )
+ {
+ selectedNode = iAllNodes[i];
+ }
+ }
+ return selectedNode;
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::Id
+// Get Uid of this view
+// -----------------------------------------------------------------------------
+//
+TUid CIAUpdateMainView::Id() const
+ {
+ return TUid::Uid( EIAUpdateMainViewId );
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::HandleCommandL
+//
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateMainView::HandleCommandL( TInt aCommand )
+ {
+ switch( aCommand )
+ {
+ case EIAUpdateCmdStartUpdate:
+ {
+ RPointerArray<MIAUpdateAnyNode> selectedNodes;
+ CleanupClosePushL( selectedNodes );
+ GetSelectedNodesL( selectedNodes );
+ if ( selectedNodes[0]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw )
+ {
+ //the marking logic will make sure firmware won't be marked with normal sis updates
+ //at the same time.
+ iFwUpdateHandler->FirmWareUpdatewithFOTA();
+ }
+ else
+ {
+ AppUi()->HandleCommandL( aCommand );
+ }
+ CleanupStack::PopAndDestroy( &selectedNodes );
+ break;
+ }
+ case EIAUpdateCmdUpdateWithPC:
+ {
+ iFwUpdateHandler->FirmWareUpdatewithNSU();
+ break;
+ }
+ case EIAUpdateCmdSettings:
+ {
+ Toolbar()->SetToolbarVisibility( EFalse );
+ AppUi()->HandleCommandL( aCommand );
+ Toolbar()->SetToolbarVisibility( ETrue );
+ break;
+ }
+ case EAknSoftkeyMark:
+ {
+ iContainer->HandleMarkCommandL( EAknCmdMark );
+ break;
+ }
+ case EAknSoftkeyUnmark:
+ {
+ iContainer->HandleMarkCommandL( EAknCmdUnmark );
+ break;
+ }
+ case EAknCmdMark:
+ case EAknCmdUnmark:
+ {
+ iContainer->HandleMarkCommandL( aCommand );
+ break;
+ }
+ default:
+ {
+ AppUi()->HandleCommandL( aCommand );
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::DynInitMenuPaneL
+// Dim options which are not availble in empty list.
+// Set Mark/Unmark option
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateMainView::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane )
+ {
+ if( aResourceId == R_IAUPDATE_MAIN_MENU )
+ {
+ if ( !FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+ {
+ aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
+ }
+ RPointerArray<MIAUpdateAnyNode> selectedNodes;
+ CleanupClosePushL( selectedNodes );
+ GetSelectedNodesL( selectedNodes );
+
+ if ( selectedNodes.Count() )
+ {
+ if ( selectedNodes[0]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw )
+ {
+ //firmware is selected
+ MIAUpdateFwNode* node = static_cast<MIAUpdateFwNode*>( selectedNodes[0] );
+
+ if ( node->FwType() == MIAUpdateFwNode::EFotaDp2 )
+ {
+ aMenuPane->SetItemDimmed( EIAUpdateCmdUpdateWithPC, ETrue );
+ }
+
+ if ( node->FwType() == MIAUpdateFwNode::EFotiNsu )
+ {
+ aMenuPane->SetItemDimmed( EIAUpdateCmdStartUpdate, ETrue );
+ }
+ }
+ else
+ {
+ //firmware is not selected, only sis
+ aMenuPane->SetItemDimmed( EIAUpdateCmdUpdateWithPC, ETrue );
+ }
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EIAUpdateCmdStartUpdate, ETrue );
+ aMenuPane->SetItemDimmed( EIAUpdateCmdUpdateWithPC, ETrue );
+ }
+ CleanupStack::PopAndDestroy( &selectedNodes );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::DoActivateL
+// Activate view
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateMainView::DoActivateL( const TVwsViewId& /*aPrevViewId*/,
+ TUid /*aCustomMessageId*/,
+ const TDesC8& /*aCustomMessage*/ )
+ {
+ UpdateStatusPaneL();
+ if( !iContainer )
+ {
+ iContainer = CIAUpdateMainContainer::NewL( ClientRect(), *this );
+
+ if( iAllNodes.Count() > 0 )
+ {
+ iContainer->RefreshL( iAllNodes, iRefreshError );
+ }
+
+ SetSelectedIndicesL();
+ DynInitToolbarL( R_IAUPDATE_MAIN_TOOLBAR, Toolbar() );
+ AppUi()->AddToStackL( iContainer );
+ }
+ else
+ {
+ UpdateSelectionInfoInNaviPaneL();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::DoDeactivate()
+// Container is deleted in deactivation
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateMainView::DoDeactivate()
+ {
+ RemoveSelectionInfoInNaviPane();
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::DynInitToolbarL()
+//
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateMainView::DynInitToolbarL( TInt aResourceId, CAknToolbar* aToolbar )
+ {
+ if ( aResourceId == R_IAUPDATE_MAIN_TOOLBAR )
+ {
+ if ( iContainer )
+ {
+ if ( CountOfSelectedItems() > 0 )
+ {
+ aToolbar->SetItemDimmed( EIAUpdateCmdStartUpdate, EFalse, ETrue );
+ }
+ else
+ {
+ aToolbar->SetItemDimmed( EIAUpdateCmdStartUpdate, ETrue, ETrue );
+ }
+ if ( CountOfSelectedItems() == 1 )
+ {
+ aToolbar->SetItemDimmed( EIAUpdateCmdMarkedUpdateDetails, EFalse, ETrue );
+ }
+ else
+ {
+ aToolbar->SetItemDimmed( EIAUpdateCmdMarkedUpdateDetails, ETrue, ETrue );
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::OfferToolbarEventL()
+//
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateMainView::OfferToolbarEventL( TInt aCommand )
+ {
+ if ( aCommand == EIAUpdateCmdStartUpdate )
+ {
+ RPointerArray<MIAUpdateAnyNode> selectedNodes;
+ CleanupClosePushL( selectedNodes );
+ GetSelectedNodesL( selectedNodes );
+
+ if ( selectedNodes.Count() )
+ {
+ if ( selectedNodes[0]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw )
+ {
+ //firmware is selected
+ MIAUpdateFwNode* node = static_cast<MIAUpdateFwNode*>( selectedNodes[0] );
+
+ if ( node->FwType() == MIAUpdateFwNode::EFotaDp2 )
+ {
+ aCommand = EIAUpdateCmdStartUpdate;
+ }
+
+ if ( node->FwType() == MIAUpdateFwNode::EFotiNsu )
+ {
+ aCommand = EIAUpdateCmdUpdateWithPC;
+ }
+ }
+ else
+ {
+ //firmware is not selected, only sis
+ aCommand = EIAUpdateCmdStartUpdate;
+ }
+ }
+ else
+ {
+ MIAUpdateAnyNode* currentNode = GetCurrentNode();
+ if ( currentNode->NodeType() == MIAUpdateAnyNode::ENodeTypeFw )
+ {
+ MIAUpdateFwNode* node = static_cast<MIAUpdateFwNode*>( currentNode );
+ if ( node->FwType() == MIAUpdateFwNode::EFotiNsu )
+ {
+ aCommand = EIAUpdateCmdUpdateWithPC;
+ }
+ }
+ }
+
+ CleanupStack::PopAndDestroy( &selectedNodes );
+ }
+ HandleCommandL( aCommand );
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::MarkListItemL
+// Mark list item
+// -----------------------------------------------------------------------------
+//
+TBool CIAUpdateMainView::MarkListItemL( TBool aMark, TInt aIndex )
+ {
+ if ( aMark )
+ {
+ //It's Mark Command
+ RPointerArray<MIAUpdateAnyNode> selectedNodes;
+ CleanupClosePushL( selectedNodes );
+ GetSelectedNodesL( selectedNodes );
+
+ //There are selected items already and type are different with the current one
+ if ( selectedNodes.Count() > 0 && (iAllNodes[aIndex]->NodeType() != selectedNodes[0]->NodeType() ) )
+ {
+ HBufC* msgText = StringLoader::LoadLC(R_IAUPDATE_FIRMWARE_WITH_OTHERS);
+
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+
+ dlg->ExecuteLD( R_IAUPDATE_INFORMATION_QUERY, *msgText );
+
+ CleanupStack::PopAndDestroy( msgText );
+
+ //clean all of the current selection(s)
+ iContainer->CleanAllSelection();
+
+ // firmware item and normal sis items can't be selected at the same time
+ // unmark the selected nodes.
+ for ( TInt i = 0; i < selectedNodes.Count(); i++ )
+ {
+ TInt index = iAllNodes.Find( selectedNodes[i]);
+ iAllNodes[index]->Base().SetSelected( EFalse );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( &selectedNodes );
+ }
+
+ //there is no selected items or the type is the same with the current one
+
+ if ( iAllNodes[aIndex]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw )
+ {
+ iAllNodes[aIndex]->Base().SetSelected( aMark );
+
+ if ( aMark )
+ {
+ SetMiddleSKTextL( ETrue, ETrue );
+ }
+ else
+ {
+ SetMiddleSKTextL( ETrue, EFalse );
+ }
+ UpdateSelectionInfoInNaviPaneL();
+ DynInitToolbarL( R_IAUPDATE_MAIN_TOOLBAR, Toolbar() );
+ return ETrue;
+ }
+
+ if ( iAllNodes[aIndex]->NodeType() == MIAUpdateAnyNode::ENodeTypeNormal )
+ {
+ TBool accepted = EFalse;
+
+ if( aIndex > -1 )
+ {
+ accepted = ETrue;
+
+ MIAUpdateNode* node = static_cast<MIAUpdateNode*>( iAllNodes[aIndex] );
+ RPointerArray<MIAUpdateAnyNode> mands;
+ RPointerArray<MIAUpdateNode> deps;
+
+ if ( aMark )
+ {
+ CleanupClosePushL( mands );
+ CleanupClosePushL( deps );
+ IAUpdateDepUtils::GetDependenciesL( *node, iAllNodes, deps );
+ GetMandatoryNodesL( mands );
+ }
+ else
+ {
+ //mandatory item is not allowed to be unmarked
+ if ( iAllNodes[aIndex]->Base().Importance() == MIAUpdateBaseNode::EMandatory )
+ {
+ //show dialog
+ ShowUpdateCannotOmitDialogL();
+ return EFalse;
+ }
+
+ CleanupClosePushL( deps );
+ IAUpdateDepUtils::GetDependantsL( *node, iAllNodes, deps );
+ // item is not allowed to be unmarked if its dependant is mandatory
+ TBool mandatoryDependantFound = EFalse;
+ for( TInt i = 0; i < deps.Count() && !mandatoryDependantFound; i++ )
+ {
+ if ( deps[i]->Base().Importance() == MIAUpdateBaseNode::EMandatory )
+ {
+ mandatoryDependantFound = ETrue;
+ }
+ }
+ if ( mandatoryDependantFound )
+ {
+ ShowUpdateCannotOmitDialogL();
+ CleanupStack::PopAndDestroy( &deps );
+ return EFalse;
+ }
+ }
+
+ TInt depCount = deps.Count();
+
+ if ( depCount > 0 )
+ {
+ HBufC* text = NULL;
+ HBufC* names = NULL;
+ MIAUpdateNode* depNode = NULL;
+ HBufC* separator = NULL;
+
+ if ( depCount > 1 )
+ {
+ separator = StringLoader::LoadLC( R_IAUPDATE_SEPARATOR );
+ }
+
+ names = HBufC::NewLC( 0 );
+
+ for( TInt i = 0; i < depCount; i++ )
+ {
+ depNode = deps[i];
+ HBufC* temp = NULL;
+ if ( separator )
+ {
+ temp = names->ReAllocL( names->Length() +
+ depNode->Base().Name().Length() +
+ separator->Length() +
+ KSpace.iTypeLength );
+ }
+ else
+ {
+ temp = names->ReAllocL( names->Length() +
+ depNode->Base().Name().Length() +
+ KSpace.iTypeLength );
+ }
+
+ CleanupStack::Pop( names );
+ names = temp;
+ CleanupStack::PushL( names );
+
+ if ( i > 0 )
+ {
+ names->Des() += *separator;
+ names->Des() += KSpace;
+ }
+ names->Des() += depNode->Base().Name();
+ }
+
+ TInt resourceId = 0;
+ if ( aMark )
+ {
+ if ( depCount > 1 )
+ {
+ resourceId = R_IAUPDATE_DEPENDENCY_MARK_MANY;
+ }
+ else
+ {
+ resourceId = R_IAUPDATE_DEPENDENCY_MARK_ONE;
+ }
+ }
+ else
+ {
+ if ( depCount > 1 )
+ {
+ resourceId = R_IAUPDATE_DEPENDENCY_UNMARK_MANY;
+ }
+ else
+ {
+ resourceId = R_IAUPDATE_DEPENDENCY_UNMARK_ONE;
+ }
+ }
+ text = StringLoader::LoadLC( resourceId, *names );
+
+ if ( aMark && iAllNodes[aIndex]->Base().Importance() == MIAUpdateBaseNode::EMandatory )
+ {
+ // depencencies of mandatory update are also selected without showing dialog
+ accepted = ETrue;
+ }
+ else
+ {
+ accepted = ShowDependenciesFoundDialogL( *text );
+ }
+ CleanupStack::PopAndDestroy( text );
+ CleanupStack::PopAndDestroy( names );
+
+ if ( separator )
+ {
+ CleanupStack::PopAndDestroy( separator );
+ }
+ }
+
+ if ( accepted )
+ {
+ for( TInt j = 0; j < depCount; j++ )
+ {
+ TInt depNodeInd = iAllNodes.Find( deps[j] );
+ iAllNodes[depNodeInd]->Base().SetSelected( aMark );
+ }
+ CleanupStack::PopAndDestroy( &deps );
+
+ TInt nodeInd = iAllNodes.Find( node );
+ iAllNodes[nodeInd]->Base().SetSelected( aMark );
+ }
+ else
+ {
+ //user rejects the dependency dialog
+ CleanupStack::PopAndDestroy( &deps );
+ if ( aMark )
+ {
+ CleanupStack::PopAndDestroy( &mands );
+ }
+ return EFalse;
+ }
+
+ //mark all of the mandatory items
+ TInt mandCount = mands.Count();
+ if ( mandCount > 0 && aMark )
+ {
+ for( TInt j = 0; j < mandCount; j++ )
+ {
+ TInt mandNodeInd = iAllNodes.Find( mands[j] );
+ iAllNodes[mandNodeInd]->Base().SetSelected( aMark );
+ if ( iAllNodes[mandNodeInd]->NodeType() == MIAUpdateAnyNode::ENodeTypeNormal )
+ {
+ // mark also all dependencies of a mandatory item
+ MIAUpdateNode* dependencyNode = static_cast<MIAUpdateNode*>( iAllNodes[mandNodeInd] );
+ RPointerArray<MIAUpdateNode> dependencies;
+ CleanupClosePushL( dependencies );
+ IAUpdateDepUtils::GetDependenciesL( *dependencyNode, iAllNodes, dependencies );
+ for( TInt k = 0; k < dependencies.Count(); k++ )
+ {
+ TInt depNodeInd = iAllNodes.Find( dependencies[k] );
+ iAllNodes[depNodeInd]->Base().SetSelected( ETrue );
+ }
+ CleanupStack::PopAndDestroy( &dependencies );
+ }
+ }
+ }
+ if ( aMark )
+ {
+ CleanupStack::PopAndDestroy( &mands );
+ }
+
+ if ( depCount > 0 || mandCount > 0 )
+ {
+ SetSelectedIndicesL();
+ }
+ else
+ {
+ UpdateSelectionInfoInNaviPaneL();
+ }
+
+ if ( aMark )
+ {
+ SetMiddleSKTextL( ETrue, ETrue );
+ }
+ else
+ {
+ SetMiddleSKTextL( ETrue, EFalse );
+ }
+ }
+ DynInitToolbarL( R_IAUPDATE_MAIN_TOOLBAR, Toolbar() );
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+
+
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::SetMiddleSKTextL
+// Middle soft key label to be set
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateMainView::SetMiddleSKTextL( TBool aVisible, TBool aSelected )
+ {
+ CEikButtonGroupContainer* cbaGroup = Cba();
+ if ( cbaGroup )
+ {
+ cbaGroup->RemoveCommandFromStack( CEikButtonGroupContainer::EMiddleSoftkeyPosition, iLastCommandId );
+ if ( aVisible )
+ {
+ HBufC* middleSKText = NULL;
+ if ( aSelected )
+ {
+ middleSKText = StringLoader::LoadLC( R_IAUPDATE_MSK_UNMARK );
+ TPtr mskPtr = middleSKText->Des();
+ cbaGroup->AddCommandToStackL(
+ CEikButtonGroupContainer::EMiddleSoftkeyPosition,
+ EAknSoftkeyUnmark,
+ mskPtr );
+ iLastCommandId = EAknSoftkeyUnmark;
+ }
+ else
+ {
+ middleSKText = StringLoader::LoadLC( R_IAUPDATE_MSK_MARK );
+ TPtr mskPtr = middleSKText->Des();
+ cbaGroup->AddCommandToStackL(
+ CEikButtonGroupContainer::EMiddleSoftkeyPosition,
+ EAknSoftkeyMark,
+ mskPtr );
+ iLastCommandId = EAknSoftkeyMark;
+ }
+ CleanupStack::PopAndDestroy( middleSKText );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::GetSelectedNodesL
+// Get selected (marked) nodes
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateMainView::GetSelectedNodesL( RPointerArray<MIAUpdateAnyNode>& aSelectedNodes ) const
+ {
+ for( TInt i = 0; i < iAllNodes.Count(); ++i )
+ {
+ if ( iAllNodes[i]->Base().IsSelected() )
+ {
+ User::LeaveIfError( aSelectedNodes.Append( iAllNodes[i] ) );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::GetMandatoryItemsL
+// Get selected (marked) nodes
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateMainView::GetMandatoryNodesL( RPointerArray<MIAUpdateAnyNode>& aMandNodes ) const
+ {
+ for( TInt i = 0; i < iAllNodes.Count(); ++i )
+ {
+ if ( iAllNodes[i]->Base().Importance() == MIAUpdateBaseNode::EMandatory )
+ {
+ User::LeaveIfError( aMandNodes.Append( iAllNodes[i] ) );
+ }
+ }
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::SetSelectedIndicesL
+// Indices of selected items are passed to container
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateMainView::SetSelectedIndicesL()
+ {
+ RArray<TInt> indices;
+
+ CleanupClosePushL( indices );
+
+ for( TInt i = 0; i < iAllNodes.Count(); ++i )
+ {
+ if ( iAllNodes[i]->Base().IsSelected() )
+ {
+ User::LeaveIfError( indices.Append( i ) );
+ }
+ }
+
+ iContainer->SetSelectedIndicesL( indices );
+ UpdateSelectionInfoInNaviPaneL();
+
+ CleanupStack::PopAndDestroy( &indices );
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::NodeIndex
+// Get index of node
+// -----------------------------------------------------------------------------
+//
+TInt CIAUpdateMainView::NodeIndex( const MIAUpdateAnyNode& aNode ) const
+ {
+ TInt result = -1;
+
+ for( TInt i = 0; i < iAllNodes.Count(); ++i )
+ {
+ if( &aNode == iAllNodes[i] )
+ {
+ result = i;
+ break;
+ }
+ }
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::UpdateStatusPaneL
+// Update title in status pane
+// -----------------------------------------------------------------------------
+//
+
+void CIAUpdateMainView::UpdateStatusPaneL()
+ {
+ CAknTitlePane* titlePane =
+ static_cast< CAknTitlePane* >( StatusPane()->ControlL(
+ TUid::Uid( EEikStatusPaneUidTitle ) ) );
+ HBufC* text = StringLoader::LoadLC( R_IAUPDATE_TEXT_TITLE_MAIN_VIEW );
+ titlePane->SetTextL( *text );
+ CleanupStack::PopAndDestroy( text );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::UpdateSelectionInfoInNaviPaneL
+// Update selection information in status pane
+// -----------------------------------------------------------------------------
+//
+//
+void CIAUpdateMainView::UpdateSelectionInfoInNaviPaneL()
+ {
+ RemoveSelectionInfoInNaviPane();
+
+ if ( iAllNodes.Count() > 0 )
+ {
+ //show empty navi pane when firmware is selected but no size info or it is NSU
+ if ( (iAllNodes[0]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw) && iAllNodes[0]->Base().IsSelected() )
+ {
+ MIAUpdateFwNode* fwnode = static_cast<MIAUpdateFwNode*>( iAllNodes[0] );
+ if ( (iAllNodes[0]->Base().ContentSizeL() == 0) || (fwnode->FwType() == MIAUpdateFwNode::EFotiNsu) )
+ {
+ return;
+ }
+ }
+
+ if ( !iNaviPane )
+ {
+ iNaviPane = static_cast<CAknNavigationControlContainer*>
+ ( StatusPane()->ControlL( TUid::Uid(EEikStatusPaneUidNavi ) ) );
+ }
+ TInt selectedSizeInBytes = 0;
+ for( TInt i = 0; i < iAllNodes.Count(); ++i )
+ {
+ if ( iAllNodes[i]->Base().IsSelected() )
+ {
+ selectedSizeInBytes += iAllNodes[i]->Base().ContentSizeL();
+ }
+ }
+
+
+ TInt resourceId = 0;
+ TInt selectedSize;
+ if ( selectedSizeInBytes >= KMaxShownInKiloBytes )
+ {
+ resourceId = R_IAUPDATE_NAVIPANE_MEGABYTE;
+ selectedSize = selectedSizeInBytes / KMegaByte;
+ if ( selectedSizeInBytes % KMegaByte != 0 )
+ {
+ selectedSize++;
+ }
+ }
+ else
+ {
+ resourceId = R_IAUPDATE_NAVIPANE_KILOBYTE;
+ selectedSize = selectedSizeInBytes / KKiloByte;
+ if ( selectedSizeInBytes % KKiloByte != 0 )
+ {
+ selectedSize++;
+ }
+ }
+
+ CArrayFix<TInt>* numberArray =
+ new ( ELeave ) CArrayFixFlat<TInt>( KSelInfoArrayGranularity );
+ CleanupStack::PushL( numberArray );
+ numberArray->AppendL( CountOfSelectedItems() );
+ numberArray->AppendL( iAllNodes.Count() );
+ numberArray->AppendL( selectedSize );
+
+ HBufC* selectionInfo = StringLoader::LoadLC( resourceId,
+ *numberArray );
+ TPtr ptr = selectionInfo->Des();
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr );
+
+ iDecorator = iNaviPane->CreateNavigationLabelL( *selectionInfo );
+
+ iNaviPane->PushL( *iDecorator );
+
+ CleanupStack::PopAndDestroy( selectionInfo );
+ CleanupStack::PopAndDestroy( numberArray );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::RemoveSelectionInfoInNaviPane
+// Remove existing selection info (created by main view) from navi pane
+// -----------------------------------------------------------------------------
+//
+
+void CIAUpdateMainView::RemoveSelectionInfoInNaviPane()
+ {
+ if ( iNaviPane && iDecorator )
+ {
+ iNaviPane->Pop( iDecorator );
+ delete iDecorator;
+ iDecorator = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateMainView::ShowDependenciesFoundDialogL
+//
+// -----------------------------------------------------------------------------
+//
+TBool CIAUpdateMainView::ShowDependenciesFoundDialogL( TDesC& aText ) const
+ {
+ CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL( aText );
+ dlg->PrepareLC( R_IAUPDATE_MESSAGE_QUERY );
+ CAknPopupHeadingPane* headingPane = dlg->Heading();
+ HBufC* title = StringLoader::LoadLC( R_IAUPDATE_DEPENDENCY_TITLE );
+ headingPane->SetTextL( *title );
+ CleanupStack::PopAndDestroy( title );
+
+ dlg->ButtonGroupContainer().SetCommandSetL(
+ R_IAUPDATE_SOFTKEYS_CONTINUE_CANCEL__CONTINUE );
+
+ return( dlg->RunLD() == EAknSoftkeyOk );
+ }
+
+// ---------------------------------------------------------------------------
+// CIAUpdateMainView::CountOfSelectedItems
+//
+// ---------------------------------------------------------------------------
+//
+TInt CIAUpdateMainView::CountOfSelectedItems() const
+ {
+ TInt countOfSelectedItems = 0;
+ for( TInt i = 0; i < iAllNodes.Count(); ++i )
+ {
+ if ( iAllNodes[i]->Base().IsSelected() )
+ {
+ countOfSelectedItems++;
+ }
+ }
+ return countOfSelectedItems;
+ }
+
+// ---------------------------------------------------------------------------
+// CIAUpdateMainView::ShowUpdateCannotOmitDialogL
+//
+// ---------------------------------------------------------------------------
+//
+void CIAUpdateMainView::ShowUpdateCannotOmitDialogL() const
+ {
+ HBufC* msgText = StringLoader::LoadLC( R_IAUPDATE_CANNOT_OMIT );
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+ dlg->ExecuteLD( R_IAUPDATE_INFORMATION_QUERY, *msgText );
+ CleanupStack::PopAndDestroy( msgText );
+ }
+
+// End of File
+