iaupdate/IAD/ui/src/iaupdatemainview.cpp
changeset 53 ae54820ef82c
parent 52 92f864ef0288
child 67 3a625661d1ce
--- a/iaupdate/IAD/ui/src/iaupdatemainview.cpp	Wed Jun 23 18:20:02 2010 +0300
+++ b/iaupdate/IAD/ui/src/iaupdatemainview.cpp	Tue Jul 06 14:23:31 2010 +0300
@@ -17,8 +17,12 @@
 */
 
 #include <hbaction.h>
-#include <QgraphicsWidget>
+#include <QGraphicsWidget>
+#include <QGraphicsLayout>
+#include <QGraphicsLayoutItem>
+#include <QGraphicsLinearLayout>
 
+#include <hbdockwidget.h>
 #include <hblistwidget.h>
 #include <hblistviewitem.h>
 #include <hblistwidgetitem.h>
@@ -28,6 +32,8 @@
 #include <xqconversions.h>
 #include <hbmessagebox.h>
 #include <hblabel.h>
+#include <hbgroupbox.h>
+#include <hbdataform.h>
 
 #include "iaupdatemainview.h"
 #include "iaupdateengine.h"
@@ -48,11 +54,17 @@
 IAUpdateMainView::IAUpdateMainView(IAUpdateEngine *engine):
 mEngine(engine)        
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::IAUpdateMainView() begin");
+    mFwListView = NULL;
+    mApplicationUpdatesGroupBox = NULL;;
+    mFwNSUGroupBox = NULL;
+    mContentDataForm = NULL;
     mDialogUtil = NULL;
     mDialogState = NoDialog;
     mPrimaryAction = NULL;
     mNode = NULL;
     mSelectionUpdate = false;
+    mSelectionConnect = false;
     
     HbDocumentLoader loader;
     bool ok = false;
@@ -62,15 +74,15 @@
     Q_ASSERT_X(ok, "Software update", "Invalid docml file");
     // Create the view from DocML
     
-    HbView* widget = qobject_cast<HbView*>(loader.findWidget("view"));
-    Q_ASSERT_X(widget != 0, "Software update", "View not found");
-    QString viewTitle(widget->title());
+    HbView* loadedWidget = qobject_cast<HbView*>(loader.findWidget("view"));
+    Q_ASSERT_X(loadedWidget != 0, "Software update", "View not found");
+    QString viewTitle(loadedWidget->title());
     // Set the IAUpdateMainView view to be the widget that was loaded from the xml
-    setWidget(widget);
+    setWidget(loadedWidget);
     setTitle(viewTitle);
       
     HbToolBar *toolBar = qobject_cast< HbToolBar*>( loader.findWidget("viewToolbar") );
-    setToolBar(toolBar);
+    //setToolBar(toolBar);
     
     HbMenu *menu = qobject_cast< HbMenu*>( loader.findWidget("viewMenu") );
     setMenu(menu);
@@ -83,21 +95,45 @@
     connect(action, SIGNAL(triggered()), this, SLOT(handleStartUpdate()));
     connect(action_1, SIGNAL(triggered()), this, SLOT(handleSettings()));
     connect(action_2, SIGNAL(triggered()), this, SLOT(handleDisclaimer()));
-
+        
+    mContent = qobject_cast< HbWidget*>( loader.findWidget("content") );
+           
     mListView = qobject_cast<HbListWidget*>( loader.findWidget("listWidget") );
     mListView->setSelectionMode( HbAbstractItemView::MultiSelection );
     
     connect( mListView, SIGNAL( longPressed( HbAbstractViewItem *, const QPointF & ) ),
             this, SLOT( handleDetails( HbAbstractViewItem *, const QPointF & ) ) ); 
-    
+        
     HbListViewItem *prototype = mListView->listItemPrototype();
 
     prototype->setGraphicsSize(HbListViewItem::LargeIcon);
+    
+    HbDockWidget *dock = new HbDockWidget(this);
+    HbWidget *dockContainer = new HbWidget(dock);
+    QGraphicsLinearLayout *dockLayout = new QGraphicsLinearLayout(dockContainer);
+    dockLayout->setOrientation(Qt::Vertical);
+    dockContainer->setLayout(dockLayout);
+    
+    mSelections = new HbGroupBox(dockContainer);
+    mSelections->setHeading("Selected 0/0 (0 kB)");
+    
+    dockLayout->addItem( mSelections);
+    
+    dockLayout->addItem(toolBar);
+    
+    dock->setWidget(dockContainer);
+    
+    setDockWidget(dock);
 
+
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::IAUpdateMainView() end");
 }
     
 IAUpdateMainView::~IAUpdateMainView()
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::~IAUpdateMainView() begin");
+    
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::~IAUpdateMainView() end");
 }
 
 // -----------------------------------------------------------------------------
@@ -105,130 +141,40 @@
 // Refreshes update list
 // -----------------------------------------------------------------------------
 //    
