homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallappsstate.cpp
changeset 77 4b195f3bea29
parent 61 2b1b11a301d2
child 85 35368b604b28
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallappsstate.cpp	Tue Jul 06 14:06:53 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallappsstate.cpp	Wed Aug 18 09:40:07 2010 +0300
@@ -15,30 +15,29 @@
  *
  */
 
-#include <qstatemachine.h>
-#include <hbview.h>
-#include <hblistview.h>
-#include <hbaction.h>
-#include <hbmenu.h>
-#include <hbabstractviewitem.h>
-#include <hsmenueventfactory.h>
-#include <hbinstance.h>
+#include <QStateMachine>
+#include <HbMenu>
+#include <HbAction>
+#include <HbAbstractViewItem>
+#include <HbIndexFeedback>
+#include <HbListView>
+#include <HbScrollBar>
+#include <HbView>
+
+#include <cadefs.h>
 #include <caentry.h>
-#include <hbsearchpanel.h>
-#include <HbScrollBar>
-#include <HbIndexFeedback>
+#include <caitemmodel.h>
+#include <caservice.h>
 
+#include "hsapp_defs.h"
+#include "hsmenueventfactory.h"
 #include "hsmenuitemmodel.h"
-#include "cadefs.h"
 #include "hsallappsstate.h"
-#include "hsaddappstocollectionstate.h"
-#include "hsapp_defs.h"
 #include "hsmenumodewrapper.h"
 #include "hsmenuviewbuilder.h"
-#include "hsmenumodetransition.h"
-#include "caentry.h"
-#include "caservice.h"
 #include "hsmainwindow.h"
+#include "hsaddmodeproxymodel.h"
+#include "hsapplibstateutils.h"
 
 /*!
  \class HsAllAppsState
@@ -55,40 +54,24 @@
  */
 
 /*!
- \var HsAllAppsState::mCollectionsSortAttribute
- Collections sort order
- */
-
-/*!
- \var HsAllAppsState::mMenuView
- Wrapper for All Applications View.
- */
-
-/*!
- \var HsAllAppsState::mMenuMode
- Menu view mode wrapper.
- Not Own.
- */
-
-/*!
  Constructor.
  \param menuViewBuilder Menu view builder.
- \param menuMode reference to object representing menu mode (add mode on/add mode off).
+ \param menuMode Menu mode object(add mode on/add mode off).
+ \param mainWindow Main window wrapper.
  \param parent Owner.
  */
 HsAllAppsState::HsAllAppsState(HsMenuViewBuilder &menuViewBuilder,
                                HsMenuModeWrapper &menuMode,
                                HsMainWindow &mainWindow,
                                QState *parent) :
