phonebookui/cntcommonui/contacteditors/cnteditview_p.cpp
author hgs
Fri, 15 Oct 2010 12:24:46 +0300
changeset 81 640d30f4fb64
parent 72 6abfb1094884
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "cnteditview_p.h"
hgs
parents:
diff changeset
    19
#include "cnteditviewlistmodel.h"
hgs
parents:
diff changeset
    20
#include "cntdocumentloader.h"
hgs
parents:
diff changeset
    21
#include "cntdetailpopup.h"
hgs
parents:
diff changeset
    22
#include "cnteditviewheadingitem.h"
hgs
parents:
diff changeset
    23
#include "cntthumbnailmanager.h"
hgs
parents:
diff changeset
    24
#include "cntimagelabel.h"
hgs
parents:
diff changeset
    25
#include "cntsavemanager.h"
hgs
parents:
diff changeset
    26
#include <cntabstractengine.h>
hgs
parents:
diff changeset
    27
#include "cntglobal.h"
hgs
parents:
diff changeset
    28
#include "cntdebug.h"
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
#include <qtcontacts.h>
hgs
parents:
diff changeset
    31
#include <hbdocumentloader.h>
hgs
parents:
diff changeset
    32
#include <hbabstractviewitem.h>
hgs
parents:
diff changeset
    33
#include <hblistviewitem.h>
hgs
parents:
diff changeset
    34
#include <hbmessagebox.h>
hgs
parents:
diff changeset
    35
#include <hbgroupbox.h>
hgs
parents:
diff changeset
    36
#include <hbmainwindow.h>
hgs
parents:
diff changeset
    37
#include <hbview.h>
hgs
parents:
diff changeset
    38
#include <hblistview.h>
hgs
parents:
diff changeset
    39
#include <hbaction.h>
hgs
parents:
diff changeset
    40
#include <hbmenu.h>
hgs
parents:
diff changeset
    41
#include <hbframebackground.h>
hgs
parents:
diff changeset
    42
#include <hbparameterlengthlimiter.h>
hgs
parents:
diff changeset
    43
#include <hbdevicenotificationdialog.h>
hgs
parents:
diff changeset
    44
#include <xqaiwrequest.h>
hgs
parents:
diff changeset
    45
#include <xqaiwdecl.h>
hgs
parents:
diff changeset
    46
#include <cntservicescontact.h>
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
#include <QFileInfo>
hgs
parents:
diff changeset
    49
#include <QApplication>
hgs
parents:
diff changeset
    50
#include <QTimer>
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
const char *CNT_EDIT_XML = ":/xml/contacts_ev.docml";
81
hgs
parents: 72
diff changeset
    53
const QString CNT_ACTIVITY_EDITOR = "ContactsCardEdit";
72
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
CntEditViewPrivate::CntEditViewPrivate() :
hgs
parents:
diff changeset
    56
    mModel( NULL ),
hgs
parents:
diff changeset
    57
    mImageLabel( NULL ),
hgs
parents:
diff changeset
    58
    mThumbnailManager( NULL ),
hgs
parents:
diff changeset
    59
    mContact( NULL ),
hgs
parents:
diff changeset
    60
    mReq(NULL),
81
hgs
parents: 72
diff changeset
    61
    mMenu(NULL)
72
hgs
parents:
diff changeset
    62
{
hgs
parents:
diff changeset
    63
    mDocument = new CntDocumentLoader;
hgs
parents:
diff changeset
    64
    
hgs
parents:
diff changeset
    65
    bool ok;
hgs
parents:
diff changeset
    66
    mDocument->load( CNT_EDIT_XML, &ok );
hgs
parents:
diff changeset
    67
    if ( !ok ){
hgs
parents:
diff changeset
    68
        qFatal( "Unable to load %S", CNT_EDIT_XML );
hgs
parents:
diff changeset
    69
    }
hgs
parents:
diff changeset
    70
    mView = static_cast<HbView*>( mDocument->findWidget("view") );
hgs
parents:
diff changeset
    71
    
hgs
parents:
diff changeset
    72
    mListView = static_cast<HbListView*>( mDocument->findWidget("listView") );
hgs
parents:
diff changeset
    73
    mListView->setLayoutName("editviewlist");
hgs
parents:
diff changeset
    74
    mListView->setItemPixmapCacheEnabled(true);
hgs
parents:
diff changeset
    75
    
hgs
parents:
diff changeset
    76
    HbFrameBackground frame;
hgs
parents:
diff changeset
    77
    frame.setFrameGraphicsName("qtg_fr_list_normal");
hgs
parents:
diff changeset
    78
    frame.setFrameType(HbFrameDrawer::NinePieces);
hgs
parents:
diff changeset
    79
    mListView->listItemPrototype()->setDefaultFrame( frame );
hgs
parents:
diff changeset
    80
    
hgs
parents:
diff changeset
    81
    mHeading = static_cast<CntEditViewHeadingItem*>( mDocument->findWidget("editViewHeading") );
hgs
parents:
diff changeset
    82
    mImageLabel = static_cast<CntImageLabel*>(mDocument->findWidget("editViewImage"));
hgs
parents:
diff changeset
    83
    
hgs
parents:
diff changeset
    84
    mSoftkey = new HbAction(Hb::BackNaviAction, mView);
hgs
parents:
diff changeset
    85
    mDiscard = static_cast<HbAction*>( mDocument->findObject("cnt:discard") );
hgs
parents:
diff changeset
    86
    mDiscard->setParent(mView);
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
    mSave = static_cast<HbAction*>( mDocument->findObject("cnt:savecontact") );
hgs
parents:
diff changeset
    89
    mSave->setParent(mView);
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
    mDelete = static_cast<HbAction*>( mDocument->findObject("cnt:deletecontact") );
hgs
parents:
diff changeset
    92
    mDelete->setParent(mView);
hgs
parents:
diff changeset
    93
    
hgs
parents:
diff changeset
    94
    HbAction* add = static_cast<HbAction*>( mDocument->findObject("cnt:adddetail_options") );
hgs
parents:
diff changeset
    95
    add->setParent(mView);
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
    connect( add, SIGNAL(triggered()), this, SLOT(addDetailItem()) );
hgs
parents:
diff changeset
    98
    connect( mDelete, SIGNAL(triggered()), this, SLOT(deleteContact()) );
hgs
parents:
diff changeset
    99
    connect( mDiscard, SIGNAL(triggered()), this, SLOT(discardChanges()) );
81
hgs
parents: 72
diff changeset
   100
    connect( mSave, SIGNAL(triggered()), this, SLOT(showPreviousView()) );
72
hgs
parents:
diff changeset
   101
        
hgs
parents:
diff changeset
   102
    connect( mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView()) );
hgs
parents:
diff changeset
   103
    connect( mImageLabel, SIGNAL(iconClicked()), this, SLOT(openImageEditor()) );
hgs
parents:
diff changeset
   104
    connect( mHeading, SIGNAL(textClicked()), this, SLOT(openNameEditor()) );
hgs
parents:
diff changeset
   105
    connect( mHeading, SIGNAL(iconClicked()), this, SLOT(openImageEditor()) );
hgs
parents:
diff changeset
   106
    connect( mListView, SIGNAL(activated(const QModelIndex&)), this, SLOT(activated(const QModelIndex&)) );
hgs
parents:
diff changeset
   107
    connect( mListView, SIGNAL(longPressed(HbAbstractViewItem*,const QPointF&)), this, SLOT(longPressed(HbAbstractViewItem*,const QPointF&)) );
