phonebookui/cntcommonui/contacteditors/cnteditviewlistmodel.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 "cnteditviewlistmodel.h"
hgs
parents:
diff changeset
    19
#include "cntextensionmanager.h"
hgs
parents:
diff changeset
    20
#include "cntuiextensionfactory.h"
hgs
parents:
diff changeset
    21
#include "cnteditviewitemsupplier.h"
hgs
parents:
diff changeset
    22
#include "cnteditviewdetailitem.h"
hgs
parents:
diff changeset
    23
#include "cnteditviewitembuilder.h"
hgs
parents:
diff changeset
    24
#include <cntviewparams.h>
hgs
parents:
diff changeset
    25
#include <QDir>
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
CntEditViewListModel::CntEditViewListModel( QContact& aContact, CntExtensionManager& aMgr ) :
hgs
parents:
diff changeset
    28
mManager( aMgr ),
hgs
parents:
diff changeset
    29
mContact( aContact )
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
{
hgs
parents:
diff changeset
    32
    mLookupTable.insert( EPhonenumber,    -1 );
hgs
parents:
diff changeset
    33
    mLookupTable.insert( EEmailAddress,   -1 );
hgs
parents:
diff changeset
    34
    mLookupTable.insert( EAddressTemplate,-1 );
hgs
parents:
diff changeset
    35
    mLookupTable.insert( EPluginItem,     -1 );
hgs
parents:
diff changeset
    36
    mLookupTable.insert( EUrl,            -1 );
hgs
parents:
diff changeset
    37
    mLookupTable.insert( ESeparator,      -1 );
hgs
parents:
diff changeset
    38
    mLookupTable.insert( EAddressDetail,  -1 );
hgs
parents:
diff changeset
    39
    mLookupTable.insert( ECompany,        -1 );
hgs
parents:
diff changeset
    40
    mLookupTable.insert( EDate,           -1 );
hgs
parents:
diff changeset
    41
    mLookupTable.insert( ERingingTone,    -1 );
hgs
parents:
diff changeset
    42
    mLookupTable.insert( ENote,           -1 );
hgs
parents:
diff changeset
    43
    mLookupTable.insert( EFamily,         -1 );
hgs
parents:
diff changeset
    44
    mLookupTable.insert( ESynchronization,-1 );
hgs
parents:
diff changeset
    45
    
hgs
parents:
diff changeset
    46
    mLookupMap.insert( QContactPhoneNumber::DefinitionName,     EPhonenumber );
hgs
parents:
diff changeset
    47
    mLookupMap.insert( QContactOnlineAccount::DefinitionName,   EPhonenumber );
hgs
parents:
diff changeset
    48
    mLookupMap.insert( QContactEmailAddress::DefinitionName,    EEmailAddress );
hgs
parents:
diff changeset
    49
    mLookupMap.insert( QContactAddress::DefinitionName,         EAddressDetail);
hgs
parents:
diff changeset
    50
    mLookupMap.insert( QContactUrl::DefinitionName,             EUrl );
hgs
parents:
diff changeset
    51
    mLookupMap.insert( QContactOrganization::DefinitionName,    ECompany);
hgs
parents:
diff changeset
    52
    mLookupMap.insert( QContactBirthday::DefinitionName,        EDate );
hgs
parents:
diff changeset
    53
    mLookupMap.insert( QContactAnniversary::DefinitionName,     EDate);
hgs
parents:
diff changeset
    54
    mLookupMap.insert( QContactRingtone::DefinitionName,        ERingingTone);
hgs
parents:
diff changeset
    55
    mLookupMap.insert( QContactNote::DefinitionName,            ENote);
hgs
parents:
diff changeset
    56
    mLookupMap.insert( QContactFamily::DefinitionName,          EFamily);
hgs
parents:
diff changeset
    57
    
hgs
parents:
diff changeset
    58
    mBuilder = new CntEditViewItemBuilder();
hgs
parents:
diff changeset
    59
    mSeparator = new CntEditViewSeparator();
hgs
parents:
diff changeset
    60
    
hgs
parents:
diff changeset
    61
    refresh();
hgs
parents:
diff changeset
    62
}
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
CntEditViewListModel::~CntEditViewListModel()
hgs
parents:
diff changeset
    65
{
hgs
parents:
diff changeset
    66
    // Delete the separator item separately if it hasn't been added to the list
hgs
parents:
diff changeset
    67
    if (mSeparator && mItemList.indexOf(mSeparator) == -1)
hgs
parents:
diff changeset
    68
    {
hgs
parents:
diff changeset
    69
        delete mSeparator;
hgs
parents:
diff changeset
    70
        mSeparator = NULL;
hgs
parents:
diff changeset
    71
    }
hgs
parents:
diff changeset
    72
    
hgs
parents:
diff changeset
    73
    qDeleteAll( mItemList );
hgs
parents:
diff changeset
    74
    mItemList.clear();
hgs
parents:
diff changeset
    75
    
hgs
parents:
diff changeset
    76
    delete mBuilder;
hgs
parents:
diff changeset
    77
    mBuilder = NULL;
hgs
parents:
diff changeset
    78
}
hgs
parents:
diff changeset
    79
 