-void IAUpdateMainView::refresh( const RPointerArray<MIAUpdateNode> &nodes,
-                                const RPointerArray<MIAUpdateFwNode> &fwNodes,
-                                int /*error*/ )
+void IAUpdateMainView::refresh(const RPointerArray<MIAUpdateNode> &nodes,
+                               const RPointerArray<MIAUpdateFwNode> &fwNodes,
+                               int error)
 {   
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refresh begin");
-       
-    mAllNodes.Reset();
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refresh() begin");
+    removeCurrentContentLayout();
         
-    if (fwNodes.Count() > 0)
-    {
-        IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refresh hard code importance");
-        //hardcode the importance of firmware as Critical
-        for (int i = 0; i < fwNodes.Count(); i++)
-        {
-            fwNodes[i]->Base().SetImportance(MIAUpdateBaseNode::ECritical);
-        }
-         
-        //either NSU or FOTA available
-        if (fwNodes.Count() == 1)
-        {
-            IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refresh either NSU or FOTA available");
-            MIAUpdateAnyNode *node = fwNodes[0];
-            mAllNodes.Append(node);
-        }
-        
-        //both NSU and FOTA available, show only FOTA node
-        if (fwNodes.Count() == 2)
+    refreshFirmwareUpdates(fwNodes);
+    
+    refreshApplicationUpdates(nodes);
+    
+    if (nodes.Count() == 0 && fwNodes.Count() == 0 && 
+        error != KErrCancel && error != KErrAbort)
+    {    
+        if (!mContentDataForm)
         {
-            IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refresh both NSU and FOTA available");
-            MIAUpdateAnyNode *node1 = fwNodes[0];
-            MIAUpdateFwNode *fwnode = static_cast<MIAUpdateFwNode*>(node1);
-            if (fwnode->FwType() == MIAUpdateFwNode::EFotaDp2)
-            {
-                mAllNodes.Append(node1);
-            }
-            else
-            {
-                MIAUpdateAnyNode* node2 = fwNodes[1];
-                mAllNodes.Append(node2);
-            }
+            mContentDataForm  = new HbDataForm(mContent); 
         }
-    }
-    
-   
-    for(int i = 0; i < nodes.Count(); ++i) 
-    {
-        MIAUpdateAnyNode *node = nodes[i];
-        mAllNodes.Append(node);
-    }
+        QGraphicsLinearLayout *linearLayout = (QGraphicsLinearLayout*) mContent->layout();
+        linearLayout->addItem(mContentDataForm);
+        QString formText;
         
-    mListView->clear();
-    QItemSelectionModel *selectionModel = mListView->selectionModel();  
-    selectionModel->clear();
-    HbIcon icon(QString(":/icons/qgn_menu_swupdate"));
-    
-    for(int j = 0; j < mAllNodes.Count(); ++j) 
-    {
-        MIAUpdateAnyNode *node = mAllNodes[j];
-           
-        QString importanceDescription;
-        MIAUpdateNode::TUIUpdateState uiState = MIAUpdateNode::ENormal;
-        if (node->NodeType() == MIAUpdateAnyNode::ENodeTypeNormal)
+        if (error == KErrNone)
         {
-            MIAUpdateNode *updateNode = static_cast<MIAUpdateNode*>(node);
-            uiState = updateNode->UiState();
-        }
-        if (uiState == MIAUpdateNode::ENormal)
-        {
-            setImportance(node, importanceDescription);
+            formText = QString("Applications are up to date");
         }
         else
         {
-            if(uiState == MIAUpdateNode::EUpdated)
-            {
-                importanceDescription = "Updated";
-            }
-            else if(uiState == MIAUpdateNode::EFailed)
-            {
-                importanceDescription = "Failed";
-            }
-            else if(uiState == MIAUpdateNode::EDownloaded)
-            {
-                importanceDescription = "Downloaded";
-            }
+            formText = QString("Refreshing failed. Try again later.");
         }
-        
-        
-             
-        HbListWidgetItem *item = new HbListWidgetItem();    
-        QString name;
-        if (node->NodeType() == MIAUpdateAnyNode::ENodeTypeNormal)
-        {  
-            MIAUpdateNode *updateNode = static_cast<MIAUpdateNode*>(node);
-            if (updateNode->UiState() == MIAUpdateNode::EDownloading)
-            {
-                name = QString("Downloading ");
-            }
-            else if (updateNode->UiState() == MIAUpdateNode::EInstalling)
-            {
-                name = QString("Installing ");
-            }
-        }
-        name.append(XQConversions::s60DescToQString(node->Base().Name()));
-        if (node->NodeType() == MIAUpdateAnyNode::ENodeTypeFw) 
-        {
-            name.append(" DEVICE SOFTWARE");
-        }
-        item->setText(name);
-        item->setSecondaryText(importanceDescription);
-        item->setIcon(icon);
-        mListView->addItem(item); 
- 
-        if (node->Base().IsSelected())
-        {
-            int count = mListView->count();
-            QModelIndex modelIndex = mListView->model()->index(count-1,0);
-            selectionModel->select(modelIndex, QItemSelectionModel::Select);
-        }
-
+        mContentDataForm->setDescription(formText);
     }
-    connect(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
-                    this, SLOT(handleSelectionChanged(QItemSelection,QItemSelection)));     
-    
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refresh end");
+    updateSelectionInfoInDock();  
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refresh() end");
 }
 
 
@@ -237,31 +183,21 @@
 void IAUpdateMainView::handleStartUpdate()
 {
     IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleStartUpdate() begin");
-    bool firmwareUpdate = false; 
-    RPointerArray<MIAUpdateAnyNode> selectedNodes;
-    getSelectedNodes(selectedNodes);
-    if (selectedNodes.Count() > 0)
-        {
-        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.
-            firmwareUpdate = true;
-            }
-        }
-    selectedNodes.Close();
-    mEngine->StartUpdate(firmwareUpdate);
+    mEngine->StartUpdate(fotaSelected());
     IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleStartUpdate() end");
 }
 
 
 void IAUpdateMainView::handleSettings()
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleSettings() begin");
     emit toSettingView();
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleSettings() end");
 }
 
 void IAUpdateMainView::handleDisclaimer()
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleDisclaimer() begin");
     if (!mDialogUtil)
     {
         mDialogUtil = new IAUpdateDialogUtil(this);
@@ -271,22 +207,38 @@
         HbAction *primaryAction = new HbAction("OK");
         mDialogUtil->showAgreement(primaryAction);
     }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleDisclaimer() end");
 }
 
