phonebookui/pbkcommonui/src/cnteditview_p.cpp
changeset 31 2a11b5b00470
parent 27 de1630741fbe
child 37 fd64c38c277d
--- a/phonebookui/pbkcommonui/src/cnteditview_p.cpp	Mon May 03 12:24:20 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cnteditview_p.cpp	Fri May 14 15:42:23 2010 +0300
@@ -26,19 +26,22 @@
 #include <thumbnailmanager_qt.h>
 #include <hbabstractviewitem.h>
 #include <hbmessagebox.h>
+#include <hbgroupbox.h>
 #include <hbmainwindow.h>
 #include <hbview.h>
 #include <hblistview.h>
 #include <hbaction.h>
 #include <hbmenu.h>
 #include <hbframebackground.h>
+#include <hbparameterlengthlimiter.h>
 
 const char *CNT_EDIT_XML = ":/xml/contacts_ev.docml";
 
 CntEditViewPrivate::CntEditViewPrivate() :
 mModel( NULL ),
 mImageLabel( NULL ),
-mThumbnailManager( NULL )
+mThumbnailManager( NULL ),
+mContact( NULL )
 {
     mDocument = new CntDocumentLoader;
     
@@ -64,8 +67,7 @@
     mDelete = static_cast<HbAction*>( mDocument->findObject("cnt:deletecontact") );
     
     HbAction* add = static_cast<HbAction*>( mDocument->findObject("cnt:adddetail_options") );
-    HbAction* removeContact = static_cast<HbAction*>( mDocument->findObject("cnt:deletecontact") );
-    
+
     connect( add, SIGNAL(triggered()), this, SLOT(addDetailItem()) );
     connect( mDelete, SIGNAL(triggered()), this, SLOT(deleteContact()) );
     connect( mDiscard, SIGNAL(triggered()), this, SLOT(discardChanges()) );
@@ -86,6 +88,7 @@
     delete mListView;
     delete mModel;
     delete mContact;
+    
     delete mThumbnailManager;
 }
 