hgs
parents:
diff changeset
    80
void CntEditViewListModel::updateRingtone()
hgs
parents:
diff changeset
    81
{
hgs
parents:
diff changeset
    82
    beginResetModel();
hgs
parents:
diff changeset
    83
    KLookupKey key = mLookupMap.value( QContactRingtone::DefinitionName );
hgs
parents:
diff changeset
    84
    int index = mLookupTable.value( key );
hgs
parents:
diff changeset
    85
    if ( index != -1 )
hgs
parents:
diff changeset
    86
    {
hgs
parents:
diff changeset
    87
         // fetch the detail item
hgs
parents:
diff changeset
    88
        QContactRingtone ringtone = mContact.detail<QContactRingtone>();
hgs
parents:
diff changeset
    89
        QUrl ringtoneUrl = ringtone.audioRingtoneUrl();
hgs
parents:
diff changeset
    90
        if ( !ringtoneUrl.isEmpty() )
hgs
parents:
diff changeset
    91
        {
hgs
parents:
diff changeset
    92
            CntEditViewDetailItem* detailItem = new CntEditViewDetailItem(
hgs
parents:
diff changeset
    93
                    ringtone,
hgs
parents:
diff changeset
    94
                    QContactRingtone::FieldAudioRingtoneUrl,
hgs
parents:
diff changeset
    95
                    ringToneFetcherView);
hgs
parents:
diff changeset
    96
            detailItem->addText( hbTrId("txt_phob_formlabel_ringing_tone") );
hgs
parents:
diff changeset
    97
            QFileInfo ringtoneFileInfo(ringtoneUrl.toString());
hgs
parents:
diff changeset
    98
            QString ringtoneFileName = ringtoneFileInfo.fileName();
hgs
parents:
diff changeset
    99
            detailItem->addText( ringtoneFileName); 
hgs
parents:
diff changeset
   100
            mItemList.replace(index, detailItem );
hgs
parents:
diff changeset
   101
        }
hgs
parents:
diff changeset
   102
    }   
hgs
parents:
diff changeset
   103
    else
hgs
parents:
diff changeset
   104
    {
hgs
parents:
diff changeset
   105
        insertDetailItem( key, mBuilder->ringtoneDetails(mContact) );
hgs
parents:
diff changeset
   106
    }
hgs
parents:
diff changeset
   107
    endResetModel();
hgs
parents:
diff changeset
   108
}
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
int CntEditViewListModel::rowCount( const QModelIndex& aParent ) const
hgs
parents:
diff changeset
   111
{
hgs
parents:
diff changeset
   112
    Q_UNUSED( aParent );
hgs
parents:
diff changeset
   113
    return mItemList.size();
hgs
parents:
diff changeset
   114
}
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
QVariant CntEditViewListModel::data( const QModelIndex& aIndex, int aRole ) const
hgs
parents:
diff changeset
   117
{
hgs
parents:
diff changeset
   118
   if ( aIndex.row() >= 0 && aIndex.row() < mItemList.size() )
hgs
parents:
diff changeset
   119
   {
hgs
parents:
diff changeset
   120
       CntEditViewItem* item = mItemList.at( aIndex.row() );
hgs
parents:
diff changeset
   121
       return item->data( aRole );
hgs
parents:
diff changeset
   122
   }
hgs
parents:
diff changeset
   123
    return QVariant();
hgs
parents:
diff changeset
   124
}
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
Qt::ItemFlags CntEditViewListModel::flags(const QModelIndex& aIndex) const
hgs
parents:
diff changeset
   127
{
hgs
parents:
diff changeset
   128
    CntEditViewItem* item = mItemList.at( aIndex.row() );
hgs
parents:
diff changeset
   129
    QVariant data = item->data( Hb::ItemTypeRole );
hgs
parents:
diff changeset
   130
    if ( data.toInt() == Hb::SeparatorItem )
hgs
parents:
diff changeset
   131
    {
hgs
parents:
diff changeset
   132
        return Qt::NoItemFlags;
hgs
parents:
diff changeset
   133
    }
hgs
parents:
diff changeset
   134
    
hgs
parents:
diff changeset
   135
    return QAbstractListModel::flags( aIndex );
hgs
parents:
diff changeset
   136
}
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
CntEditViewItem* CntEditViewListModel::itemAt( const QModelIndex& aIndex ) const
hgs
parents:
diff changeset
   139
{
hgs
parents:
diff changeset
   140
    return mItemList.at( aIndex.row() );
hgs
parents:
diff changeset
   141
}
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
void CntEditViewListModel::removeItem( CntEditViewItem* aItem, const QModelIndex& aIndex )
hgs
parents:
diff changeset
   144
{
hgs
parents:
diff changeset
   145
    int index = mItemList.indexOf( aItem );
hgs
parents:
diff changeset
   146
    if ( index >= 0 )
hgs
parents:
diff changeset
   147
    {
hgs
parents:
diff changeset
   148
        beginRemoveRows( aIndex.parent(), index, index );
hgs
parents:
diff changeset
   149
        // remove item from item list
hgs
parents:
diff changeset
   150
        CntEditViewItem* item = mItemList.takeAt( index );
hgs
parents:
diff changeset
   151
        
hgs
parents:
diff changeset
   152
        // get detailed information
hgs
parents:
diff changeset
   153
        QContactDetail detail = item->data(ERoleContactDetail).value<QContactDetail>();
hgs
parents:
diff changeset
   154
        QStringList fields = item->data(ERoleContactDetailFields).toStringList();
hgs
parents:
diff changeset
   155
        
hgs
parents:
diff changeset
   156
        // remove the detail from QContact
hgs
parents:
diff changeset
   157
        mBuilder->removeDetail( mContact, detail, fields );
hgs
parents:
diff changeset
   158
        
hgs
parents:
diff changeset
   159
        // Update lookup table. Note, in case of QContactAddress,
hgs
parents:
diff changeset
   160
        // we can't remove address template, so the mapping for address always points to address detail
hgs
parents:
diff changeset
   161
        KLookupKey lookupKey = mLookupMap.value( detail.definitionName() );
hgs
parents:
diff changeset
   162
        removeItem( lookupKey );
hgs
parents:
diff changeset
   163
        
hgs
parents:
diff changeset
   164
        delete item;
hgs
parents:
diff changeset
   165
        
hgs
parents:
diff changeset
   166
        endRemoveRows();
hgs
parents:
diff changeset
   167
        
hgs
parents:
diff changeset
   168
        // Remove separator item if needed
hgs
parents:
diff changeset
   169
        if (mItemList.last()->data( Hb::ItemTypeRole ) == QVariant(Hb::SeparatorItem))
hgs
parents:
diff changeset
   170
        {
hgs
parents:
diff changeset
   171
            int separatorIndex = mItemList.indexOf( mSeparator );
hgs
parents:
diff changeset
   172
            beginRemoveRows( aIndex.parent(), separatorIndex, separatorIndex );
hgs
parents:
diff changeset
   173
            mItemList.removeAt( separatorIndex );
hgs
parents:
diff changeset
   174
            removeItem( ESeparator  );
hgs
parents:
diff changeset
   175
            
hgs
parents:
diff changeset
   176
            delete mSeparator;
hgs
parents:
diff changeset
   177
            mSeparator = NULL;
hgs
parents:
diff changeset
   178
            
hgs
parents:
diff changeset
   179
            endRemoveRows();
hgs
parents:
diff changeset
   180
        }
hgs
parents:
diff changeset
   181
        
hgs
parents:
diff changeset
   182
        // Check if the removed item is -1 in lookuptable and if it needs a template
hgs
parents:
diff changeset
   183
        int lookupValue = mLookupTable.value( lookupKey );
hgs
parents:
diff changeset
   184
        if ( lookupValue == -1 )
hgs
parents:
diff changeset
   185
        {
hgs
parents:
diff changeset
   186
            if ( detail.definitionName() == QContactPhoneNumber::DefinitionName )
hgs
parents:
diff changeset
   187
            {
hgs
parents:
diff changeset
   188
                beginInsertRows(aIndex.parent(), index, index);
hgs
parents:
diff changeset
   189
                insertItem( EPhonenumber, mBuilder->phoneNumberItems(mContact) );
hgs
parents:
diff changeset
   190
                endInsertRows();
hgs
parents:
diff changeset
   191
            }
hgs
parents:
diff changeset
   192
            else if ( detail.definitionName() == QContactEmailAddress::DefinitionName )
hgs
parents:
diff changeset
   193
            {
hgs
parents:
diff changeset
   194
                beginInsertRows(aIndex.parent(), index, index);
hgs
parents:
diff changeset
   195
                insertItem( EEmailAddress, mBuilder->emailAddressItems(mContact) );
hgs
parents:
diff changeset
   196
                endInsertRows();
hgs
parents:
diff changeset
   197
            }
hgs
parents:
diff changeset
   198
            else if ( detail.definitionName() == QContactAddress::DefinitionName )
hgs
parents:
diff changeset
   199
            {
hgs
parents:
diff changeset
   200
                // special case: unlike the others, address template isn't in the same index as the last deleted detail
hgs
parents:
diff changeset
   201
                int emailIndex = mLookupTable.value( EEmailAddress );
hgs
parents:
diff changeset
   202
                beginInsertRows(aIndex.parent(), emailIndex + 1, emailIndex + 1);
hgs
parents:
diff changeset
   203
                insertItem( EAddressTemplate, mBuilder->addressItems(mContact) );
hgs
parents:
diff changeset
   204
                endInsertRows();
hgs
parents:
diff changeset
   205
            }
hgs
parents:
diff changeset
   206
            else if ( detail.definitionName() == QContactUrl::DefinitionName )
hgs
parents:
diff changeset
   207
            {
hgs
parents:
diff changeset
   208
                beginInsertRows(aIndex.parent(), index, index);
hgs
parents:
diff changeset
   209
                insertItem( EUrl, mBuilder->urlItems(mContact) );
hgs
parents:
diff changeset
   210
                endInsertRows();
hgs
parents:
diff changeset
   211
            }
hgs
parents:
diff changeset
   212
        }
hgs
parents:
diff changeset
   213
    }
hgs
parents:
diff changeset
   214
}
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
void CntEditViewListModel::refreshExtensionItems()
hgs
parents:
diff changeset
   217
{
hgs
parents:
diff changeset
   218
    // remove and delete all extension items
hgs
parents:
diff changeset
   219
    for( int i(mItemList.count()-1); i >= 0; i-- )
hgs
parents:
diff changeset
   220
    {
hgs
parents:
diff changeset
   221
        CntEditViewItem* item = mItemList.at( i );
hgs
parents:
diff changeset
   222
        if ( item->data(ERoleItemType) == QVariant(ETypeUiExtension) )
hgs
parents:
diff changeset
   223
        {
hgs
parents:
diff changeset
   224
            QModelIndex modelIndex = createIndex(i, 0);
hgs
parents:
diff changeset
   225
            beginRemoveRows( modelIndex.parent(), i, i );
hgs
parents:
diff changeset
   226
            mItemList.removeAt(i);
hgs
parents:
diff changeset
   227
            removeItem( EPluginItem );
hgs
parents:
diff changeset
   228
            
hgs
parents:
diff changeset
   229
            delete item;
hgs
parents:
diff changeset
   230
            endRemoveRows();
hgs
parents:
diff changeset
   231
        }
hgs
parents:
diff changeset
   232
    }
hgs
parents:
diff changeset
   233
    // query and reload extension items again
hgs
parents:
diff changeset
   234
    int count = mManager.pluginCount();
hgs
parents:
diff changeset
   235
    for ( int i(0); i < count; i++ )
hgs
parents:
diff changeset
   236
    {
hgs
parents:
diff changeset
   237
        CntUiExtensionFactory* factory = mManager.pluginAt(i);
hgs
parents:
diff changeset
   238
        CntEditViewItemSupplier* supplier = factory->editViewItemSupplier( mContact );
hgs
parents:
diff changeset
   239
        if (supplier)
hgs
parents:
diff changeset
   240
        {
hgs
parents:
diff changeset
   241
            loadPluginItems( supplier );
hgs
parents:
diff changeset
   242
        }
hgs
parents:
diff changeset
   243
    }
hgs
parents:
diff changeset
   244
}
hgs
parents:
diff changeset
   245