hgs
parents:
diff changeset
   108
}
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
CntEditViewPrivate::~CntEditViewPrivate()
hgs
parents:
diff changeset
   111
{
hgs
parents:
diff changeset
   112
    mView->deleteLater();
hgs
parents:
diff changeset
   113
    
hgs
parents:
diff changeset
   114
    delete mDocument;
hgs
parents:
diff changeset
   115
    mDocument = NULL;
hgs
parents:
diff changeset
   116
    delete mModel;
hgs
parents:
diff changeset
   117
    mModel = NULL;
hgs
parents:
diff changeset
   118
    delete mContact;
hgs
parents:
diff changeset
   119
    mContact = NULL;
hgs
parents:
diff changeset
   120
    if (mMenu) 
hgs
parents:
diff changeset
   121
    {
hgs
parents:
diff changeset
   122
        delete mMenu;
hgs
parents:
diff changeset
   123
        mMenu = NULL;
hgs
parents:
diff changeset
   124
    }
hgs
parents:
diff changeset
   125
}
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
void CntEditViewPrivate::setOrientation(Qt::Orientation orientation)
hgs
parents:
diff changeset
   128
{
hgs
parents:
diff changeset
   129
    if (orientation == Qt::Vertical) 
hgs
parents:
diff changeset
   130
    {
hgs
parents:
diff changeset
   131
        // reading "portrait" section
hgs
parents:
diff changeset
   132
        mDocument->load( CNT_EDIT_XML, "portrait" );
hgs
parents:
diff changeset
   133
    } 
hgs
parents:
diff changeset
   134
    else 
hgs
parents:
diff changeset
   135
    {
hgs
parents:
diff changeset
   136
        // reading "landscape" section
hgs
parents:
diff changeset
   137
        mDocument->load( CNT_EDIT_XML, "landscape" );
hgs
parents:
diff changeset
   138
    }
hgs
parents:
diff changeset
   139
}
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
void CntEditViewPrivate::activate( const CntViewParameters aArgs )
hgs
parents:
diff changeset
   142
{
hgs
parents:
diff changeset
   143
    CNT_ENTRY
hgs
parents:
diff changeset
   144
    
hgs
parents:
diff changeset
   145
    mArgs = aArgs;
hgs
parents:
diff changeset
   146
    mMgr = &mEngine->viewManager();
hgs
parents:
diff changeset
   147
    
hgs
parents:
diff changeset
   148
    if ( mView->navigationAction() != mSoftkey)
hgs
parents:
diff changeset
   149
    {
hgs
parents:
diff changeset
   150
        mView->setNavigationAction(mSoftkey);
hgs
parents:
diff changeset
   151
    }
hgs
parents:
diff changeset
   152
    HbMainWindow* window = mView->mainWindow();
hgs
parents:
diff changeset
   153
    if ( window )
hgs
parents:
diff changeset
   154
    {
hgs
parents:
diff changeset
   155
        connect(window, SIGNAL(viewReady()), this, SLOT(setScrollPosition()) );
81
hgs
parents: 72
diff changeset
   156
        connect(window, SIGNAL(viewReady()), this, SLOT(setObjectNames()) );
72
hgs
parents:
diff changeset
   157
        connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation)));
hgs
parents:
diff changeset
   158
        setOrientation(window->orientation());
hgs
parents:
diff changeset
   159
    }
hgs
parents:
diff changeset
   160
        
hgs
parents:
diff changeset
   161
    QString myCard = mArgs.value( EMyCard ).toString();
hgs
parents:
diff changeset
   162
    QString selectedAction = mArgs.value( ESelectedAction ).toString();
hgs
parents:
diff changeset
   163
    QVariant contact = aArgs.value( ESelectedContact );
hgs
parents:
diff changeset
   164
    
hgs
parents:
diff changeset
   165
    setSelectedContact( contact.value<QContact>() );
hgs
parents:
diff changeset
   166
    mModel = new CntEditViewListModel( *mContact, mEngine->extensionManager() );
hgs
parents:
diff changeset
   167
    mListView->setModel( mModel );
hgs
parents:
diff changeset
   168
    
hgs
parents:
diff changeset
   169
    QContactLocalId localId = mContact->localId();
hgs
parents:
diff changeset
   170
    QContactManager& cm = mEngine->contactManager(SYMBIAN_BACKEND);
hgs
parents:
diff changeset
   171
    QContactLocalId selfContactId = cm.selfContactId();
hgs
parents:
diff changeset
   172
    mIsMyCard = ( localId == selfContactId && localId != 0 ) || !myCard.isEmpty();
hgs
parents:
diff changeset
   173
    
hgs
parents:
diff changeset
   174
    
hgs
parents:
diff changeset
   175
    if ( mHeading )
hgs
parents:
diff changeset
   176
        mHeading->setDetails( mContact, mIsMyCard );
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
    // if "MyCard", set slightly different heading and options menu
hgs
parents:
diff changeset
   179
    if ( mIsMyCard )
hgs
parents:
diff changeset
   180
    {
hgs
parents:
diff changeset
   181
        mSave->setText(hbTrId("txt_phob_opt_save_my_card"));
hgs
parents:
diff changeset
   182
        mDelete->setText(hbTrId("txt_phob_opt_clear_my_card"));
hgs
parents:
diff changeset
   183
        HbGroupBox* groupBox = static_cast<HbGroupBox*>( mDocument->findWidget("groupBox") );
hgs
parents:
diff changeset
   184
        if ( groupBox )
hgs
parents:
diff changeset
   185
        {
hgs
parents:
diff changeset
   186
            groupBox->setHeading(hbTrId("txt_phob_subtitle_edit_my_details"));
hgs
parents:
diff changeset
   187
        }
hgs
parents:
diff changeset
   188
    }
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
    if ( localId == 0 && !mIsMyCard )
hgs
parents:
diff changeset
   191
    {
hgs
parents:
diff changeset
   192
        HbMenu* menu = mView->menu();
hgs
parents:
diff changeset
   193
        menu->removeAction( mDelete );
hgs
parents:
diff changeset
   194
    }
hgs
parents:
diff changeset
   195
    
hgs
parents:
diff changeset
   196
    // don't delete contact which is "MyCard" or not saved yet or both.
hgs
parents:
diff changeset
   197
    if ( mIsMyCard && (mContact->details().count() <= 4 || localId == 0) )
hgs
parents:
diff changeset
   198
    {
hgs
parents:
diff changeset
   199
        mDelete->setEnabled( false );
hgs
parents:
diff changeset
   200
    }
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
    // save and discard disabled if no changes found
hgs
parents:
diff changeset
   203
    if ( *mContact == cm.contact( mContact->localId()) )
hgs
parents:
diff changeset
   204
    {
hgs
parents:
diff changeset
   205
        mDiscard->setEnabled( false );
hgs
parents:
diff changeset
   206
        mSave->setEnabled( false );
hgs
parents:
diff changeset
   207
    }
hgs
parents:
diff changeset
   208
    
hgs
parents:
diff changeset
   209
    mThumbnailManager = &mEngine->thumbnailManager();
hgs
parents:
diff changeset
   210
    connect( mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)),
hgs
parents:
diff changeset
   211
            this, SLOT(thumbnailReady(QPixmap, void*, int, int)) );
hgs
parents:
diff changeset
   212
hgs
parents:
diff changeset
   213
    loadAvatar();
hgs
parents:
diff changeset
   214
    
hgs
parents:
diff changeset
   215
    CNT_EXIT
hgs
parents:
diff changeset
   216
}
hgs
parents:
diff changeset
   217
81
hgs
parents: 72
diff changeset
   218