-    HsBaseViewState(parent), mSortAttribute(AscendingNameHsSortAttribute),
-    mCollectionsSortAttribute(LatestOnTopHsSortAttribute),
-    mMenuView(menuViewBuilder, HsAllAppsContext),
-    mMenuMode(menuMode),
-    mAllAppsModel(0),
-    mMainWindow(mainWindow),
-    mContextModelIndex(), mContextMenu(0)
+    HsBaseViewState(mainWindow, menuMode, parent),
+    mAddModeProxyModel(0),
+    mSortAttribute(AscendingNameHsSortAttribute)
 {
+    initialize(menuViewBuilder, HsAllAppsContext);
     construct();
+	mAddModeProxyModel = new HsAddModeProxyModel(this);
+    mAddModeProxyModel->setSourceModel(mModel);
 }
 
 /*!
@@ -98,64 +81,46 @@
 {
     HSMENUTEST_FUNC_ENTRY("HsAllAppsState::construct");
 
-    QState *initialState = new QState(this);
-    setInitialState(initialState);
-
-    QState *addModeState = new QState(this);
-    connect(addModeState, SIGNAL(entered()),SLOT(addModeEntered()));
-
-    QState *normalModeState = new QState(this);
-    connect(normalModeState, SIGNAL(entered()),SLOT(normalModeEntered()));
-
-    initialState->addTransition(new HsMenuModeTransition(
-                                    mMenuMode, NormalHsMenuMode, normalModeState));
-    initialState->addTransition(new HsMenuModeTransition(
-                                    mMenuMode, AddHsMenuMode, addModeState));
+    defineTransitions();
 
     const QString parentName =
         parent() != 0 ? parent()->objectName() : QString("");
     setObjectName(parentName + "/allappsstate");
 
-    connect(this, SIGNAL(entered()),SLOT(stateEntered()));
-    connect(this, SIGNAL(exited()),SLOT(stateExited()));
+    connect(mBackKeyAction, SIGNAL(triggered()), SIGNAL(toAppLibraryState()));
 
-    mSecondarySoftkeyAction = new HbAction(Hb::BackNaviAction, this);
-
-    mMenuView.view()->setNavigationAction(
-        mSecondarySoftkeyAction);
+    mModel = HsMenuService::getAllApplicationsModel(mSortAttribute);
+    mMenuView->setModel(mModel);
 
-    connect(mSecondarySoftkeyAction, SIGNAL(triggered()),
-            SIGNAL(toAppLibraryState()));
+    mModel->preloadIcons();
 
-    mAllAppsModel = HsMenuService::getAllApplicationsModel(mSortAttribute);
-    mMenuView.setModel(mAllAppsModel);
-
-    mMenuView.listView()->verticalScrollBar()->setInteractive(true);
-    HbIndexFeedback *indexFeedback = new HbIndexFeedback(mMenuView.view());
+    mMenuView->listView()->verticalScrollBar()->setInteractive(true);
+    HbIndexFeedback *indexFeedback = new HbIndexFeedback(mMenuView->view());
     indexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter);
-    indexFeedback->setItemView(mMenuView.listView());
+    indexFeedback->setItemView(mMenuView->listView());
 
     HSMENUTEST_FUNC_EXIT("HsAllAppsState::construct");
 }
 
+
 /*!
  Creates and installs menu options for the view
  */
 void HsAllAppsState::setMenuOptions()
 {
     HSMENUTEST_FUNC_ENTRY("HsAllAppsState::setMenuOptions");
-    QScopedPointer<HbMenu> viewOptions(new HbMenu);
-    viewOptions->addAction(hbTrId("txt_applib_opt_task_switcher"),
-                           this, SLOT(openTaskSwitcher()));
-    viewOptions->addAction(hbTrId("txt_applib_opt_add_to_collection"),
+    mViewOptions->clearActions();
+    mViewOptions->addAction(hbTrId("txt_applib_opt_task_switcher"),
+                           static_cast<HsBaseViewState*>(this), SLOT(openTaskSwitcher()));
+    mViewOptions->addAction(hbTrId("txt_applib_opt_add_to_collection"),
                            this, SLOT(addToCollection()));
-    viewOptions->addAction(hbTrId("txt_applib_opt_check_software_updates"),
-                           this, SLOT(checkSoftwareUpdates()));
+    mViewOptions->addAction(hbTrId("txt_applib_opt_check_software_updates"),
+                           static_cast<HsBaseViewState*>(this), SLOT(checkSoftwareUpdates()));
 
-    HbMenu *const sortMenu = viewOptions->addMenu(hbTrId(
+    HbMenu *const sortMenu = mViewOptions->addMenu(hbTrId(
                                  "txt_applib_opt_sort_by"));
     //Grouped options are exclusive by default.
-    QActionGroup *sortGroup = new QActionGroup(viewOptions.data());
+    QActionGroup *sortGroup = new QActionGroup(this);
 
     sortGroup->addAction(
         sortMenu->addAction(hbTrId("txt_applib_opt_sub_ascending"),
@@ -164,7 +129,7 @@
         sortMenu->addAction(hbTrId("txt_applib_opt_sub_descending"),
                             this, SLOT(descendingMenuAction())));
 
-    viewOptions->addAction(hbTrId("txt_applib_subtitle_installed"),
+    mViewOptions->addAction(hbTrId("txt_applib_opt_view_installed_applications"),
                            this, SLOT(openInstalledView()));
 
     foreach(QAction *action, sortMenu->actions()) {
@@ -184,7 +149,6 @@
     if (currentSortingPosition >= 0) {
         sortGroup->actions().at(currentSortingPosition)->setChecked(true);
     }
-    mMenuView.view()->setMenu(viewOptions.take());
 
     HSMENUTEST_FUNC_EXIT("HsAllAppsState::setMenuOptions");
 }
@@ -195,63 +159,32 @@
 
 HsAllAppsState::~HsAllAppsState()
 {
-    mMenuView.setModel(NULL);
-    delete mAllAppsModel;
 }
 
-/*!
- Scrolls view to first item at top
- */
-void HsAllAppsState::scrollToBeginning()
-{
-    mMenuView.listView()->scrollTo(
-        mAllAppsModel->index(0), HbAbstractItemView::PositionAtTop);
-}
 
 /*!
- Slot invoked when a state is entered.
+ Slot invoked when normal mode entered.
  */
-
-
-void HsAllAppsState::stateEntered()
+void HsAllAppsState::normalModeEntered()
 {
-    qDebug("AllAppsState::stateEntered()");
-    HSMENUTEST_FUNC_ENTRY("HsAllAppsState::stateEntered");
-    
-    mMainWindow.setCurrentView(mMenuView);
-    mMenuView.activate();
-
-    HSMENUTEST_FUNC_EXIT("HsAllAppsState::stateEntered");
+    HsBaseViewState::normalModeEntered();
+    if (mMenuView->model() != mModel) {
+        mMenuView->setModel(mModel);
+    }
+    connect(mMenuView.data(),
+            SIGNAL(activated(QModelIndex)),
+            static_cast<HsBaseViewState*>(this), SLOT(launchItem(QModelIndex)));
 }
 
 /*!
  Slot invoked when add mode entered.
  */
-void HsAllAppsState::normalModeEntered()
-{    
-    setMenuOptions();
-    connect(&mMainWindow, SIGNAL(viewIsReady()),
-        &mMainWindow, SLOT(saveActivity()),
-        Qt::UniqueConnection);
-    connect(&mMenuView,
-            SIGNAL(activated(QModelIndex)),
-            SLOT(listItemActivated(QModelIndex)));
-    connect(&mMenuView,
-            SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
-            SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF)));
-}
-
-/*!
- Add mode entered.
- */
 void HsAllAppsState::addModeEntered()
 {
-    connect(&mMenuView,
-            SIGNAL(activated(QModelIndex)),
-            SLOT(addActivated(QModelIndex)));
-    connect(&mMenuView,
-            SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
-            SLOT(addLongPressed(HbAbstractViewItem *, QPointF)));
+    HsBaseViewState::addModeEntered();
+    if (mMenuView->model() != mAddModeProxyModel) {
+        mMenuView->setModel(mAddModeProxyModel);
+    }
 }
 
 /*!
@@ -261,161 +194,31 @@
 {
     HSMENUTEST_FUNC_ENTRY("HsAllAppsState::stateExited");
 
-    disconnect(&mMainWindow, SIGNAL(viewIsReady()),
-               &mMainWindow, SLOT(saveActivity()));
-       
-    mMenuView.setSearchPanelVisible(false);
-
-    mMenuView.disconnect(this);
+    HsBaseViewState::stateExited();
 
-    mMenuView.view()->setMenu(NULL);
-
-    mMenuView.inactivate();
-
-    if (mContextMenu)
-        mContextMenu->close();
-
-    HsBaseViewState::stateExited();
-    
     HSMENUTEST_FUNC_EXIT("HsAllAppsState::stateExited");
     qDebug("AllAppsState::stateExited()");
 }
 
 /*!
- Open task switcher.
- \retval true if operation is successful.
- */
-bool HsAllAppsState::openTaskSwitcher()
-{
-    return HsMenuService::launchTaskSwitcher();
-}
-
-/*!
- Check software updates.
- \retval 0 if operation is successful.
- */
-int HsAllAppsState::checkSoftwareUpdates()
-{
-    int errCode = HsMenuService::launchSoftwareUpdate();
-    if (errCode != 0){
-        createApplicationLaunchFailMessage(errCode,0);
-    }
-    return errCode;
-}
-
-/*!
- Slot connected to List widget in normal mode.
- \param index Model index of the activated item.
- */
-void HsAllAppsState::listItemActivated(const QModelIndex &index)
-{
-    HSMENUTEST_FUNC_ENTRY("HsAllAppsState::listItemActivated");
-
-    QSharedPointer<const CaEntry> entry = mAllAppsModel->entry(index);
-    
-    if (entry->entryTypeName() == widgetTypeName()) {
-        EntryFlags flags = index.data(CaItemModel::FlagsRole).value<
-                               EntryFlags> ();
-        if (!(flags & UninstallEntryFlag)) {
-            machine()->postEvent(
-                HsMenuEventFactory::createPreviewHSWidgetEvent(
-                    entry->id(), entry->entryTypeName(), entry->attribute(
-                        widgetUriAttributeName()), entry->attribute(
-                        widgetLibraryAttributeName())));
-
-            const int itemId = index.data(CaItemModel::IdRole).toInt();
-            HsMenuService::touch(itemId);
-        }
-    } else {
-        QVariant data = mAllAppsModel->data(index, CaItemModel::IdRole);
-        int errCode = HsMenuService::executeAction(data.toInt());
-        if (errCode != 0) {
-            createApplicationLaunchFailMessage(errCode,index.data(CaItemModel::IdRole).toInt());
-        }
-    }
-    
-    mMenuView.setSearchPanelVisible(false);
-
-    HSMENUTEST_FUNC_EXIT("HsAllAppsState::listItemActivated");
-}
-
-/*!
  Slot connected to List widget in add mode.
  \param index Model index of the activated item.
  */
 void HsAllAppsState::addActivated(const QModelIndex &index)
 {
+    mMenuView->disconnect(this);
     HSMENUTEST_FUNC_ENTRY("HsAllAppsState::addActivated");
     addToHomeScreen(index);
     HSMENUTEST_FUNC_EXIT("HsAllAppsState::addActivated");
 }
 
-/*!
- Handles long-item-pressed event in all apps view by showing context menu
- \param item View item
- \param coords Press point coordinates
- */
-void HsAllAppsState::listItemLongPressed(HbAbstractViewItem *item,
-        const QPointF &coords)
-{
-    HSMENUTEST_FUNC_ENTRY("HsAllAppsState::listItemLongPressed");
-
-    EntryFlags flags = item->modelIndex().data(
-                           CaItemModel::FlagsRole).value<EntryFlags> ();
-
-    if (!(flags & UninstallEntryFlag)) {
-        // create context menu
-        mContextMenu = new HbMenu;
-
-        HbAction *addToHomeScreenAction = mContextMenu->addAction(
-            hbTrId("txt_applib_menu_add_to_home_screen"));
-        addToHomeScreenAction->setData(AddToHomeScreenContextAction);
-
-        HbAction *addToCollectionAction = mContextMenu->addAction(
-            hbTrId("txt_applib_menu_add_to_collection"));
-        addToCollectionAction->setData(AddToCollectionContextAction);
-
-        HbAction *uninstallAction = mContextMenu->addAction(
-            hbTrId("txt_common_menu_delete"));
-        uninstallAction->setData(UninstallContextAction);
-        HbAction *appSettingsAction(NULL);
-        HbAction *appDetailsAction(NULL);
-
-        // check conditions and hide irrelevant menu items
-        QSharedPointer<const CaEntry> entry = mAllAppsModel->entry(item->modelIndex());
-
-        if (!(entry->attribute(appSettingsPlugin()).isEmpty())) {
-            appSettingsAction = mContextMenu->addAction(
-                hbTrId("txt_common_menu_settings"));
-            appSettingsAction->setData(AppSettingContextAction);
-        }
-        if (!(entry->attribute(componentIdAttributeName()).isEmpty()) &&
-                (flags & RemovableEntryFlag) ) {
-            appDetailsAction = mContextMenu->addAction(
-                hbTrId("txt_common_menu_details"));
-            appDetailsAction->setData(AppDetailsContextAction);
-        }
-
-        if (!(flags & RemovableEntryFlag)) {
-            uninstallAction->setVisible(false);
-        }
-
-        mContextModelIndex = item->modelIndex();
-        mContextMenu->setPreferredPos(coords);
-        mContextMenu->setAttribute(Qt::WA_DeleteOnClose);
-        mContextMenu->open(this, SLOT(contextMenuAction(HbAction*)));
-    }
-
-
-    HSMENUTEST_FUNC_EXIT("HsAllAppsState::listItemLongPressed");
-}
 
 /*!
  Handles context menu actions
  */
 void HsAllAppsState::contextMenuAction(HbAction *action)
 {
-    HsContextAction command = 
+    HsContextAction command =
         static_cast<HsContextAction>(action->data().toInt());
 
     const int itemId = mContextModelIndex.data(CaItemModel::IdRole).toInt();
@@ -429,25 +232,27 @@
             // an existing collection via item specific menu.
             machine()->postEvent(
                 HsMenuEventFactory::createAddAppsFromApplicationsViewEvent(
-                    mSortAttribute, mCollectionsSortAttribute, itemId));
+                    mSortAttribute, itemId));
             break;
         case UninstallContextAction:
             machine()->postEvent(
                 HsMenuEventFactory::createUninstallApplicationEvent(itemId));
             break;
-        case AppSettingContextAction: 
+        case AppSettingContextAction:
             machine()->postEvent(
                 HsMenuEventFactory::createAppSettingsViewEvent(itemId));
             break;
-        case AppDetailsContextAction: 
+        case AppDetailsContextAction:
             machine()->postEvent(
                 HsMenuEventFactory::createAppDetailsViewEvent(itemId));
-            break;            
+            break;
+        case OpenContextAction:
+            launchItem(mContextModelIndex);
+            break;
         default:
             break;
     }
-                                    
-    mMenuView.setSearchPanelVisible(false);
+    mMenuView->hideSearchPanel();
 }
 
 /*!
@@ -460,6 +265,7 @@
                                     const QPointF &coords)
 {
     Q_UNUSED(coords);
+    mMenuView->disconnect(this);
     HSMENUTEST_FUNC_ENTRY("HsAllAppsState::addLongPressed");
     addToHomeScreen(item->modelIndex());
     HSMENUTEST_FUNC_EXIT("HsAllAppsState::addLongPressed");
@@ -475,7 +281,7 @@
     // a new/an existing collection via the All view
     machine()->postEvent(
         HsMenuEventFactory::createAddAppsFromApplicationsViewEvent(
-            mSortAttribute, mCollectionsSortAttribute));
+            mSortAttribute));
 }
 
 /*!
@@ -495,50 +301,86 @@
 
 /*!
  Triggers event so that a state adding to Home Screen is reached
- \param index of an item to be added to homescreen
+ \param index of an item to be added to homescreen.
  \retval void
  */
 void HsAllAppsState::addToHomeScreen(const QModelIndex &index)
 {
     HSMENUTEST_FUNC_ENTRY("HsAllAppsState::addToHomeScreen");
-    QSharedPointer<const CaEntry> entry = mAllAppsModel->entry(index);
+    QSharedPointer<const CaEntry> entry = mModel->entry(index);
 
     machine()-> postEvent(HsMenuEventFactory::createAddToHomeScreenEvent(
-                              entry->id(), mMenuMode.getHsMenuMode(), 
-                              mMenuMode.getHsToken()));
+                              entry->id(), mMenuMode->getHsMenuMode(),
+                              mMenuMode->getHsToken()));
 
     HSMENUTEST_FUNC_EXIT("HsAllAppsState::addToHomeScreen");
 }
 
 /*!
+ Method seting context menu options.
+ */
+void HsAllAppsState::setContextMenuOptions(HbAbstractViewItem *item, EntryFlags flags)
+{
+    HbAction *openAction = mContextMenu->addAction(hbTrId(
+        "txt_common_menu_open"));
+    openAction->setData(OpenContextAction);
+
+    HbAction *addToHomeScreenAction = mContextMenu->addAction(
+        hbTrId("txt_applib_menu_add_to_home_screen"));
+    addToHomeScreenAction->setData(AddToHomeScreenContextAction);
+
+    HbAction *addToCollectionAction = mContextMenu->addAction(
+        hbTrId("txt_applib_menu_add_to_collection"));
+    addToCollectionAction->setData(AddToCollectionContextAction);
+
+    HbAction *uninstallAction = mContextMenu->addAction(
+        hbTrId("txt_common_menu_delete"));
+    uninstallAction->setData(UninstallContextAction);
+    HbAction *appSettingsAction(NULL);
+    HbAction *appDetailsAction(NULL);
+
+    // check conditions and hide irrelevant menu items
+    QSharedPointer<const CaEntry> entry = mModel->entry(item->modelIndex());
+
+    if (!(entry->attribute(appSettingsPlugin()).isEmpty())) {
+        appSettingsAction = mContextMenu->addAction(
+            hbTrId("txt_common_menu_settings"));
+        appSettingsAction->setData(AppSettingContextAction);
+    }
+    if (!(entry->attribute(componentIdAttributeName()).isEmpty()) &&
+            (flags & RemovableEntryFlag) ) {
+        appDetailsAction = mContextMenu->addAction(
+            hbTrId("txt_common_menu_details"));
+        appDetailsAction->setData(AppDetailsContextAction);
+    }
+
+    if (!(flags & RemovableEntryFlag)) {
+        uninstallAction->setVisible(false);
+    }
+
+    addToHomeScreenAction->setVisible(
+        !HsAppLibStateUtils::isCWRTWidgetOnHomeScreen(entry.data()));
+}
+
+/*!
   Menu ascending sort action slot.
  */
 void HsAllAppsState::ascendingMenuAction()
 {
     HSMENUTEST_FUNC_ENTRY("HsAllAppsState::ascendingMenuAction");
     mSortAttribute = AscendingNameHsSortAttribute;
-    mAllAppsModel->setSort(mSortAttribute);
+    mModel->setSort(mSortAttribute);
     HSMENUTEST_FUNC_EXIT("HsAllAppsState::ascendingMenuAction");
 }
 
 /*!
- Sets collections sort order
- /param sortOrder sort order.
- */
-void HsAllAppsState::collectionsSortOrder(
-    HsSortAttribute sortOrder)
-{
-    mCollectionsSortAttribute = sortOrder;
-}
-
-/*!
  Menu descending sort action slot.
  */
 void HsAllAppsState::descendingMenuAction()
 {
     HSMENUTEST_FUNC_ENTRY("HsAllAppsState::descendingMenuAction");
     mSortAttribute = DescendingNameHsSortAttribute;
-    mAllAppsModel->setSort(mSortAttribute);
+    mModel->setSort(mSortAttribute);
     HSMENUTEST_FUNC_EXIT("HsAllAppsState::descendingMenuAction");
 
 }