-void IAUpdateMainView::handleDetails( HbAbstractViewItem * item, const QPointF & )
+void IAUpdateMainView::handleDetails(HbAbstractViewItem * item, const QPointF &)
 {
- 
-    
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleDetails() begin");
     int ind = item->modelIndex().row();
-    if (getNode(ind) != NULL)
+    if (getApplicationNode(ind) != NULL)
     {    
-        showDetails(*getNode(ind));
+        showDetails(*getApplicationNode(ind));
     }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleDetails() end");
+}
+
+void IAUpdateMainView::handleFotaDetails(HbAbstractViewItem *, const QPointF &)
+{
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleFotaDetails begin");
+    //only one FOTA item in a list, just use it
+    for (int i = 0; i < mFwNodes.Count(); i++)
+    {
+        if (mFwNodes[i]->FwType() == MIAUpdateFwNode::EFotaDp2)
+        {
+            showDetails(*mFwNodes[i]);
+        }
+    }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleFotaDetails end");
 }
 
 
 void IAUpdateMainView::handleSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleSelectionChanged begin");
     if (!mSelectionUpdate)
     {
         bool changedItemFound = false; 
@@ -306,11 +258,38 @@
             }
         }
     }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleSelectionChanged end");
+}
+
+void IAUpdateMainView::handleFwSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
+{
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleFwSelectionChanged begin");
+    if (!mSelectionUpdate)
+    {
+        bool changedItemFound = false; 
+        QModelIndexList indexList = selected.indexes();
+        for (int i = 0; !changedItemFound && i < indexList.count(); ++i)
+        {    
+            changedItemFound = true;
+            markFotaItem(true);
+        }
+        if (!changedItemFound)
+        {
+            indexList = deselected.indexes();
+            for (int i = 0; !changedItemFound && i < indexList.count(); ++i)
+            {    
+                changedItemFound = true;
+                markFotaItem(false);
+            }
+        }
+    }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleFwSelectionChanged end");
 }
 
 
 void IAUpdateMainView::dialogFinished(HbAction *action)
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::dialogFinished begin");
     DialogState dialogState = mDialogState;
     mDialogState = NoDialog;
     
@@ -322,6 +301,7 @@
                 updateSelectionsToNodeArray(*mNode,mMark);
             }
             updateSelectionsToList();
+            updateSelectionInfoInDock();
             break;
         case CannotOmit:    
             break;
@@ -330,225 +310,264 @@
         default: 
             break;
     }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::dialogFinished end");
+}
+
+bool IAUpdateMainView::fotaSelected() const
+{
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::fotaSelected() begin");
+    bool selected = false;
+    for (int i = 0; i < mFwNodes.Count() && !selected; ++i)
+    {
+        if ( mFwNodes[i]->FwType() == MIAUpdateFwNode::EFotaDp2 && mFwNodes[i]->Base().IsSelected() )
+        {    
+            selected = true;
+        }
+    }
+    if (selected)
+        {
+        IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::fotaSelected() Fota item is selected");
+        }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::fotaSelected() end");
+    return selected;
 }
 
 
