homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsbaseviewstate.cpp
changeset 63 52b0f64eeb51
parent 62 341166945d65
child 69 87476091b3f5
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsbaseviewstate.cpp	Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsbaseviewstate.cpp	Fri Jul 09 14:36:01 2010 +0300
@@ -15,38 +15,91 @@
  *
  */
 
-#include <hbmessagebox.h>
+#include <QStateMachine>
+#include <HbMessageBox>
 #include <HbParameterLengthLimiter>
-#include <hbaction.h>
+#include <HbAction>
+#include <HbMenu>
+#include <HbAbstractViewItem>
+#include <HbView>
+#include <HbListView>
+
 #include <canotifier.h>
 
 #include "hsbaseviewstate.h"
+#include "hsmenueventfactory.h"
+#include "hsmenudialogfactory.h"
+#include "hsmenuitemmodel.h"
+#include "hsmenumodetransition.h"
+#include "hsmainwindow.h"
+
 
 /*!
  Constructor.
+ \param mainWindow main window wrapper object.
+ \param parent Owner.
  */
-HsBaseViewState::HsBaseViewState(
+HsBaseViewState::HsBaseViewState(HsMainWindow &mainWindow, QState *parent):
+    QState(parent),
+    mNotifier(0),
+    mMessageRelatedItemId(0),
+    mApplicationLaunchFailMessage(0),
+    mModel(0),
+    mContextMenu(0),
+    mContextModelIndex(),
+    mBackKeyAction(0),
+    mMenuView(0),
+    mMenuMode(0),
+    mMainWindow(mainWindow)
+{
+    mBackKeyAction = new HbAction(Hb::BackNaviAction, this);
+}
+
+/*!
+ Constructor.
+ \param mainWindow main window wrapper object.
+ \param menuMode menu mode object.
+ \param parent Owner.
+ */
+HsBaseViewState::HsBaseViewState(HsMainWindow &mainWindow, 
+    HsMenuModeWrapper& menuMode, 
     QState *parent):
     QState(parent),
     mNotifier(0),
     mMessageRelatedItemId(0),
-    mApplicationLaunchFailMessage(0)    
+    mApplicationLaunchFailMessage(0),
+    mModel(0),
+    mContextMenu(0),
+    mContextModelIndex(),
+    mBackKeyAction(0),
+    mMenuView(0),
+    mMenuMode(&menuMode),
+    mMainWindow(mainWindow)
 {
-    construct();
+    mBackKeyAction = new HbAction(Hb::BackNaviAction, this);
 }
+/*!
+ Initialize contained objects.
+ \param menuViewBuilder object providing widgets for menu view.
+ \param viewContext state context of the view the builder is to provide widgets for.
+ */
+void HsBaseViewState::initialize(HsMenuViewBuilder &menuViewBuilder, 
+    HsViewContext viewContext)
+{
+    mMenuView.reset(new HsMenuView(menuViewBuilder, viewContext));
+    mMenuView->view()->setNavigationAction(mBackKeyAction);
 
-/*!
- Constructs contained objects.
- */
-void HsBaseViewState::construct()
-{
+    connect(this, SIGNAL(entered()),SLOT(stateEntered()));
+    connect(this, SIGNAL(exited()),SLOT(stateExited()));
 }
 
 /*!
  Creates and open application launch fail message.
  \param errorCode eroor code to display.
+ \param itemId id of the launched item.
  */
-void HsBaseViewState::createApplicationLaunchFailMessage(int errorCode,int itemId)
+void HsBaseViewState::createApplicationLaunchFailMessage(int errorCode,
+    int itemId)
 {
     QString message;
     message.append(
@@ -56,15 +109,7 @@
     mMessageRelatedItemId = itemId;
 
     // create and show message box
-    mApplicationLaunchFailMessage = new HbMessageBox(HbMessageBox::MessageTypeInformation);
-    mApplicationLaunchFailMessage->setAttribute(Qt::WA_DeleteOnClose);
-
-    mApplicationLaunchFailMessage->setText(message);
-
-    mApplicationLaunchFailMessage->clearActions();
-    HbAction *mClosemAction = new HbAction(hbTrId("txt_common_button_close"),
-        mApplicationLaunchFailMessage);
-    mApplicationLaunchFailMessage->addAction(mClosemAction);
+    mApplicationLaunchFailMessage = HsMenuDialogFactory().create(message, HsMenuDialogFactory::Close);
 
     mApplicationLaunchFailMessage->open(this, SLOT(applicationLaunchFailMessageFinished(HbAction*)));
     
@@ -115,19 +160,214 @@
     cleanUpApplicationLaunchFailMessage();
 }
 
+
+/*!
+ Slot invoked when a state is entered.
+ */
+void HsBaseViewState::stateEntered()
+{
+    qDebug("HsBaseViewState::stateEntered()");
+    HSMENUTEST_FUNC_ENTRY("HsBaseViewState::stateEntered");
+
+    mMainWindow.setCurrentView(*mMenuView);
+    mMenuView->activate();
+
+    HSMENUTEST_FUNC_EXIT("HsBaseViewState::stateEntered");
+}
+
 /*!
  Slot invoked when a state is exited.
  */
 void HsBaseViewState::stateExited()
 {
     HSMENUTEST_FUNC_ENTRY("HsBaseViewState::stateExited");
+    mMenuView->setSearchPanelVisible(false);
+    mMenuView->disconnect(this);
+    mMenuView->view()->setMenu(NULL);
+    mMenuView->inactivate();
     cleanUpApplicationLaunchFailMessage();
+    if (mContextMenu){
+        mContextMenu->close();
+    }
     HSMENUTEST_FUNC_EXIT("HsBaseViewState::stateExited");
 }
 
 /*!
+ Add mode entered.
+ */
+void HsBaseViewState::addModeEntered()
+{
+    connect(mMenuView.data(),
+            SIGNAL(activated(QModelIndex)),
+            SLOT(addActivated(QModelIndex)));
+    connect(mMenuView.data(),
+            SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
+            SLOT(addLongPressed(HbAbstractViewItem *, QPointF)));
+}
+
+/*!
+ Slot invoked when add mode entered.
+ */
+void HsBaseViewState::normalModeEntered()
+{
+    setMenuOptions();
+    connect(mMenuView.data(),
+            SIGNAL(activated(QModelIndex)),
+            mMenuView.data(),
+            SLOT(hideSearchPanel()));
+    connect(mMenuView.data(),
+            SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
+            SLOT(showContextMenu(HbAbstractViewItem *, QPointF)));
+}
+
+/*!
  Destructor.
  */
 HsBaseViewState::~HsBaseViewState()
 {
+    mMenuView->setModel(NULL);
+    delete mModel;
 }
+
+/*!
+ Slot connected to List widget in normal mode.
+ \param index Model index of the activated item.
+ */
+void HsBaseViewState::launchItem(const QModelIndex &index)
+{
+    HSMENUTEST_FUNC_ENTRY("HsBaseViewState::launchItem");
+
+    QSharedPointer<const CaEntry> entry = mModel->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 = mModel->data(index, CaItemModel::IdRole);
+        int errCode = HsMenuService::executeAction(data.toInt());
+        if (errCode != 0) {
+            createApplicationLaunchFailMessage(errCode,index.data(CaItemModel::IdRole).toInt());
+        }
+    }
+
+    HSMENUTEST_FUNC_EXIT("HsBaseViewState::launchItem");
+}
+
+/*!
+ Slot connected to List widget in normal mode.
+ \param index Model index of the activated item.
+ */
+void HsBaseViewState::openCollection(const QModelIndex &index)
+{
+    HSMENUTEST_FUNC_ENTRY("HsBaseViewState::openCollection");
+    QVariant data = mModel->data(index, CaItemModel::IdRole);
+    int id = data.toInt();
+    QString collectionType =
+        mModel->data(index, CaItemModel::TypeRole).toString();
+    qDebug("HsBaseViewState::openCollection - MCS ID: %d",
+           data.toInt());
+
+    machine()->postEvent(HsMenuEventFactory::createOpenCollectionFromAppLibraryEvent(id,
+                         collectionType));
+    HSMENUTEST_FUNC_EXIT("HsBaseViewState::openCollection");
+}
+
+/*!
+ Slot connected to List widget in normal mode.
+ \param index Model index of the activated item.
+ */
+void HsBaseViewState::showContextMenu(HbAbstractViewItem *item, const QPointF &coords)
+{
+
+    HSMENUTEST_FUNC_ENTRY("HsBaseViewState::showContextMenu");
+
+    EntryFlags flags = item->modelIndex().data(
+                           CaItemModel::FlagsRole).value<EntryFlags> ();
+
+    if (!(flags & UninstallEntryFlag)) {
+        mContextMenu = new HbMenu;
+        setContextMenuOptions(item,flags);
+        mContextModelIndex = item->modelIndex();
+        mContextMenu->setPreferredPos(coords);
+        mContextMenu->setAttribute(Qt::WA_DeleteOnClose);
+        mContextMenu->open(this, SLOT(contextMenuAction(HbAction*)));
+    }
+    HSMENUTEST_FUNC_EXIT("HsBaseViewState::showContextMenu");
+
+}
+
+/*!
+ Open task switcher.
+ \retval true if operation is successful.
+ */
+bool HsBaseViewState::openTaskSwitcher()
+{
+    return HsMenuService::launchTaskSwitcher();
+}
+
+/*!
+ Menu softkey back action slot
+ */
+void HsBaseViewState::openAppLibrary()
+{
+    machine()->postEvent(HsMenuEventFactory::createOpenAppLibraryEvent());
+}
+
+/*!
+ Check software updates.
+ \retval 0 if operation is successful.
+ */
+int HsBaseViewState::checkSoftwareUpdates()
+{
+    int errCode = HsMenuService::launchSoftwareUpdate();
+    if (errCode != 0){
+        createApplicationLaunchFailMessage(errCode,0);
+    }
+    return errCode;
+}
+/*!
+ Scrolls view to first item at top
+ */
+void HsBaseViewState::scrollToBeginning()
+{
+    mMenuView->listView()->scrollTo(
+        mModel->index(0), HbAbstractItemView::PositionAtTop);
+}
+
+/*!
+ Normal mode exited dummy implementation.
+ */
+void HsBaseViewState::normalModeExited()
+{
+}
+
+/*!
+ Defines transitions
+ */
+void HsBaseViewState::defineTransitions()
+{
+    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()));
+    connect(normalModeState, SIGNAL(exited()),SLOT(normalModeExited()));
+
+    initialState->addTransition(new HsMenuModeTransition(
+                                    *mMenuMode, NormalHsMenuMode, normalModeState));
+    initialState->addTransition(new HsMenuModeTransition(
+                                    *mMenuMode, AddHsMenuMode, addModeState));
+}