diff -r 000000000000 -r ba25891c3a9e iaupdate/IAD/ui/src/iaupdatemainview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iaupdate/IAD/ui/src/iaupdatemainview.cpp Thu Dec 17 08:51:10 2009 +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 +#include +#include +#include // CAknNavigationControlContainer +#include // CAknNavigationDecorator +#include +#include // CAknMessageQueryDialog +#include +#include +#include +#include + +#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& aNodes, + const RPointerArray& 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( 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 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 selectedNodes; + CleanupClosePushL( selectedNodes ); + GetSelectedNodesL( selectedNodes ); + + if ( selectedNodes.Count() ) + { + if ( selectedNodes[0]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw ) + { + //firmware is selected + MIAUpdateFwNode* node = static_cast( 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 selectedNodes; + CleanupClosePushL( selectedNodes ); + GetSelectedNodesL( selectedNodes ); + + if ( selectedNodes.Count() ) + { + if ( selectedNodes[0]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw ) + { + //firmware is selected + MIAUpdateFwNode* node = static_cast( 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( 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 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( iAllNodes[aIndex] ); + RPointerArray mands; + RPointerArray 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( iAllNodes[mandNodeInd] ); + RPointerArray 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& 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& 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 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( iAllNodes[0] ); + if ( (iAllNodes[0]->Base().ContentSizeL() == 0) || (fwnode->FwType() == MIAUpdateFwNode::EFotiNsu) ) + { + return; + } + } + + if ( !iNaviPane ) + { + iNaviPane = static_cast + ( 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* numberArray = + new ( ELeave ) CArrayFixFlat( 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 +