-void IAUpdateMainView::getSelectedNodes(RPointerArray<MIAUpdateAnyNode> &selectedNodes) const
-{
-    for (int i = 0; i < mAllNodes.Count(); ++i)
-    {
-        if (mAllNodes[i]->Base().IsSelected())
-        {
-            selectedNodes.Append(mAllNodes[i]);
-        }
-    }
-}
 
 void IAUpdateMainView::markListItem(bool mark, int index)
 {
+    IAUPDATE_TRACE_2("[IAUPDATE] IAUpdateMainView::markListItem() begin mark: %d index %d", mark, index);
     if (mark)
     {
         //It's Mark Command
-        RPointerArray<MIAUpdateAnyNode> selectedNodes;
-        getSelectedNodes(selectedNodes); 
+        if (fotaSelected())
+        {    
+            //FOTA item is selected, unmark FOTA item
+            //FOTA item and application update items can't be selected at the same time 
+            markFotaItem(false);
+        }    
+    }
+       
+    bool accepted = false;
         
-        //There are selected items already and type are different with the current one
-        if (selectedNodes.Count() > 0 && (mAllNodes[index]->NodeType() != selectedNodes[0]->NodeType()))
-        {       
-            // firmware item and normal sis items can't be selected at the same time
-            // unmark the selected nodes.
-            for (int i = 0; i < selectedNodes.Count(); i++)
-            {                
-                int index = mAllNodes.Find(selectedNodes[i]);
-                mAllNodes[index]->Base().SetSelected(false);
+    if(index > -1)
+    {
+        accepted = true;
+        MIAUpdateNode* node = mNodes[index];
+        RPointerArray<MIAUpdateNode> mands;
+        RPointerArray<MIAUpdateNode> deps;
+           
+        if (mark)
+        {
+            TRAPD(err,IAUpdateDepUtils::GetDependenciesL(*node, mNodes, deps));
+            if (err != KErrNone)
+            {
+                deps.Close();
+                updateSelectionsToList();
+                IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markListItem() return end");
+                return;
+            }
+            if (!getMandatoryNodes(mands))
+                {
+                // error when creating mandatory node list
+                mands.Close();
+                updateSelectionsToList();
+                IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markListItem() return end");
+                return;
+                }
+        }
+        else
+        {
+            //mandatory item is not allowed to be unmarked
+            if (mNodes[index]->Base().Importance() == MIAUpdateBaseNode::EMandatory)
+            {
+                //show dialog  
+                showUpdateCannotOmitDialog();
+                updateSelectionsToList();
+                IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markListItem() return end");
+                return;
+            }
+            TRAPD(err,IAUpdateDepUtils::GetDependantsL(*node, mNodes, deps));  
+            if (err != KErrNone)
+            {
+                deps.Close();
+                updateSelectionsToList();
+                IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markListItem() return end");
+                return;
+            }
+            // item is not allowed to be unmarked if its dependant is mandatory
+            bool mandatoryDependantFound = false;
+            for(int i = 0; i < deps.Count() && !mandatoryDependantFound; i++)
+            {
+                if (deps[i]->Base().Importance() == MIAUpdateBaseNode::EMandatory)
+                {
+                    mandatoryDependantFound = true;
+                }
+            }
+            if (mandatoryDependantFound)
+            {
+                showUpdateCannotOmitDialog();
+                deps.Close();
+                updateSelectionsToList();
+                IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markListItem() return end");
+                return;
             }
         }
-        selectedNodes.Close();
-    }
-    
-    //there is no selected items or the type is the same with the current one
-    
-    if (mAllNodes[index]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw )
-    {
-        mAllNodes[index]->Base().SetSelected(mark);   
-        updateSelectionsToList();
-        return;
-    }
-    
-    if (mAllNodes[index]->NodeType() == MIAUpdateAnyNode::ENodeTypeNormal )
-    {
-        bool accepted = false;
-        
-        if(index > -1)
+             
+        int depCount = deps.Count();
+           
+        if (depCount > 0)
         {
-            accepted = true;
-            
-            MIAUpdateNode* node = static_cast<MIAUpdateNode*>(mAllNodes[index]);
-            RPointerArray<MIAUpdateAnyNode> mands;
-            RPointerArray<MIAUpdateNode> deps;
-           
+            QString text;
+            QString names;
+            MIAUpdateNode* depNode = NULL;
+            QString separator(",");
+                       
+            for(int i = 0; i < depCount; i++)  
+            {
+                depNode = deps[i];
+                if (i > 0)
+                {
+                    names.append(separator);
+                    names.append(QString(" "));
+                }
+                names.append(XQConversions::s60DescToQString(depNode->Base().Name()));
+            }
+
             if (mark)
             {
-                TRAPD(err,IAUpdateDepUtils::GetDependenciesL(*node, mAllNodes, deps));
-                if (err != KErrNone)
+                if (depCount > 1) 
                 {
-                    deps.Close();
-                    updateSelectionsToList();
-                    return;
+                    text.append("This update needs also updates "); 
+                    text.append(names);
+                    text.append(" for working");
+                } 
+                else
+                {
+                    text.append("This update needs also \""); 
+                    text.append(names);
+                    text.append("\" for working");
+                    }
                 }
-                if (!getMandatoryNodes(mands))
+            else
+            {
+                if (depCount > 1) 
+                {
+                    text.append("Updates "); 
+                    text.append(names);
+                    text.append(" need this update for working");
+                } 
+                else
                 {
-                    // error when creating mandatory node list
-                    mands.Close();
-                    updateSelectionsToList();
-                    return;
-                }
+                    text.append("Update \""); 
+                    text.append(names);
+                    text.append("\" needs this update for working");
+                }   
+            }
+                
+            if (mark && mNodes[index]->Base().Importance() == MIAUpdateBaseNode::EMandatory)
+            {
+                // depencencies of mandatory update are also selected without showing dialog
+                accepted = true;
             }
             else
             {
-                //mandatory item is not allowed to be unmarked
-                if (mAllNodes[index]->Base().Importance() == MIAUpdateBaseNode::EMandatory)
-                {
-                    //show dialog  
-                    showUpdateCannotOmitDialog();
-                    updateSelectionsToList();
-                    return;
-                }
-                
-                //CleanupClosePushL( deps );
-                TRAPD(err,IAUpdateDepUtils::GetDependantsL(*node, mAllNodes, deps));  
-                if (err != KErrNone)
-                {
-                    deps.Close();
-                    updateSelectionsToList();
-                    return;
-                }
-                // item is not allowed to be unmarked if its dependant is mandatory
-                bool mandatoryDependantFound = false;
-                for(int i = 0; i < deps.Count() && !mandatoryDependantFound; i++)
-                {
-                    if (deps[i]->Base().Importance() == MIAUpdateBaseNode::EMandatory)
-                    {
-                        mandatoryDependantFound = true;
-                    }
-                }
-                if (mandatoryDependantFound)
-                {
-                    showUpdateCannotOmitDialog();
-                    deps.Close();
-                    updateSelectionsToList();
-                    return;
-                }
-            }
-             
-            int depCount = deps.Count();
-           
-            if (depCount > 0)
-            {
-                QString text;
-                QString names;
-                MIAUpdateNode* depNode = NULL;
-                QString separator(",");
-                       
-                for(int i = 0; i < depCount; i++)  
-                {
-                    depNode = deps[i];
-                    if (i > 0)
-                    {
-                        names.append(separator);
-                        names.append(QString(" "));
-                    }
-                    names.append(XQConversions::s60DescToQString(depNode->Base().Name()));
-                }
-                
-
-                if (mark)
-                {
-                    if (depCount > 1) 
-                    {
-                        text.append("This update needs also updates "); 
-                        text.append(names);
-                        text.append(" for working");
-                        //resourceId = R_IAUPDATE_DEPENDENCY_MARK_MANY;
-                    } 
-                    else
-                    {
-                        text.append("This update needs also \""); 
-                        text.append(names);
-                        text.append("\" for working");
-                        //resourceId = R_IAUPDATE_DEPENDENCY_MARK_ONE;    
-                    }
-                }
-                else
-                {
-                    if (depCount > 1) 
-                    {
-                        text.append("Updates "); 
-                        text.append(names);
-                        text.append(" need this update for working");
-                        //resourceId = R_IAUPDATE_DEPENDENCY_UNMARK_MANY;
-                    } 
-                    else
-                    {
-                        text.append("Update \""); 
-                        text.append(names);
-                        text.append("\" needs this update for working");
-                        //resourceId = R_IAUPDATE_DEPENDENCY_UNMARK_ONE;  
-                    }   
-                }
-                
-                if (mark && mAllNodes[index]->Base().Importance() == MIAUpdateBaseNode::EMandatory)
-                {
-                    // depencencies of mandatory update are also selected without showing dialog
-                    accepted = true;
-                }
-                else
-                {
-                    mNode = node;
-                    mMark = mark;
-                    showDependenciesFoundDialog(text);
-                    return;
-                }
-            }
-            if (accepted)
-            {    
-                updateSelectionsToNodeArray(*node, mark);   
+                mNode = node;
+                mMark = mark;
+                accepted = false;
+                showDependenciesFoundDialog(text);
             }
         }
-        
+        if (accepted)
+        {    
+            updateSelectionsToNodeArray(*node, mark);   
+        }
     }
-    updateSelectionsToList();
+    if (accepted)
+    {    
+        updateSelectionsToList();
+        updateSelectionInfoInDock();
+    }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markListItem() end");
 }       
-    
+
+
+void IAUpdateMainView::markFotaItem(bool mark)
+{
+    IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateMainView::markFotaItem() begin mark: %d", mark);
+    if (mark)
+    {
+        //It's Mark Command
+                
+        //if some of application update item(s) are selected, unmark them
+        //FOTA item and application update items can't be selected at the same time 
+        bool deselected = false;
+        for (int i = 0; i < mNodes.Count(); ++i)
+        {
+            if (mNodes[i]->Base().IsSelected())
+            {
+                mNodes[i]->Base().SetSelected(false);
+            }
+        } 
+        if (deselected)
+        {    
+            // umnmarked items to be updated also to UI
+            updateSelectionsToList();
+        }    
+    }
+    for (int j = 0; j < mFwNodes.Count(); ++j)
+    {    
+        if (mFwNodes[j]->FwType() == MIAUpdateFwNode::EFotaDp2)
+        {
+            mFwNodes[j]->Base().SetSelected(mark);
+            if (mark)
+            {
+                mFwListView->selectionModel()->select(mFwListView->model()->index(0,0),QItemSelectionModel::Select);
+            }
+            else
+            {
+                mFwListView->selectionModel()->select(mFwListView->model()->index(0,0),QItemSelectionModel::Deselect);
+            }
+        }
+    }
+    updateSelectionInfoInDock();
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markFotaItem() end");
+}
+
+
+
+
+
 void IAUpdateMainView::updateSelectionsToNodeArray(MIAUpdateNode &node, bool mark)   
-{    
+{
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::updateSelectionsToNodeArray() begin");
     RPointerArray<MIAUpdateNode> deps;  
     TInt err = KErrNone;
     if (mark)
     {
-        TRAP(err,IAUpdateDepUtils::GetDependenciesL(node, mAllNodes, deps));
+        TRAP(err,IAUpdateDepUtils::GetDependenciesL(node, mNodes, deps));
     }
     else
     {
-        TRAP(err,IAUpdateDepUtils::GetDependantsL(node, mAllNodes, deps)); 
+        TRAP(err,IAUpdateDepUtils::GetDependantsL(node, mNodes, deps)); 
     }
     if (err  == KErrNone )
     {    
         int depCount = deps.Count(); 
         for(int i = 0; i < depCount; i++)
         {
-            int depNodeInd = mAllNodes.Find(deps[i]);
-            mAllNodes[depNodeInd]->Base().SetSelected(mark);
+            int depNodeInd = mNodes.Find(deps[i]);
+            mNodes[depNodeInd]->Base().SetSelected(mark);
         }
         deps.Close();
-        int nodeInd = mAllNodes.Find(&node);
-        mAllNodes[nodeInd]->Base().SetSelected(mark);
+        int nodeInd = mNodes.Find(&node);
+        mNodes[nodeInd]->Base().SetSelected(mark);
     }                
     
     //mark all of the mandatory items
     if ( mark )
     {    
-        RPointerArray<MIAUpdateAnyNode> mands;    
+        RPointerArray<MIAUpdateNode> mands;    
         if (getMandatoryNodes(mands))
         {
             int mandCount = mands.Count();
@@ -556,14 +575,14 @@
             {
                 for(int i = 0; i < mandCount; i++)
                 {
-                    int mandNodeInd = mAllNodes.Find(mands[i]);
-                    mAllNodes[mandNodeInd]->Base().SetSelected(mark);
-                    if (mAllNodes[mandNodeInd]->NodeType() == MIAUpdateAnyNode::ENodeTypeNormal)
+                    int mandNodeInd = mNodes.Find(mands[i]);
+                    mNodes[mandNodeInd]->Base().SetSelected(mark);
+                    if (mNodes[mandNodeInd]->NodeType() == MIAUpdateAnyNode::ENodeTypeNormal)
                     {
                         // mark also all dependencies of a mandatory item
-                        MIAUpdateNode* dependencyNode = static_cast<MIAUpdateNode*>(mAllNodes[mandNodeInd]);
+                        MIAUpdateNode* dependencyNode = mNodes[mandNodeInd];
                         RPointerArray<MIAUpdateNode> dependencies;
-                        TRAPD(err,IAUpdateDepUtils::GetDependenciesL(*dependencyNode, mAllNodes, dependencies));
+                        TRAPD(err,IAUpdateDepUtils::GetDependenciesL(*dependencyNode, mNodes, dependencies));
                         if (err)
                         {
                             dependencies.Close(); 
@@ -572,8 +591,8 @@
                         }
                         for(int j = 0; j < dependencies.Count(); j++)
                         {
-                            int depNodeInd = mAllNodes.Find(dependencies[j]);
-                            mAllNodes[depNodeInd]->Base().SetSelected(true);
+                            int depNodeInd = mNodes.Find(dependencies[j]);
+                            mNodes[depNodeInd]->Base().SetSelected(true);
                         }
                         dependencies.Close();
                     }
@@ -581,28 +600,32 @@
             }
         }
         mands.Close();
-    }  
+    }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::updateSelectionsToNodeArray() end");
 }
 
 
-bool IAUpdateMainView::getMandatoryNodes(RPointerArray<MIAUpdateAnyNode> &mandNodes) const
+bool IAUpdateMainView::getMandatoryNodes(RPointerArray<MIAUpdateNode> &mandNodes) const
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::getMandatoryNodes() begin");
     bool ret = true;
-    for(int i = 0; i < mAllNodes.Count(); ++i)
+    for(int i = 0; i < mNodes.Count(); ++i)
     {
-        if (mAllNodes[i]->Base().Importance() == MIAUpdateBaseNode::EMandatory)
+        if (mNodes[i]->Base().Importance() == MIAUpdateBaseNode::EMandatory)
         {
-            if (mandNodes.Append(mAllNodes[i]) != KErrNone)
+            if (mandNodes.Append(mNodes[i]) != KErrNone)
             {
                 ret = false; 
             }
         }
     }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::getMandatoryNodes() end");
     return ret;
 }
 
 void IAUpdateMainView::showUpdateCannotOmitDialog()
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::showUpdateCannotOmitDialog() begin");
     HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeInformation);
     messageBox->setText(QString("This required update cannot be omitted"));
     int actionCount = messageBox->actions().count();