hgs
parents:
diff changeset
   246
void CntEditViewListModel::allInUseFields( CntViewIdList& aList )
hgs
parents:
diff changeset
   247
{
hgs
parents:
diff changeset
   248
    foreach ( KLookupKey key, mLookupTable.keys() )
hgs
parents:
diff changeset
   249
    {
hgs
parents:
diff changeset
   250
        int index = mLookupTable.value( key );
hgs
parents:
diff changeset
   251
        if ( index != -1 )
hgs
parents:
diff changeset
   252
        {
hgs
parents:
diff changeset
   253
            switch (key)
hgs
parents:
diff changeset
   254
            {
hgs
parents:
diff changeset
   255
                case EAddressDetail:
hgs
parents:
diff changeset
   256
                {
hgs
parents:
diff changeset
   257
                    // Considered to be in use if all address contexts have been added
hgs
parents:
diff changeset
   258
                    QList<QContactAddress> addrList = mContact.details<QContactAddress>();
hgs
parents:
diff changeset
   259
                    if ( addrList.count() >= 3 ) // no context, context home, context work
hgs
parents:
diff changeset
   260
                        aList.append( addressEditorView );
hgs
parents:
diff changeset
   261
                }
hgs
parents:
diff changeset
   262
                break;
hgs
parents:
diff changeset
   263
                
hgs
parents:
diff changeset
   264
                case ECompany:
hgs
parents:
diff changeset
   265
                {
hgs
parents:
diff changeset
   266
                    // Considered in use if some details and assistant exists
hgs
parents:
diff changeset
   267
                    QContactOrganization org = mContact.detail( QContactOrganization::DefinitionName );
hgs
parents:
diff changeset
   268
                    if ( !org.assistantName().isEmpty() && 
hgs
parents:
diff changeset
   269
                        (!org.name().isEmpty() || !org.department().isEmpty() || !org.title().isEmpty()) )
hgs
parents:
diff changeset
   270
                        aList.append( companyEditorView );
hgs
parents:
diff changeset
   271
                }
hgs
parents:
diff changeset
   272
                break;
hgs
parents:
diff changeset
   273
                
hgs
parents:
diff changeset
   274
                case EDate:
hgs
parents:
diff changeset
   275
                {
hgs
parents:
diff changeset
   276
                    QContactBirthday bd = mContact.detail( QContactBirthday::DefinitionName );
hgs
parents:
diff changeset
   277
                    QContactAnniversary anniversary = mContact.detail( QContactAnniversary::DefinitionName );
hgs
parents:
diff changeset
   278
                    // considered as in use when both birthday and anniversary has a valid date
hgs
parents:
diff changeset
   279
                    if ( bd.date().isValid() && anniversary.originalDate().isValid() )
hgs
parents:
diff changeset
   280
                        aList.append( dateEditorView );
hgs
parents:
diff changeset
   281
                }
hgs
parents:
diff changeset
   282
                break;
hgs
parents:
diff changeset
   283
                    
hgs
parents:
diff changeset
   284
                case EFamily:
hgs
parents:
diff changeset
   285
                {
hgs
parents:
diff changeset
   286
                    QContactFamily family = mContact.detail( QContactFamily::DefinitionName );
hgs
parents:
diff changeset
   287
                    if ( !family.children().isEmpty() && !family.spouse().isEmpty() )
hgs
parents:
diff changeset
   288
                        aList.append( familyDetailEditorView );
hgs
parents:
diff changeset
   289
                }
hgs
parents:
diff changeset
   290
                break;
hgs
parents:
diff changeset
   291
                
hgs
parents:
diff changeset
   292
                case ERingingTone:
hgs
parents:
diff changeset
   293
                {
hgs
parents:
diff changeset
   294
                    
hgs
parents:
diff changeset
   295
                    QContactRingtone tone = mContact.detail( QContactRingtone::DefinitionName );
hgs
parents:
diff changeset
   296
                    if ( !tone.audioRingtoneUrl().isEmpty() )
hgs
parents:
diff changeset
   297
                        aList.append( ringToneFetcherView );
hgs
parents:
diff changeset
   298
                    
hgs
parents:
diff changeset
   299
                }
hgs
parents:
diff changeset
   300
                break;
hgs
parents:
diff changeset
   301
                
hgs
parents:
diff changeset
   302
                default:
hgs
parents:
diff changeset
   303
                    break;
hgs
parents:
diff changeset
   304
            }
hgs
parents:
diff changeset
   305
        }
hgs
parents:
diff changeset
   306
    }
hgs
parents:
diff changeset
   307
}
hgs
parents:
diff changeset
   308