QString CntEditViewPrivate::externalize(QDataStream &stream)
hgs
parents: 72
diff changeset
   219
{
hgs
parents: 72
diff changeset
   220
    // closing the application from task swapper or end key will cause the contact to be saved
hgs
parents: 72
diff changeset
   221
    saveChanges();
hgs
parents: 72
diff changeset
   222
    
hgs
parents: 72
diff changeset
   223
    CntViewParameters viewParameters;
hgs
parents: 72
diff changeset
   224
    viewParameters.insert(EViewId, mArgs.value(EViewId).toInt());
hgs
parents: 72
diff changeset
   225
 
hgs
parents: 72
diff changeset
   226
    if (mArgs.value(ESelectedContact).isValid())
hgs
parents: 72
diff changeset
   227
    {
hgs
parents: 72
diff changeset
   228
        QContact contact = mArgs.value(ESelectedContact).value<QContact>();
hgs
parents: 72
diff changeset
   229
        viewParameters.insert(ESelectedContactId, contact.localId()); 
hgs
parents: 72
diff changeset
   230
    }
hgs
parents: 72
diff changeset
   231
    if (mArgs.value(ESelectedGroupContact).isValid())
hgs
parents: 72
diff changeset
   232
    {
hgs
parents: 72
diff changeset
   233
        QContact contact = mArgs.value(ESelectedGroupContact).value<QContact>();
hgs
parents: 72
diff changeset
   234
        viewParameters.insert(ESelectedGroupContactId, contact.localId());
hgs
parents: 72
diff changeset
   235
    }
hgs
parents: 72
diff changeset
   236
    if (mArgs.value(EMyCard).isValid())
hgs
parents: 72
diff changeset
   237
    {
hgs
parents: 72
diff changeset
   238
        viewParameters.insert(EMyCard, mArgs.value(EMyCard));
hgs
parents: 72
diff changeset
   239
    }
hgs
parents: 72
diff changeset
   240
    if (mArgs.value(EExtraAction).isValid())
hgs
parents: 72
diff changeset
   241
    {
hgs
parents: 72
diff changeset
   242
        viewParameters.insert(EExtraAction, mArgs.value(EExtraAction));
hgs
parents: 72
diff changeset
   243
    }
hgs
parents: 72
diff changeset
   244
   
hgs
parents: 72
diff changeset
   245
    stream << viewParameters;
hgs
parents: 72
diff changeset
   246
    
hgs
parents: 72
diff changeset
   247
    return CNT_ACTIVITY_EDITOR;
hgs
parents: 72
diff changeset
   248
}
hgs
parents: 72
diff changeset
   249
hgs
parents: 72
diff changeset
   250
bool CntEditViewPrivate::internalize(QDataStream &stream, CntViewParameters &viewParameters)
hgs
parents: 72
diff changeset
   251
{
hgs
parents: 72
diff changeset
   252
    CntViewParameters tempViewParameters;
hgs
parents: 72
diff changeset
   253
    stream >> tempViewParameters;
hgs
parents: 72
diff changeset
   254
    
hgs
parents: 72
diff changeset
   255
    viewParameters.insert(EViewId, tempViewParameters.value(EViewId));
hgs
parents: 72
diff changeset
   256
    
hgs
parents: 72
diff changeset
   257
    if (tempViewParameters.value(ESelectedContactId).isValid())
hgs
parents: 72
diff changeset
   258
    {
hgs
parents: 72
diff changeset
   259
        QContactManager &mgr = mEngine->contactManager(SYMBIAN_BACKEND);
hgs
parents: 72
diff changeset
   260
        
hgs
parents: 72
diff changeset
   261
        QContactLocalId localId = tempViewParameters.value(ESelectedContactId).toInt();
hgs
parents: 72
diff changeset
   262
        
hgs
parents: 72
diff changeset
   263
        if (!mgr.contactIds().contains(localId) && localId != 0 && mgr.selfContactId() != localId)
hgs
parents: 72
diff changeset
   264
        {
hgs
parents: 72
diff changeset
   265
            // a contact has been deleted.
hgs
parents: 72
diff changeset
   266
            return false;
hgs
parents: 72
diff changeset
   267
        }
hgs
parents: 72
diff changeset
   268
        else
hgs
parents: 72
diff changeset
   269
        {
hgs
parents: 72
diff changeset
   270
            QVariant var;
hgs
parents: 72
diff changeset
   271
            var.setValue(mgr.contact(localId));      
hgs
parents: 72
diff changeset
   272
            viewParameters.insert(ESelectedContact, var);
hgs
parents: 72
diff changeset
   273
        }
hgs
parents: 72
diff changeset
   274
    }
hgs
parents: 72
diff changeset
   275
    if (tempViewParameters.value(ESelectedGroupContactId).isValid())
hgs
parents: 72
diff changeset
   276
    {
hgs
parents: 72
diff changeset
   277
        QContactManager &mgr = mEngine->contactManager(SYMBIAN_BACKEND);
hgs
parents: 72
diff changeset
   278
        QVariant var;
hgs
parents: 72
diff changeset
   279
        var.setValue(mgr.contact(tempViewParameters.value(ESelectedGroupContactId).toInt()));      
hgs
parents: 72
diff changeset
   280
        viewParameters.insert(ESelectedGroupContact, var);
hgs
parents: 72
diff changeset
   281
    }
hgs
parents: 72
diff changeset
   282
    if (tempViewParameters.value(EMyCard).isValid())
hgs
parents: 72
diff changeset
   283
    {
hgs
parents: 72
diff changeset
   284
        viewParameters.insert(EMyCard, tempViewParameters.value(EMyCard));
hgs
parents: 72
diff changeset
   285
    }
hgs
parents: 72
diff changeset
   286
    if (tempViewParameters.value(EExtraAction).isValid())
hgs
parents: 72
diff changeset
   287
    {
hgs
parents: 72
diff changeset
   288
        viewParameters.insert(EExtraAction, tempViewParameters.value(EExtraAction));
hgs
parents: 72
diff changeset
   289
    }
hgs
parents: 72
diff changeset
   290
     
hgs
parents: 72
diff changeset
   291
    return true;
hgs
parents: 72
diff changeset
   292
}
hgs
parents: 72
diff changeset
   293
72
hgs
parents:
diff changeset
   294
void CntEditViewPrivate::deactivate()
hgs
parents:
diff changeset
   295
{   
hgs
parents:
diff changeset
   296
}
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
void CntEditViewPrivate::openView(CntViewParameters& viewParams)
hgs
parents:
diff changeset
   299
{
hgs
parents:
diff changeset
   300
    QList<int> keys = viewParams.keys();
hgs
parents:
diff changeset
   301
    for(int i = 0;i < keys.count();i++)
hgs
parents:
diff changeset
   302
    {
hgs
parents:
diff changeset
   303
        mArgs.insert(keys.at(i), viewParams.value(keys.at(i)));
hgs
parents:
diff changeset
   304
    }
hgs
parents:
diff changeset
   305
    mMgr->changeView( mArgs );
hgs
parents:
diff changeset
   306
}
hgs
parents:
diff changeset
   307
hgs
parents:
diff changeset
   308
void CntEditViewPrivate::requestRefresh()
hgs
parents:
diff changeset
   309
{
hgs
parents:
diff changeset
   310
    mModel->refreshExtensionItems();
hgs
parents:
diff changeset
   311
}
hgs
parents:
diff changeset
   312
hgs
parents:
diff changeset
   313
void CntEditViewPrivate::showPreviousView()
hgs
parents:
diff changeset
   314
{
hgs
parents:
diff changeset
   315
    mMgr->back( mArgs, saveChanges() );
hgs
parents:
diff changeset
   316
}
hgs
parents:
diff changeset
   317
    
hgs
parents:
diff changeset
   318
void CntEditViewPrivate::activated( const QModelIndex& aIndex )
hgs
parents:
diff changeset
   319
{
hgs
parents:
diff changeset
   320
    CntEditViewItem* item = mModel->itemAt( aIndex );
hgs
parents:
diff changeset
   321
    QVariant type = item->data( ERoleItemType );
hgs
parents:
diff changeset
   322
    if ( type == QVariant(ETypeUiExtension) )
hgs
parents:
diff changeset
   323
    {
hgs
parents:
diff changeset
   324
        item->activated(this);
hgs
parents:
diff changeset
   325
    }
hgs
parents:
diff changeset
   326
    else if( item->data(ERoleEditorViewId) == ringToneFetcherView )
hgs
parents:
diff changeset
   327
    {
hgs
parents:
diff changeset
   328
       fetchTone();
hgs
parents:
diff changeset
   329
    }
hgs
parents:
diff changeset
   330
    else
hgs
parents:
diff changeset
   331
    {
hgs
parents:
diff changeset
   332
        // open editor view
hgs
parents:
diff changeset
   333
        QVariant id = item->data( ERoleEditorViewId );
hgs
parents:
diff changeset
   334
        mArgs.insert(EViewId, id.toInt());
hgs
parents:
diff changeset
   335
        
hgs
parents:
diff changeset
   336
        QVariant var;
hgs
parents:
diff changeset
   337
        var.setValue(*mContact);
hgs
parents:
diff changeset
   338
        mArgs.insert(ESelectedContact, var);
hgs
parents:
diff changeset
   339
        mArgs.insert(ESelectedAction, QString() );
hgs
parents:
diff changeset
   340
        mMgr->changeView( mArgs );
hgs
parents:
diff changeset
   341
    }
hgs
parents:
diff changeset
   342
    
hgs
parents:
diff changeset
   343
}
hgs
parents:
diff changeset
   344
