homescreenapp/stateplugins/hsapplibrarystateplugin/src/hscollectionstate.cpp
changeset 63 52b0f64eeb51
parent 62 341166945d65
child 69 87476091b3f5
equal deleted inserted replaced
62:341166945d65 63:52b0f64eeb51
    13  *
    13  *
    14  * Description: Menu collection state.
    14  * Description: Menu collection state.
    15  *
    15  *
    16  */
    16  */
    17 
    17 
    18 #include <qstatemachine.h>
    18 #include <QStateMachine>
    19 
    19 #include <HbAction>
       
    20 #include <HbView>
    20 #include <HbGroupBox>
    21 #include <HbGroupBox>
    21 #include <HbListView>
    22 #include <HbListView>
    22 #include <HbPushButton>
    23 #include <HbPushButton>
    23 #include <hbview.h>
    24 #include <HbAbstractViewItem>
    24 #include <hbaction.h>
    25 #include <HbMenu>
    25 #include <hbabstractviewitem.h>
    26 
    26 #include <hsmenueventfactory.h>
    27 #include <cadefs.h>
    27 #include <hbmenu.h>
    28 #include <caentry.h>
    28 #include <hbinstance.h>
    29 
    29 #include <hbsearchpanel.h>
    30 #include "hsapp_defs.h"
    30 
       
    31 #include "hsmenuevent.h"
    31 #include "hsmenuevent.h"
       
    32 #include "hsmenueventfactory.h"
    32 #include "hsmenuservice.h"
    33 #include "hsmenuservice.h"
    33 #include "hsmenumodewrapper.h"
    34 #include "hsmenumodewrapper.h"
    34 #include "hsmenuitemmodel.h"
    35 #include "hsmenuitemmodel.h"
    35 #include "hsmenuviewbuilder.h"
       
    36 #include "cadefs.h"
       
    37 #include "caentry.h"
       
    38 #include "hscollectionstate.h"
    36 #include "hscollectionstate.h"
    39 #include "hsaddappstocollectionstate.h"
    37 #include "hsaddappstocollectionstate.h"
    40 #include "hsapp_defs.h"
       
    41 #include "hsmainwindow.h"
       
    42 
    38 
    43 /*!
    39 /*!
    44  \class HsCollectionState
    40  \class HsCollectionState
    45  \ingroup group_hsmenustateplugin
    41  \ingroup group_hsmenustateplugin
    46  \brief Collection State.
    42  \brief Collection State.
    53  \var HsCollectionState::mSortAttribute
    49  \var HsCollectionState::mSortAttribute
    54  Sort order.
    50  Sort order.
    55  */
    51  */
    56 
    52 
    57 /*!
    53 /*!
    58  \var HsCollectionState::mCollectionsSortAttribute
       
    59  All collections sort order.
       
    60  */
       
    61 
       
    62 /*!
       
    63  \var HsCollectionState::mCollectionId
    54  \var HsCollectionState::mCollectionId
    64  The id of the current collection.
    55  The id of the current collection.
    65  */
    56  */
    66 
    57 
    67 /*!
    58 /*!
    68  \var HsCollectionState::mCollectionType
    59  \var HsCollectionState::mCollectionType
    69  The type of the current collection.
    60  The type of the current collection.
    70  */
    61  */
    71 
    62 
    72 /*!
       
    73  \var HsCollectionState::mMenuView
       
    74  The List View widget.
       
    75  */
       
    76 
       
    77 /*!
       
    78  \var HsCollectionState::mSecondarySoftkeyAction
       
    79  Secondary Softkey action.
       
    80  Backstepping functionality.
       
    81  Own.
       
    82  */
       
    83 
       
    84 /*!
       
    85  \var HsCollectionState::mOldNavigationAction
       
    86  Old navigation icon.
       
    87  Not own.
       
    88  */
       
    89 
       
    90 /*!
       
    91  \var HsCollectionState::mCollectionModel
       
    92  Item Model for the List.
       
    93  Own.
       
    94  */
       
    95 
       
    96 /*!
       
    97  \var HsCollectionState::mOptions
       
    98  Options menu.
       
    99  Own.
       
   100  */
       
   101 
    63 
   102 /*!
    64 /*!
   103   \fn void HsCollectionState::sortOrderChanged(SHsSortAttribute sortOrder);
    65   \fn void HsCollectionState::sortOrderChanged(SHsSortAttribute sortOrder);
   104   This signal is emitted when sort order is changed to \a sortOrder.
    66   This signal is emitted when sort order is changed to \a sortOrder.
   105   \param sortAttribute sort attribute
    67   \param sortAttribute sort attribute
   112  */
    74  */
   113 
    75 
   114 /*!
    76 /*!
   115  Constructor.
    77  Constructor.
   116  \param menuViewBuilder Menu view builder.
    78  \param menuViewBuilder Menu view builder.
   117  \param menuMode reference to object representing menu mode (add mode on/add mode off).
    79  \param menuMode menu mode object (add mode on/add mode off).
       
    80  \param mainWindow main window wrapper.
   118  \param parent Owner.
    81  \param parent Owner.
   119 */
    82 */
   120 HsCollectionState::HsCollectionState(HsMenuViewBuilder &menuViewBuilder,
    83 HsCollectionState::HsCollectionState(HsMenuViewBuilder &menuViewBuilder,
   121                                      HsMenuModeWrapper &menuMode,
    84                                      HsMenuModeWrapper &menuMode,
   122                                      HsMainWindow &mainWindow,
    85                                      HsMainWindow &mainWindow,
   123                                      QState *parent) :
    86                                      QState *parent) :
   124     HsBaseViewState(parent),
    87     HsBaseViewState(mainWindow, menuMode, parent),
   125     mSortAttribute(LatestOnTopHsSortAttribute),
    88     mSortAttribute(LatestOnTopHsSortAttribute),
   126     mCollectionsSortAttribute(CustomHsSortAttribute),
    89     mCollectionId(-1)
   127     mCollectionId(-1),
    90 {
   128     mMenuView(menuViewBuilder, HsCollectionContext),
    91     initialize(menuViewBuilder, HsCollectionContext);
   129     mMenuMode(menuMode),
       
   130     mSecondarySoftkeyAction(new HbAction(Hb::BackNaviAction, this)),
       
   131     mCollectionModel(0),
       
   132     mOptions(0), mContextModelIndex(), mContextMenu(0),
       
   133     mMainWindow(mainWindow)
       
   134 {
       
   135     construct();
    92     construct();
   136 }
    93 }
   137 
    94 
   138 /*!
    95 /*!
   139  Constructs contained objects.
    96  Constructs contained objects.
   144 
   101 
   145     const QString parentName =
   102     const QString parentName =
   146         parent() != 0 ? parent()->objectName() : QString("");
   103         parent() != 0 ? parent()->objectName() : QString("");
   147     setObjectName(parentName + "/collectionstate");
   104     setObjectName(parentName + "/collectionstate");
   148 
   105 
   149     connect(this, SIGNAL(entered()),SLOT(stateEntered()));
   106     mMenuView->collectionButton()->setCheckable(true);
   150     connect(this, SIGNAL(exited()),SLOT(stateExited()));
       
   151     
       
   152     mMenuView.collectionButton()->setCheckable(true);   
       
   153     makeConnect();
       
   154     mMenuView.view()->setNavigationAction(mSecondarySoftkeyAction);
       
   155 
   107 
   156     HSMENUTEST_FUNC_EXIT("HsCollectionState::construct");
   108     HSMENUTEST_FUNC_EXIT("HsCollectionState::construct");
   157 }
   109 }
   158 
   110 
   159 /*!
   111 /*!
   160  Destructor.
   112  Destructor.
   161  */
   113  */
   162 HsCollectionState::~HsCollectionState()
   114 HsCollectionState::~HsCollectionState()
   163 {
   115 {
   164     makeDisconnect();
   116     mMenuView->inactivate();
   165     mMenuView.inactivate();
   117     mMenuView->view()->setNavigationAction(NULL);
   166     mMenuView.setModel(NULL);
       
   167     mMenuView.view()->setNavigationAction(NULL);
       
   168     delete mCollectionModel;
       
   169 }
   118 }
   170 
   119 
   171 
   120 
   172 /*!
   121 /*!
   173  Sets entry event.
   122  Sets entry event.
   190 }
   139 }
   191 
   140 
   192 /*!
   141 /*!
   193  Slot invoked when a state is entered.
   142  Slot invoked when a state is entered.
   194  */
   143  */
   195 
       
   196 
       
   197 void HsCollectionState::stateEntered()
   144 void HsCollectionState::stateEntered()
   198 {
   145 {
   199     HSMENUTEST_FUNC_ENTRY("HsCollectionState::stateEntered");
   146     HSMENUTEST_FUNC_ENTRY("HsCollectionState::stateEntered");
   200 
   147     HsBaseViewState::stateEntered();
   201     mMainWindow.setCurrentView(mMenuView);
   148     makeConnect();
   202     mMenuView.activate();
   149     if (!mModel) {
   203 
   150         mModel =
   204     if (!mCollectionModel) {
       
   205         mCollectionModel =
       
   206             HsMenuService::getCollectionModel(
   151             HsMenuService::getCollectionModel(
   207                 mCollectionId, mSortAttribute, mCollectionType);
   152                 mCollectionId, mSortAttribute, mCollectionType);
   208     }
   153     }
   209     
   154 
   210     EntryFlags flags =
   155     EntryFlags flags =
   211         mCollectionModel->root().data(CaItemModel::FlagsRole).value<
   156         mModel->root().data(CaItemModel::FlagsRole).value<
   212         EntryFlags> ();
   157         EntryFlags> ();
   213 
   158 
   214     if (mCollectionModel->rowCount() == 0){
   159     if (mModel->rowCount() == 0){
   215         if (flags & RemovableEntryFlag){
   160         if (flags & RemovableEntryFlag){
   216             mMenuView.setContext(HsCollectionContext,HsButtonContext);
   161             mMenuView->setContext(HsCollectionContext,HsButtonContext);
   217         } else {
   162         } else {
   218             mMenuView.setContext(HsCollectionContext,HsEmptyLabelContext);
   163             mMenuView->setContext(HsCollectionContext,HsEmptyLabelContext);
   219         }
   164         }
   220         mMenuView.disableSearch(true);
   165         mMenuView->disableSearch(true);
   221     } else {
   166     } else {
   222         mMenuView.setContext(HsCollectionContext,HsItemViewContext);
   167         mMenuView->setContext(HsCollectionContext,HsItemViewContext);
   223         mMenuView.disableSearch(false);
   168         mMenuView->disableSearch(false);
   224     }
   169     }
   225 
   170 
   226     connect(mCollectionModel, SIGNAL(modelReset()), SLOT(updateLabel()));
   171     connect(mModel, SIGNAL(modelReset()), SLOT(updateLabel()));
   227     connect(mCollectionModel, SIGNAL(empty(bool)),this,
   172     connect(mModel, SIGNAL(empty(bool)),this,
   228             SLOT(handleEmptyChange(bool)));
   173             SLOT(handleEmptyChange(bool)));
   229     connect(mCollectionModel, SIGNAL(empty(bool)),this,
   174     connect(mModel, SIGNAL(empty(bool)),this,
   230             SLOT(lockSearchButton(bool)));
   175             SLOT(lockSearchButton(bool)));
   231 
   176 
   232     mMenuView.setModel(mCollectionModel);
   177     mMenuView->setModel(mModel);
   233 
   178 
   234     mMenuView.listView()->scrollTo(
   179     mMenuView->listView()->scrollTo(
   235         mCollectionModel->index(0), HbAbstractItemView::PositionAtTop);
   180         mModel->index(0), HbAbstractItemView::PositionAtTop);
   236 
   181 
   237     mMenuView.viewLabel()->setHeading(
   182     mMenuView->viewLabel()->setHeading(
   238         mCollectionModel->root().data(Qt::DisplayRole).toString());
   183         mModel->root().data(Qt::DisplayRole).toString());
   239 
   184     setMenuOptions();
   240     if (!mOptions) {
   185 
   241         mOptions = new HbMenu();
   186     HSMENUTEST_FUNC_EXIT("HsCollectionState::stateEntered");
   242         mOptions->addAction(hbTrId("txt_applib_opt_task_switcher"),
   187 }
   243                             this,
   188 
       
   189 /*!
       
   190  Creates and installs menu options for the view
       
   191  */
       
   192 void HsCollectionState::setMenuOptions()
       
   193 {
       
   194     HSMENUTEST_FUNC_ENTRY("HsAllCollectionsState::setMenuOptions");
       
   195 
       
   196     EntryFlags flags =
       
   197         mModel->root().data(CaItemModel::FlagsRole).value<EntryFlags> ();
       
   198 
       
   199     QScopedPointer<HbMenu> viewOptions(new HbMenu);
       
   200 
       
   201     viewOptions->addAction(hbTrId("txt_applib_opt_task_switcher"),
       
   202                             static_cast<HsBaseViewState*>(this),
   244                             SLOT(openTaskSwitcher()));
   203                             SLOT(openTaskSwitcher()));
   245 
   204 
   246         if (flags & RemovableEntryFlag) {
   205     if (flags & RemovableEntryFlag) {
   247             mOptions->addAction(hbTrId("txt_applib_opt_add_content"), this,
   206         viewOptions->addAction(hbTrId("txt_applib_opt_add_content"), this,
   248                                 SLOT(addAppsAction()));
   207                             SLOT(addAppsAction()));
       
   208     }
       
   209 
       
   210     viewOptions->addAction(hbTrId("txt_applib_opt_add_to_home_screen"),
       
   211                         this, SLOT(addCollectionShortcutToHomeScreenAction()));
       
   212 
       
   213     if (flags & RemovableEntryFlag) {
       
   214         if (mModel->rowCount() > 0) {
       
   215             viewOptions->addAction(
       
   216                 hbTrId("txt_applib_opt_arrange"),
       
   217                 this,
       
   218                 SLOT(createArrangeCollection()));
   249         }
   219         }
   250 
   220         viewOptions->addAction(
   251         mOptions->addAction(hbTrId("txt_applib_opt_add_to_home_screen"),
   221             hbTrId("txt_common_opt_rename_item"),
   252                             this, SLOT(addCollectionShortcutToHomeScreenAction()));
   222             this,
   253 
   223             SLOT(renameAction()));
   254         if (flags & RemovableEntryFlag) {
   224         viewOptions->addAction(
   255             mOptions->addAction(
   225             hbTrId("txt_common_opt_delete"),
   256                 hbTrId("txt_common_opt_rename_item"),
   226             this,
       
   227             SLOT(deleteAction()));
       
   228     }
       
   229     if (mCollectionType == collectionDownloadedTypeName()) {
       
   230         HbMenu *sortMenu = viewOptions->addMenu(
       
   231                                hbTrId("txt_applib_opt_sort_by"));
       
   232         //Grouped options are exclusive by default.
       
   233         QActionGroup *sortGroup = new QActionGroup(viewOptions.data());
       
   234         sortGroup->addAction(
       
   235             sortMenu->addAction(
       
   236                 hbTrId("txt_applib_opt_sort_by_sub_latest_on_top"),
   257                 this,
   237                 this,
   258                 SLOT(renameAction()));
   238                 SLOT(latestOnTopMenuAction())));
   259             mOptions->addAction(
   239         sortGroup->addAction(
   260                 hbTrId("txt_common_opt_delete"),
   240             sortMenu->addAction(
       
   241                 hbTrId("txt_applib_opt_sort_by_sub_oldest_on_top"),
   261                 this,
   242                 this,
   262                 SLOT(deleteAction()));
   243                 SLOT(oldestOnTopMenuAction())));
       
   244         foreach(QAction *action, sortMenu->actions()) {
       
   245             action->setCheckable(true);
   263         }
   246         }
   264         if (mCollectionType == collectionDownloadedTypeName()) {
   247         static const int defaultSortingPosition = 0;
   265             HbMenu *sortMenu = mOptions->addMenu(
   248         sortGroup->actions().at(defaultSortingPosition)->setChecked(true);
   266                                    hbTrId("txt_applib_opt_sort_by"));
   249     }
   267             //Grouped options are exclusive by default.
   250     mMenuView->view()->setMenu(viewOptions.take());
   268             QActionGroup *sortGroup = new QActionGroup(mOptions);
   251     HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::setMenuOptions");
   269             sortGroup->addAction(
       
   270                 sortMenu->addAction(
       
   271                     hbTrId("txt_applib_opt_sort_by_sub_latest_on_top"),
       
   272                     this,
       
   273                     SLOT(latestOnTopMenuAction())));
       
   274             sortGroup->addAction(
       
   275                 sortMenu->addAction(
       
   276                     hbTrId("txt_applib_opt_sort_by_sub_oldest_on_top"),
       
   277                     this,
       
   278                     SLOT(oldestOnTopMenuAction())));
       
   279             foreach(QAction *action, sortMenu->actions()) {
       
   280                 action->setCheckable(true);
       
   281             }
       
   282             static const int defaultSortingPosition = 0;
       
   283             sortGroup->actions().at(defaultSortingPosition)->setChecked(true);
       
   284         }
       
   285 
       
   286         mOptions->setParent(this);
       
   287         mMenuView.view()->setMenu(mOptions);
       
   288     }
       
   289     HSMENUTEST_FUNC_EXIT("HsCollectionState::stateEntered");
       
   290 }
   252 }
   291 
   253 
   292 /*!
   254 /*!
   293  Slot invoked when a state is exited.
   255  Slot invoked when a state is exited.
   294  */
   256  */
   295 void HsCollectionState::stateExited()
   257 void HsCollectionState::stateExited()
   296 {
   258 {
   297     HSMENUTEST_FUNC_ENTRY("HsCollectionState::stateExited");
   259     HSMENUTEST_FUNC_ENTRY("HsCollectionState::stateExited");
   298 
   260     makeDisconnect();
   299     mMenuView.inactivate();
   261     mMenuView->disableSearch(false);
   300     mMenuView.setSearchPanelVisible(false);
   262     disconnect(mModel, SIGNAL(empty(bool)),this,
   301     mMenuView.disableSearch(false);
       
   302     disconnect(mCollectionModel, SIGNAL(empty(bool)),this,
       
   303                SLOT(handleEmptyChange(bool)));
   263                SLOT(handleEmptyChange(bool)));
   304 
   264 
   305     disconnect(mCollectionModel, SIGNAL(empty(bool)),this,
   265     disconnect(mModel, SIGNAL(empty(bool)),this,
   306                SLOT(lockSearchButton(bool)));
   266                SLOT(lockSearchButton(bool)));
   307 
   267 
   308     disconnect(mCollectionModel, SIGNAL(modelReset()),
   268     disconnect(mModel, SIGNAL(modelReset()),
   309                    this, SLOT(updateLabel()));
   269                    this, SLOT(updateLabel()));
   310     delete mCollectionModel;
   270     delete mModel;
   311     mCollectionModel = NULL;
   271     mModel = NULL;
   312     mOptions->close();
       
   313     delete mOptions;
       
   314     mOptions = NULL;
       
   315     if (mContextMenu)
       
   316         mContextMenu->close();
       
   317     this->mSortAttribute = NoHsSortAttribute;
   272     this->mSortAttribute = NoHsSortAttribute;
   318     
   273 
   319     HsBaseViewState::stateExited();
   274     HsBaseViewState::stateExited();
   320     
   275 
   321     HSMENUTEST_FUNC_EXIT("HsCollectionState::stateExited");
   276     HSMENUTEST_FUNC_EXIT("HsCollectionState::stateExited");
   322     qDebug("CollectionState::stateExited()");
   277     qDebug("CollectionState::stateExited()");
   323 }
   278 }
   324 
   279 
   325 /*!
   280 /*!
   326  Perform all signal connections.
   281  Perform all signal connections.
   327  */
   282  */
   328 void HsCollectionState::makeConnect()
   283 void HsCollectionState::makeConnect()
   329 {
   284 {
   330     connect(mSecondarySoftkeyAction, SIGNAL(triggered()),
   285     connect(mBackKeyAction, SIGNAL(triggered()),
   331             SLOT(backSteppingAction()));
   286             static_cast<HsBaseViewState*>(this), SLOT(openAppLibrary()));
   332     connect(&mMenuView,
   287     connect(mMenuView.data(),
   333             SIGNAL(activated(QModelIndex)),
   288             SIGNAL(activated(QModelIndex)),
   334             SLOT(listItemActivated(QModelIndex)));
   289             static_cast<HsBaseViewState*>(this),
   335     connect(&mMenuView,
   290             SLOT(launchItem(QModelIndex)));
       
   291     connect(mMenuView.data(),
       
   292             SIGNAL(activated(QModelIndex)),
       
   293             mMenuView.data(),
       
   294             SLOT(hideSearchPanel()));
       
   295     connect(mMenuView.data(),
   336             SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
   296             SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
   337             SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF)));
   297             static_cast<HsBaseViewState*>(this),
   338     connect(mMenuView.collectionButton(),
   298             SLOT(showContextMenu(HbAbstractViewItem *, QPointF)));
       
   299     connect(mMenuView->collectionButton(),
   339             SIGNAL(toggled(bool)), this, SLOT(addAppsAction(bool)));
   300             SIGNAL(toggled(bool)), this, SLOT(addAppsAction(bool)));
   340 }
   301 }
   341 
   302 
   342 /*!
   303 /*!
   343  Perform all signal disconnections.
   304  Perform all signal disconnections.
   344  */
   305  */
   345 void HsCollectionState::makeDisconnect()
   306 void HsCollectionState::makeDisconnect()
   346 {
   307 {
   347     disconnect(mMenuView.collectionButton(),
   308     disconnect(mMenuView->collectionButton(),
   348             SIGNAL(toggled(bool)), this, SLOT(addAppsAction(bool)));
   309             SIGNAL(toggled(bool)), this, SLOT(addAppsAction(bool)));
   349 
   310 
   350     disconnect(mSecondarySoftkeyAction, SIGNAL(triggered()),
   311     disconnect(mBackKeyAction, SIGNAL(triggered()),
   351                this, SLOT(backSteppingAction()));
   312                static_cast<HsBaseViewState*>(this), SLOT(openAppLibrary()));
   352 
   313 
   353     disconnect(&mMenuView,
   314     disconnect(mMenuView.data(),
   354                SIGNAL(activated(QModelIndex)),
   315                SIGNAL(activated(QModelIndex)),
   355                this, SLOT(listItemActivated(QModelIndex)));
   316                static_cast<HsBaseViewState*>(this),
   356 
   317                SLOT(launchItem(QModelIndex)));
   357     disconnect(&mMenuView,
   318     disconnect(mMenuView.data(),
       
   319             SIGNAL(activated(QModelIndex)),
       
   320             mMenuView.data(),
       
   321             SLOT(hideSearchPanel()));
       
   322     disconnect(mMenuView.data(),
   358                SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
   323                SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
   359                this, SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF)));
   324                static_cast<HsBaseViewState*>(this),
   360 }
   325                SLOT(showContextMenu(HbAbstractViewItem *, QPointF)));
   361 
       
   362 /*!
       
   363  Open task switcher.
       
   364  \retval true if operation is successful.
       
   365  */
       
   366 bool HsCollectionState::openTaskSwitcher()
       
   367 {
       
   368     return HsMenuService::launchTaskSwitcher();
       
   369 }
       
   370 
       
   371 /*!
       
   372  Slot connected to List widget.
       
   373  \param index Model index of the activated item.
       
   374  */
       
   375 void HsCollectionState::listItemActivated(const QModelIndex &index)
       
   376 {
       
   377     HSMENUTEST_FUNC_ENTRY("HsCollectionState::listItemActivated");
       
   378 
       
   379     QSharedPointer<const CaEntry> entry = mCollectionModel->entry(index);
       
   380 
       
   381     if (entry->entryTypeName() == widgetTypeName()) {
       
   382         EntryFlags flags = index.data(CaItemModel::FlagsRole).value<
       
   383                                EntryFlags> ();
       
   384         if (!(flags & UninstallEntryFlag)) {
       
   385             machine()->postEvent(
       
   386                 HsMenuEventFactory::createPreviewHSWidgetEvent(
       
   387                     entry->id(), entry->entryTypeName(), entry->attribute(
       
   388                         widgetUriAttributeName()), entry->attribute(
       
   389                         widgetLibraryAttributeName())));
       
   390 
       
   391             const int itemId = index.data(CaItemModel::IdRole).toInt();
       
   392             HsMenuService::touch(itemId);
       
   393         }
       
   394     } else {
       
   395         QVariant data = mCollectionModel->data(index, CaItemModel::IdRole);
       
   396         int errCode = HsMenuService::executeAction(data.toInt());
       
   397         if (errCode != 0) {
       
   398             createApplicationLaunchFailMessage(errCode,index.data(CaItemModel::IdRole).toInt());
       
   399         }
       
   400     }
       
   401 
       
   402     mMenuView.setSearchPanelVisible(false);
       
   403     HSMENUTEST_FUNC_EXIT("HsCollectionState::listItemActivated");
       
   404 }
       
   405 
       
   406 /*!
       
   407  Handles long-item-pressed event in all apps view by showing context menu
       
   408  \param item the event pertains to
       
   409  \param coords press point coordinates.
       
   410  \retval void
       
   411  */
       
   412 void HsCollectionState::listItemLongPressed(HbAbstractViewItem *item,
       
   413         const QPointF &coords)
       
   414 {
       
   415     HSMENUTEST_FUNC_ENTRY("HsCollectionState::listItemLongPressed");
       
   416 
       
   417     EntryFlags flags = item->modelIndex().data(CaItemModel::FlagsRole).value<
       
   418                        EntryFlags> ();
       
   419 
       
   420     if (!(flags & UninstallEntryFlag)) {
       
   421         // create context menu
       
   422         mContextMenu = new HbMenu();
       
   423 
       
   424         HbAction *addShortcutAction = mContextMenu->addAction(hbTrId(
       
   425                                           "txt_applib_menu_add_to_home_screen"));
       
   426         addShortcutAction->setData(AddToHomeScreenContextAction);
       
   427         HbAction *addToCollection = mContextMenu->addAction(hbTrId(
       
   428                                         "txt_applib_menu_add_to_collection"));
       
   429         addToCollection->setData(AddToCollectionContextAction);
       
   430         HbAction *removeAction(NULL);
       
   431         HbAction *uninstallAction(NULL);
       
   432         HbAction *appSettingsAction(NULL);
       
   433         HbAction *appDetailsAction(NULL);
       
   434         // we do not add remove option in locked collection
       
   435         // check conditions and hide irrelevant menu items
       
   436         EntryFlags rootFlags =
       
   437             mCollectionModel->root().data(CaItemModel::FlagsRole).value<
       
   438             EntryFlags> ();
       
   439 
       
   440         if (rootFlags & RemovableEntryFlag) {
       
   441             removeAction = mContextMenu->addAction(
       
   442                                hbTrId("txt_applib_menu_remove_from_collection"));
       
   443             removeAction->setData(RemoveFromCollectionContextAction);
       
   444         }
       
   445 
       
   446         if ((flags & RemovableEntryFlag)) {
       
   447             uninstallAction = mContextMenu->addAction(hbTrId("txt_common_menu_delete"));
       
   448             uninstallAction->setData(UninstallContextAction);
       
   449         }
       
   450         QSharedPointer<const CaEntry> entry = mCollectionModel->entry(item->modelIndex());
       
   451 
       
   452         if (!(entry->attribute(appSettingsPlugin()).isEmpty())) {
       
   453             appSettingsAction = mContextMenu->addAction(hbTrId(
       
   454                                                     "txt_common_menu_settings"));
       
   455             appSettingsAction->setData(AppSettingContextAction);
       
   456         }
       
   457     
       
   458         if (!(entry->attribute(componentIdAttributeName()).isEmpty()) &&
       
   459                 (flags & RemovableEntryFlag) ) {
       
   460             appDetailsAction = mContextMenu->addAction(hbTrId(
       
   461                                                     "txt_common_menu_details"));
       
   462             appDetailsAction->setData(AppDetailsContextAction);
       
   463         }
       
   464         mContextModelIndex = item->modelIndex();
       
   465         mContextMenu->setPreferredPos(coords);
       
   466         mContextMenu->setAttribute(Qt::WA_DeleteOnClose);
       
   467         mContextMenu->open(this, SLOT(contextMenuAction(HbAction*)));
       
   468     }
       
   469 
       
   470     HSMENUTEST_FUNC_EXIT("HsCollectionState::listItemLongPressed");
       
   471 }
   326 }
   472 
   327 
   473 /*!
   328 /*!
   474  Handles context menu actions
   329  Handles context menu actions
   475  */
   330  */
   476 void HsCollectionState::contextMenuAction(HbAction *action)
   331 void HsCollectionState::contextMenuAction(HbAction *action)
   477 {
   332 {
   478     HsContextAction command = 
   333     HsContextAction command =
   479         static_cast<HsContextAction>(action->data().toInt());
   334         static_cast<HsContextAction>(action->data().toInt());
   480 
   335 
   481     const int itemId = mContextModelIndex.data(CaItemModel::IdRole).toInt();
   336     const int itemId = mContextModelIndex.data(CaItemModel::IdRole).toInt();
   482 
   337 
   483     switch (command) {
   338     switch (command) {
   484         case AddToHomeScreenContextAction:
   339         case AddToHomeScreenContextAction:
   485             addElementToHomeScreen(mContextModelIndex);
   340             addElementToHomeScreen(mContextModelIndex);
   486             break;
   341             break;
   487         case AddToCollectionContextAction:
   342         case AddToCollectionContextAction:
   488             machine()->postEvent(
   343             machine()->postEvent(
   489                 HsMenuEventFactory::createAddAppsFromCallectionViewEvent(
   344                 HsMenuEventFactory::createAddAppsFromCollectionViewEvent(
   490                     mCollectionId, itemId, mCollectionsSortAttribute));
   345                     mCollectionId, itemId));
   491             break;
   346             break;
   492         case UninstallContextAction:
   347         case UninstallContextAction:
   493             machine()->postEvent(
   348             machine()->postEvent(
   494                 HsMenuEventFactory::createUninstallApplicationEvent(
   349                 HsMenuEventFactory::createUninstallApplicationEvent(
   495                     itemId));
   350                     itemId));
   497         case RemoveFromCollectionContextAction:
   352         case RemoveFromCollectionContextAction:
   498             machine()->postEvent(
   353             machine()->postEvent(
   499                 HsMenuEventFactory::createRemoveAppFromCollectionEvent(
   354                 HsMenuEventFactory::createRemoveAppFromCollectionEvent(
   500                     itemId, mCollectionId));
   355                     itemId, mCollectionId));
   501             break;
   356             break;
   502         case AppSettingContextAction: 
   357         case AppSettingContextAction:
   503             machine()->postEvent(
   358             machine()->postEvent(
   504                 HsMenuEventFactory::createAppSettingsViewEvent(itemId));
   359                 HsMenuEventFactory::createAppSettingsViewEvent(itemId));
   505             break;
   360             break;
   506         case AppDetailsContextAction: 
   361         case AppDetailsContextAction:
   507             machine()->postEvent(
   362             machine()->postEvent(
   508                 HsMenuEventFactory::createAppDetailsViewEvent(itemId));
   363                 HsMenuEventFactory::createAppDetailsViewEvent(itemId));
   509             break;                 
   364             break;
   510         default:
   365         default:
   511             break;
   366             break;
   512     }
   367     }
   513                                     
   368 
   514     mMenuView.setSearchPanelVisible(false);
   369     mMenuView->setSearchPanelVisible(false);
   515 }
   370 }
   516 
   371 
   517 /*!
   372 /*!
   518  Handles button visibility
   373  Handles button visibility
   519   \param empty if true set empty text label or button to add entries to collection
   374   \param empty if true set empty text label or button to add entries to collection.
   520  */
   375  */
   521 void HsCollectionState::handleEmptyChange(bool empty)
   376 void HsCollectionState::handleEmptyChange(bool empty)
   522 {
   377 {
   523     EntryFlags flags =
   378     EntryFlags flags =
   524         mCollectionModel->root().data(CaItemModel::FlagsRole).value<
   379         mModel->root().data(CaItemModel::FlagsRole).value<
   525         EntryFlags> ();
   380         EntryFlags> ();
   526 
   381 
   527     if (empty){
   382     if (empty){
   528         if (flags & RemovableEntryFlag){
   383         if (flags & RemovableEntryFlag){
   529             mMenuView.setContext(HsCollectionContext,HsButtonContext);
   384             mMenuView->setContext(HsCollectionContext,HsButtonContext);
   530         } else {
   385         } else {
   531             mMenuView.setContext(HsCollectionContext,HsEmptyLabelContext);
   386             mMenuView->setContext(HsCollectionContext,HsEmptyLabelContext);
   532         }
   387         }
   533     } else {
   388     } else {
   534         mMenuView.setContext(HsCollectionContext,HsItemViewContext);
   389         mMenuView->setContext(HsCollectionContext,HsItemViewContext);
   535     }
   390     }
   536 }
   391     setMenuOptions();
   537 
   392 }
   538 
   393 
   539 /*!
   394 
   540  Handles lock serch button
   395 /*!
   541   \param lock if true lock search button
   396  Handles lock search button
       
   397   \param lock if true lock search button.
   542  */
   398  */
   543 void HsCollectionState::lockSearchButton(bool lock)
   399 void HsCollectionState::lockSearchButton(bool lock)
   544 {
   400 {
   545     mMenuView.disableSearch(lock);
   401     mMenuView->disableSearch(lock);
   546 }
   402 }
   547 
   403 
   548 
   404 
   549 /*!
   405 /*!
   550  Menu add applications action slot
   406  Menu add applications action slot
   551    \param addApps if true create event for add enties to collection. Parametr use by toggled from HbPushButton
   407    \param addApps if true create event for add enties to collection.
       
   408    Parametr use by toggled from HbPushButton
   552  */
   409  */
   553 void HsCollectionState::addAppsAction(bool addApps)
   410 void HsCollectionState::addAppsAction(bool addApps)
   554 {
   411 {
   555     // Add applications
   412     // Add applications
   556     if (addApps) {
   413     if (addApps) {
   557         mMenuView.collectionButton()->setChecked(false);
   414         mMenuView->collectionButton()->setChecked(false);
   558         machine()->postEvent(
   415         machine()->postEvent(
   559             HsMenuEventFactory::createAddAppsFromCallectionViewEvent(
   416             HsMenuEventFactory::createAddAppsFromCollectionViewEvent(
   560                 mCollectionId));
   417                 mCollectionId));
   561     }    
   418     }
   562 }
   419 }
   563 
   420 
   564 /*!
   421 /*!
   565  Menu add shortcut action slot
   422  Menu add shortcut action slot
   566  */
   423  */
   567 void HsCollectionState::addCollectionShortcutToHomeScreenAction()
   424 void HsCollectionState::addCollectionShortcutToHomeScreenAction()
   568 {
   425 {
   569     machine()->postEvent(HsMenuEventFactory::createAddToHomeScreenEvent(
   426     machine()->postEvent(HsMenuEventFactory::createAddToHomeScreenEvent(
   570                              mCollectionId, mMenuMode.getHsMenuMode(), 
   427                              mCollectionId, mMenuMode->getHsMenuMode(),
   571                              mMenuMode.getHsToken()));
   428                              mMenuMode->getHsToken()));
   572 }
   429 }
   573 
   430 
   574 /*!
   431 /*!
   575  Menu rename action slot
   432  Menu rename action slot
   576  */
   433  */
   588     machine()->postEvent(HsMenuEventFactory::createDeleteCollectionEvent(
   445     machine()->postEvent(HsMenuEventFactory::createDeleteCollectionEvent(
   589                              mCollectionId));
   446                              mCollectionId));
   590 }
   447 }
   591 
   448 
   592 /*!
   449 /*!
   593  Menu softkey back action slot
       
   594  */
       
   595 void HsCollectionState::backSteppingAction()
       
   596 {
       
   597     machine()->postEvent(HsMenuEventFactory::createOpenAppLibraryEvent());
       
   598 }
       
   599 
       
   600 /*!
       
   601  Updates label
   450  Updates label
   602  */
   451  */
   603 void HsCollectionState::updateLabel()
   452 void HsCollectionState::updateLabel()
   604 {
   453 {
   605     HSMENUTEST_FUNC_ENTRY("HsCollectionState::updateLabel");
   454     HSMENUTEST_FUNC_ENTRY("HsCollectionState::updateLabel");
   606     if (mCollectionModel) {
   455     if (mModel) {
   607         mMenuView.viewLabel()->setHeading(
   456         mMenuView->viewLabel()->setHeading(
   608             mCollectionModel->root().data(Qt::DisplayRole).toString());
   457             mModel->root().data(Qt::DisplayRole).toString());
   609     }
   458     }
   610     HSMENUTEST_FUNC_EXIT("HsCollectionState::updateLabel");
   459     HSMENUTEST_FUNC_EXIT("HsCollectionState::updateLabel");
   611 }
   460 }
   612 
   461 
   613 /*!
   462 /*!
   614   Triggers event so that a state adding to Home Screen is reached
   463   Triggers event so that a state adding to Home Screen is reached
   615   \param index of an item to be added to homescreen
   464   \param index of an item to be added to homescreen.
   616   \retval void
   465   \retval void
   617  */
   466  */
   618 void HsCollectionState::addElementToHomeScreen(const QModelIndex &index)
   467 void HsCollectionState::addElementToHomeScreen(const QModelIndex &index)
   619 {
   468 {
   620     QSharedPointer<const CaEntry> entry = mCollectionModel->entry(index);
   469     QSharedPointer<const CaEntry> entry = mModel->entry(index);
   621 
   470 
   622     QMap<QString, QString> attributes = entry->attributes();
   471     QMap<QString, QString> attributes = entry->attributes();
   623 
   472 
   624     machine()->postEvent(
   473     machine()->postEvent(
   625         HsMenuEventFactory::createAddToHomeScreenEvent(
   474         HsMenuEventFactory::createAddToHomeScreenEvent(
   626             entry->id(), mMenuMode.getHsMenuMode(), mMenuMode.getHsToken()));
   475             entry->id(), mMenuMode->getHsMenuMode(), mMenuMode->getHsToken()));
       
   476 }
       
   477 
       
   478 /*!
       
   479  Method seting context menu options.
       
   480  */
       
   481 void HsCollectionState::setContextMenuOptions(HbAbstractViewItem *item, EntryFlags flags)
       
   482 {
       
   483     HbAction *addShortcutAction = mContextMenu->addAction(hbTrId(
       
   484                                       "txt_applib_menu_add_to_home_screen"));
       
   485     addShortcutAction->setData(AddToHomeScreenContextAction);
       
   486     HbAction *addToCollection = mContextMenu->addAction(hbTrId(
       
   487                                     "txt_applib_menu_add_to_collection"));
       
   488     addToCollection->setData(AddToCollectionContextAction);
       
   489     HbAction *removeAction(NULL);
       
   490     HbAction *uninstallAction(NULL);
       
   491     HbAction *appSettingsAction(NULL);
       
   492     HbAction *appDetailsAction(NULL);
       
   493     // we do not add remove option in locked collection
       
   494     // check conditions and hide irrelevant menu items
       
   495     EntryFlags rootFlags =
       
   496         mModel->root().data(CaItemModel::FlagsRole).value<
       
   497         EntryFlags> ();
       
   498 
       
   499     if (rootFlags & RemovableEntryFlag) {
       
   500         removeAction = mContextMenu->addAction(
       
   501                            hbTrId("txt_applib_menu_remove_from_collection"));
       
   502         removeAction->setData(RemoveFromCollectionContextAction);
       
   503     }
       
   504 
       
   505     if ((flags & RemovableEntryFlag)) {
       
   506         uninstallAction = mContextMenu->addAction(hbTrId("txt_common_menu_delete"));
       
   507         uninstallAction->setData(UninstallContextAction);
       
   508     }
       
   509     QSharedPointer<const CaEntry> entry = mModel->entry(item->modelIndex());
       
   510 
       
   511     if (!(entry->attribute(appSettingsPlugin()).isEmpty())) {
       
   512         appSettingsAction = mContextMenu->addAction(hbTrId(
       
   513                                                 "txt_common_menu_settings"));
       
   514         appSettingsAction->setData(AppSettingContextAction);
       
   515     }
       
   516 
       
   517     if (!(entry->attribute(componentIdAttributeName()).isEmpty()) &&
       
   518             (flags & RemovableEntryFlag) ) {
       
   519         appDetailsAction = mContextMenu->addAction(hbTrId(
       
   520                                                 "txt_common_menu_details"));
       
   521         appDetailsAction->setData(AppDetailsContextAction);
       
   522     }
   627 }
   523 }
   628 
   524 
   629 /*!
   525 /*!
   630   A Slot called when an action for sorting (latest
   526   A Slot called when an action for sorting (latest
   631   on top) is invoked for Downloaded collection.
   527   on top) is invoked for Downloaded collection.
   632  */
   528  */
   633 void HsCollectionState::latestOnTopMenuAction()
   529 void HsCollectionState::latestOnTopMenuAction()
   634 {
   530 {
   635     mSortAttribute = LatestOnTopHsSortAttribute;
   531     mSortAttribute = LatestOnTopHsSortAttribute;
   636     mCollectionModel->setSort(mSortAttribute);
   532     mModel->setSort(mSortAttribute);
   637     emit sortOrderChanged(mSortAttribute);
   533     emit sortOrderChanged(mSortAttribute);
   638 }
   534 }
   639 
   535 
   640 /*!
   536 /*!
   641   A Slot called when an action for sorting (oldest
   537   A Slot called when an action for sorting (oldest
   642   on top) is invoked for Downloaded collection.
   538   on top) is invoked for Downloaded collection.
   643  */
   539  */
   644 void HsCollectionState::oldestOnTopMenuAction()
   540 void HsCollectionState::oldestOnTopMenuAction()
   645 {
   541 {
   646     mSortAttribute = OldestOnTopHsSortAttribute;
   542     mSortAttribute = OldestOnTopHsSortAttribute;
   647     mCollectionModel->setSort(mSortAttribute);
   543     mModel->setSort(mSortAttribute);
   648     emit sortOrderChanged(mSortAttribute);
   544     emit sortOrderChanged(mSortAttribute);
   649 }
   545 }
   650 
   546 
   651 /*!
   547 /*!
   652   Slot for setting all collections sort order
   548   A Slot called when an arrange operation
   653   \param sortOrder all collections sort order
   549   is invoked for a static collection.
   654  */
   550  */
   655 void HsCollectionState::collectionsSortOrder(
   551 void HsCollectionState::createArrangeCollection()
   656     HsSortAttribute sortOrder)
   552 {
   657 {
   553     // Arrange collection via the Arrange view
   658     mCollectionsSortAttribute = sortOrder;
   554     int topItemId(0);
   659 }
   555 
       
   556     const QList<HbAbstractViewItem *> array =
       
   557         mMenuView->listView()->visibleItems();
       
   558 
       
   559     if (array.count() >= 1) {
       
   560         QModelIndex idx = array[0]->modelIndex();
       
   561         topItemId = idx.data(CaItemModel::IdRole).toInt();
       
   562     }
       
   563 
       
   564     machine()->postEvent(
       
   565         HsMenuEventFactory::createArrangeCollectionEvent(
       
   566             topItemId,
       
   567             mCollectionId));
       
   568 }