hgs
parents:
diff changeset
   309
QModelIndex CntEditViewListModel::itemIndex( QContactDetail aDetail ) const
hgs
parents:
diff changeset
   310
{
hgs
parents:
diff changeset
   311
    QModelIndex itemIndex;
hgs
parents:
diff changeset
   312
    for ( int i(0); i < mItemList.count(); i++ ) {
hgs
parents:
diff changeset
   313
        CntEditViewItem* item = mItemList.at( i );
hgs
parents:
diff changeset
   314
        QVariant data = item->data( ERoleContactDetail );
hgs
parents:
diff changeset
   315
        if ( data.value<QContactDetail>() == aDetail )
hgs
parents:
diff changeset
   316
        {
hgs
parents:
diff changeset
   317
            itemIndex = index( i ); 
hgs
parents:
diff changeset
   318
            break;
hgs
parents:
diff changeset
   319
        }
hgs
parents:
diff changeset
   320
    }
hgs
parents:
diff changeset
   321
    return itemIndex;
hgs
parents:
diff changeset
   322
}
hgs
parents:
diff changeset
   323
hgs
parents:
diff changeset
   324
void CntEditViewListModel::refresh()
hgs
parents:
diff changeset
   325
{
81
hgs
parents: 72
diff changeset
   326
    mItemList.clear();
72
hgs
parents:
diff changeset
   327
    insertItem( EPhonenumber, mBuilder->phoneNumberItems(mContact) );
hgs
parents:
diff changeset
   328
    insertItem( EEmailAddress, mBuilder->emailAddressItems(mContact) );
hgs
parents:
diff changeset
   329
    insertItem( EAddressTemplate, mBuilder->addressItems(mContact) );
hgs
parents:
diff changeset
   330
    insertItem( EUrl, mBuilder->urlItems(mContact) );
hgs
parents:
diff changeset
   331
        
hgs
parents:
diff changeset
   332
    int count = mManager.pluginCount();
hgs
parents:
diff changeset
   333
    for ( int i(0); i < count; i++ )
hgs
parents:
diff changeset
   334
    {
hgs
parents:
diff changeset
   335
        CntUiExtensionFactory* factory = mManager.pluginAt(i);
hgs
parents:
diff changeset
   336
        CntEditViewItemSupplier* supplier = factory->editViewItemSupplier( mContact );
hgs
parents:
diff changeset
   337
        if (supplier)
hgs
parents:
diff changeset
   338
        {
hgs
parents:
diff changeset
   339
            loadPluginItems( supplier );
hgs
parents:
diff changeset
   340
        }
hgs
parents:
diff changeset
   341
    }
hgs
parents:
diff changeset
   342
        
hgs
parents:
diff changeset
   343
    insertDetailItem( EAddressDetail, mBuilder->addressDetails(mContact) );
hgs
parents:
diff changeset
   344
    insertDetailItem( ECompany, mBuilder->companyDetails(mContact) );
hgs
parents:
diff changeset
   345
    insertDetailItem( EDate, mBuilder->dateDetails(mContact) );
hgs
parents:
diff changeset
   346
    insertDetailItem( ENote, mBuilder->noteDetails(mContact) );
hgs
parents:
diff changeset
   347
    insertDetailItem( EFamily, mBuilder->familyDetails(mContact) );
hgs
parents:
diff changeset
   348
    insertDetailItem( ERingingTone, mBuilder->ringtoneDetails(mContact) );
hgs
parents:
diff changeset
   349
}
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
bool CntEditViewListModel::isEmptyItem( CntEditViewItem* aItem )
hgs
parents:
diff changeset
   352
{
hgs
parents:
diff changeset
   353
    if ( aItem )
hgs
parents:
diff changeset
   354
    {
hgs
parents:
diff changeset
   355
        QContactDetail d = aItem->data( ERoleContactDetail ).value<QContactDetail>();
hgs
parents:
diff changeset
   356
        QStringList fields = aItem->data( ERoleContactDetailFields ).toStringList();
hgs
parents:
diff changeset
   357
        
hgs
parents:
diff changeset
   358
        foreach ( QString field, fields )
hgs
parents:
diff changeset
   359
        {
hgs
parents:
diff changeset
   360
            if ( !d.value(field).isEmpty() || !d.value<QStringList>(field).isEmpty() )
hgs
parents:
diff changeset
   361
            {
hgs
parents:
diff changeset
   362
                return false;
hgs
parents:
diff changeset
   363
            }
hgs
parents:
diff changeset
   364
        }
hgs
parents:
diff changeset
   365
    }
hgs
parents:
diff changeset
   366
    return true;
hgs
parents:
diff changeset
   367
}
hgs
parents:
diff changeset
   368