hgs
parents:
diff changeset
   345
void CntEditViewPrivate::longPressed( HbAbstractViewItem* aItem, const QPointF& aCoords )
hgs
parents:
diff changeset
   346
{
hgs
parents:
diff changeset
   347
    CntEditViewItem* item = mModel->itemAt( aItem->modelIndex() );
hgs
parents:
diff changeset
   348
    QVariant type = item->data( ERoleItemType );
hgs
parents:
diff changeset
   349
    
hgs
parents:
diff changeset
   350
    // Ui extensions handle the long press by themselves.
hgs
parents:
diff changeset
   351
    if ( type == QVariant(ETypeUiExtension) )
hgs
parents:
diff changeset
   352
    {
hgs
parents:
diff changeset
   353
        item->longPressed( aCoords, this );
hgs
parents:
diff changeset
   354
    }
hgs
parents:
diff changeset
   355
    // only detail items are able to show context specific menu
hgs
parents:
diff changeset
   356
    else
hgs
parents:
diff changeset
   357
    {
hgs
parents:
diff changeset
   358
        if (mMenu) 
hgs
parents:
diff changeset
   359
        {
hgs
parents:
diff changeset
   360
            delete mMenu;
hgs
parents:
diff changeset
   361
        }
hgs
parents:
diff changeset
   362
        mMenu = createPopup( aItem->modelIndex(), item );
hgs
parents:
diff changeset
   363
        mMenu->setPreferredPos( aCoords );
hgs
parents:
diff changeset
   364
        mMenu->setModal( true );
hgs
parents:
diff changeset
   365
        mMenu->open( this, SLOT(handleMenuAction(HbAction*)) );
hgs
parents:
diff changeset
   366
    }
hgs
parents:
diff changeset
   367
}
hgs
parents:
diff changeset
   368
hgs
parents:
diff changeset
   369
void CntEditViewPrivate::handleMenuAction( HbAction* aAction )
hgs
parents:
diff changeset
   370
{
hgs
parents:
diff changeset
   371
    HbMenu *menu = static_cast<HbMenu*>(sender());
hgs
parents:
diff changeset
   372
    if ( aAction )
hgs
parents:
diff changeset
   373
    {
hgs
parents:
diff changeset
   374
        int row = aAction->data().toInt();
hgs
parents:
diff changeset
   375
        mIndex = mModel->index(row, 0);
hgs
parents:
diff changeset
   376
        CntEditViewItem* item = mModel->itemAt( mIndex );
hgs
parents:
diff changeset
   377
        
hgs
parents:
diff changeset
   378
        switch ( aAction->property("menu").toInt() )  
hgs
parents:
diff changeset
   379
        {
hgs
parents:
diff changeset
   380
        case HbAction::EditRole:
hgs
parents:
diff changeset
   381
        {
hgs
parents:
diff changeset
   382
            if( item->data(ERoleEditorViewId) == ringToneFetcherView )
hgs
parents:
diff changeset
   383
                {
hgs
parents:
diff changeset
   384
                fetchTone();
hgs
parents:
diff changeset
   385
                menu->close();
hgs
parents:
diff changeset
   386
                }
hgs
parents:
diff changeset
   387
            else
hgs
parents:
diff changeset
   388
                {
hgs
parents:
diff changeset
   389
                editDetail( item );
hgs
parents:
diff changeset
   390
                }
hgs
parents:
diff changeset
   391
        }
hgs
parents:
diff changeset
   392
        break;
hgs
parents:
diff changeset
   393
        
hgs
parents:
diff changeset
   394
        case HbAction::NewRole:
hgs
parents:
diff changeset
   395
        {
hgs
parents:
diff changeset
   396
            addDetail( item );
hgs
parents:
diff changeset
   397
        }
hgs
parents:
diff changeset
   398
        break;
hgs
parents:
diff changeset
   399
        
hgs
parents:
diff changeset
   400
        case HbAction::DeleteRole:
hgs
parents:
diff changeset
   401
        {
hgs
parents:
diff changeset
   402
          removeDetail( item, mIndex );
hgs
parents:
diff changeset
   403
        }
hgs
parents:
diff changeset
   404
        break;
hgs
parents:
diff changeset
   405
        
hgs
parents:
diff changeset
   406
        default:
hgs
parents:
diff changeset
   407
            break;
hgs
parents:
diff changeset
   408
        }
hgs
parents:
diff changeset
   409
    }
hgs
parents:
diff changeset
   410
}
hgs
parents:
diff changeset
   411
hgs
parents:
diff changeset
   412
void CntEditViewPrivate::addDetailItem()
hgs
parents:
diff changeset
   413
{
hgs
parents:
diff changeset
   414
    CntViewIdList list;
hgs
parents:
diff changeset
   415
    mModel->allInUseFields( list );
hgs
parents:
diff changeset
   416
    
hgs
parents:
diff changeset
   417
    CntDetailPopup::selectDetail( list, this, SLOT(handleAddDetailItem(HbAction*)) );
hgs
parents:
diff changeset
   418
}
hgs
parents:
diff changeset
   419
hgs
parents:
diff changeset
   420
void CntEditViewPrivate::handleAddDetailItem(HbAction *aAction)
hgs
parents:
diff changeset
   421
{
hgs
parents:
diff changeset
   422
    CntDetailPopup *popup = static_cast<CntDetailPopup*>(sender());
hgs
parents:
diff changeset
   423
    
hgs
parents:
diff changeset
   424
    if (popup && aAction != popup->actions().first() && popup->selectedItems().count())
hgs
parents:
diff changeset
   425
    {
hgs
parents:
diff changeset
   426
        int row = popup->selectedItems().first().toInt();
hgs
parents:
diff changeset
   427
        QModelIndex index = popup->model()->index(row, 0);
hgs
parents:
diff changeset
   428
        int id = popup->model()->data(index, Qt::UserRole).toInt();
hgs
parents:
diff changeset
   429
hgs
parents:
diff changeset
   430
        if (id != noView )
hgs
parents:
diff changeset
   431
        {
hgs
parents:
diff changeset
   432
            mArgs.insert(EViewId, id );
hgs
parents:
diff changeset
   433
hgs
parents:
diff changeset
   434
            switch ( id )
hgs
parents:
diff changeset
   435
            {
hgs
parents:
diff changeset
   436
            case phoneNumberEditorView:
hgs
parents:
diff changeset
   437
            case emailEditorView:
hgs
parents:
diff changeset
   438
            case urlEditorView:
hgs
parents:
diff changeset
   439
            case noteEditorView:
hgs
parents:
diff changeset
   440
                mArgs.insert( ESelectedAction, CNT_ADD_ACTION );
hgs
parents:
diff changeset
   441
                changeEditorView();
hgs
parents:
diff changeset
   442
                break;
hgs
parents:
diff changeset
   443
            case addressEditorView:
hgs
parents:
diff changeset
   444
            case dateEditorView:
hgs
parents:
diff changeset
   445
            case companyEditorView:
hgs
parents:
diff changeset
   446
            case familyDetailEditorView:
hgs
parents:
diff changeset
   447
                mArgs.insert( ESelectedAction, CNT_FOCUS_ACTION );
hgs
parents:
diff changeset
   448
                changeEditorView();
hgs
parents:
diff changeset
   449
                break;            
hgs
parents:
diff changeset
   450
            case ringToneFetcherView:
hgs
parents:
diff changeset
   451
                fetchTone();
hgs
parents:
diff changeset
   452
                break;                
hgs
parents:
diff changeset
   453
            default:
hgs
parents:
diff changeset
   454
                break;                
hgs
parents:
diff changeset
   455
            }            
hgs
parents:
diff changeset
   456
        }
hgs
parents:
diff changeset
   457
    }
hgs
parents:
diff changeset
   458
}
hgs
parents:
diff changeset
   459