@@ -106,6 +109,8 @@
 void CntEditViewPrivate::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs )
 {
     mMgr = aMgr;
+    mArgs = aArgs;
+    
     if ( mView->navigationAction() != mSoftkey)
     {
         mView->setNavigationAction(mSoftkey);
@@ -117,19 +122,41 @@
         setOrientation(window->orientation());
     }
         
+    QVariant selectedAction = mArgs.value( EMyCard );
+    QString myCard = selectedAction.toString();
+    
     QVariant contact = aArgs.value( ESelectedContact );
     mContact = new QContact( contact.value<QContact>() );
     QContactLocalId localId = mContact->localId();
     
     QContactManager* cm = mMgr->contactManager(SYMBIAN_BACKEND);
     QContactLocalId selfContactId = cm->selfContactId();
+    mIsMyCard = ( localId == selfContactId && localId != 0 ) || myCard == "myCard"; 
+
+    // if "MyCard", set slightly different heading and options menu
+    if ( mIsMyCard )
+    {
+        mSave->setText(hbTrId("txt_phob_opt_save_my_card"));
+        mDelete->setText(hbTrId("txt_phob_opt_clear_my_card"));
+        HbGroupBox* groupBox = static_cast<HbGroupBox*>( mDocument->findWidget("groupBox") );
+        if ( groupBox )
+        {
+            groupBox->setHeading(hbTrId("txt_phob_subtitle_edit_my_details"));
+        }
+    }
+
+    if ( localId == 0 && !mIsMyCard )
+    {
+        HbMenu* menu = mView->menu();
+        menu->removeAction( mDelete );
+    }
     
-    HbMenu* menu = mView->menu();
     // don't delete contact which is "MyCard" or not saved yet or both.
-    if ( localId == selfContactId && selfContactId != 0 && mContact->details().count() <= 4 || localId == 0 )
+    if ( mIsMyCard && (mContact->details().count() <= 4 || localId == 0) )
     {
         mDelete->setEnabled( false );
     }
+
     // save and discard disabled if no changes found
     if ( (*mContact) == cm->contact( mContact->localId()) )
     {
@@ -169,13 +196,13 @@
     {
         // open editor view
         QVariant id = item->data( ERoleEditorViewId );
-        CntViewParameters viewParameters;
-        viewParameters.insert(EViewId, id.toInt());
+        mArgs.insert(EViewId, id.toInt());
+        
         QVariant var;
         var.setValue(*mContact);
-        viewParameters.insert(ESelectedContact, var);
-            
-        mMgr->changeView( viewParameters );
+        mArgs.insert(ESelectedContact, var);
+        mArgs.insert(ESelectedAction, QString() );
+        mMgr->changeView( mArgs );
     }
 }
 
@@ -193,92 +220,129 @@
     // only detail items are able to show context specific menu
     else
     {
-        QVariant cd = item->data( ERoleContactDetail );
-        
-        HbMenu* menu = new HbMenu();
-        menu->addActions( createPopup(item) );
-        HbAction* selected = menu->exec( aCoords );
-        
-        if ( selected )
+        HbMenu* menu = createPopup( aItem->modelIndex(), item );
+        menu->setAttribute( Qt::WA_DeleteOnClose, true );
+        menu->setPreferredPos( aCoords );
+        menu->setModal( true );
+        menu->open( this, SLOT(handleMenuAction(HbAction*)) );
+    }
+}
+
+void CntEditViewPrivate::handleMenuAction( HbAction* aAction )
+{
+    int row = aAction->data().toInt();
+    QModelIndex index = mModel->index(row, 0);
+    CntEditViewItem* item = mModel->itemAt( index );
+    if ( aAction )
+    {
+        switch ( aAction->commandRole() )  
+        {
+        case HbAction::EditRole:
         {
-            switch ( selected->commandRole() )  
-            {
-                case HbAction::EditRole:
-                {
-                    editDetail( item );
-                }
-                break;
-                
-                case HbAction::NewRole:
-                {
-                    addDetail( item );
-                }
-                break;
-                
-                case HbAction::DeleteRole:
-                {
-                    removeDetail( item, aItem->modelIndex() );
-                }
-                break;
-                
-                default:
-                    break;
-            }
+            editDetail( item );
+        }
+        break;
+        
+        case HbAction::NewRole:
+        {
+            addDetail( item );
         }
+        break;
         
-        delete menu;
+        case HbAction::DeleteRole:
+        {
+            removeDetail( item, index );
+        }
+        break;
+        
+        default:
+            break;
+        }
     }
 }
 
 void CntEditViewPrivate::addDetailItem()
 {
-    int detailEditorId = CntDetailPopup::selectDetail();
-    if (detailEditorId != noView )
+    CntViewIdList list;
+    mModel->allInUseFields( list );
+    
+    CntDetailPopup::selectDetail( list, this, SLOT(handleAddDetailItem(HbAction*)) );
+}
+
+void CntEditViewPrivate::handleAddDetailItem(HbAction *aAction)
+{
+    CntDetailPopup *popup = static_cast<CntDetailPopup*>(sender());
+    
+    if (popup && aAction != popup->actions().first())
     {
-        CntViewParameters viewParameters;
-        viewParameters.insert(EViewId, detailEditorId );
-        switch ( detailEditorId )
+        int id = popup->selectedDetail();
+        
+        if (id != noView )
         {
-        case phoneNumberEditorView:
-        case emailEditorView:
-        case urlEditorView:
-        case noteEditorView:
-            viewParameters.insert( ESelectedAction, "add" );
-            break;
-        case addressEditorView:
-        case dateEditorView:
-        case companyEditorView:
-        case familyDetailEditorView:
-            viewParameters.insert( ESelectedAction, "focus" );
-            break;
-        default:
-            break;
+            mArgs.insert(EViewId, id );
+
+            switch ( id )
+            {
+            case phoneNumberEditorView:
+            case emailEditorView:
+            case urlEditorView:
+            case noteEditorView:
+                mArgs.insert( ESelectedAction, "add" );
+                break;
+            case addressEditorView:
+            case dateEditorView:
+            case companyEditorView:
+            case familyDetailEditorView:
+                mArgs.insert( ESelectedAction, "focus" );
+                break;
+            default:
+                break;
+            }
+            QVariant var;
+            var.setValue(*mContact);
+            mArgs.insert(ESelectedContact, var);
+            mMgr->changeView( mArgs );
         }
-        QVariant var;
-        var.setValue(*mContact);
-        viewParameters.insert(ESelectedContact, var);
-        mMgr->changeView(viewParameters);
     }
 }
 
 void CntEditViewPrivate::deleteContact()
 {
-    QContactManager* cm = mMgr->contactManager( SYMBIAN_BACKEND );
-    QString name = cm->synthesizedDisplayLabel( *mContact );
+    if ( mIsMyCard )
+    {
+        HbMessageBox::question(hbTrId("txt_phob_info_clear_my_card"), this, 
+                SLOT(handleDeleteContact(HbAction*)), 
+                hbTrId("txt_phob_button_clear"), 
+                hbTrId("txt_common_button_cancel"));
+    }
+    else
+    {
+        QContactManager* cm = mMgr->contactManager( SYMBIAN_BACKEND );
+        QString name = cm->synthesizedDisplayLabel( *mContact );
+        HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_delete_1")).arg(name), this, SLOT(handleDeleteContact(HbAction*)), 
+                hbTrId("txt_phob_button_delete"), hbTrId("txt_common_button_cancel"));
+    }
+}
 