@@ -617,10 +640,12 @@
     messageBox->setAttribute(Qt::WA_DeleteOnClose);
     mDialogState = CannotOmit;
     messageBox->open(this, SLOT(dialogFinished(HbAction*)));
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::showUpdateCannotOmitDialog() end");
 }
 
 void IAUpdateMainView::showDependenciesFoundDialog(QString &text)
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::showDependenciesFoundDialog() begin");
     HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
     HbLabel *label = new HbLabel(messageBox);
     label->setHtml(QString("Depencencies"));
@@ -643,17 +668,19 @@
     messageBox->setAttribute(Qt::WA_DeleteOnClose);
     mDialogState = Dependencies;
     messageBox->open(this, SLOT(dialogFinished(HbAction*)));
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::showDependenciesFoundDialog() end");
 }
 
 void IAUpdateMainView::updateSelectionsToList()
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::updateSelectionsToList() begin");
     mSelectionUpdate = true;
-    for(int i = 0; i < mAllNodes.Count(); ++i)
+    for(int i = 0; i < mNodes.Count(); ++i)
     {
-        if ( mAllNodes[i]->Base().IsSelected() != mListView->selectionModel()->isSelected(mListView->model()->index(i,0)))
+        if ( mNodes[i]->Base().IsSelected() != mListView->selectionModel()->isSelected(mListView->model()->index(i,0)))
         {    
             QItemSelectionModel::SelectionFlag selectionFlag;
-            if ( mAllNodes[i]->Base().IsSelected())
+            if ( mNodes[i]->Base().IsSelected())
             {
                 selectionFlag = QItemSelectionModel::Select;
             }
@@ -665,22 +692,26 @@
         }
     }
     mSelectionUpdate = false;
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::updateSelectionsToList() end");
 }
 
 