hgs
parents:
diff changeset
   460
void CntEditViewPrivate::changeEditorView()
hgs
parents:
diff changeset
   461
{
hgs
parents:
diff changeset
   462
        QVariant var;
hgs
parents:
diff changeset
   463
        var.setValue(*mContact);
hgs
parents:
diff changeset
   464
        mArgs.insert(ESelectedContact, var);
hgs
parents:
diff changeset
   465
        mMgr->changeView( mArgs );   
hgs
parents:
diff changeset
   466
}
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
// Call IToneFetch Service
hgs
parents:
diff changeset
   469
void CntEditViewPrivate::fetchTone()
hgs
parents:
diff changeset
   470
{
hgs
parents:
diff changeset
   471
        if(mReq)
hgs
parents:
diff changeset
   472
         {
hgs
parents:
diff changeset
   473
             delete mReq;
hgs
parents:
diff changeset
   474
             mReq = 0;
hgs
parents:
diff changeset
   475
         }
hgs
parents:
diff changeset
   476
             //launch media fetcher
hgs
parents:
diff changeset
   477
         mReq = mAppMgr.create(XQI_TONE_FETCH, XQOP_TONE_FETCH, true); // read strings from header file constants
hgs
parents:
diff changeset
   478
         if (!mReq)
hgs
parents:
diff changeset
   479
         {
hgs
parents:
diff changeset
   480
           return;
hgs
parents:
diff changeset
   481
         }
hgs
parents:
diff changeset
   482
         else
hgs
parents:
diff changeset
   483
         {
81
hgs
parents: 72
diff changeset
   484
             mReq->setSynchronous(false);
72
hgs
parents:
diff changeset
   485
             connect(mReq, SIGNAL( requestOk( const QVariant&)), SLOT( ringToneFetchHandleOk(const QVariant&)) );
hgs
parents:
diff changeset
   486
             connect(mReq, SIGNAL( requestError( int,const QString&)), SLOT(ringToneFetchHandleError(int,const QString&)) );
hgs
parents:
diff changeset
   487
         }
hgs
parents:
diff changeset
   488
         
hgs
parents:
diff changeset
   489
         // Make the request
hgs
parents:
diff changeset
   490
         mReq->send();
hgs
parents:
diff changeset
   491
}
hgs
parents:
diff changeset
   492
hgs
parents:
diff changeset
   493
void CntEditViewPrivate::ringToneFetchHandleOk(const QVariant &result)
hgs
parents:
diff changeset
   494
{
hgs
parents:
diff changeset
   495
    QContactRingtone ringtone = mContact->detail<QContactRingtone>();
81
hgs
parents: 72
diff changeset
   496
    // Contact can have only one ringtone at a time
hgs
parents: 72
diff changeset
   497
    // remove existing ringtone detail if any
hgs
parents: 72
diff changeset
   498
    if(!(ringtone.isEmpty()))
hgs
parents: 72
diff changeset
   499
     {
hgs
parents: 72
diff changeset
   500
        mContact->removeDetail(&ringtone);
hgs
parents: 72
diff changeset
   501
     }
72
hgs
parents:
diff changeset
   502
     
81
hgs
parents: 72
diff changeset
   503
     ringtone.setAudioRingtoneUrl( QUrl::fromLocalFile( result.value<QString>() ) );
72
hgs
parents:
diff changeset
   504
     mContact->saveDetail( &ringtone );
hgs
parents:
diff changeset
   505
     mModel->updateRingtone();
hgs
parents:
diff changeset
   506
     mSave->setEnabled( true );
hgs
parents:
diff changeset
   507
     mDiscard->setEnabled( true );
hgs
parents:
diff changeset
   508
}
hgs
parents:
diff changeset
   509
 
hgs
parents:
diff changeset
   510
void CntEditViewPrivate::ringToneFetchHandleError(int errorCode, const QString& errorMessage)
hgs
parents:
diff changeset
   511
{
hgs
parents:
diff changeset
   512
    Q_UNUSED(errorCode);
hgs
parents:
diff changeset
   513
    Q_UNUSED(errorMessage);
hgs
parents:
diff changeset
   514
    
hgs
parents:
diff changeset
   515
}
hgs
parents:
diff changeset
   516
hgs
parents:
diff changeset
   517
hgs
parents:
diff changeset
   518
void CntEditViewPrivate::deleteContact()
hgs
parents:
diff changeset
   519
{
hgs
parents:
diff changeset
   520
    CNT_ENTRY
hgs
parents:
diff changeset
   521
    
hgs
parents:
diff changeset
   522
    if ( mIsMyCard )
hgs
parents:
diff changeset
   523
    {
hgs
parents:
diff changeset
   524
        HbMessageBox::question(hbTrId("txt_phob_dialog_remove_all_personal_data_from_my_c"), this, 
hgs
parents:
diff changeset
   525
                SLOT(handleDeleteContact(int)), 
hgs
parents:
diff changeset
   526
                HbMessageBox::Yes | HbMessageBox::No);
hgs
parents:
diff changeset
   527
    }
hgs
parents:
diff changeset
   528
    else
hgs
parents:
diff changeset
   529
    {
hgs
parents:
diff changeset
   530
        QContactManager& cm = mEngine->contactManager( SYMBIAN_BACKEND );
hgs
parents:
diff changeset
   531
        QString name = cm.synthesizedContactDisplayLabel( *mContact );
hgs
parents:
diff changeset
   532
        if (name.isEmpty())
hgs
parents:
diff changeset
   533
        {
hgs
parents:
diff changeset
   534
            name = hbTrId("txt_phob_list_unnamed");
hgs
parents:
diff changeset
   535
        }
hgs
parents:
diff changeset
   536
        
81
hgs
parents: 72
diff changeset
   537
        HbMessageBox::question(HbParameterLengthLimiter("txt_phob_info_delete_1").arg(name), this, SLOT(handleDeleteContact(int)), 
72
hgs
parents:
diff changeset
   538
                HbMessageBox::Delete | HbMessageBox::Cancel);
hgs
parents:
diff changeset
   539
    }
hgs
parents:
diff changeset
   540
    
hgs
parents:
diff changeset
   541
    CNT_EXIT
hgs
parents:
diff changeset
   542
}
hgs
parents:
diff changeset
   543
hgs
parents:
diff changeset
   544
void CntEditViewPrivate::handleDeleteContact(int action)
hgs
parents:
diff changeset
   545
{
hgs
parents:
diff changeset
   546
    CNT_ENTRY
hgs
parents:
diff changeset
   547
    
hgs
parents:
diff changeset
   548
    Q_Q(CntEditView);
hgs
parents:
diff changeset
   549
hgs
parents:
diff changeset
   550
    if(action == HbMessageBox::Yes || action == HbMessageBox::Delete)
hgs
parents:
diff changeset
   551
    {
hgs
parents:
diff changeset
   552
        QContactManager& cm = mEngine->contactManager( SYMBIAN_BACKEND );
hgs
parents:
diff changeset
   553
hgs
parents:
diff changeset
   554
        disconnect(&cm, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)),
hgs
parents:
diff changeset
   555
                this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)));
hgs
parents:
diff changeset
   556
        emit q->contactRemoved(cm.removeContact( mContact->localId() ));
hgs
parents:
diff changeset
   557
        
hgs
parents:
diff changeset
   558
        mMgr->back( mArgs, true );
hgs
parents:
diff changeset
   559
    }
hgs
parents:
diff changeset
   560
    
hgs
parents:
diff changeset
   561
    CNT_EXIT
hgs
parents:
diff changeset
   562
}
hgs
parents:
diff changeset
   563
hgs
parents:
diff changeset
   564
