homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddappstocollectionstate.cpp
changeset 35 f9ce957a272c
child 39 4e8ebe173323
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddappstocollectionstate.cpp	Fri Mar 19 09:27:44 2010 +0200
@@ -0,0 +1,458 @@
+/*
+ * 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 <qfinalstate.h>
+#include <QDebug>
+#include <hsmenuservice.h>
+#include <hbnotificationdialog.h>
+#include <QAbstractTransition>
+
+#include "hsaddappstocollectionstate.h"
+#include "hsmenuevent.h"
+#include "hscollectionnamedialog.h"
+#include "hscollectionslistdialog.h"
+#include "hsappschecklist.h"
+
+/*!
+ \class HsAddAppsToCollectionState
+ \ingroup group_hsmenuworkerstateplugin
+ \brief Manages adding to homescreen state
+ */
+
+/*!
+ \fn void transitToSaveState(const QString &collectionName);
+ Signal emitted when collection name is selected.
+ \param collectionName name of collection.
+ */
+
+/*!
+ \fn void transitToAppsCheckListState(const QString &collectionName);
+ Signal emitted when collection name is selected - version to trigger
+ transition to mAppCheckListState.
+ \param collectionName name of collection.
+ */
+
+/*!
+ \fn void void transitToSaveState(int collectionId);
+ Signal emitted when collection id is selected.
+ \param collectionId id of collection.
+ */
+
+/*!
+ \fn void transitToAppsCheckListState(int collectionId);
+ Signal emitted when collection name is selected - version to trigger
+ transition to mAppCheckListState.
+ \param collectionId id of collection.
+ */
+
+/*!
+ \fn void transitToNewCollectionState();
+ Signal emitted when user selects creating new collection.
+ */
+
+/*!
+ \fn void transitToSaveState(const QList<int> &appList);
+ Signal emitted when applications are selected.
+ \param appList application list.
+ */
+
+/*!
+ \fn void transitToFinalState();
+ Signal emitted when user selects cancel.
+ \param collectionName name of collection.
+ */
+
+/*!
+ Constructor.
+ \return \a true on success, \a false otherwise.
+ \param parent Owner.
+ */
+HsAddAppsToCollectionState::HsAddAppsToCollectionState(QState *parent) :
+    QState(parent), mCollectionName(0), mCollectionId(0), mAppList(),
+    mShowConfirmation(0), mInitialState(0), mSelectCollectionState(0),
+    mNewCollectionState(0), mAppsCheckListState(0), mActionType(
+        NoActionType), mApplicationsSortAttribute(NoHsSortAttribute),
+    mCollectionsSortAttribute(NoHsSortAttribute), mAppsCheckList(0)
+{
+    construct();
+}
+
+/*!
+ Destructor.
+
+ */
+HsAddAppsToCollectionState::~HsAddAppsToCollectionState()
+{
+    delete mAppsCheckList;
+}
+
+/*!
+ Constructor part.
+ */
+void HsAddAppsToCollectionState::construct()
+{
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::construct");
+    setObjectName("homescreen.nokia.com/state/addappstocollectionstate");
+    createStates();
+    connect(this, SIGNAL(exited()),SLOT(stateExited()));
+
+    mAppsCheckList = new HsAppsCheckList();
+    connect(mAppsCheckList, SIGNAL(commit(QList<int>)),
+            SLOT(selectApplicationsDone(QList<int>)));
+
+    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(transitToAppsCheckListState(int)),
+            SLOT(setCollectionId(int)));
+    connect(this, SIGNAL(transitToAppsCheckListState(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(transitToAppsCheckListState(int)), mAppsCheckListState);
+    mNewCollectionState->addTransition(this,
+                                       SIGNAL(transitToAppsCheckListState(QString)), mAppsCheckListState);
+    mAppsCheckListState->addTransition(this,
+                                       SIGNAL(transitToSaveState(QList<int>)), saveState);
+
+    mSelectCollectionState->addTransition(this,
+                                          SIGNAL(transitToFinalState()),finalState);
+    mNewCollectionState->addTransition(this,
+                                       SIGNAL(transitToFinalState()), finalState);
+    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);
+        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<HsSortAttribute>(data.value(
+                                     appSortOrderKey()).toInt());
+    mCollectionsSortAttribute = static_cast<HsSortAttribute>(data.value(
+                                    collectionSortOrderKey()).toInt());
+
+    const int itemId = data.value(itemIdKey()).toInt();
+    mCollectionId = data.value(collectionIdKey()).toInt();
+
+    if (itemId && (mCollectionsSortAttribute != NoHsSortAttribute
+                   || mCollectionId)) {
+        //add selected app item form allAppView or collectionView
+        mAppList.append(itemId);
+
+        mInitialState->addTransition(mSelectCollectionState);
+
+        mShowConfirmation = true;
+    } else if (mApplicationsSortAttribute != NoHsSortAttribute
+               && mCollectionsSortAttribute != NoHsSortAttribute) {
+        //add apps from allAppView options menu
+        mActionType = ViaAllViewOptionMenuType;
+
+        mInitialState->addTransition(mSelectCollectionState);
+
+        mShowConfirmation = true;
+    } else if (mCollectionId) {
+        //add apps from collectionView options menu
+        mApplicationsSortAttribute = 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]);
+    }
+    mAppsCheckList->cleanUp();
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::stateExited");
+    qDebug("AddAppsToCollectionState::stateExited()");
+}
+
+/*!
+ Slot invoked when new collection state is entered..
+ */
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC SKIP
+#endif //COVERAGE_MEASUREMENT
+void HsAddAppsToCollectionState::newCollection()
+{
+    qDebug("HsAddAppsToCollectionState::newCollection");
+
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::newCollection");
+    HsCollectionNameDialog editor;
+    HbAction *result = editor.exec();
+    if (result == editor.primaryAction()) {
+        QString newName(editor.newName(editor.value().toString(), true));
+        if (mActionType == ViaAllViewOptionMenuType) {
+            qDebug("HsAddAppsToCollectionState::newCollection() "
+                   "- emit collectionNameSelectedCl(newName)");
+            emit transitToAppsCheckListState(newName);
+        } else {
+            qDebug("HsAddAppsToCollectionState::newCollection() "
+                   "- emit collectionNameSelected(newName)");
+            emit transitToSaveState(newName);
+        }
+    } else {
+        qDebug(
+            "HsAddAppsToCollectionState::newCollection() - emit cancel()");
+        emit transitToFinalState();
+    }
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::newCollection");
+}
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC ENDSKIP
+#endif //COVERAGE_MEASUREMENT
+
+/*!
+ Slot invoked when select collection state is entered.
+ */
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC SKIP
+#endif //COVERAGE_MEASUREMENT
+void HsAddAppsToCollectionState::selectCollection()
+{
+    qDebug("HsAddAppsToCollectionState::selectCollection()");
+
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::selectCollection");
+    HsCollectionsListDialog listView(mCollectionsSortAttribute,
+                                     mCollectionId);
+    if (listView.exec() != listView.secondaryAction()) {
+        int itemId = listView.getItemId();
+        if (itemId) {
+            if (mActionType == ViaAllViewOptionMenuType) {
+                qDebug("emit collectionSelectedCl(%d)", itemId);
+                emit transitToAppsCheckListState(itemId);
+            } else {
+                qDebug("emit collectionSelected(%d)", itemId);
+                emit transitToSaveState(itemId);
+            }
+        } else {
+            qDebug("emit createNewCollection()");
+            emit transitToNewCollectionState();
+        }
+    } else {
+        qDebug("emit cancel()");
+        emit transitToFinalState();
+    }
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::selectCollection");
+}
+
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC ENDSKIP
+#endif //COVERAGE_MEASUREMENT
+/*!
+ 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_dpopinfo_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.
+ */
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC SKIP
+#endif //COVERAGE_MEASUREMENT
+void HsAddAppsToCollectionState::appsCheckListState()
+{
+    qDebug("HsAddAppsToCollectionState::appsCheckListState()");
+    HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::appsCheckListState");
+    if (!mAppsCheckList) {
+        mAppsCheckList = new HsAppsCheckList();
+    }
+    mAppsCheckList->setSortOrder(mApplicationsSortAttribute);
+    mAppsCheckList->showAppsCheckboxList(mApplicationsSortAttribute);
+    HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::appsCheckListState");
+}
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC ENDSKIP
+#endif //COVERAGE_MEASUREMENT
+/*!
+ Slot connected trrigger action of secondary soft key of check list box.
+ It is called when done button is selected.
+ */
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC SKIP
+#endif //COVERAGE_MEASUREMENT
+void HsAddAppsToCollectionState::selectApplicationsDone(
+    const QList<int> &appList)
+{
+    if (appList.count()) {
+        qDebug("AppsCheckListState::selectApplicationsDone() "
+               "- emit appsSelected(mAppList)");
+        emit transitToSaveState(appList);
+    } else {
+        qDebug(
+            "AppsCheckListState::selectApplicationsDone() - emit cancel()");
+        emit transitToFinalState();
+    }
+}
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC ENDSKIP
+#endif //COVERAGE_MEASUREMENT