-MIAUpdateAnyNode* IAUpdateMainView::getNode(int index) const
+MIAUpdateNode* IAUpdateMainView::getApplicationNode(int index) const
 {
-    MIAUpdateAnyNode *currentNode = NULL;
+    IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateMainView::getApplicationNode() begin index: %d", index);
+    MIAUpdateNode *currentNode = NULL;
      
-    if (index >= 0 && index < mAllNodes.Count())
+    if (index >= 0 && index < mNodes.Count())
     {
-        currentNode = mAllNodes[index];
+        currentNode = mNodes[index];
     }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::getApplicationNode() end");
     return currentNode;
 }
                 
 void IAUpdateMainView::showDetails(MIAUpdateAnyNode& node)
 {  
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::showDetails() begin");
     HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeInformation);
     HbLabel *label = new HbLabel(messageBox);
     label->setHtml(QString("Details"));
@@ -694,13 +725,14 @@
     messageBox->setTimeout(HbPopup::NoTimeout);
     messageBox->setAttribute(Qt::WA_DeleteOnClose);
     mDialogState = Details;
-    messageBox->open(this, SLOT(dialogFinished(HbAction*)));                
+    messageBox->open(this, SLOT(dialogFinished(HbAction*)));    
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::showDetails() end");
 }                
         
 
 void IAUpdateMainView::constructDetailsText(MIAUpdateAnyNode &node, QString &text)
 {
-    
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::constructDetailsText() begin");
     text.append(QString("Name:"));
     text.append(QString("<br />"));
     QString name = XQConversions::s60DescToQString(node.Base().Name());
@@ -763,10 +795,12 @@
         fileSizeText(contentSize, textFileSize);
         text.append(textFileSize);
     }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::constructDetailsText() end");
 }
 
 void IAUpdateMainView::versionText(const TIAUpdateVersion &version, QString &versionText)
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::versionText() begin");
     QString stringMajor;
     stringMajor.setNum(version.iMajor);
     versionText.append(stringMajor);