void CntEditViewPrivate::discardChanges()
hgs
parents:
diff changeset
   565
{
hgs
parents:
diff changeset
   566
    Q_Q(CntEditView);
hgs
parents:
diff changeset
   567
    
hgs
parents:
diff changeset
   568
    emit q->changesDiscarded();
hgs
parents:
diff changeset
   569
    
hgs
parents:
diff changeset
   570
    // get a fresh one from backend.
hgs
parents:
diff changeset
   571
    QContactManager& mgr = mEngine->contactManager(SYMBIAN_BACKEND);
hgs
parents:
diff changeset
   572
    setSelectedContact( mgr.contact( mContact->localId()) );
hgs
parents:
diff changeset
   573
    
hgs
parents:
diff changeset
   574
    QVariant var;
hgs
parents:
diff changeset
   575
    var.setValue(*mContact);
hgs
parents:
diff changeset
   576
    
hgs
parents:
diff changeset
   577
    mArgs.insert(ESelectedContact, var);
hgs
parents:
diff changeset
   578
    
hgs
parents:
diff changeset
   579
    if ( mArgs.value( EExtraAction ).toString() == CNT_ROOT_ACTION )
hgs
parents:
diff changeset
   580
    {
hgs
parents:
diff changeset
   581
        mMgr->back( mArgs, true );
hgs
parents:
diff changeset
   582
    }
hgs
parents:
diff changeset
   583
    else
hgs
parents:
diff changeset
   584
    {
hgs
parents:
diff changeset
   585
        mMgr->back( mArgs );
hgs
parents:
diff changeset
   586
    }
hgs
parents:
diff changeset
   587
       
hgs
parents:
diff changeset
   588
}   
hgs
parents:
diff changeset
   589
hgs
parents:
diff changeset
   590
bool CntEditViewPrivate::saveChanges()
hgs
parents:
diff changeset
   591
{
hgs
parents:
diff changeset
   592
    CNT_ENTRY
hgs
parents:
diff changeset
   593
    
hgs
parents:
diff changeset
   594
    Q_Q(CntEditView);
hgs
parents:
diff changeset
   595
    
hgs
parents:
diff changeset
   596
    QContactManager& mgr = mEngine->contactManager(SYMBIAN_BACKEND);
hgs
parents:
diff changeset
   597
    QString name = mgr.synthesizedContactDisplayLabel(*mContact);
hgs
parents:
diff changeset
   598
    
hgs
parents:
diff changeset
   599
    if (name.isEmpty())
hgs
parents:
diff changeset
   600
    {
hgs
parents:
diff changeset
   601
        name = hbTrId("txt_phob_list_unnamed");
hgs
parents:
diff changeset
   602
    }
hgs
parents:
diff changeset
   603
    
hgs
parents:
diff changeset
   604
    disconnect(&mgr, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)),
hgs
parents:
diff changeset
   605
                            this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)));
81
hgs
parents: 72
diff changeset
   606
    
hgs
parents: 72
diff changeset
   607
    CntSaveManager& save = mEngine->saveManager();
hgs
parents: 72
diff changeset
   608
    CntSaveManager::CntSaveResult result;
hgs
parents: 72
diff changeset
   609
    if ( mIsMyCard )
hgs
parents: 72
diff changeset
   610
        result = save.saveMyCard(mContact, &mgr);
hgs
parents: 72
diff changeset
   611
    else
hgs
parents: 72
diff changeset
   612
        result = save.saveContact( mContact, &mgr );
72
hgs
parents:
diff changeset
   613
    
hgs
parents:
diff changeset
   614
    QVariant var;
hgs
parents:
diff changeset
   615
    bool backToRoot(false);
hgs
parents:
diff changeset
   616
    
hgs
parents:
diff changeset
   617
    switch (result)
hgs
parents:
diff changeset
   618
    {
hgs
parents:
diff changeset
   619
    case CntSaveManager::ESaved:
hgs
parents:
diff changeset
   620
        emit q->contactUpdated(KCntServicesReturnValueContactSaved);
81
hgs
parents: 72
diff changeset
   621
        HbDeviceNotificationDialog::notification(QString(), HbParameterLengthLimiter("txt_phob_dpophead_contact_1_saved").arg(name));
72
hgs
parents:
diff changeset
   622
        var.setValue(*mContact);
hgs
parents:
diff changeset
   623
        mArgs.insert(ESelectedContact, var);
hgs
parents:
diff changeset
   624
        mArgs.insert(ESelectedAction, CNT_CREATE_ACTION);
hgs
parents:
diff changeset
   625
        break;
hgs
parents:
diff changeset
   626
    case CntSaveManager::EUpdated:
hgs
parents:
diff changeset
   627
        emit q->contactUpdated(KCntServicesReturnValueContactSaved);
81
hgs
parents: 72
diff changeset
   628
        HbDeviceNotificationDialog::notification(QString(), HbParameterLengthLimiter("txt_phob_dpophead_contacts_1_updated").arg(name));
72
hgs
parents:
diff changeset
   629
        var.setValue(*mContact);
hgs
parents:
diff changeset
   630
        mArgs.insert(ESelectedContact, var);
hgs
parents:
diff changeset
   631
        mArgs.insert(ESelectedAction, CNT_EDIT_ACTION);
hgs
parents:
diff changeset
   632
        break;
hgs
parents:
diff changeset
   633
    case CntSaveManager::EFailed:
hgs
parents:
diff changeset
   634
        emit q->contactUpdated(KCntServicesReturnValueContactNotModified);
hgs
parents:
diff changeset
   635
        HbDeviceNotificationDialog::notification(QString(),hbTrId("SAVING FAILED!"));
hgs
parents:
diff changeset
   636
        break;
hgs
parents:
diff changeset
   637
    case CntSaveManager::EDeleted:
hgs
parents:
diff changeset
   638
        emit q->contactRemoved(true);
hgs
parents:
diff changeset
   639
        backToRoot = true;
hgs
parents:
diff changeset
   640
        break;
hgs
parents:
diff changeset
   641
    case CntSaveManager::ENothingDone:
hgs
parents:
diff changeset
   642
    default:
hgs
parents:
diff changeset
   643
        emit q->contactUpdated(KCntServicesReturnValueContactNotModified);
hgs
parents:
diff changeset
   644
        break;
hgs
parents:
diff changeset
   645
    }
hgs
parents:
diff changeset
   646
hgs
parents:
diff changeset
   647
    if ( mArgs.value( EExtraAction ).toString() == CNT_ROOT_ACTION )
hgs
parents:
diff changeset
   648
    {
hgs
parents:
diff changeset
   649
        backToRoot = true;
hgs
parents:
diff changeset
   650
    }
hgs
parents:
diff changeset
   651
    
hgs
parents:
diff changeset
   652
    CNT_EXIT_ARGS(backToRoot)
hgs
parents:
diff changeset
   653
hgs
parents:
diff changeset
   654
    return backToRoot;
hgs
parents:
diff changeset
   655
}
hgs
parents:
diff changeset
   656
hgs
parents:
diff changeset
   657
void CntEditViewPrivate::openNameEditor()
hgs
parents:
diff changeset
   658
{
hgs
parents:
diff changeset
   659
    QVariant var;
hgs
parents:
diff changeset
   660
    var.setValue(*mContact);
hgs
parents:
diff changeset
   661
            
hgs
parents:
diff changeset
   662
    mArgs.insert(EViewId, namesEditorView);
hgs
parents:
diff changeset
   663
    mArgs.insert(ESelectedAction, QString());
hgs
parents:
diff changeset
   664
    mArgs.insert(ESelectedContact, var);
hgs
parents:
diff changeset
   665
    
hgs
parents:
diff changeset
   666
    mMgr->changeView( mArgs );
hgs
parents:
diff changeset
   667
}
hgs
parents:
diff changeset
   668
hgs
parents:
diff changeset
   669