hgs
parents:
diff changeset
   369
void CntEditViewListModel::loadPluginItems( CntEditViewItemSupplier* aSupplier )
hgs
parents:
diff changeset
   370
{
hgs
parents:
diff changeset
   371
    QList<CntEditViewItem*> list;
hgs
parents:
diff changeset
   372
    int count = aSupplier->itemCount();
hgs
parents:
diff changeset
   373
    for ( int i(0); i < count; i++ )
hgs
parents:
diff changeset
   374
    {
hgs
parents:
diff changeset
   375
        CntEditViewItem* item = aSupplier->itemAt( i );
hgs
parents:
diff changeset
   376
        if ( item )
hgs
parents:
diff changeset
   377
        {
hgs
parents:
diff changeset
   378
            list << item;
hgs
parents:
diff changeset
   379
        }
hgs
parents:
diff changeset
   380
    }
hgs
parents:
diff changeset
   381
    
hgs
parents:
diff changeset
   382
    if ( !list.isEmpty() )
hgs
parents:
diff changeset
   383
    {
hgs
parents:
diff changeset
   384
        // the new items will be inserted under already existing plugin items...
hgs
parents:
diff changeset
   385
        int index = mLookupTable.value( EPluginItem );
hgs
parents:
diff changeset
   386
        
hgs
parents:
diff changeset
   387
        // ... or under the address template (if no plugins exist)
hgs
parents:
diff changeset
   388
        if (index == -1)
hgs
parents:
diff changeset
   389
        {
hgs
parents:
diff changeset
   390
            index = mLookupTable.value( EAddressTemplate );
hgs
parents:
diff changeset
   391
        }
hgs
parents:
diff changeset
   392
        
hgs
parents:
diff changeset
   393
        // ... or as a final choice, under the email address items (if address template doesn't exist)
hgs
parents:
diff changeset
   394
        if (index == -1)
hgs
parents:
diff changeset
   395
        {
hgs
parents:
diff changeset
   396
            index = mLookupTable.value( EEmailAddress );
hgs
parents:
diff changeset
   397
        }
hgs
parents:
diff changeset
   398
        QModelIndex modelIndex = createIndex(index, 0);
hgs
parents:
diff changeset
   399
        beginInsertRows(modelIndex.parent(), index + 1, index + count);
hgs
parents:
diff changeset
   400
        insertItem( EPluginItem, list );
hgs
parents:
diff changeset
   401
        endInsertRows();
hgs
parents:
diff changeset
   402
    }
hgs
parents:
diff changeset
   403
}
hgs
parents:
diff changeset
   404
