phonebookui/pbkcommonui/src/cntgroupmemberview.cpp
changeset 59 a642906a277a
parent 47 7cbcb2896f0e
child 65 ae724a111993
equal deleted inserted replaced
47:7cbcb2896f0e 59:a642906a277a
    14 * Description:
    14 * Description:
    15 *
    15 *
    16 */
    16 */
    17 
    17 
    18 #include "cntgroupmemberview.h"
    18 #include "cntgroupmemberview.h"
    19 #include "cntfetchcontactsview.h"
    19 #include "cntgroupmemberview_p.h"
    20 #include "cntcontactcardheadingitem.h"
    20 #include "cntabstractviewmanager.h"
    21 #include "cntglobal.h"
       
    22 #include "cntimagelabel.h"
       
    23 #include "cntimageutility.h"
       
    24 #include <hbnotificationdialog.h>
       
    25 #include <hbmessagebox.h>
       
    26 #include <hbmenu.h>
       
    27 #include <hblistview.h>
       
    28 #include <hblistviewitem.h>
       
    29 #include <hbframebackground.h>
       
    30 #include <hbindexfeedback.h>
       
    31 #include <hbscrollbar.h>
       
    32 #include <hbview.h>
       
    33 #include <hbaction.h>
       
    34 #include <hblabel.h>
       
    35 #include <hbparameterlengthlimiter.h>
       
    36 #include <thumbnailmanager_qt.h>
       
    37 #include <cntlistmodel.h>
       
    38 #include <hbmainwindow.h>
       
    39 
       
    40 #include "cntdocumentloader.h"
       
    41 
       
    42 const char *CNT_GROUPMEMBERVIEW_XML = ":/xml/contacts_groupmembers.docml";
       
    43 
    21 
    44 /*!
    22 /*!
    45 \class CntGroupMemberView
    23 \class CntGroupMemberView
    46 \brief
    24 \brief
    47 
    25 
    54 /*!
    32 /*!
    55 Constructor, initialize member variables.
    33 Constructor, initialize member variables.
    56 \a viewManager is the parent that creates this view. \a parent is a pointer to parent QGraphicsItem (by default this is 0)
    34 \a viewManager is the parent that creates this view. \a parent is a pointer to parent QGraphicsItem (by default this is 0)
    57 
    35 
    58 */
    36 */
    59 CntGroupMemberView::CntGroupMemberView() :
    37 CntGroupMemberView::CntGroupMemberView() : d_ptr(new CntGroupMemberViewPrivate())
    60     mGroupContact(NULL),
       
    61     mViewManager(NULL),
       
    62     mHeadingItem(NULL),
       
    63     mModel(NULL),
       
    64     mImageLabel(NULL), 
       
    65     mListView(NULL),
       
    66     mFetchView(NULL),
       
    67     mAvatar(NULL)
       
    68 {
    38 {
    69     mDocument = new CntDocumentLoader;
    39     Q_D( CntGroupMemberView );
    70     
    40     d->q_ptr = this;
    71     bool ok;
       
    72     mDocument->load( CNT_GROUPMEMBERVIEW_XML, &ok );
       
    73     if ( !ok ){
       
    74         qFatal( "Unable to load %S", CNT_GROUPMEMBERVIEW_XML );
       
    75     }
       
    76 
       
    77     mView = static_cast<HbView*>( mDocument->findWidget("view") );
       
    78     
       
    79     //back button
       
    80     mSoftkey = new HbAction(Hb::BackNaviAction, mView);
       
    81     connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView()));
       
    82     
       
    83     mImageLabel = static_cast<CntImageLabel*>(mDocument->findWidget("editViewImage"));
       
    84     connect( mImageLabel, SIGNAL(iconClicked()), this, SLOT(openImageEditor()) );
       
    85     connect( mImageLabel, SIGNAL(iconLongPressed(const QPointF&)), this, SLOT(drawImageMenu(const QPointF&)) );
       
    86     
       
    87     mListView = static_cast<HbListView*>( mDocument->findWidget("listView") );
       
    88     connect(mListView, SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), this,
       
    89         SLOT(showContextMenu(HbAbstractViewItem*,QPointF)));
       
    90     connect(mListView, SIGNAL(activated (const QModelIndex&)), this,
       
    91         SLOT(showContactView(const QModelIndex&)));
       
    92     
       
    93     mHeadingItem = static_cast<CntContactCardHeadingItem*>( mDocument->findWidget("editViewHeading") );
       
    94     connect(mHeadingItem, SIGNAL(passShortPressed(const QPointF&)), this, SLOT(openImageEditor()) );
       
    95     connect(mHeadingItem, SIGNAL(passLongPressed(const QPointF&)), this, SLOT(drawImageMenu(const QPointF&)));
       
    96 
       
    97     // menu actions
       
    98     mEditGroupAction = static_cast<HbAction*>( mDocument->findObject("cnt:editgroupdetails"));
       
    99     connect(mEditGroupAction, SIGNAL(triggered()), this, SLOT(editGroup()));
       
   100     
       
   101     // toolbar actions
       
   102     mManageAction = static_cast<HbAction*>( mDocument->findObject("cnt:managemembers"));
       
   103     connect(mManageAction, SIGNAL(triggered()), this, SLOT(manageMembers()));
       
   104     mDeleteAction = static_cast<HbAction*>( mDocument->findObject("cnt:deletegroup"));
       
   105     connect(mDeleteAction, SIGNAL(triggered()), this, SLOT(deleteGroup()));
       
   106     mShowActionsAction = static_cast<HbAction*>( mDocument->findObject("cnt:groupactions"));
       
   107     connect(mShowActionsAction, SIGNAL(triggered()), this, SLOT(openGroupActions()));
       
   108     
       
   109     // thumbnail manager
       
   110     mThumbnailManager = new ThumbnailManager(this);
       
   111     mThumbnailManager->setMode(ThumbnailManager::Default);
       
   112     mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality);
       
   113     mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailLarge);
       
   114    
       
   115     connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)),
       
   116                this, SLOT(thumbnailReady(QPixmap, void*, int, int)));
       
   117 }
    41 }
   118 
    42 
   119 /*!
       
   120 Destructor
       
   121 */
       
   122 CntGroupMemberView::~CntGroupMemberView()
    43 CntGroupMemberView::~CntGroupMemberView()
   123 {
    44 {
   124     mView->deleteLater();
    45     Q_D(CntGroupMemberView);
       
    46     delete d;
       
    47 }
   125     
    48     
   126     delete mGroupContact;
       
   127     mGroupContact = 0;
       
   128     
       
   129     delete mModel;
       
   130     mModel = 0;
       
   131     
       
   132     delete mFetchView;
       
   133     mFetchView = 0;
       
   134     
       
   135     delete mAvatar;
       
   136     mAvatar = NULL;
       
   137 }
       
   138 
       
   139 void CntGroupMemberView::setOrientation(Qt::Orientation orientation)
       
   140 {
       
   141     if (orientation == Qt::Vertical) 
       
   142     {
       
   143         // reading "portrait" section
       
   144         mDocument->load( CNT_GROUPMEMBERVIEW_XML, "portrait" );
       
   145     } 
       
   146     else 
       
   147     {
       
   148         // reading "landscape" section
       
   149         mDocument->load( CNT_GROUPMEMBERVIEW_XML, "landscape" );
       
   150     }
       
   151 }
       
   152 
       
   153 void CntGroupMemberView::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs )
    49 void CntGroupMemberView::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs )
   154 {
    50 {
   155     mViewManager = aMgr;
    51     Q_D(CntGroupMemberView);
   156     mArgs = aArgs;
    52     d->activate(aMgr,aArgs);
   157     
       
   158     if (mView->navigationAction() != mSoftkey)
       
   159         {
       
   160         mView->setNavigationAction(mSoftkey);   
       
   161         }
       
   162         
       
   163     QVariant contact = mArgs.value( ESelectedGroupContact );
       
   164     mGroupContact = new QContact( contact.value<QContact>() );
       
   165     
       
   166     HbMainWindow* window = mView->mainWindow();
       
   167     if ( window )
       
   168     {
       
   169         connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation)));
       
   170         setOrientation(window->orientation());
       
   171     }
       
   172     
       
   173     mHeadingItem->setGroupDetails(mGroupContact);
       
   174 
       
   175     // avatar
       
   176     QList<QContactAvatar> details = mGroupContact->details<QContactAvatar>();
       
   177     for (int i = 0;i < details.count();i++)
       
   178     {
       
   179         if (details.at(i).imageUrl().isValid())
       
   180             {
       
   181             mAvatar = new QContactAvatar(details.at(i));
       
   182             mThumbnailManager->getThumbnail(mAvatar->imageUrl().toString());
       
   183             break;
       
   184             }
       
   185     }
       
   186     
       
   187     // create list & model
       
   188     mListView->setFrictionEnabled(true);
       
   189     mListView->setScrollingStyle(HbScrollArea::PanWithFollowOn);
       
   190     mListView->verticalScrollBar()->setInteractive(true);
       
   191     mListView->setUniformItemSizes(true);
       
   192     mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::Thumbnail);
       
   193     HbIndexFeedback *indexFeedback = new HbIndexFeedback(mView);
       
   194     indexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter);
       
   195     indexFeedback->setItemView(mListView);
       
   196 
       
   197     HbFrameBackground frame;
       
   198     frame.setFrameGraphicsName("qtg_fr_list_normal");
       
   199     frame.setFrameType(HbFrameDrawer::NinePieces);
       
   200     mListView->itemPrototypes().first()->setDefaultFrame(frame);
       
   201     
       
   202     createModel();
       
   203     
       
   204     if (mArgs.value(ESelectedAction).toString() == CNT_SAVE_ACTION)
       
   205     {
       
   206         QString name = getContactManager()->synthesizedDisplayLabel(*mGroupContact);
       
   207         HbNotificationDialog::launchDialog(HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_new_group_1_created").arg(name)));
       
   208     }
       
   209     
       
   210     mFetchView = new CntFetchContacts(*mViewManager->contactManager( SYMBIAN_BACKEND ));
       
   211     connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleManageMembers()));
       
   212 }
    53 }
   213 
    54 
   214 void CntGroupMemberView::deactivate()
    55 void CntGroupMemberView::deactivate()
   215 {
    56 {
   216     
    57     Q_D(CntGroupMemberView);
       
    58     d->deactivate();
   217 }
    59 }
   218 
    60 
   219 void CntGroupMemberView::showPreviousView()
    61 bool CntGroupMemberView::isDefault() const
   220 {
    62 {
   221     //save the contact if avatar has been changed.
    63     return false;
   222     QContact contact = mViewManager->contactManager( SYMBIAN_BACKEND )->contact(mGroupContact->localId());
       
   223     if ( contact != *mGroupContact )
       
   224     {
       
   225         getContactManager()->saveContact(mGroupContact);
       
   226     }
       
   227     mViewManager->back(mArgs);
       
   228 }
    64 }
   229 
    65 
   230 void CntGroupMemberView::openGroupActions()
    66 HbView* CntGroupMemberView::view() const
   231 {
    67 {
   232     QVariant var;
    68     Q_D( const CntGroupMemberView );
   233     var.setValue(*mGroupContact);
    69     return d->mView;
   234     
       
   235     mArgs.insert(EViewId, groupActionsView);
       
   236     mArgs.insert(ESelectedGroupContact, var);
       
   237     mViewManager->changeView(mArgs);
       
   238 }
    70 }
   239 
    71 
   240 void CntGroupMemberView::manageMembers()
    72 int CntGroupMemberView::viewId() const
   241 {
    73 {
   242     QContactRelationshipFilter membersFilter;
    74     return groupMemberView;
   243     membersFilter.setRelationshipType(QContactRelationship::HasMember);
    75 } 
   244     membersFilter.setRelatedContactRole(QContactRelationship::First);
    76 // EOF
   245     membersFilter.setRelatedContactId(mGroupContact->id());   
       
   246     mOriginalGroupMembers = getContactManager()->contactIds(membersFilter);
       
   247     
       
   248     QSet<QContactLocalId> contactsSet = mOriginalGroupMembers.toSet();
       
   249     QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName );
       
   250     QString groupName(groupContactName.value( QContactName::FieldCustomLabel ));
       
   251     
       
   252     if (!mFetchView) {
       
   253         mFetchView = new CntFetchContacts(*mViewManager->contactManager( SYMBIAN_BACKEND ));
       
   254         connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleManageMembers()));
       
   255     }
       
   256     mFetchView->setDetails(HbParameterLengthLimiter(hbTrId("txt_phob_title_members_of_1_group")).arg(groupName),
       
   257                            hbTrId("txt_common_button_save"));
       
   258     mFetchView->displayContacts(HbAbstractItemView::MultiSelection, contactsSet);
       
   259 }
       
   260 
    77 
   261 void CntGroupMemberView::handleManageMembers()
       
   262 {
       
   263     
       
   264     QSet<QContactLocalId> selectedContacts = mFetchView->getSelectedContacts();
       
   265     
       
   266     if (mFetchView->wasCanceled()) {
       
   267         delete mFetchView;
       
   268         mFetchView = 0;
       
   269         return;
       
   270     }
       
   271 
       
   272     QList<QContactRelationship> removedMemberships;
       
   273     QList<QContactRelationship> addedMemberships;
       
   274 
       
   275     QSet<QContactLocalId> removedMembers = mOriginalGroupMembers.toSet() - selectedContacts;
       
   276     setRelationship(removedMembers, removedMemberships);
       
   277 
       
   278     QSet<QContactLocalId> addedMembers = selectedContacts - mOriginalGroupMembers.toSet();
       
   279     setRelationship(addedMembers, addedMemberships);
       
   280     
       
   281     QMap<int, QContactManager::Error> errors;
       
   282     if (!addedMemberships.isEmpty()) {
       
   283         getContactManager()->saveRelationships(&addedMemberships, &errors);
       
   284     }
       
   285     
       
   286     if (!removedMemberships.isEmpty()) {
       
   287         getContactManager()->removeRelationships(removedMemberships, &errors);
       
   288     }
       
   289 }
       
   290 
       
   291 void CntGroupMemberView::createModel()
       
   292 {
       
   293     QContactRelationshipFilter rFilter;
       
   294     rFilter.setRelationshipType(QContactRelationship::HasMember);
       
   295     rFilter.setRelatedContactRole(QContactRelationship::First);
       
   296     rFilter.setRelatedContactId(mGroupContact->id());
       
   297 
       
   298     mModel = new CntListModel(getContactManager(), rFilter, false);
       
   299     mListView->setModel(mModel);
       
   300 }
       
   301 
       
   302 void CntGroupMemberView::editGroup()
       
   303 {
       
   304     mArgs.insert(EViewId, groupEditorView);
       
   305     QVariant var;
       
   306     var.setValue(*mGroupContact);
       
   307     mArgs.insert(ESelectedGroupContact, var);
       
   308     mViewManager->changeView(mArgs);
       
   309 }
       
   310 
       
   311 void CntGroupMemberView::deleteGroup()
       
   312 {
       
   313     QString groupName = mGroupContact->displayLabel();
       
   314     HbLabel *headingLabel = new HbLabel();
       
   315     headingLabel->setPlainText(HbParameterLengthLimiter(hbTrId("txt_phob_dialog_delete_1_group")).arg(groupName));
       
   316     
       
   317     HbMessageBox::question(hbTrId("txt_phob_dialog_only_group_will_be_removed_contac"), this, SLOT(handleDeleteGroup(HbAction*)),
       
   318             hbTrId("txt_common_button_delete"), hbTrId("txt_common_button_cancel"), headingLabel);
       
   319 }
       
   320 
       
   321 void CntGroupMemberView::handleDeleteGroup(HbAction *action)
       
   322 {
       
   323     HbDialog *popup = static_cast<HbDialog*>(sender());
       
   324     
       
   325     if (popup && action == popup->actions().first())
       
   326     {
       
   327         getContactManager()->removeContact(mGroupContact->localId());
       
   328         showPreviousView();
       
   329     }
       
   330 }
       
   331 
       
   332 /*!
       
   333 Called when a list item is longpressed
       
   334 */
       
   335 void CntGroupMemberView::showContextMenu(HbAbstractViewItem *aItem, const QPointF &aCoords)
       
   336 {
       
   337     QVariant data( aItem->modelIndex().row() );
       
   338    
       
   339     QModelIndex index = aItem->modelIndex();
       
   340 
       
   341     HbMenu *menu = new HbMenu();
       
   342     menu->setAttribute(Qt::WA_DeleteOnClose);
       
   343     menu->setPreferredPos( aCoords );
       
   344     
       
   345     HbAction *removeFromGroupAction = 0;
       
   346     HbAction *openContactAction = 0;
       
   347     HbAction *editContactAction = 0;
       
   348 
       
   349     openContactAction = menu->addAction(hbTrId("txt_common_menu_open"));
       
   350     editContactAction = menu->addAction(hbTrId("txt_common_menu_edit"));
       
   351     removeFromGroupAction = menu->addAction(hbTrId("txt_phob_menu_remove_from_group"));
       
   352     
       
   353     openContactAction->setData( data );
       
   354     editContactAction->setData( data );
       
   355     removeFromGroupAction->setData( data );
       
   356 
       
   357     menu->open(this, SLOT(handleMenu(HbAction*)));
       
   358 }
       
   359 
       
   360 void CntGroupMemberView::handleMenu(HbAction* action)
       
   361 {
       
   362     int row = action->data().toInt();
       
   363     HbMenu *menuItem = static_cast<HbMenu*>(sender());
       
   364     QModelIndex index = mModel->index(row);
       
   365     
       
   366     if ( action == menuItem->actions().first() )
       
   367         {
       
   368         showContactView(index);
       
   369         }
       
   370     else if (action == menuItem->actions().at(1))
       
   371         {
       
   372         editContact(index);
       
   373         }
       
   374     else if (action == menuItem->actions().at(2))
       
   375         {
       
   376         removeFromGroup(index);
       
   377         }
       
   378 }
       
   379 
       
   380 
       
   381 /*!
       
   382 Called after user clicked on the listview.
       
   383 */
       
   384 void CntGroupMemberView::showContactView(const QModelIndex &index)
       
   385 {
       
   386     mArgs.insert(EViewId, commLauncherView);
       
   387     QVariant var;
       
   388     var.setValue(mModel->contact(index));
       
   389     mArgs.insert(ESelectedContact, var);
       
   390     QVariant varGroup;
       
   391     varGroup.setValue(*mGroupContact);
       
   392     mArgs.insert(ESelectedGroupContact, varGroup);
       
   393     mViewManager->changeView(mArgs);
       
   394         
       
   395 }
       
   396 
       
   397 void CntGroupMemberView::removeFromGroup(const QModelIndex &index)
       
   398 {
       
   399     // get contact id using index
       
   400     QContact selectedContact = mModel->contact(index);
       
   401     QContactRelationship relationship;
       
   402     relationship.setRelationshipType(QContactRelationship::HasMember);
       
   403     relationship.setFirst(mGroupContact->id());
       
   404     relationship.setSecond(selectedContact.id());
       
   405     getContactManager()->removeRelationship(relationship);
       
   406 }
       
   407 
       
   408 void CntGroupMemberView::editContact(const QModelIndex &index)
       
   409 {
       
   410 
       
   411     mArgs.insert(EViewId, editView);
       
   412     QVariant var;
       
   413     var.setValue(mModel->contact(index));
       
   414     mArgs.insert(ESelectedContact, var);
       
   415     mViewManager->changeView(mArgs);
       
   416 }
       
   417 
       
   418 void CntGroupMemberView::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error)
       
   419 {
       
   420     Q_UNUSED(data);
       
   421     Q_UNUSED(id);
       
   422     Q_UNUSED(error);
       
   423     if (!error)
       
   424     {
       
   425         QIcon qicon(pixmap);
       
   426         HbIcon icon(qicon);
       
   427         mHeadingItem->setIcon(icon);
       
   428         
       
   429         mImageLabel->clear();
       
   430         mImageLabel->setIcon(icon);
       
   431     }
       
   432 }
       
   433 
       
   434 void CntGroupMemberView::openImageEditor()
       
   435 {
       
   436     QVariant var;
       
   437     var.setValue(*mGroupContact);
       
   438                 
       
   439     // SelectedGroupContact is needed so we know which group to show
       
   440     // when we come back to this view, and selected contact is needed
       
   441     // for image editor to be able to assign the image to correct contact.
       
   442     mArgs.insert(ESelectedGroupContact, var);
       
   443     mArgs.insert(ESelectedContact, var);
       
   444     
       
   445     mArgs.insert(EViewId, imageEditorView );
       
   446         
       
   447     mViewManager->changeView( mArgs );
       
   448 }
       
   449 
       
   450 QContactManager* CntGroupMemberView::getContactManager()
       
   451 {
       
   452     return mViewManager->contactManager(SYMBIAN_BACKEND);
       
   453 }
       
   454 
       
   455 void CntGroupMemberView::setRelationship(QSet<QContactLocalId>        &aLocalId,
       
   456                                          QList<QContactRelationship>  &aRelationshipList)
       
   457 {
       
   458     foreach (QContactLocalId id, aLocalId) {
       
   459         QContact contact = getContactManager()->contact(id);
       
   460 
       
   461         QContactRelationship membership;
       
   462         membership.setRelationshipType(QContactRelationship::HasMember);
       
   463         membership.setFirst(mGroupContact->id());
       
   464         membership.setSecond(contact.id());
       
   465         aRelationshipList.append(membership);
       
   466     }
       
   467 }
       
   468 
       
   469 /*!
       
   470 Draw the image specific content menu
       
   471 */
       
   472 void CntGroupMemberView::drawImageMenu(const QPointF &aCoords)
       
   473 {
       
   474     HbMenu *menu = new HbMenu();
       
   475     HbAction *changeImageAction = menu->addAction(hbTrId("txt_phob_menu_change_picture"), this, SLOT(openImageEditor()));
       
   476     if (mAvatar)
       
   477     {
       
   478         HbAction *removeAction = menu->addAction(hbTrId("txt_phob_menu_remove_image"), this, SLOT(removeImage()));
       
   479     }
       
   480     menu->setPreferredPos(aCoords);
       
   481     menu->open();
       
   482 }
       
   483 
       
   484 
       
   485 void CntGroupMemberView::removeImage()
       
   486 {
       
   487     if (mAvatar) 
       
   488     {
       
   489         if (!mAvatar->imageUrl().isEmpty())
       
   490         {
       
   491             bool success = mGroupContact->removeDetail(mAvatar);
       
   492             // Check if image removable.
       
   493             CntImageUtility imageUtility;
       
   494             if(imageUtility.isImageRemovable(mAvatar->imageUrl().toString()))
       
   495             {
       
   496                 imageUtility.removeImage(mAvatar->imageUrl().toString());
       
   497             }
       
   498             mAvatar->setImageUrl(QUrl());
       
   499             mImageLabel->clear();
       
   500             mImageLabel->setIcon(HbIcon("qtg_large_add_group_picture"));
       
   501             mHeadingItem->setIcon(HbIcon("qtg_large_add_group_picture"));
       
   502             mViewManager->contactManager( SYMBIAN_BACKEND )->saveContact(mGroupContact);
       
   503        }
       
   504     }
       
   505 }
       
   506 
       
   507 
       
   508 
       
   509 // end of file