iaupdate/IAD/ui/src/iaupdatemainview.cpp
changeset 0 ba25891c3a9e
child 13 0817e13c927e
--- /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 <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
+