-    HbMessageBox *note = new HbMessageBox(hbTrId("txt_phob_info_delete_1").arg(name), HbMessageBox::MessageTypeQuestion);
-    note->setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"), note));
-    note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note));
-    HbAction *selected = note->exec();
-    if (selected == note->primaryAction())
+void CntEditViewPrivate::handleDeleteContact(HbAction *action)
+{
+    HbMessageBox *dlg = static_cast<HbMessageBox*>(sender());
+    if(dlg && action == dlg->actions().first())
     {
-        cm->removeContact( mContact->localId() );
-        emit contactRemoved();
+        QContactManager* cm = mMgr->contactManager( SYMBIAN_BACKEND );
+
+        if ( mIsMyCard )
+        {
+            mContact->clearDetails();
+            emit contactUpdated(cm->saveContact(mContact));
+        }
+        else
+        {
+            emit contactRemoved(cm->removeContact( mContact->localId() ));
+        }
         
-        CntViewParameters viewParameters;
-        mMgr->back( viewParameters );
+        mMgr->back( mArgs );
     }
-    delete note;
 }
 
 void CntEditViewPrivate::discardChanges()
@@ -301,17 +365,68 @@
 void CntEditViewPrivate::saveChanges()
 {
     QContactManager* mgr = mMgr->contactManager( SYMBIAN_BACKEND );
-    mgr->saveContact( mContact );
-    emit contactUpdated();
+    bool isSavedContact = mContact->localId() > 0;
     
-    QVariant var;
-    var.setValue(*mContact);
-        
-    CntViewParameters viewParameters;
-    viewParameters.insert(ESelectedContact, var);
-    viewParameters.insert( ESelectedAction, "save" );    
+    // if the contact is really changed or a new one
+    if ( (*mContact) != mgr->contact(mContact->localId()) || !isSavedContact )
+    {
+        int detailCount = mContact->details().count();
+            
+        // If its a new contact
+        if ( !isSavedContact )
+        {
+            if ( detailCount > 2 )
+            {
+                bool success = mgr->saveContact( mContact );
+                if ( success && mIsMyCard )
+                {
+                    mgr->setSelfContactId( mContact->localId() );
+                }
+                QVariant var;
+                var.setValue(*mContact);
+                mArgs.insert(ESelectedContact, var);
+                mArgs.insert( ESelectedAction, success ? "save" : "failed" );
+                emit contactUpdated(success);
+            }
+        }
+        else
+        {
+            // contact details has been cleared out.
+            if ( detailCount <= 4 )
+            {
+                // get the contact from database, it should have the name still in it,
+                // and show the delete notification to user
+                QContact c = mgr->contact( mContact->localId() );
+                
+                bool success = mgr->removeContact( mContact->localId() );
+                emit contactRemoved(success);
+                if ( success )
+                {
+                    mArgs.insert( ESelectedAction, "delete" );
+                    QVariant contact;
+                    contact.setValue( c );
+                    mArgs.insert( ESelectedContact, contact );
+                }
+            }
+            else
+            {
+                bool success = mgr->saveContact(mContact);
+                mArgs.insert( ESelectedAction, success ? "save" : "failed");
+                
+                QVariant var;
+                var.setValue(*mContact);
+                mArgs.insert(ESelectedContact, var);
+                    
+                emit contactUpdated( success );
+            }
+        }
+    }
+    else
+    {
+        emit changesDiscarded();
+    }
     
-    mMgr->back( viewParameters );
+    mMgr->back( mArgs );
 }
 
 void CntEditViewPrivate::openNameEditor()
@@ -319,11 +434,11 @@
     QVariant var;
     var.setValue(*mContact);
             
-    CntViewParameters viewParameters;
-    viewParameters.insert(EViewId, namesEditorView);
-    viewParameters.insert(ESelectedContact, var);
+    mArgs.insert(EViewId, namesEditorView);
+    mArgs.insert(ESelectedAction, QString());
+    mArgs.insert(ESelectedContact, var);
     
-    mMgr->changeView( viewParameters );
+    mMgr->changeView( mArgs );
 }
 
 void CntEditViewPrivate::openImageEditor()
@@ -331,11 +446,11 @@
     QVariant var;
     var.setValue(*mContact);
                 
-    CntViewParameters viewParameters;
-    viewParameters.insert(ESelectedContact, var);
-    viewParameters.insert(EViewId, imageEditorView );
+    mArgs.insert(ESelectedContact, var);
+    mArgs.insert(ESelectedAction, QString());
+    mArgs.insert(EViewId, imageEditorView );
         
