emailuis/nmailui/src/nmmessagelistview.cpp
changeset 27 9ba4404ef423
parent 23 2dc6caa42ec3
child 30 759dc5235cdb
equal deleted inserted replaced
23:2dc6caa42ec3 27:9ba4404ef423
    17 
    17 
    18 static const char *NMUI_MESSAGE_LIST_VIEW_XML = ":/docml/nmmessagelistview.docml";
    18 static const char *NMUI_MESSAGE_LIST_VIEW_XML = ":/docml/nmmessagelistview.docml";
    19 static const char *NMUI_MESSAGE_LIST_VIEW = "NmMessageListView";
    19 static const char *NMUI_MESSAGE_LIST_VIEW = "NmMessageListView";
    20 static const char *NMUI_MESSAGE_LIST_TREE_LIST = "MessageTreeList";
    20 static const char *NMUI_MESSAGE_LIST_TREE_LIST = "MessageTreeList";
    21 static const char *NMUI_MESSAGE_LIST_NO_MESSAGES = "MessageListNoMessages";
    21 static const char *NMUI_MESSAGE_LIST_NO_MESSAGES = "MessageListNoMessages";
    22 static const char *NMUI_MESSAGE_LIST_FOLDER_LABEL = "folderLabel";
    22 static const char *NMUI_MESSAGE_LIST_FOLDER_LABEL = "labelGroupBox";
    23 static const char *NMUI_MESSAGE_LIST_SYNC_ICON = "syncIcon";
    23 static const char *NMUI_MESSAGE_LIST_SYNC_ICON = "syncIcon";
    24 
    24 
    25 #include "nmuiheaders.h"
    25 #include "nmuiheaders.h"
    26 
    26 
    27 /*!
    27 /*!
    38     NmUiEngine &uiEngine,
    38     NmUiEngine &uiEngine,
    39     NmMailboxListModel &mailboxListModel,
    39     NmMailboxListModel &mailboxListModel,
    40     NmMessageListModel &messageListModel,
    40     NmMessageListModel &messageListModel,
    41     HbDocumentLoader *documentLoader,
    41     HbDocumentLoader *documentLoader,
    42     QGraphicsItem *parent)
    42     QGraphicsItem *parent)
    43 : NmBaseView(startParam, parent),
    43 : NmBaseView(startParam, application, parent),
    44 mApplication(application),
    44 mApplication(application),
    45 mMessageListWidget(NULL),
    45 mMessageListWidget(NULL),
    46 mUiEngine(uiEngine),
    46 mUiEngine(uiEngine),
    47 mMailboxListModel(mailboxListModel),
    47 mMailboxListModel(mailboxListModel),
    48 mMessageListModel(messageListModel),
    48 mMessageListModel(messageListModel),
    51 mLongPressedItem(NULL),
    51 mLongPressedItem(NULL),
    52 mNoMessagesLabel(NULL),
    52 mNoMessagesLabel(NULL),
    53 mFolderLabel(NULL),
    53 mFolderLabel(NULL),
    54 mSyncIcon(NULL),
    54 mSyncIcon(NULL),
    55 mViewReady(false),
    55 mViewReady(false),
    56 mCurrentFolderType(NmFolderInbox)
    56 mCurrentFolderType(NmFolderInbox),
       
    57 mSettingsLaunched(false)
    57 {
    58 {
    58     // Load view layout
    59     // Load view layout
    59     loadViewLayout();
    60     loadViewLayout();
    60     // Init tree view
    61     // Init tree view
    61     initTreeView();
    62     initTreeView();
   117         }
   118         }
   118         else{
   119         else{
   119             NMLOG("nmailui: (no messages) object loading failed");
   120             NMLOG("nmailui: (no messages) object loading failed");
   120         }
   121         }
   121 
   122 
   122         // Create folder label and set inbox text for it
   123         mFolderLabel = qobject_cast<HbGroupBox *>(mDocumentLoader->findWidget(NMUI_MESSAGE_LIST_FOLDER_LABEL));
   123         mFolderLabel = qobject_cast<HbLabel *>(mDocumentLoader->findWidget(NMUI_MESSAGE_LIST_FOLDER_LABEL));
   124 
   124 
   125         // Disable the old sync icon implementation for the time being
   125         mSyncIcon = qobject_cast<HbLabel *>(mDocumentLoader->findWidget(NMUI_MESSAGE_LIST_SYNC_ICON));
   126         mSyncIcon = qobject_cast<HbLabel *>(mDocumentLoader->findWidget(NMUI_MESSAGE_LIST_SYNC_ICON));
   126         if (mSyncIcon) {
   127         if (mSyncIcon) {
   127             mSyncIcon->setIcon(NmIcons::getIcon(NmIcons::NmIconOffline));
   128             mSyncIcon->setIcon(NmIcons::getIcon(NmIcons::NmIconOffline));
   128         }
   129         }
   129 
   130 
   155         //create toolbar
   156         //create toolbar
   156         createToolBar();
   157         createToolBar();
   157         // Refresh list
   158         // Refresh list
   158         QMetaObject::invokeMethod(this, "refreshList", Qt::QueuedConnection);
   159         QMetaObject::invokeMethod(this, "refreshList", Qt::QueuedConnection);
   159         mViewReady=true;
   160         mViewReady=true;
       
   161     }
       
   162     mSettingsLaunched = false;
       
   163 }
       
   164 
       
   165 /*!
       
   166     Getter for currently displayed folder type
       
   167 */
       
   168 NmFolderType NmMessageListView::folderType()
       
   169 {
       
   170     return mCurrentFolderType;
       
   171 }
       
   172 
       
   173 /*!
       
   174     okToExitView. Message list view determines whether it is 
       
   175     ok to exit view and calls mapplication popview.
       
   176 */
       
   177 void NmMessageListView::okToExitView()
       
   178 {
       
   179     // Close view if current folder is inbox
       
   180     if (mCurrentFolderType==NmFolderInbox){
       
   181         mApplication.popView();
       
   182     }
       
   183     // Switch to inbox 
       
   184     else{
       
   185         NmId mailboxId = mStartParam->mailboxId();
       
   186         NmId folderId = mUiEngine.standardFolderId(mailboxId,NmFolderInbox);
       
   187         folderSelected(mailboxId,folderId);
   160     }
   188     }
   161 }
   189 }
   162 
   190 
   163 /*!
   191 /*!
   164     initTreeView
   192     initTreeView
   198         // Update the model with new parameters
   226         // Update the model with new parameters
   199         mUiEngine.messageListModel(startParam->mailboxId(), startParam->folderId());
   227         mUiEngine.messageListModel(startParam->mailboxId(), startParam->folderId());
   200         refreshList();
   228         refreshList();
   201         // Refresh the mailboxname
   229         // Refresh the mailboxname
   202         setMailboxName();
   230         setMailboxName();
   203         // Show message list if it is hidden
       
   204         mMessageListWidget->show();
       
   205     }
   231     }
   206     else {
   232     else {
   207         NMLOG("nmailui: Invalid message list start parameter");
   233         NMLOG("nmailui: Invalid message list start parameter");
   208         // Unused start parameter needs to be deleted
   234         // Unused start parameter needs to be deleted
   209         delete startParam;
   235         delete startParam;
   237                 mSyncIcon->setIcon(NmIcons::getIcon(NmIcons::NmIconOffline));
   263                 mSyncIcon->setIcon(NmIcons::getIcon(NmIcons::NmIconOffline));
   238             }
   264             }
   239         }
   265         }
   240     }
   266     }
   241 
   267 
       
   268     // In each refresh, e.g. in folder change the UI signals
       
   269     // lower layer about the folder that has been opened.
       
   270     if (mStartParam){
       
   271         mUiEngine.updateActiveFolder(mailboxId, mStartParam->folderId());
       
   272     }
       
   273 
       
   274     // Set item model to message list widget
   242     if (mMessageListWidget) {
   275     if (mMessageListWidget) {
   243         mMessageListWidget->setModel(static_cast<QStandardItemModel*>(&mMessageListModel));
   276         mMessageListWidget->setModel(static_cast<QStandardItemModel*>(&mMessageListModel));
   244         QObject::connect(&mMessageListModel, SIGNAL(rowsInserted(const QModelIndex&,int,int)),
   277         QObject::connect(&mMessageListModel, SIGNAL(rowsInserted(const QModelIndex&,int,int)),
   245                 this, SLOT(itemsAdded(const QModelIndex&,int,int)));
   278                 this, SLOT(itemsAdded(const QModelIndex&,int,int)));
   246         QObject::connect(&mMessageListModel, SIGNAL(rowsRemoved(const QModelIndex&,int,int)),
   279         QObject::connect(&mMessageListModel, SIGNAL(rowsRemoved(const QModelIndex&,int,int)),
   252             showNoMessagesText();
   285             showNoMessagesText();
   253         }
   286         }
   254     }
   287     }
   255 }
   288 }
   256 
   289 
       
   290 /*!
       
   291     Sync state event handling
       
   292 */
   257 void NmMessageListView::handleSyncStateEvent(NmSyncState syncState, const NmId & mailboxId)
   293 void NmMessageListView::handleSyncStateEvent(NmSyncState syncState, const NmId & mailboxId)
   258 {
   294 {
   259     if (mSyncIcon && mailboxId == mMessageListModel.currentMailboxId()) {
   295     if (mSyncIcon && mailboxId == mMessageListModel.currentMailboxId()) {
   260         if (syncState == Synchronizing) {
   296         if (syncState == Synchronizing) {
   261             mSyncIcon->setIcon(NmIcons::getIcon(NmIcons::NmIconSynching));
   297             mSyncIcon->setIcon(NmIcons::getIcon(NmIcons::NmIconSynching));
       
   298             // before first sync inbox id might be zero
       
   299             if (mStartParam->folderId() == 0) {
       
   300                 // after sync inbox id should be updated to correct value
       
   301                 NmId folderId = mUiEngine.standardFolderId(
       
   302                     mStartParam->mailboxId(),
       
   303                     NmFolderInbox);
       
   304                 mStartParam->setFolderId(folderId);
       
   305             }
   262         }
   306         }
   263         else {
   307         else {
   264             if (mUiEngine.connectionState(mailboxId) == Connected) {
   308             if (mUiEngine.connectionState(mailboxId) == Connected) {
   265                 mSyncIcon->setIcon(NmIcons::getIcon(NmIcons::NmIconOnline));
   309                 mSyncIcon->setIcon(NmIcons::getIcon(NmIcons::NmIconOnline));
   266             }
   310             }
   289 /*!
   333 /*!
   290     folder selection handling within current mailbox
   334     folder selection handling within current mailbox
   291 */
   335 */
   292 void NmMessageListView::folderSelected(NmId mailbox, NmId folder)
   336 void NmMessageListView::folderSelected(NmId mailbox, NmId folder)
   293 {
   337 {
   294     // Reloas view contents with new startparams
   338     // Reload view contents with new startparams if mailbox or folder
   295     if (mStartParam){
   339     // id is different than current values.
   296         NmUiStartParam* startParam = new NmUiStartParam(NmUiViewMessageList,mailbox,folder);
   340     if (mStartParam && (mStartParam->mailboxId()!=mailbox||mStartParam->folderId()!=folder)){
   297         // Hide message lis for redraw
   341         // Create start params
   298         mMessageListWidget->hide();
   342         NmUiStartParam* startParam = new NmUiStartParam(NmUiViewMessageList,mailbox,folder);    
       
   343         // Store active folder type
       
   344         mCurrentFolderType = mUiEngine.folderTypeById(startParam->mailboxId(),startParam->folderId());  
   299         // Reload view, ownership of the startparams is passed and old startparams
   345         // Reload view, ownership of the startparams is passed and old startparams
   300         // are deleted within reloadViewContents function
   346         // are deleted within reloadViewContents function
   301         reloadViewContents(startParam);
   347         reloadViewContents(startParam);
   302         //Set folder text to status bar
   348         //Set folder text to status bar
   303         setFolderName();
   349         setFolderName();
   304         // Store active folder type
       
   305         mCurrentFolderType = NmFolderInbox;
       
   306     }
   350     }
   307 }
   351 }
   308 
   352 
   309 
   353 
   310 /*!
   354 /*!
   311     Long keypress handling
   355     Long keypress handling
   312 */
   356 */
   313 void NmMessageListView::showItemContextMenu(HbAbstractViewItem *listViewItem, const QPointF &coords)
   357 void NmMessageListView::showItemContextMenu(HbAbstractViewItem *listViewItem, const QPointF &coords)
   314 {
   358 {
   315     // Store long press item for later use with response
   359     if (listViewItem) {
   316     mLongPressedItem = mMessageListModel.data(
   360         // Store long press item for later use with response
   317             listViewItem->modelIndex(), Qt::DisplayRole).value<NmMessageListModelItem*>();
   361         mLongPressedItem = mMessageListModel.data(
   318     if (mItemContextMenu && mLongPressedItem && mLongPressedItem->itemType() ==
   362                 listViewItem->modelIndex(), Qt::DisplayRole).value<NmMessageListModelItem*>();
   319         NmMessageListModelItem::NmMessageItemMessage) {
   363         if (mItemContextMenu && mLongPressedItem && mLongPressedItem->itemType() ==
   320 
   364             NmMessageListModelItem::NmMessageItemMessage) {
   321         // Clear previous items from context menu
   365     
   322         mItemContextMenu->clearActions();
   366             // Clear previous items from context menu
   323         NmUiExtensionManager &extMngr = mApplication.extManager();
   367             mItemContextMenu->clearActions();
   324         QList<NmAction*> list;
   368             NmUiExtensionManager &extMngr = mApplication.extManager();
   325         // Fetch items from extension based on item
   369             QList<NmAction*> list;
   326         NmMessageEnvelope *envelope = mLongPressedItem->envelopePtr();
   370             // Fetch items from extension based on item
   327         if (envelope){
   371             NmMessageEnvelope *envelope = mLongPressedItem->envelopePtr();
   328             NmActionRequest request(this, NmActionContextMenu, NmActionContextViewMessageList,
   372             if (envelope){
   329                     NmActionContextDataMessage, mStartParam->mailboxId(), mStartParam->folderId(),
   373                 NmActionRequest request(this, NmActionContextMenu, NmActionContextViewMessageList,
   330                     envelope->messageId(),QVariant::fromValue(envelope));
   374                         NmActionContextDataMessage, mStartParam->mailboxId(), mStartParam->folderId(),
   331             extMngr.getActions(request, list);
   375                         envelope->messageId(),QVariant::fromValue(envelope));
   332         }
   376                 extMngr.getActions(request, list);
   333         else{
   377                 for (int i=0;i<list.count();i++) {
   334             NmActionRequest request(this, NmActionContextMenu, NmActionContextViewMessageList,
   378                     mItemContextMenu->addAction(list[i]);
   335                     NmActionContextDataMessage, mStartParam->mailboxId(), mStartParam->folderId(),
   379                 }
   336                     envelope->messageId());
   380 			    mItemContextMenu->setPreferredPos(coords);
   337             extMngr.getActions(request, list);
   381                 mItemContextMenu->open();
   338         }
   382             }
   339         for (int i=0;i<list.count();i++) {
       
   340             mItemContextMenu->addAction(list[i]);
       
   341         }
       
   342         mItemContextMenu->setPreferredPos(coords);
       
   343         mItemContextMenu->open(this, SLOT(contextButton(NmActionResponse&)));
       
   344     }
       
   345 }
       
   346 
       
   347 /*!
       
   348     Slot. Signaled when menu option is selected
       
   349 */
       
   350 void NmMessageListView::contextButton(NmActionResponse &result)
       
   351 {
       
   352     // Handle context menu commands here
       
   353     if (result.menuType()==NmActionContextMenu){
       
   354         switch (result.responseCommand()){
       
   355            case NmActionResponseCommandOpen:{
       
   356                if (mLongPressedItem){
       
   357                    NmUiStartParam *startParam = new NmUiStartParam(NmUiViewMessageViewer,
       
   358                        mStartParam->mailboxId(), mStartParam->folderId(),
       
   359                        mLongPressedItem->envelope().messageId());
       
   360                    mApplication.enterNmUiView(startParam);
       
   361                    mLongPressedItem=NULL;
       
   362                    }
       
   363                }
       
   364                break;
       
   365            //temporary solution..
       
   366            case NmActionResponseCommandForward:{
       
   367                 if (mLongPressedItem){
       
   368                    NmUiStartParam *startParam = new NmUiStartParam(NmUiViewMessageEditor,
       
   369                        mStartParam->mailboxId(), mStartParam->folderId(),
       
   370                        mLongPressedItem->envelope().messageId());
       
   371                    mApplication.enterNmUiView(startParam);
       
   372                    mLongPressedItem=NULL;
       
   373                    }
       
   374                }
       
   375                break;
       
   376            default:
       
   377                break;
       
   378         }
   383         }
   379     }
   384     }
   380 }
   385 }
   381 
   386 
   382 /*!
   387 /*!
   407         else {
   412         else {
   408             mMessageListWidget->setExpanded(mActivatedIndex, false);
   413             mMessageListWidget->setExpanded(mActivatedIndex, false);
   409             modelItem->setExpanded(false);
   414             modelItem->setExpanded(false);
   410         }
   415         }
   411     } 
   416     } 
   412     if (modelItem && modelItem->itemType() == NmMessageListModelItem::NmMessageItemMessage)
   417     if (modelItem && modelItem->itemType() == NmMessageListModelItem::NmMessageItemMessage
       
   418         && !mSettingsLaunched)
   413     {
   419     {
   414         NmFolderType folderType = mUiEngine.folderTypeById(mStartParam->mailboxId(),
   420         NmFolderType folderType = mUiEngine.folderTypeById(mStartParam->mailboxId(),
   415                                   mStartParam->folderId());
   421                                   mStartParam->folderId());
   416         if (folderType==NmFolderDrafts){
   422         if (folderType==NmFolderDrafts){
   417             NmUiStartParam *startParam = new NmUiStartParam(NmUiViewMessageEditor,
   423             NmUiStartParam *startParam = new NmUiStartParam(NmUiViewMessageEditor,
   469             case NmActionResponseCommandUpdateMailboxName: {
   475             case NmActionResponseCommandUpdateMailboxName: {
   470                 setMailboxName();
   476                 setMailboxName();
   471                 break;
   477                 break;
   472             }
   478             }
   473             case NmActionResponseCommandMailboxDeleted: {
   479             case NmActionResponseCommandMailboxDeleted: {
   474                 mApplication.popView();
   480                 mApplication.prepareForPopView();
   475 				break;
   481 				break;
   476             }
   482             }
   477             case NmActionResponseCommandSwitchFolder: {
   483             case NmActionResponseCommandSwitchFolder: {
   478                 folderSelected(actionResponse.mailboxId(), actionResponse.folderId());
   484                 folderSelected(actionResponse.mailboxId(), actionResponse.folderId());
   479                 break;
   485                 break;
   480             }
   486             }
       
   487             case NmActionResponseCommandSettings: {
       
   488                 mSettingsLaunched = true;
       
   489                 break;
       
   490             }
   481             default: {
   491             default: {
   482                 break;
   492                 break;
   483             }
   493             }
   484         }
   494         }
   485     }
   495     }
       
   496     
       
   497     // Handle context menu commands here
       
   498     else if (actionResponse.menuType()==NmActionContextMenu){
       
   499         switch (actionResponse.responseCommand()){
       
   500            case NmActionResponseCommandOpen:{
       
   501                if (mLongPressedItem){
       
   502                    NmUiStartParam *startParam = new NmUiStartParam(NmUiViewMessageViewer,
       
   503                        mStartParam->mailboxId(), mStartParam->folderId(),
       
   504                        mLongPressedItem->envelope().messageId());
       
   505                    mApplication.enterNmUiView(startParam);
       
   506                    mLongPressedItem=NULL;
       
   507                    }
       
   508                }
       
   509                break;
       
   510            default:
       
   511                break;
       
   512         }
       
   513     }
       
   514     
   486     // Handle toolbar commands here
   515     // Handle toolbar commands here
   487     else if ( actionResponse.menuType() == NmActionToolbar ) {
   516     else if ( actionResponse.menuType() == NmActionToolbar ) {
   488         if ( actionResponse.responseCommand() == NmActionResponseCommandNewMail ) {
   517         if ( actionResponse.responseCommand() == NmActionResponseCommandNewMail ) {
   489             // Check that given start response has mailbox and folder id's
   518             // Check that given start response has mailbox and folder id's
   490             if (actionResponse.mailboxId()!=0){
   519             if (actionResponse.mailboxId()!=0){
   579 
   608 
   580 /*!
   609 /*!
   581     setFolderName. Function sets folder name to status bar
   610     setFolderName. Function sets folder name to status bar
   582 */
   611 */
   583 void NmMessageListView::setFolderName()
   612 void NmMessageListView::setFolderName()
   584 {
   613 {   
   585     if (mStartParam && mFolderLabel) {
   614     if (mStartParam&&mFolderLabel){
   586         switch (mUiEngine.folderTypeById(mStartParam->mailboxId(),
   615         switch (mCurrentFolderType) {
   587                 mStartParam->folderId())) {
       
   588         case NmFolderOutbox:
   616         case NmFolderOutbox:
   589             {
   617             {
   590             mFolderLabel->setPlainText(hbTrId("txt_mail_subhead_outbox"));
   618             mFolderLabel->setHeading(hbTrId("txt_mail_subhead_outbox"));
   591             }
   619             }
   592             break;
   620             break;
   593         case NmFolderDrafts:
   621         case NmFolderDrafts:
   594             {
   622             {
   595             mFolderLabel->setPlainText(hbTrId("txt_mail_subhead_drafts"));
   623             mFolderLabel->setHeading(hbTrId("txt_mail_subhead_drafts"));
   596             }
   624             }
   597             break;
   625             break;
   598         case NmFolderSent:
   626         case NmFolderSent:
   599             {
   627             {
   600             mFolderLabel->setPlainText(hbTrId("txt_mail_subhead_sent_items"));
   628             mFolderLabel->setHeading(hbTrId("txt_mail_subhead_sent_items"));
   601             }
   629             }
   602             break;
   630             break;
   603         case NmFolderDeleted:
   631         case NmFolderDeleted:
   604             {
   632             {
   605             mFolderLabel->setPlainText(hbTrId("txt_mail_subhead_deleted_items"));
   633             mFolderLabel->setHeading(hbTrId("txt_mail_subhead_deleted_items"));
   606             }
   634             }
   607             break;
   635             break;
   608         case NmFolderInbox:
   636         case NmFolderInbox:
   609         default:
   637         default:
   610             {
   638             {
   611             mFolderLabel->setPlainText(hbTrId("txt_mail_subhead_inbox"));
   639             mFolderLabel->setHeading(hbTrId("txt_mail_subhead_inbox"));
   612             }
   640             }
   613             break;
   641             break;        
   614         }
   642         }       
   615     }
   643     }
   616 }
   644 }
   617 
   645 
   618 /*!
   646 /*!
   619     Observe items added
   647     Observe items added