void CntEditViewPrivate::openImageEditor()
hgs
parents:
diff changeset
   670
{
hgs
parents:
diff changeset
   671
    QVariant var;
hgs
parents:
diff changeset
   672
    var.setValue(*mContact);
hgs
parents:
diff changeset
   673
                
hgs
parents:
diff changeset
   674
    mArgs.insert(ESelectedContact, var);
hgs
parents:
diff changeset
   675
    mArgs.insert(ESelectedAction, QString());
hgs
parents:
diff changeset
   676
    mArgs.insert(EViewId, imageEditorView );
hgs
parents:
diff changeset
   677
        
hgs
parents:
diff changeset
   678
    mMgr->changeView( mArgs );
hgs
parents:
diff changeset
   679
}
hgs
parents:
diff changeset
   680
hgs
parents:
diff changeset
   681
void CntEditViewPrivate::loadAvatar()
hgs
parents:
diff changeset
   682
{
hgs
parents:
diff changeset
   683
    QList<QContactAvatar> details = mContact->details<QContactAvatar>();
hgs
parents:
diff changeset
   684
    for (int i = 0;i < details.count();i++)
hgs
parents:
diff changeset
   685
    {
hgs
parents:
diff changeset
   686
        QUrl url = details.at(i).imageUrl();
hgs
parents:
diff changeset
   687
        if ( url.isValid() )
hgs
parents:
diff changeset
   688
        {
hgs
parents:
diff changeset
   689
            mThumbnailManager->getThumbnail( ThumbnailManager::ThumbnailLarge, url.toString() );
hgs
parents:
diff changeset
   690
            break;
hgs
parents:
diff changeset
   691
        }
hgs
parents:
diff changeset
   692
    }
hgs
parents:
diff changeset
   693
}
hgs
parents:
diff changeset
   694
hgs
parents:
diff changeset
   695
void CntEditViewPrivate::setScrollPosition()
hgs
parents:
diff changeset
   696
{
hgs
parents:
diff changeset
   697
    if ( mArgs.contains(ESelectedDetail) )
hgs
parents:
diff changeset
   698
    {
hgs
parents:
diff changeset
   699
        QContactDetail d = mArgs.value( ESelectedDetail ).value<QContactDetail>();
hgs
parents:
diff changeset
   700
        
hgs
parents:
diff changeset
   701
        QModelIndex index = mModel->itemIndex( d );
hgs
parents:
diff changeset
   702
        if ( index.isValid() )
hgs
parents:
diff changeset
   703
        {
hgs
parents:
diff changeset
   704
            mListView->scrollTo( index, HbListView::EnsureVisible );
hgs
parents:
diff changeset
   705
        }
hgs
parents:
diff changeset
   706
    }
hgs
parents:
diff changeset
   707
}
hgs
parents:
diff changeset
   708
hgs
parents:
diff changeset
   709
void CntEditViewPrivate::thumbnailReady( const QPixmap& pixmap, void *data, int id, int error )
hgs
parents:
diff changeset
   710
{
hgs
parents:
diff changeset
   711
    Q_UNUSED(data);
hgs
parents:
diff changeset
   712
    Q_UNUSED(id);
hgs
parents:
diff changeset
   713
    if (!error)
hgs
parents:
diff changeset
   714
    {
hgs
parents:
diff changeset
   715
        HbIcon icon(pixmap);
hgs
parents:
diff changeset
   716
        mHeading->setIcon(icon);
hgs
parents:
diff changeset
   717
        
hgs
parents:
diff changeset
   718
        mImageLabel->clear();
hgs
parents:
diff changeset
   719
        mImageLabel->setIcon(pixmap);
hgs
parents:
diff changeset
   720
    }
hgs
parents:
diff changeset
   721
}
hgs
parents:
diff changeset
   722
hgs
parents:
diff changeset
   723
HbMenu* CntEditViewPrivate::createPopup( const QModelIndex aIndex, CntEditViewItem* aDetail )
hgs
parents:
diff changeset
   724
{
hgs
parents:
diff changeset
   725
    HbMenu* menu = new HbMenu();
hgs
parents:
diff changeset
   726
    CntStringMapper* map = new CntStringMapper();
hgs
parents:
diff changeset
   727
    QVariant cd = aDetail->data( ERoleContactDetail );
hgs
parents:
diff changeset
   728
    QContactDetail detail = cd.value<QContactDetail>();
hgs
parents:
diff changeset
   729
    
hgs
parents:
diff changeset
   730
    QVariant data( aIndex.row() );
hgs
parents:
diff changeset
   731
    
hgs
parents:
diff changeset
   732
    if ( !mModel->isEmptyItem(aDetail) ) 
hgs
parents:
diff changeset
   733
    {
hgs
parents:
diff changeset
   734
        // add is supported only on these items:
hgs
parents:
diff changeset
   735
        // QContactPhonenumber, QContactOnlineAccount, QContactEmail, QContactUrl and QContactNote
hgs
parents:
diff changeset
   736
        QString def = detail.definitionName(); 
hgs
parents:
diff changeset
   737
        if ( def == QContactPhoneNumber::DefinitionName   || 
hgs
parents:
diff changeset
   738
             def == QContactOnlineAccount::DefinitionName ||
hgs
parents:
diff changeset
   739
             def == QContactEmailAddress::DefinitionName  ||
hgs
parents:
diff changeset
   740
             def == QContactUrl::DefinitionName || 
hgs
parents:
diff changeset
   741
             def == QContactNote::DefinitionName )
hgs
parents:
diff changeset
   742
        {
hgs
parents:
diff changeset
   743
            HbAction* add = menu->addAction(map->getContactEditorAddLocString(detail.definitionName(), ""));
hgs
parents:
diff changeset
   744
            add->setProperty( "menu", HbAction::NewRole );
hgs
parents:
diff changeset
   745
            add->setData( data );
hgs
parents:
diff changeset
   746
        }
hgs
parents:
diff changeset
   747
        
hgs
parents:
diff changeset
   748
        QString context;
hgs
parents:
diff changeset
   749
        QString subtype;
hgs
parents:
diff changeset
   750
        if ( def == QContactPhoneNumber::DefinitionName )
hgs
parents:
diff changeset
   751
        {
hgs
parents:
diff changeset
   752
            QContactPhoneNumber number(detail); 
hgs
parents:
diff changeset
   753
            context = number.contexts().isEmpty() ? QString() : number.contexts().first();
hgs
parents:
diff changeset
   754
            subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first();
hgs
parents:
diff changeset
   755
        }
hgs
parents:
diff changeset
   756
        else if ( def == QContactEmailAddress::DefinitionName )
hgs
parents:
diff changeset
   757
        {
hgs
parents:
diff changeset
   758
            QContactEmailAddress email(detail); 
hgs
parents:
diff changeset
   759
            context = email.contexts().isEmpty() ? QString() : email.contexts().first();
hgs
parents:
diff changeset
   760
            subtype = detail.definitionName();
hgs
parents:
diff changeset
   761
        }
hgs
parents:
diff changeset
   762
        else if ( def == QContactOnlineAccount::DefinitionName )
hgs
parents:
diff changeset
   763
        {
hgs
parents:
diff changeset
   764
            QContactOnlineAccount number(detail); 
hgs
parents:
diff changeset
   765
            context = number.contexts().isEmpty() ? QString() : number.contexts().first();
hgs
parents:
diff changeset
   766
            subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first();
hgs
parents:
diff changeset
   767
        }
hgs
parents:
diff changeset
   768
        else if ( def == QContactFamily::DefinitionName )
hgs
parents:
diff changeset
   769
        {
hgs
parents:
diff changeset
   770
            QStringList fields = aDetail->data(ERoleContactDetailFields).toStringList();
hgs
parents:
diff changeset
   771
            subtype = fields.first();
hgs
parents:
diff changeset
   772
        }
hgs
parents:
diff changeset
   773
        else
hgs
parents:
diff changeset
   774
        {
hgs
parents:
diff changeset
   775
            context = QString();
hgs
parents:
diff changeset
   776
            subtype = detail.definitionName();
hgs
parents:
diff changeset
   777
        }
hgs
parents:
diff changeset
   778
        
hgs
parents:
diff changeset
   779
        HbAction* edit = menu->addAction(hbTrId("txt_common_menu_edit"));
hgs
parents:
diff changeset
   780
        HbAction* del = menu->addAction(map->getContactEditorDelLocString(subtype, context));
hgs
parents:
diff changeset
   781
        edit->setProperty( "menu", HbAction::EditRole );
hgs
parents:
diff changeset
   782
        del->setProperty( "menu" , HbAction::DeleteRole );
hgs
parents:
diff changeset
   783
        edit->setData( data );
hgs
parents:
diff changeset
   784
        del->setData( data );
hgs
parents:
diff changeset
   785
    }
hgs
parents:
diff changeset
   786
    else
hgs
parents:
diff changeset
   787
    {
hgs
parents:
diff changeset
   788
        HbAction* add = menu->addAction(map->getContactEditorAddLocString(detail.definitionName(), ""));
hgs
parents:
diff changeset
   789
        add->setProperty( "menu", HbAction::NewRole );
hgs
parents:
diff changeset
   790
        add->setData( data );
hgs
parents:
diff changeset
   791
    }
hgs
parents:
diff changeset
   792
    delete map;
hgs
parents:
diff changeset
   793
    return menu;
hgs
parents:
diff changeset
   794
}
hgs
parents:
diff changeset
   795
