homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddappstocollectionstate.cpp
branchRCL_3
changeset 82 5f0182e07bfb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddappstocollectionstate.cpp	Tue Aug 31 15:06:34 2010 +0300
@@ -0,0 +1,621 @@
+/*
+ * Copyright (c) 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:
+ *
+ */
+
+#include <HbDocumentLoader>
+#include <HbDialog>
+#include <HbListView>
+#include <QStandardItemModel>
+#include <qfinalstate.h>
+#include <QDebug>
+#include <hsmenuservice.h>
+#include <hbnotificationdialog.h>
+#include <QAbstractTransition>
+#include <hbaction.h>
+
+#include "hsaddappstocollectionstate.h"
+#include "hsmenuevent.h"
+#include "hscollectionnamedialog.h"
+#include "hsappschecklist.h"
+#include "hsmenuitemmodel.h"
+
+/*!
+ \class HsAddAppsToCollectionState
+ \ingroup group_hsmenuworkerstateplugin
+ \brief Manages adding to homescreen state
+ State responsible for adding new applications to collections.
+ \lib ?library
+ \see StateMachine
+ */
+
+/*!
+ \enum HsAddAppsToCollectionState::CollectionActionType
+ Types of collection's related actions.
+ */
+
+/*! \var HsAddAppsToCollectionState::CollectionActionType HsAddAppsToCollectionState::NoActionType
+ No action.
+ */
+
+/*! \var HsAddAppsToCollectionState::CollectionActionType HsAddAppsToCollectionState::ViaItemSpecificMenuType
+ Adding a specific application to an existing collection via item specific menu.
+ */
+
+/*! \var HsAddAppsToCollectionState::CollectionActionType HsAddAppsToCollectionState::ViaAllViewOptionMenuType
+ Add one/many applications to a new/an existing collection via the All view.
+ */
+
+/*! \var HsAddAppsToCollectionState::CollectionActionType HsAddAppsToCollectionState::ViaAllCollectionsViewType
+ Adding a new collection via the Collections view.
+ */
+
+/*! \var HsAddAppsToCollectionState::CollectionActionType HsAddAppsToCollectionState::ViaCollectionsViewOptionsMenuType
+ Add items to a collection via the collection's view options menu.
+ */
+
+/*! \var HsAddAppsToCollectionState::CollectionActionType HsAddAppsToCollectionState::ViaCollectionSpecificMenuType
+ Add a specific item to a collection via collection specific menu.
+ */
+
+/*!
+ \var HsAddAppsToCollectionState::mCollectionName
+ Collection name.
+ */
+
+/*!
+ \var HsAddAppsToCollectionState::mCollectionId
+ Collection id.
+ */
+
+/*!
+ \var HsAddAppsToCollectionState::mAppList
+ Applications list.
+ */
+
+/*!
+ \var HsAddAppsToCollectionState::mShowConfirmation
+ Bool indicating need of confirmation note after saving in content arsenal.
+ */
+
+/*!
+ \var HsAddAppsToCollectionState::mInitialState
+ Initial state.
+ */
+
+/*!
+ \var HsAddAppsToCollectionState::mSelectCollectionState
+ Select collection state.
+ */
+
+/*!
+ \var HsAddAppsToCollectionState::mNewCollectionState
+ Collection name state.
+ */
+
+/*!
+ \var HsAddAppsToCollectionState::mAppsCheckListState
+ Collection name state.
+ */
+
+/*!
+ \var HsAddAppsToCollectionState::mActionType
+ Collection action type.
+ */
+
+/*!
+ \var HsAddAppsToCollectionState::mApplicationsSortAttribute
+ Applications sort order.
+ */
+
+/*!
+ \var HsAddAppsToCollectionState::mCollectionsSortAttribute
+ Collections sort order.
+ */
+
+/*!
+ \var HsAddAppsToCollectionState::mAppsCheckList
+ Applications check list.
+ */
+
+/*!
+ \fn void HsAddAppsToCollectionState::transitToSaveState(const QString &collectionName);
+ Signal emitted when collection name is selected.
+ \param collectionName name of collection.
+ */
+
+/*!
+ \fn void void HsAddAppsToCollectionState::transitToSaveState(int collectionId);
+ Signal emitted when collection id is selected.
+ \param collectionId id of collection.
+ */
+
+/*!
+ \fn void HsAddAppsToCollectionState::transitToSelectCollectionState();
+ Signal emitted after close multiselection list when CollectionActionType is ViaAllViewOptionMenuType   
+ transition to mSelectCollectionState.
+  */
+
+/*!
+ \fn void HsAddAppsToCollectionState::transitToNewCollectionState();
+ Signal emitted when user selects creating new collection.
+ */
+
+/*!
+ \fn void HsAddAppsToCollectionState::transitToSaveState(const QList<int> &appList);
+ Signal emitted when applications are selected.
+ \param appList application list.
+ */
+
+/*!
+ \fn void HsAddAppsToCollectionState::transitToFinalState();
+ Signal emitted when user selects cancel.
+ \param collectionName name of collection.
+ */
+
+/*!
+ Constructor.
+ \return \a true on success, \a false otherwise.
+ \param parent Parent state.
+ */
+HsAddAppsToCollectionState::HsAddAppsToCollectionState(QState *parent) :
+    QState(parent), mCollectionName(), mCollectionId(0), mAppList(),
+    mShowConfirmation(0), mInitialState(0), mSelectCollectionState(0),
+    mNewCollectionState(0), mAppsCheckListState(0), mActionType(
+        NoActionType), mApplicationsSortAttribute(Hs::NoHsSortAttribute),
+    mAppsCheckList(0), mEditorDialog(0), mListDialog(0), mModel(0)
+{
+    construct();
+}
+
+/*!
+ Destructor.
+ */
+HsAddAppsToCollectionState::~HsAddAppsToCollectionState()
+{
+
+}
+
+/*!
+ Constructor part.
+ */
+void HsAddAppsToCollectionState::construct()
+{
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::construct");
+    setObjectName("homescreen.nokia.com/state/addappstocollectionstate");
+    createStates();
+    connect(this, SIGNAL(exited()),SLOT(stateExited()));
+
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::construct");
+}
+
+/*!
+ Creates behavioural model i.e states
+ */
+void HsAddAppsToCollectionState::createStates()
+{
+    //child states
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::createStates");
+
+    mInitialState = new QState(this);
+    QState *saveState = new QState(this);
+    QFinalState *finalState = new QFinalState(this);
+
+    mSelectCollectionState = new QState(this);
+    mNewCollectionState = new QState(this);
+    mAppsCheckListState = new QState(this);
+
+    setInitialState(mInitialState);
+    connect(saveState, SIGNAL(entered()),SLOT(save()));
+    connect(finalState, SIGNAL(entered()),SLOT(cleanData()));
+    connect(mNewCollectionState, SIGNAL(entered()),SLOT(newCollection()));
+    connect(mSelectCollectionState, SIGNAL(entered()),
+            SLOT(selectCollection()));
+    connect(mAppsCheckListState, SIGNAL(entered()),
+            SLOT(appsCheckListState()));
+
+    //child states will gather needed data in parent sate
+    //with signals and slots communication
+    connect(this, SIGNAL(transitToSaveState(int)),
+            SLOT(setCollectionId(int)));
+    connect(this, SIGNAL(transitToSaveState(QString)),
+            SLOT(setCollectionName(QString)));
+    connect(this, SIGNAL(transitToSaveState(QList<int>)),
+            SLOT(setAppList(QList<int>)));
+
+    // Add a specific application to an existing collection
+    // via item specific menu.
+    // Add a specific item to a collection via collection specific menu.
+    // Adding a new collection via the Collections view.
+    mSelectCollectionState->addTransition(this,
+            SIGNAL(transitToNewCollectionState()), mNewCollectionState);
+    mSelectCollectionState->addTransition(this,
+            SIGNAL(transitToSaveState(int)), saveState);
+    mNewCollectionState->addTransition(this,
+            SIGNAL(transitToSaveState(QString)), saveState);
+
+    // Add one/many applications to an existing/a new collection
+    // via the All view options menu.
+    // Add items to a collection via the collection's view options menu.    
+    mSelectCollectionState->addTransition(this,
+            SIGNAL(transitToSaveState(int)), saveState);
+    mNewCollectionState->addTransition(this,
+            SIGNAL(transitToSaveState(QString)), saveState);
+    mAppsCheckListState->addTransition(this,
+                    SIGNAL(transitToSaveState(QList<int>)), saveState);
+    mSelectCollectionState->addTransition(this,
+            SIGNAL(transitToFinalState()),finalState);
+    mNewCollectionState->addTransition(this,
+            SIGNAL(transitToFinalState()), finalState);
+    mAppsCheckListState->addTransition(this,
+            SIGNAL(transitToSelectCollectionState()), mSelectCollectionState);
+    mAppsCheckListState->addTransition(this,
+            SIGNAL(transitToFinalState()), finalState);
+
+    //transition to final state after save
+    saveState->addTransition(finalState);
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::createStates");
+
+}
+
+/*!
+ Saves data in content arsenal(selected applications in collection).
+ */
+void HsAddAppsToCollectionState::save()
+{
+    qDebug("AddAppsToCollectionState::save() - slot");
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::save");
+    //Adds new collection.
+    if (!mCollectionName.isEmpty()) {
+        mCollectionId = HsMenuService::createCollection(mCollectionName);
+    }
+    //Adds applications to colection.
+    if ((mCollectionId > 0) && mAppList.count()) {
+        HsMenuService::addApplicationsToCollection(mAppList, mCollectionId);
+        HsMenuService::touch(mAppList);
+        if (mShowConfirmation) {
+            showMessageAppsAdded(mCollectionId);
+        }
+    }
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::save");
+}
+
+/*!
+ Cleans data after cancel() signal.
+ */
+void HsAddAppsToCollectionState::cleanData()
+{
+    qDebug("AddAppsToCollectionState::cleanData() - slot");
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::cleanData");
+    mCollectionId = 0;
+    mAppList.clear();
+    mCollectionName.clear();
+    mShowConfirmation = false;
+    mActionType = NoActionType;
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::cleanData");
+}
+
+/*!
+ Derived from QState.
+ Method invoked when a state is entered.
+ \param event an event causing the entrance the state.
+ */
+void HsAddAppsToCollectionState::onEntry(QEvent *event)
+{
+    qDebug("HsAddAppsToCollectionState::onEntry()");
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::onEntry");
+    QState::onEntry(event);
+    HsMenuEvent *menuEvent = static_cast<HsMenuEvent *>(event);
+    QVariantMap data = menuEvent->data();
+
+    mApplicationsSortAttribute = static_cast<Hs::HsSortAttribute>(data.value(
+                                     Hs::appSortOrderKey).toInt());
+
+    const int itemId = data.value(Hs::itemIdKey).toInt();
+    mCollectionId = data.value(Hs::collectionIdKey).toInt();
+
+    if (itemId) {
+        //add selected app item from allAppView or collectionView
+        mAppList.append(itemId);
+        mInitialState->addTransition(mSelectCollectionState);
+        mShowConfirmation = true;
+    } else if (mApplicationsSortAttribute != Hs::NoHsSortAttribute) {
+        //add apps from allAppView options menu
+        mActionType = ViaAllViewOptionMenuType;
+        mInitialState->addTransition(mAppsCheckListState);
+        mShowConfirmation = true;
+    } else if (mCollectionId) {
+        //add apps from collectionView options menu
+        mApplicationsSortAttribute = Hs::AscendingNameHsSortAttribute;
+        mInitialState->addTransition(mAppsCheckListState);
+    }
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::onEntry");
+}
+
+/*!
+ Slot invoked when a state is exited.
+ */
+void HsAddAppsToCollectionState::stateExited()
+{
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::stateExited");
+    QList<QAbstractTransition *> transitionsList =
+        mInitialState->findChildren<QAbstractTransition *> ();
+    if (transitionsList.count()) {
+        mInitialState->removeTransition(transitionsList[0]);
+    }
+    delete mAppsCheckList;
+    mAppsCheckList = NULL;
+
+    if (mEditorDialog) {
+        disconnect(mEditorDialog, SIGNAL(finished(HbAction*)),
+                   this, SLOT(editorDialogFinished(HbAction*)));
+        mEditorDialog->close();
+        mEditorDialog = NULL;
+    }
+
+    if (mListDialog) {
+        disconnect(mListDialog, SIGNAL(finished(HbAction*)),
+                   this, SLOT(listDialogFinished(HbAction*)));
+        mListDialog->close();
+        mListDialog = NULL;
+    }
+
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::stateExited");
+    qDebug("AddAppsToCollectionState::stateExited()");
+}
+
+/*!
+ Slot invoked when new collection state is entered..
+ */
+void HsAddAppsToCollectionState::newCollection()
+{
+    qDebug("HsAddAppsToCollectionState::newCollection");
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::newCollection");
+    mEditorDialog = new HsCollectionNameDialog();
+    mEditorDialog->open(this, SLOT(editorDialogFinished(HbAction*)));
+
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::newCollection");
+}
+
+
+/*!
+ Slot invoked when editor dialog with name of created collection is finished.
+ */
+void HsAddAppsToCollectionState::editorDialogFinished(
+        HbAction* finishedAction)
+{
+    if (finishedAction == mEditorDialog->actions().value(0)) {
+        QString newName(
+                mEditorDialog->uniqueCollectionName());
+        qDebug("HsAddAppsToCollectionState::newCollection() "
+               "- emit collectionNameSelectedCl(newName)");
+        emit transitToSaveState(newName);
+    } else {
+        qDebug(
+            "HsAddAppsToCollectionState::newCollection() - emit cancel()");
+        emit transitToFinalState();
+    }
+    mEditorDialog = NULL; // set to null since this will be deleted after close
+}
+
+/*!
+ Slot invoked when select collection state is entered.
+ */
+void HsAddAppsToCollectionState::selectCollection()
+{
+    qDebug("HsAddAppsToCollectionState::selectCollection()");
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::selectCollection");
+    
+    HbDocumentLoader loader;
+    bool loadStatusOk = false;
+    loader.load(HS_COLLECTION_DIALOG_LAYOUT, &loadStatusOk);
+    Q_ASSERT_X(loadStatusOk, HS_COLLECTION_DIALOG_LAYOUT,
+           "Error while loading docml file.");
+
+    mListDialog = qobject_cast<HbDialog*>(
+        loader.findWidget(HS_COLLECTION_DIALOG_NAME));
+    
+    HbListView *listView = qobject_cast<HbListView*>(
+        loader.findWidget(HS_COLLECTION_DIALOG_LIST_VIEW));
+    
+    HbAction* createNewCollection = 
+            qobject_cast<HbAction*>(loader.findObject(
+            HS_COLLECTION_DIALOG_CREATE_NEW_ACTION));
+    
+    HbAction* cancel = qobject_cast<HbAction*>(loader.findObject(
+            HS_COLLECTION_DIALOG_CANCEL_ACTION));
+    
+    if (mListDialog != NULL) {
+        mListDialog->setTimeout(HbPopup::NoTimeout);
+        mListDialog->setAttribute(Qt::WA_DeleteOnClose, true);
+        
+        createNewCollection->setParent(mListDialog);
+        cancel->setParent(mListDialog);
+        
+        mModel = standardItemModel(mCollectionId);
+        mModel->setParent(mListDialog);
+        listView->setModel(mModel);
+        
+        connect(listView, SIGNAL(activated(const QModelIndex &)),
+                this, SLOT(collectionSelected(const QModelIndex &)));
+        
+        mListDialog->open(this, SLOT(listDialogFinished(HbAction*)));
+    }
+    
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::selectCollection");
+}
+
+/*!
+ Slot invoked when collection list dialog is finished
+ */
+void HsAddAppsToCollectionState::listDialogFinished(HbAction* finishedAction)
+{
+    if (finishedAction == mListDialog->actions().value(0)) {
+        qDebug("emit createNewCollection()");
+        emit transitToNewCollectionState();
+	} else if (finishedAction == mListDialog->actions().value(1)) {
+        qDebug("emit cancel()");
+        emit transitToFinalState();
+	}
+    
+    mListDialog = NULL; // set to null since this will be deleted after close
+    mModel = NULL;// set to null since this will be deleted with dialog
+}
+
+/*!
+ Slot invoked when collection is selected
+  \param modelIndex Index of selected item.
+ */
+void HsAddAppsToCollectionState::collectionSelected(
+        const QModelIndex &modelIndex)
+{
+    if (mListDialog) {
+        int selectedCollection = mModel->data(
+                modelIndex, CaItemModel::IdRole).toInt();
+        mListDialog->close();
+        qDebug("emit collectionSelected(%d)", selectedCollection);
+        emit transitToSaveState(selectedCollection);
+    }
+}
+
+/*!
+ Slot connected to saving action of state.
+ It is called when new application are addend to collection.
+ \param id Id of collection to which applications were added.
+ */
+void HsAddAppsToCollectionState::showMessageAppsAdded(int id)
+{
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::showMessageAppsAdded");
+    HbNotificationDialog *notificationDialog = new HbNotificationDialog();
+    notificationDialog->setAttribute(Qt::WA_DeleteOnClose);
+    notificationDialog->setTitle(
+            hbTrId("txt_applib_dpophead_added_to_collection_1") .arg(
+                    HsMenuService::getName(id)));
+    notificationDialog->show();
+    mShowConfirmation = false;
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::showMessageAppsAdded");
+}
+
+/*!
+ Slot setting collection name.
+ \param collectionName name of collection.
+ */
+void HsAddAppsToCollectionState::setCollectionName(
+    const QString &collectionName)
+{
+    qDebug() << "AddAppsToCollectionState::setCollectionName("
+             << collectionName << ") - slot";
+
+    mCollectionName = collectionName;
+}
+
+/*!
+ Slot setting collection id..
+ \param collectionId id of collection.
+ */
+void HsAddAppsToCollectionState::setCollectionId(int collectionId)
+{
+    qDebug() << "AddAppsToCollectionState::setCollectionId("
+             << collectionId << ") - slot";
+
+    mCollectionId = collectionId;
+}
+
+/*!
+ Slot sets app list.
+ \param appList list of applications ids.
+ */
+void HsAddAppsToCollectionState::setAppList(const QList<int> &appList)
+{
+    qDebug() << "AddAppsToCollectionState::setAppList(" << appList
+             << ") - slot";
+
+    mAppList = appList;
+}
+
+/*!
+ Slot invoked when apps checklist state is entered.
+ */
+void HsAddAppsToCollectionState::appsCheckListState()
+{
+    qDebug("HsAddAppsToCollectionState::appsCheckListState()");
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::appsCheckListState");
+    if (!mAppsCheckList) {
+        mAppsCheckList = new HsAppsCheckList();
+        connect(mAppsCheckList, SIGNAL(commit(QList<int>)),
+                SLOT(selectApplicationsDone(QList<int>)));
+
+    }
+    mAppsCheckList->setSortOrder(mApplicationsSortAttribute);
+    mAppsCheckList->showAppsCheckboxList(mApplicationsSortAttribute);
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::appsCheckListState");
+}
+/*!
+ Slot connected trrigger action of secondary soft key of check list box.
+ It is called when done button is selected.
+ */
+void HsAddAppsToCollectionState::selectApplicationsDone(
+    const QList<int> &appList)
+{
+    if (appList.count()) {
+        qDebug("AppsCheckListState::selectApplicationsDone() "
+               "- emit appsSelected(mAppList)");
+        if (mActionType == ViaAllViewOptionMenuType) {
+            setAppList(appList);
+            emit transitToSelectCollectionState();
+        } else {
+            emit transitToSaveState(appList);
+        }
+    } else {
+        qDebug(
+            "AppsCheckListState::selectApplicationsDone() - emit cancel()");
+        emit transitToFinalState();
+    }
+}
+/*!
+ Creates standard item model.
+ \param collectionId id of collection to remove from model.
+ \return QStandardItemModel - caller takes ownership.
+ */
+QStandardItemModel *HsAddAppsToCollectionState::standardItemModel(
+    int collectionId)
+{
+    HSMENUTEST_FUNC_ENTRY("HsListDialog::standartItemModel");
+    QScopedPointer<HsMenuItemModel> caModel(
+        HsMenuService::getAllCollectionsModel());
+    caModel->setSecondLineVisibility(true);
+    QStandardItemModel *model = new QStandardItemModel(this);
+    QList<QStandardItem *> items;
+    for (int row = 0; row < caModel->rowCount(); row++) {
+        uint flags = caModel->data(caModel->index(row, 0),
+                CaItemModel::FlagsRole).value<EntryFlags> ();
+        int itemId = caModel->data(caModel->index(row, 0),
+                                   CaItemModel::IdRole).toInt();
+        if ((flags & RemovableEntryFlag) && (itemId != collectionId)) {
+            QStandardItem *standardItem = new QStandardItem();
+            standardItem->setData(caModel->data(caModel->index(row, 0),
+                CaItemModel::IdRole), CaItemModel::IdRole);
+            standardItem->setData(caModel->data(caModel->index(row, 0),
+                Qt::DisplayRole), Qt::DisplayRole);
+            standardItem->setData(caModel->data(caModel->index(row, 0),
+                Qt::DecorationRole), Qt::DecorationRole);
+            items << standardItem;
+        }
+    }
+    model->insertColumn(0, items);
+
+    HSMENUTEST_FUNC_EXIT("HsListDialog::standartItemModel");
+    return model;
+}