hgs
parents:
diff changeset
   405
void CntEditViewListModel::insertDetailItem( KLookupKey aKey, QList<CntEditViewItem*> aList )
hgs
parents:
diff changeset
   406
{
hgs
parents:
diff changeset
   407
    if ( !aList.isEmpty() )
hgs
parents:
diff changeset
   408
    {
hgs
parents:
diff changeset
   409
        insertSeparator();
hgs
parents:
diff changeset
   410
        insertItem( aKey, aList );
hgs
parents:
diff changeset
   411
    }
hgs
parents:
diff changeset
   412
}
hgs
parents:
diff changeset
   413
hgs
parents:
diff changeset
   414
void CntEditViewListModel::insertItem( KLookupKey aLookupKey, QList<CntEditViewItem*> aList )
hgs
parents:
diff changeset
   415
{
hgs
parents:
diff changeset
   416
    if ( !aList.isEmpty() )
hgs
parents:
diff changeset
   417
    {
hgs
parents:
diff changeset
   418
        QList<KLookupKey> keys = mLookupTable.keys();
hgs
parents:
diff changeset
   419
        int ind = keys.indexOf( aLookupKey );
hgs
parents:
diff changeset
   420
        for ( int i=ind; i >= 0; i-- )
hgs
parents:
diff changeset
   421
        {
hgs
parents:
diff changeset
   422
            KLookupKey key = keys.at( i );
hgs
parents:
diff changeset
   423
            int lastIndexValue = mLookupTable.value( key );
hgs
parents:
diff changeset
   424
            // search next suitable "lastindex" where to insert the items
hgs
parents:
diff changeset
   425
            if ( i != 0 && lastIndexValue == -1 )
hgs
parents:
diff changeset
   426
                continue;
hgs
parents:
diff changeset
   427
                   
hgs
parents:
diff changeset
   428
            // insert items to current index
hgs
parents:
diff changeset
   429
            for ( int j(0); j < aList.count(); j++ )
hgs
parents:
diff changeset
   430
            {
hgs
parents:
diff changeset
   431
                mItemList.insert( lastIndexValue + j + 1, aList[j] );
hgs
parents:
diff changeset
   432
            }
hgs
parents:
diff changeset
   433
                   
hgs
parents:
diff changeset
   434
            // lookup keys value "lastindex"
hgs
parents:
diff changeset
   435
            int listCount = aList.count();
hgs
parents:
diff changeset
   436
            lastIndexValue = lastIndexValue + listCount;
hgs
parents:
diff changeset
   437
            mLookupTable.insert( aLookupKey, lastIndexValue );
hgs
parents:
diff changeset
   438
            // update all indexes in lookuptable 
hgs
parents:
diff changeset
   439
            for ( int k(ind+1); k < keys.size(); k++ )
hgs
parents:
diff changeset
   440
            {
hgs
parents:
diff changeset
   441
                int value = mLookupTable.value(keys[k]);
hgs
parents:
diff changeset
   442
                if ( value != -1 )
hgs
parents:
diff changeset
   443
                {
hgs
parents:
diff changeset
   444
                    mLookupTable.insert( keys[k], value + aList.count() );
hgs
parents:
diff changeset
   445
                }
hgs
parents:
diff changeset
   446
            }
hgs
parents:
diff changeset
   447
            break;
hgs
parents:
diff changeset
   448
        }
hgs
parents:
diff changeset
   449
    }
hgs
parents:
diff changeset
   450
}
hgs
parents:
diff changeset
   451