hgs
parents:
diff changeset
   796
void CntEditViewPrivate::addDetail( CntEditViewItem* aDetail )
hgs
parents:
diff changeset
   797
{
hgs
parents:
diff changeset
   798
    QVariant id = aDetail->data( ERoleEditorViewId );
hgs
parents:
diff changeset
   799
    
hgs
parents:
diff changeset
   800
    mArgs.insert(EViewId, id.toInt());
hgs
parents:
diff changeset
   801
    mArgs.insert(ESelectedAction, CNT_ADD_ACTION );
hgs
parents:
diff changeset
   802
    QVariant var;
hgs
parents:
diff changeset
   803
    var.setValue(*mContact);
hgs
parents:
diff changeset
   804
    
hgs
parents:
diff changeset
   805
    mArgs.insert(ESelectedContact, var);
hgs
parents:
diff changeset
   806
                                        
hgs
parents:
diff changeset
   807
    mMgr->changeView( mArgs );
hgs
parents:
diff changeset
   808
}
hgs
parents:
diff changeset
   809
hgs
parents:
diff changeset
   810
void CntEditViewPrivate::editDetail( CntEditViewItem* aDetail )
hgs
parents:
diff changeset
   811
{
hgs
parents:
diff changeset
   812
    QVariant id = aDetail->data( ERoleEditorViewId );
hgs
parents:
diff changeset
   813
    
hgs
parents:
diff changeset
   814
    mArgs.insert(EViewId, id.toInt());
hgs
parents:
diff changeset
   815
    mArgs.insert(ESelectedAction, QString() );
hgs
parents:
diff changeset
   816
    QVariant var;
hgs
parents:
diff changeset
   817
    var.setValue(*mContact);
hgs
parents:
diff changeset
   818
    
hgs
parents:
diff changeset
   819
    mArgs.insert(ESelectedContact, var);
hgs
parents:
diff changeset
   820
                                              
hgs
parents:
diff changeset
   821
    mMgr->changeView( mArgs );
hgs
parents:
diff changeset
   822
}
hgs
parents:
diff changeset
   823
hgs
parents:
diff changeset
   824
void CntEditViewPrivate::removeDetail( CntEditViewItem* aDetail, const QModelIndex& aIndex )
hgs
parents:
diff changeset
   825
{
hgs
parents:
diff changeset
   826
    mModel->removeItem( aDetail, aIndex );
hgs
parents:
diff changeset
   827
    mSave->setEnabled( true );
hgs
parents:
diff changeset
   828
    mDiscard->setEnabled( true );
hgs
parents:
diff changeset
   829
}
hgs
parents:
diff changeset
   830
hgs
parents:
diff changeset
   831
void CntEditViewPrivate::setSelectedContact( QContact aContact )
hgs
parents:
diff changeset
   832
{
hgs
parents:
diff changeset
   833
    CNT_ENTRY
hgs
parents:
diff changeset
   834
    
hgs
parents:
diff changeset
   835
    if ( mContact )
hgs
parents:
diff changeset
   836
    {
hgs
parents:
diff changeset
   837
        delete mContact;
hgs
parents:
diff changeset
   838
        mContact = NULL;
hgs
parents:
diff changeset
   839
    }
hgs
parents:
diff changeset
   840
    mContact = new QContact( aContact );
hgs
parents:
diff changeset
   841
    
hgs
parents:
diff changeset
   842
    QContactManager& cm = mEngine->contactManager( SYMBIAN_BACKEND );
hgs
parents:
diff changeset
   843
    connect(&cm, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)), 
hgs
parents:
diff changeset
   844
        this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)), Qt::UniqueConnection);
hgs
parents:
diff changeset
   845
    
hgs
parents:
diff changeset
   846
	CNT_EXIT
hgs
parents:
diff changeset
   847
}
hgs
parents:
diff changeset
   848
hgs
parents:
diff changeset
   849
void CntEditViewPrivate::contactDeletedFromOtherSource(const QList<QContactLocalId>& contactIds)
hgs
parents:
diff changeset
   850
{
hgs
parents:
diff changeset
   851
    CNT_ENTRY
hgs
parents:
diff changeset
   852
    
hgs
parents:
diff changeset
   853
    if ( contactIds.contains(mContact->localId()) )
hgs
parents:
diff changeset
   854
    {
hgs
parents:
diff changeset
   855
        // Do not switch to the previous view immediately. List views are
hgs
parents:
diff changeset
   856
        // not updated properly if this is not done in the event loop
hgs
parents:
diff changeset
   857
        QTimer::singleShot(0, this, SLOT(showRootView()));
hgs
parents:
diff changeset
   858
    }
hgs
parents:
diff changeset
   859
    
hgs
parents:
diff changeset
   860
    CNT_EXIT
hgs
parents:
diff changeset
   861
}
hgs
parents:
diff changeset
   862
hgs
parents:
diff changeset
   863
void CntEditViewPrivate::showRootView()
hgs
parents:
diff changeset
   864
{
hgs
parents:
diff changeset
   865
    CNT_ENTRY
hgs
parents:
diff changeset
   866
    
hgs
parents:
diff changeset
   867
    Q_Q(CntEditView);
hgs
parents:
diff changeset
   868
    
hgs
parents:
diff changeset
   869
    emit q->contactRemoved(true);
hgs
parents:
diff changeset
   870
    mMgr->back( mArgs, true );
hgs
parents:
diff changeset
   871
    
hgs
parents:
diff changeset
   872
    CNT_EXIT
hgs
parents:
diff changeset
   873
}
hgs
parents:
diff changeset
   874
81
hgs
parents: 72
diff changeset
   875
void CntEditViewPrivate::setObjectNames()
hgs
parents: 72
diff changeset
   876
{
hgs
parents: 72
diff changeset
   877
    int itemCount = mModel->rowCount();
hgs
parents: 72
diff changeset
   878
    
hgs
parents: 72
diff changeset
   879
    for (int itemRow = 0 ; itemRow < itemCount ; itemRow++)
hgs
parents: 72
diff changeset
   880
    {
hgs
parents: 72
diff changeset
   881
        QModelIndex modelIndex = mModel->index(itemRow);
hgs
parents: 72
diff changeset
   882
        HbListViewItem* item = static_cast<HbListViewItem*>(mListView->itemByIndex(modelIndex));
hgs
parents: 72
diff changeset
   883
        if (NULL != item)
hgs
parents: 72
diff changeset
   884
        {
hgs
parents: 72
diff changeset
   885
            item->setObjectName(QString("ListViewItem %1").arg(itemRow));
hgs
parents: 72
diff changeset
   886
        }
hgs
parents: 72
diff changeset
   887
    }   
hgs
parents: 72
diff changeset
   888
}
72
hgs
parents:
diff changeset
   889
// End of File
hgs
parents:
diff changeset
   890