@@ -779,10 +813,12 @@
     stringBuild.setNum(version.iBuild);
     versionText.append(stringBuild);
     versionText.append(QString(")"));
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::versionText() end");
 }
 
 void IAUpdateMainView::fileSizeText(int fileSize, QString &text)
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::fileSizeText() begin");
     int size = 0;
     QString stringUnit;
     
@@ -806,10 +842,12 @@
         }
     text.setNum(size);
     text.append(stringUnit); 
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::fileSizeText() end");
 }
 
 void IAUpdateMainView::setImportance(MIAUpdateAnyNode *node, QString &importanceDescription)
 {
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::setImportance() begin");
     int sizeInBytes = node->Base().ContentSizeL();
     int size = 0;
     bool shownInMegabytes = false;        
@@ -915,5 +953,232 @@
             break;
         }
     }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::setImportance() end");
 }    
 
+void IAUpdateMainView::removeCurrentContentLayout()
+{
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::removeCurrentContentLayout() begin");
+    int itemCount = mContent->layout()->count();
+    for (int i = 0; i < itemCount; i++)    
+    {
+        mContent->layout()->removeAt(i);
+    }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::removeCurrentContentLayout() end");    
+}
+
+void IAUpdateMainView::refreshFirmwareUpdates(const RPointerArray<MIAUpdateFwNode> &fwNodes)
+{
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshFirmwareUpdates() begin");
+    mFwNodes.Reset();
+            
+    for (int i = 0; i < fwNodes.Count(); i++)
+    {
+        MIAUpdateFwNode *fwnode = (fwNodes[i]);
+        mFwNodes.Append(fwnode);
+        fwnode->Base().SetImportance(MIAUpdateBaseNode::ECritical);
+        if (fwnode->FwType() == MIAUpdateFwNode::EFotaDp2)
+        {
+            refreshFotaUpdate(*fwnode );
+        }
+        else if (fwNodes.Count() == 1 && fwnode->FwType() == MIAUpdateFwNode::EFotiNsu)
+        {
+            refreshNsuUpdate();
+        }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshFirmwareUpdates() end");    
+    }    
+}
+
+void IAUpdateMainView::refreshFotaUpdate(MIAUpdateFwNode& fwNode)
+{
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshFotaUpdate() begin");
+    if (!mFwListView)
+    {
+        mFwListView  = new HbListWidget(mContent);
+        mFwListView->setSelectionMode( HbAbstractItemView::MultiSelection );
+        connect( mFwListView, SIGNAL( longPressed( HbAbstractViewItem *, const QPointF & ) ),
+        this, SLOT( handleFotaDetails( HbAbstractViewItem *, const QPointF & ) ) ); 
+        mFwListView->listItemPrototype()->setGraphicsSize(HbListViewItem::LargeIcon);   
+        mFwListView->listItemPrototype()->setStretchingStyle(HbListViewItem::NoStretching);
+        connect(mFwListView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+        this, SLOT(handleFwSelectionChanged(QItemSelection,QItemSelection)));     
+    }
+    QGraphicsLinearLayout *linearLayout = (QGraphicsLinearLayout*) mContent->layout();
+    linearLayout->addItem(mFwListView);
+    mFwListView->clear();
+    QItemSelectionModel *selectionModel = mFwListView->selectionModel();  
+    selectionModel->clear();
+    HbListWidgetItem *fwItem = new HbListWidgetItem();
+    QString name(XQConversions::s60DescToQString(fwNode.Base().Name()));
+    name.append(" DEVICE SOFTWARE");
+    fwItem->setText(name);
+    QString importanceDescription;
+    setImportance(&fwNode, importanceDescription);
+    fwItem->setSecondaryText(importanceDescription);
+    HbIcon icon(QString(":/icons/qgn_menu_swupdate"));
+    fwItem->setIcon(icon);
+    if (fwNode.Base().IsSelected())
+    {
+        QModelIndex modelIndex = mFwListView->model()->index(0,0);
+        selectionModel->select(modelIndex, QItemSelectionModel::Select);
+    }
+    mFwListView->addItem(fwItem); 
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshFotaUpdate() end");
+}
+
+void IAUpdateMainView::refreshNsuUpdate()
+{
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshNsuUpdate() begin");
+    if (!mFwNSUGroupBox)
+    {
+        mFwNSUGroupBox = new HbGroupBox(mContent);
+        mFwNSUGroupBox->setHeading("Device software available");
+        HbDataForm *dataForm  = new HbDataForm(mFwNSUGroupBox); 
+        mFwNSUGroupBox->setContentWidget(dataForm);
+        dataForm->setDescription("Use your PC to update the device software ([version %L]) from address www.nokia.com/softwareupdate");
+    }
+    QGraphicsLinearLayout *linearLayout = (QGraphicsLinearLayout*) mContent->layout();
+    linearLayout->addItem(mFwNSUGroupBox);
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshNsuUpdate() end");
+}
+
+void IAUpdateMainView::refreshApplicationUpdates(const RPointerArray<MIAUpdateNode> &nodes)
+{
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshApplicationUpdates() begin");
+    if (nodes.Count() > 0)
+    {
+        if (!mApplicationUpdatesGroupBox)
+        {
+            mApplicationUpdatesGroupBox = new HbGroupBox(mContent);
+            mApplicationUpdatesGroupBox->setHeading("Application updates");
+        }
+        QGraphicsLinearLayout *linearLayout = (QGraphicsLinearLayout*) mContent->layout();
+        linearLayout->addItem(mApplicationUpdatesGroupBox);
+        linearLayout->addItem(mListView);
+    }
+    mListView->clear();
+    QItemSelectionModel *selectionModel = mListView->selectionModel();  
+    selectionModel->clear();
+    HbIcon icon(QString(":/icons/qgn_menu_swupdate"));
+    mNodes.Reset();
+    for(int i = 0; i < nodes.Count(); ++i) 
+    {
+        MIAUpdateNode *node = nodes[i];
+        mNodes.Append(node);
+        QString importanceDescription;
+        MIAUpdateNode::TUIUpdateState uiState = node->UiState();
+        if (uiState == MIAUpdateNode::ENormal)
+        {
+            setImportance(node, importanceDescription);
+        }
+        else if (uiState == MIAUpdateNode::EUpdated)
+        {
+            importanceDescription = "Updated";
+        }
+        else if (uiState == MIAUpdateNode::EFailed)
+        {
+            importanceDescription = "Failed";
+        }
+        else if (uiState == MIAUpdateNode::EDownloaded)
+        {
+            importanceDescription = "Downloaded";
+        }
+        HbListWidgetItem *item = new HbListWidgetItem();    
+        QString name;
+        if (uiState == MIAUpdateNode::EDownloading)
+        {
+            name = QString("Downloading ");
+        }
+        else if (uiState == MIAUpdateNode::EInstalling)
+        {
+            name = QString("Installing ");
+        }
+        name.append(XQConversions::s60DescToQString(node->Base().Name()));
+        item->setText(name);
+        item->setSecondaryText(importanceDescription);
+        item->setIcon(icon);
+        mListView->addItem(item); 
+         
+        if (node->Base().IsSelected())
+        {
+            int count = mListView->count();
+            QModelIndex modelIndex = mListView->model()->index(count-1,0);
+            selectionModel->select(modelIndex, QItemSelectionModel::Select);
+        }
+    }
+    if (!mSelectionConnect)
+    {    
+        mSelectionConnect = connect(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+                        this, SLOT(handleSelectionChanged(QItemSelection,QItemSelection)));     
+    }
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshApplicationUpdates() end");
+}
+
+void IAUpdateMainView::updateSelectionInfoInDock()
+{
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::updateSelectionInfoInDock() begin");
+    int countOfSelectedItems = 0;
+    int countOfAllItems = 0;
+    int selectedSizeInBytes = 0;
+    for (int i = 0; i < mFwNodes.Count(); ++i)
+    {
+        if (mFwNodes[i]->FwType() == MIAUpdateFwNode::EFotaDp2)
+        {
+            countOfAllItems++;
+            if (mFwNodes[i]->Base().IsSelected())
+            {
+                countOfSelectedItems++;
+                selectedSizeInBytes += mFwNodes[i]->Base().ContentSizeL();
+            }
+        }
+    } 
+    countOfAllItems += mNodes.Count();
+    for (int j = 0; j < mNodes.Count(); ++j)
+    {    
+        if (mNodes[j]->Base().IsSelected())
+        {
+            countOfSelectedItems++;
+            selectedSizeInBytes += mNodes[j]->Base().ContentSizeL();
+        }
+    }    
+    
+    int selectedSize = 0;
+    QString unit;
+    if (selectedSizeInBytes >= KMaxShownInKiloBytes)
+    {
+        unit = "MB";
+        selectedSize = selectedSizeInBytes / KMegaByte;
+        if (selectedSizeInBytes % KMegaByte != 0)
+        {
+            selectedSize++;
+        }
+    }
+    else 
+    {
+        unit = "kB";
+        selectedSize = selectedSizeInBytes / KKiloByte;
+        if (selectedSizeInBytes % KKiloByte != 0)
+        {
+            selectedSize++;
+        }
+    }
+    QString selectionString; 
+    selectionString.append("Selected ");
+    QString numText;
+    numText.setNum(countOfSelectedItems);
+    selectionString.append(numText);
+    selectionString.append("/");
+    numText.setNum(countOfAllItems);
+    selectionString.append(numText);
+    if (selectedSize > 0)
+    {
+        selectionString.append(" (");
+        numText.setNum(selectedSize);
+        selectionString.append(numText);
+        selectionString.append(" ");
+        selectionString.append(unit);
+        selectionString.append(")");
+    }
+    mSelections->setHeading(selectionString);
+    IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::updateSelectionInfoInDock() end");
+}