-    mMgr->changeView( viewParameters );
+    mMgr->changeView( mArgs );
 }
 
 void CntEditViewPrivate::loadAvatar()
@@ -367,27 +482,15 @@
     }
 }
 
-QList<QAction*> CntEditViewPrivate::createPopup( CntEditViewItem* aDetail )
+HbMenu* CntEditViewPrivate::createPopup( const QModelIndex aIndex, CntEditViewItem* aDetail )
 {
-    QList<QAction*> actions;
+    HbMenu* menu = new HbMenu();
     CntStringMapper* map = new CntStringMapper();
     QVariant cd = aDetail->data( ERoleContactDetail );
     QContactDetail detail = cd.value<QContactDetail>();
     
-    HbAction* edit = static_cast<HbAction*>(mDocument->findObject("cnt:editdetail"));
-            
-    HbAction* add = static_cast<HbAction*>(mDocument->findObject("cnt:adddetail_popup"));
-    QString text = add->text();
-    add->setText( text.arg( "%1", map->getMappedDetail(detail.definitionName())) );
-            
-    HbAction* del = static_cast<HbAction*>(mDocument->findObject("cnt:deletedetail"));
-    text = edit->text();
-    del->setText( text.arg("%1", map->getMappedDetail(detail.definitionName())) );
-        
-    add->setCommandRole( HbAction::NewRole );
-    edit->setCommandRole( HbAction::EditRole );
-    del->setCommandRole( HbAction::DeleteRole );
-            
+    QVariant data( aIndex.row() );
+    
     if ( !mModel->isEmptyItem(aDetail) ) 
     {
         // add is supported only on these items:
@@ -399,17 +502,51 @@
              def == QContactUrl::DefinitionName || 
              def == QContactNote::DefinitionName )
         {
-            actions.append( add );
+            HbAction* add = menu->addAction(HbParameterLengthLimiter(
+                    map->getContactEditorAddLocString(detail.definitionName(), "")));
+            add->setCommandRole( HbAction::NewRole );
+            add->setData( data );
+        }
+        
+        QString context;
+        QString subtype;
+        if ( def == QContactPhoneNumber::DefinitionName )
+        {
+            QContactPhoneNumber number(detail); 
+            context = number.contexts().isEmpty() ? QString() : number.contexts().first();
+            subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first();
         }
-        actions.append( edit );
-        actions.append( del );
+        else if ( def == QContactOnlineAccount::DefinitionName )
+        {
+            QContactOnlineAccount number(detail); 
+            context = number.contexts().isEmpty() ? QString() : number.contexts().first();
+            subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first();
+        }
+        else if ( def == QContactFamily::DefinitionName )
+        {
+            QStringList fields = aDetail->data(ERoleContactDetailFields).toStringList();
+            subtype = fields.first();
+        }
+        else
+        {
+            context = QString();
+            subtype = detail.definitionName();
+        }
+            HbAction* edit = menu->addAction(HbParameterLengthLimiter(map->getContactEditorEditLocString(subtype, context)));
+            HbAction* del = menu->addAction(HbParameterLengthLimiter(map->getContactEditorDelLocString(subtype, context)));
+            edit->setCommandRole( HbAction::EditRole );
+            del->setCommandRole( HbAction::DeleteRole );
+            edit->setData( data );
+            del->setData( data );
     }
     else
     {
-        actions.append( edit );
+        HbAction* edit = menu->addAction(HbParameterLengthLimiter(map->getContactEditorEditLocString(detail.definitionName(), "")));
+        edit->setCommandRole( HbAction::EditRole );
+        edit->setData( data );
     }
-    delete map;
-    return actions;
+    
+    return menu;
 }
 
 void CntEditViewPrivate::addDetail( CntEditViewItem* aDetail )
@@ -428,14 +565,15 @@
 void CntEditViewPrivate::editDetail( CntEditViewItem* aDetail )
 {
     QVariant id = aDetail->data( ERoleEditorViewId );
-    CntViewParameters viewParameters;
-    viewParameters.insert(EViewId, id.toInt());
+    
+    mArgs.insert(EViewId, id.toInt());
+    mArgs.insert(ESelectedAction, QString() );
     QVariant var;
     var.setValue(*mContact);
     
-    viewParameters.insert(ESelectedContact, var);
+    mArgs.insert(ESelectedContact, var);
                                               
-    mMgr->changeView( viewParameters );
+    mMgr->changeView( mArgs );
 }
 
 void CntEditViewPrivate::removeDetail( CntEditViewItem* aDetail, const QModelIndex& aIndex )