--- 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 )