hgs
parents:
diff changeset
   452
void CntEditViewListModel::removeItem( KLookupKey aKey )
hgs
parents:
diff changeset
   453
{
hgs
parents:
diff changeset
   454
    QList<KLookupKey> keys = mLookupTable.keys();
hgs
parents:
diff changeset
   455
    int ind = keys.indexOf( aKey );
hgs
parents:
diff changeset
   456
    for ( int i(ind); i < keys.count(); i++ )
hgs
parents:
diff changeset
   457
    {
hgs
parents:
diff changeset
   458
        KLookupKey key = keys.at( i );
hgs
parents:
diff changeset
   459
        int lastIndexValue = mLookupTable.value( key ) - 1;
hgs
parents:
diff changeset
   460
        
hgs
parents:
diff changeset
   461
        // climb the keys (bottom to top) and see if somebody has the same value (then set value to -1)
hgs
parents:
diff changeset
   462
        for ( int j(ind); j >= 0; j-- )
hgs
parents:
diff changeset
   463
        {
hgs
parents:
diff changeset
   464
            if ( mLookupTable.value(keys[j]) == lastIndexValue )
hgs
parents:
diff changeset
   465
            {
hgs
parents:
diff changeset
   466
                lastIndexValue = -1;
hgs
parents:
diff changeset
   467
                break;
hgs
parents:
diff changeset
   468
            }
hgs
parents:
diff changeset
   469
        }
hgs
parents:
diff changeset
   470
        
hgs
parents:
diff changeset
   471
        mLookupTable.insert( key, lastIndexValue );
hgs
parents:
diff changeset
   472
        // update rest of the keys by reducing one (top to bottom)
hgs
parents:
diff changeset
   473
        for ( int k(ind+1); k < keys.count(); k++ )
hgs
parents:
diff changeset
   474
        {
hgs
parents:
diff changeset
   475
            KLookupKey tmp = keys.at( k );
hgs
parents:
diff changeset
   476
            int value = mLookupTable.value( tmp );
hgs
parents:
diff changeset
   477
            if ( value != -1 )
hgs
parents:
diff changeset
   478
            {
hgs
parents:
diff changeset
   479
                mLookupTable.insert( tmp, value - 1 );
hgs
parents:
diff changeset
   480
            }
hgs
parents:
diff changeset
   481
        }
hgs
parents:
diff changeset
   482
        
hgs
parents:
diff changeset
   483
        break;
hgs
parents:
diff changeset
   484
    }
hgs
parents:
diff changeset
   485
}
hgs
parents:
diff changeset
   486
hgs
parents:
diff changeset
   487
void CntEditViewListModel::insertSeparator()
hgs
parents:
diff changeset
   488
{
hgs
parents:
diff changeset
   489
    if ( mItemList.indexOf(mSeparator) == -1 )
hgs
parents:
diff changeset
   490
    {
hgs
parents:
diff changeset
   491
        QList<CntEditViewItem*> list;
hgs
parents:
diff changeset
   492
        if (!mSeparator)
hgs
parents:
diff changeset
   493
        {
hgs
parents:
diff changeset
   494
            mSeparator = new CntEditViewSeparator();
hgs
parents:
diff changeset
   495
        }
hgs
parents:
diff changeset
   496
        list << mSeparator;
hgs
parents:
diff changeset
   497
        insertItem( ESeparator, list );
hgs
parents:
diff changeset
   498
    }
hgs
parents:
diff changeset
   499
}
hgs
parents:
diff changeset
   500
hgs
parents:
diff changeset
   501
// End of File