messagingappbase/msgeditor/viewsrc/MsgAddressControl.cpp
author hgs
Wed, 03 Nov 2010 09:52:46 +0530
changeset 79 2981cb3aa489
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
79
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2002-2006 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:  MsgAddressControl implementation
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// ========== INCLUDE FILES ================================
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include <eikenv.h>                        // for CEikonEnv
hgs
parents:
diff changeset
    23
#include <eikappui.h>                      // for CEikAppUi
hgs
parents:
diff changeset
    24
#include <barsread.h>                      // for TResourceReader
hgs
parents:
diff changeset
    25
#include <eikedwin.h>                      // for TClipboardFunc
hgs
parents:
diff changeset
    26
#include <txtrich.h>                       // for CRichText
hgs
parents:
diff changeset
    27
#include <AknUtils.h>                      // for AknUtils
hgs
parents:
diff changeset
    28
#include <aknbutton.h>                     // for CAknButton
hgs
parents:
diff changeset
    29
#include <eiklabel.h>                      // for CEikLabel
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
#include "MsgAddressControl.h"             // for CMsgAddressControl
hgs
parents:
diff changeset
    32
#include "MsgAddressControlEditor.h"       // for CMsgAddressControlEditor
hgs
parents:
diff changeset
    33
#include "MsgAddressControlEditorField.h"  // for CMsgAddressControlEditorField
hgs
parents:
diff changeset
    34
#include "MsgBaseControlObserver.h"        // for MMsgBaseControlObserver
hgs
parents:
diff changeset
    35
#include "MsgRecipientItem.h"              // for CMsgRecipientItem
hgs
parents:
diff changeset
    36
#include "MsgEditorPanic.h"                // for CMsgEditor panics
hgs
parents:
diff changeset
    37
#include "MsgEditorCommon.h"               // for KArabicSemicolon
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
// ========== EXTERNAL DATA STRUCTURES =====================
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
// ========== EXTERNAL FUNCTION PROTOTYPES =================
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
// ========== CONSTANTS ====================================
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
// ========== MACROS =======================================
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
// ========== LOCAL CONSTANTS AND MACROS ===================
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
const TInt KRecipientArrayGranularity = 10;
hgs
parents:
diff changeset
    50
const TInt KMaxEntryLength = 256;
hgs
parents:
diff changeset
    51
const TUint KMsgListSeparator = ';';             // List separator
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
// Unicode sign for S60 "enter" symbol
hgs
parents:
diff changeset
    54
const TInt KDownwardsArrowWithTipLeftwards  = 0x21B2;
hgs
parents:
diff changeset
    55
const TInt KDownwardsArrowWithTipRightwards = 0x21B3;
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
// ========== MODULE DATA STRUCTURES =======================
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
// ========== LOCAL FUNCTION PROTOTYPES ====================
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
// ========== LOCAL FUNCTIONS ==============================
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
// ========== MEMBER FUNCTIONS =============================
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
// ---------------------------------------------------------
hgs
parents:
diff changeset
    68
// CMsgAddressControl::CMsgAddressControl
hgs
parents:
diff changeset
    69
//
hgs
parents:
diff changeset
    70
// Constructor.
hgs
parents:
diff changeset
    71
// ---------------------------------------------------------
hgs
parents:
diff changeset
    72
//
hgs
parents:
diff changeset
    73
CMsgAddressControl::CMsgAddressControl( MMsgBaseControlObserver& aBaseControlObserver ) : 
hgs
parents:
diff changeset
    74
    CMsgExpandableControl( aBaseControlObserver )
hgs
parents:
diff changeset
    75
    {
hgs
parents:
diff changeset
    76
    }
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
// ---------------------------------------------------------
hgs
parents:
diff changeset
    79
// CMsgAddressControl::~CMsgAddressControl
hgs
parents:
diff changeset
    80
//
hgs
parents:
diff changeset
    81
// Destructor.
hgs
parents:
diff changeset
    82
// ---------------------------------------------------------
hgs
parents:
diff changeset
    83
//
hgs
parents:
diff changeset
    84
CMsgAddressControl::~CMsgAddressControl()
hgs
parents:
diff changeset
    85
    {
hgs
parents:
diff changeset
    86
    if ( iRecipientArray )
hgs
parents:
diff changeset
    87
        {
hgs
parents:
diff changeset
    88
        iRecipientArray->ResetAndDestroy();
hgs
parents:
diff changeset
    89
        }
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
    delete iRecipientArray;
hgs
parents:
diff changeset
    92
    }
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
// ---------------------------------------------------------
hgs
parents:
diff changeset
    95
// CMsgAddressControl::AddRecipientL
hgs
parents:
diff changeset
    96
//
hgs
parents:
diff changeset
    97
//
hgs
parents:
diff changeset
    98
// ---------------------------------------------------------
hgs
parents:
diff changeset
    99
//
hgs
parents:
diff changeset
   100
EXPORT_C void CMsgAddressControl::AddRecipientL( const TDesC& aName,
hgs
parents:
diff changeset
   101
                                                 const TDesC& aAddress,
hgs
parents:
diff changeset
   102
                                                 TBool aVerified,
hgs
parents:
diff changeset
   103
                                                 MVPbkContactLink* aContactLink )
hgs
parents:
diff changeset
   104
    {
hgs
parents:
diff changeset
   105
    TInt count   = 0;
hgs
parents:
diff changeset
   106
    TInt size    = 0;
hgs
parents:
diff changeset
   107
    TInt entries = iAddressControlEditor->EntryCount();
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
    GetSizeOfAddresses( count, size );
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
    // when field is empty, count == 0 but entries == 1.
hgs
parents:
diff changeset
   112
    // when count > 0, this inserts at the end of the field.
hgs
parents:
diff changeset
   113
    if ( entries > 1 )
hgs
parents:
diff changeset
   114
        {
hgs
parents:
diff changeset
   115
        count = entries;
hgs
parents:
diff changeset
   116
        }
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
    iAddressControlEditor->SetCursorPosAndCancelSelectionL(
hgs
parents:
diff changeset
   119
        iAddressControlEditor->TextLength() );
hgs
parents:
diff changeset
   120
    iAddressControlEditor->CheckHighlightingL();
hgs
parents:
diff changeset
   121
    iAddressControlEditor->InsertEntryL(
hgs
parents:
diff changeset
   122
        count,
hgs
parents:
diff changeset
   123
        aName,
hgs
parents:
diff changeset
   124
        aAddress,
hgs
parents:
diff changeset
   125
        aVerified,
hgs
parents:
diff changeset
   126
        ETrue,
hgs
parents:
diff changeset
   127
        aContactLink
hgs
parents:
diff changeset
   128
         );
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
    FormatAndSetCursorPosL( iAddressControlEditor->TextLength() );
hgs
parents:
diff changeset
   131
    DrawDeferred();
hgs
parents:
diff changeset
   132
    iControlModeFlags |= EMsgControlModeModified;
hgs
parents:
diff changeset
   133
    }
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
// ---------------------------------------------------------
hgs
parents:
diff changeset
   136
// CMsgAddressControl::AddRecipientsL
hgs
parents:
diff changeset
   137
//
hgs
parents:
diff changeset
   138
//
hgs
parents:
diff changeset
   139
// ---------------------------------------------------------
hgs
parents:
diff changeset
   140
//
hgs
parents:
diff changeset
   141
EXPORT_C void CMsgAddressControl::AddRecipientsL(
hgs
parents:
diff changeset
   142
    const CMsgRecipientList& aRecipients )
hgs
parents:
diff changeset
   143
    {
hgs
parents:
diff changeset
   144
    CMsgRecipientArray* recipients = GetRecipientsL();
hgs
parents:
diff changeset
   145
    RefreshL( *recipients );
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
    TInt count = 0;
hgs
parents:
diff changeset
   148
    TInt size = 0;
hgs
parents:
diff changeset
   149
    TInt entries = iAddressControlEditor->EntryCount();
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
    GetSizeOfAddresses( count, size );
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
    // when field is empty, count == 0 but entries == 1.
hgs
parents:
diff changeset
   154
    // when count > 0, this inserts at the end of the field.
hgs
parents:
diff changeset
   155
    if ( entries > 1 )
hgs
parents:
diff changeset
   156
        {
hgs
parents:
diff changeset
   157
        count = entries;
hgs
parents:
diff changeset
   158
        }
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
    TInt cc = aRecipients.Count();
hgs
parents:
diff changeset
   161
    CMsgRecipientItem* item = NULL;
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
    iAddressControlEditor->SetCursorPosAndCancelSelectionL(
hgs
parents:
diff changeset
   164
        iAddressControlEditor->TextLength() );
hgs
parents:
diff changeset
   165
    iAddressControlEditor->CheckHighlightingL();
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
    TBool bandFormatting( EFalse );
hgs
parents:
diff changeset
   168
    if ( iAddressControlEditor->TextLayout()->IsFormattingBand() )
hgs
parents:
diff changeset
   169
        {
hgs
parents:
diff changeset
   170
        bandFormatting = ETrue;
hgs
parents:
diff changeset
   171
        }
hgs
parents:
diff changeset
   172
        
hgs
parents:
diff changeset
   173
    for ( TInt i = 0; i < cc; i++ )
hgs
parents:
diff changeset
   174
        {
hgs
parents:
diff changeset
   175
        item = aRecipients.At( i );
hgs
parents:
diff changeset
   176
        iAddressControlEditor->InsertEntryL(
hgs
parents:
diff changeset
   177
            count,
hgs
parents:
diff changeset
   178
            *item->Name(),
hgs
parents:
diff changeset
   179
            *item->Address(),
hgs
parents:
diff changeset
   180
            item->IsVerified(),
hgs
parents:
diff changeset
   181
            item->IsValidated(),
hgs
parents:
diff changeset
   182
            item->ContactLink() );
hgs
parents:
diff changeset
   183
        count++;
hgs
parents:
diff changeset
   184
        }    
hgs
parents:
diff changeset
   185
    
hgs
parents:
diff changeset
   186
    TInt pos = iAddressControlEditor->TextLength();
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
    iAddressControlEditor->TextView()->SetDocPosL( pos, EFalse );
hgs
parents:
diff changeset
   189
    
hgs
parents:
diff changeset
   190
    FormatAndSetCursorPosL( pos );
hgs
parents:
diff changeset
   191
    
hgs
parents:
diff changeset
   192
    // Editor changed to band formatting due to address addition.
hgs
parents:
diff changeset
   193
    // Set the editor height to maximum as text was added directly to
hgs
parents:
diff changeset
   194
    // richtext and height is not updated correctly because of partial format.
hgs
parents:
diff changeset
   195
    if ( !bandFormatting &&
hgs
parents:
diff changeset
   196
         iAddressControlEditor->TextLayout()->IsFormattingBand() )
hgs
parents:
diff changeset
   197
        {
hgs
parents:
diff changeset
   198
        // Set newSize to current width and maximum body height and
hgs
parents:
diff changeset
   199
        // force CMsgExpandableControl::HandleEdwinSizeChangeEventL to
hgs
parents:
diff changeset
   200
        // update the control size.
hgs
parents:
diff changeset
   201
        iControlModeFlags |= EMsgControlModeForceSizeUpdate;
hgs
parents:
diff changeset
   202
            
hgs
parents:
diff changeset
   203
        TSize newSize( iAddressControlEditor->Size().iWidth,
hgs
parents:
diff changeset
   204
                       iMaxBodyHeight - 1 );
hgs
parents:
diff changeset
   205
        
hgs
parents:
diff changeset
   206
        iAddressControlEditor->SetSize( newSize );
hgs
parents:
diff changeset
   207
        
hgs
parents:
diff changeset
   208
        iControlModeFlags &= ~EMsgControlModeForceSizeUpdate;
hgs
parents:
diff changeset
   209
        }
hgs
parents:
diff changeset
   210
        
hgs
parents:
diff changeset
   211
    DrawDeferred();
hgs
parents:
diff changeset
   212
    iControlModeFlags |= EMsgControlModeModified;
hgs
parents:
diff changeset
   213
    }
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
// ---------------------------------------------------------
hgs
parents:
diff changeset
   217
// CMsgAddressControl::GetRecipientsL
hgs
parents:
diff changeset
   218
//
hgs
parents:
diff changeset
   219
//
hgs
parents:
diff changeset
   220
// ---------------------------------------------------------
hgs
parents:
diff changeset
   221
//
hgs
parents:
diff changeset
   222
EXPORT_C CMsgRecipientArray* CMsgAddressControl::GetRecipientsL()
hgs
parents:
diff changeset
   223
    {
hgs
parents:
diff changeset
   224
    TInt entryNumber( iAddressControlEditor->EntryCount() );
hgs
parents:
diff changeset
   225
    const CMsgAddressControlEditorField* field = NULL;
hgs
parents:
diff changeset
   226
    TBuf<KMaxEntryLength> entryBuf;
hgs
parents:
diff changeset
   227
    TInt ret( KErrNotFound );
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
    if ( iRecipientArray == NULL )
hgs
parents:
diff changeset
   230
        {
hgs
parents:
diff changeset
   231
        iRecipientArray = new ( ELeave )
hgs
parents:
diff changeset
   232
            CMsgRecipientArray( KRecipientArrayGranularity );
hgs
parents:
diff changeset
   233
        }
hgs
parents:
diff changeset
   234
    else
hgs
parents:
diff changeset
   235
        {
hgs
parents:
diff changeset
   236
        iRecipientArray->ResetAndDestroy();
hgs
parents:
diff changeset
   237
        }
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
    for ( TInt ii = 0; ii < entryNumber; ii++ )
hgs
parents:
diff changeset
   240
        {
hgs
parents:
diff changeset
   241
        field = iAddressControlEditor->Field( ii );
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
        if ( field && field->IsVerified() )
hgs
parents:
diff changeset
   244
            {
hgs
parents:
diff changeset
   245
            HBufC* addressCopy = field->Address()->AllocLC();
hgs
parents:
diff changeset
   246
            TPtr addrTPtr = addressCopy->Des();
hgs
parents:
diff changeset
   247
            AknTextUtils::ConvertDigitsTo( addrTPtr, EDigitTypeWestern );
hgs
parents:
diff changeset
   248
            
hgs
parents:
diff changeset
   249
            CMsgRecipientItem* item =
hgs
parents:
diff changeset
   250
                CMsgRecipientItem::NewLC( *field->Name(), *addressCopy );
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
            const MVPbkContactLink* contactLink = field->ContactLink();
hgs
parents:
diff changeset
   253
            if ( contactLink )                  
hgs
parents:
diff changeset
   254
                {
hgs
parents:
diff changeset
   255
                item->SetContactLink( contactLink );
hgs
parents:
diff changeset
   256
                }
hgs
parents:
diff changeset
   257
                
hgs
parents:
diff changeset
   258
            item->SetVerified( field->IsVerified() );
hgs
parents:
diff changeset
   259
            item->SetValidated( field->IsValidated() );
hgs
parents:
diff changeset
   260
            iRecipientArray->AppendL( item );
hgs
parents:
diff changeset
   261
hgs
parents:
diff changeset
   262
            CleanupStack::Pop(); // item
hgs
parents:
diff changeset
   263
            CleanupStack::PopAndDestroy(); // addressCopy
hgs
parents:
diff changeset
   264
            }
hgs
parents:
diff changeset
   265
        else
hgs
parents:
diff changeset
   266
            {
hgs
parents:
diff changeset
   267
            SetParsingInfo( ii, 0, 0 );
hgs
parents:
diff changeset
   268
            ret = KErrNone;
hgs
parents:
diff changeset
   269
            while ( ret == KErrNone )
hgs
parents:
diff changeset
   270
                {
hgs
parents:
diff changeset
   271
                ret = GetNextItemOnEntry( entryBuf );
hgs
parents:
diff changeset
   272
                if ( ( ret == KErrNone ) && ( entryBuf.Length() > 0 ) )
hgs
parents:
diff changeset
   273
                    {
hgs
parents:
diff changeset
   274
                    AknTextUtils::ConvertDigitsTo( entryBuf, EDigitTypeWestern );
hgs
parents:
diff changeset
   275
                    // unverified entries are treated as addresses.
hgs
parents:
diff changeset
   276
                    CMsgRecipientItem* item =
hgs
parents:
diff changeset
   277
                        CMsgRecipientItem::NewLC( KNullDesC, entryBuf );
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
                    iRecipientArray->AppendL( item );
hgs
parents:
diff changeset
   280
hgs
parents:
diff changeset
   281
                    CleanupStack::Pop(); // item
hgs
parents:
diff changeset
   282
                    entryBuf.Zero();
hgs
parents:
diff changeset
   283
                    }
hgs
parents:
diff changeset
   284
                }
hgs
parents:
diff changeset
   285
            }
hgs
parents:
diff changeset
   286
        }
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
    ResetParsingInfo();
hgs
parents:
diff changeset
   289
    return iRecipientArray;
hgs
parents:
diff changeset
   290
    }
hgs
parents:
diff changeset
   291
hgs
parents:
diff changeset
   292
// ---------------------------------------------------------
hgs
parents:
diff changeset
   293
// CMsgAddressControl::ResetL
hgs
parents:
diff changeset
   294
//
hgs
parents:
diff changeset
   295
// Clears content of the address control.
hgs
parents:
diff changeset
   296
// ---------------------------------------------------------
hgs
parents:
diff changeset
   297
//
hgs
parents:
diff changeset
   298
EXPORT_C TInt CMsgAddressControl::ResetL()
hgs
parents:
diff changeset
   299
    {
hgs
parents:
diff changeset
   300
    ResetParsingInfo();
hgs
parents:
diff changeset
   301
    TInt entryCount( iAddressControlEditor->EntryCount() );
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
    iAddressControlEditor->TurnHighlightingOffL();
hgs
parents:
diff changeset
   304
    iAddressControlEditor->DeleteAllL();
hgs
parents:
diff changeset
   305
    iControlModeFlags |= EMsgControlModeModified;
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
    return entryCount;
hgs
parents:
diff changeset
   308
    }
hgs
parents:
diff changeset
   309
hgs
parents:
diff changeset
   310
// ---------------------------------------------------------
hgs
parents:
diff changeset
   311
// CMsgAddressControl::Reset
hgs
parents:
diff changeset
   312
//
hgs
parents:
diff changeset
   313
// from CMsgBaseControl.
hgs
parents:
diff changeset
   314
// Same as above but non-leaving version.
hgs
parents:
diff changeset
   315
// ---------------------------------------------------------
hgs
parents:
diff changeset
   316
//
hgs
parents:
diff changeset
   317
EXPORT_C void CMsgAddressControl::Reset()
hgs
parents:
diff changeset
   318
    {
hgs
parents:
diff changeset
   319
    TRAP_IGNORE( ResetL() );
hgs
parents:
diff changeset
   320
    }
hgs
parents:
diff changeset
   321
hgs
parents:
diff changeset
   322
// ---------------------------------------------------------
hgs
parents:
diff changeset
   323
// CMsgAddressControl::GetFirstUnverifiedStringL
hgs
parents:
diff changeset
   324
//
hgs
parents:
diff changeset
   325
// Finds the first unverified string and updates also the iParserInfo
hgs
parents:
diff changeset
   326
// correspondingly.
hgs
parents:
diff changeset
   327
// ---------------------------------------------------------
hgs
parents:
diff changeset
   328
//
hgs
parents:
diff changeset
   329
EXPORT_C TInt CMsgAddressControl::GetFirstUnverifiedStringL( HBufC*& aString )
hgs
parents:
diff changeset
   330
    {
hgs
parents:
diff changeset
   331
    __ASSERT_DEBUG( IsFocused(), Panic( EMsgControlNotFocused ) );
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
    ResetParsingInfo();
hgs
parents:
diff changeset
   334
    return GetNextUnverifiedStringL( aString );
hgs
parents:
diff changeset
   335
    }
hgs
parents:
diff changeset
   336
hgs
parents:
diff changeset
   337
// ---------------------------------------------------------
hgs
parents:
diff changeset
   338
// CMsgAddressControl::GetNextUnverifiedStringL
hgs
parents:
diff changeset
   339
//
hgs
parents:
diff changeset
   340
// Finds the next unverified string.
hgs
parents:
diff changeset
   341
// ---------------------------------------------------------
hgs
parents:
diff changeset
   342
//
hgs
parents:
diff changeset
   343
EXPORT_C TInt CMsgAddressControl::GetNextUnverifiedStringL( HBufC*& aString )
hgs
parents:
diff changeset
   344
    {
hgs
parents:
diff changeset
   345
    __ASSERT_DEBUG( IsFocused(), Panic( EMsgControlNotFocused ) );
hgs
parents:
diff changeset
   346
hgs
parents:
diff changeset
   347
    if ( aString != NULL )
hgs
parents:
diff changeset
   348
        {
hgs
parents:
diff changeset
   349
        delete aString;
hgs
parents:
diff changeset
   350
        aString = NULL;
hgs
parents:
diff changeset
   351
        }
hgs
parents:
diff changeset
   352
hgs
parents:
diff changeset
   353
    iAddressControlEditor->TurnHighlightingOffL();
hgs
parents:
diff changeset
   354
hgs
parents:
diff changeset
   355
    TInt entryCount = iAddressControlEditor->EntryCount();
hgs
parents:
diff changeset
   356
    TInt entryNumber( iParsingInfo.iEntryNum );
hgs
parents:
diff changeset
   357
    TBuf<KMaxEntryLength> entryBuf;
hgs
parents:
diff changeset
   358
    TInt ret( KErrNotFound );
hgs
parents:
diff changeset
   359
    HBufC* string = NULL;
hgs
parents:
diff changeset
   360
hgs
parents:
diff changeset
   361
    while ( entryNumber < entryCount )
hgs
parents:
diff changeset
   362
        {
hgs
parents:
diff changeset
   363
        entryBuf.Zero();
hgs
parents:
diff changeset
   364
        if ( iAddressControlEditor->IsEntryVerified( entryNumber ) )
hgs
parents:
diff changeset
   365
            {
hgs
parents:
diff changeset
   366
            entryNumber++;
hgs
parents:
diff changeset
   367
            SetParsingInfo( entryNumber, 0, 0 );
hgs
parents:
diff changeset
   368
            }
hgs
parents:
diff changeset
   369
        else
hgs
parents:
diff changeset
   370
            {
hgs
parents:
diff changeset
   371
            ret = GetNextItemOnEntry( entryBuf );
hgs
parents:
diff changeset
   372
            if ( ( ret == KErrNone ) && ( entryBuf.Length() > 0 ) )
hgs
parents:
diff changeset
   373
                {
hgs
parents:
diff changeset
   374
                string = entryBuf.AllocLC();
hgs
parents:
diff changeset
   375
                TInt firstPos = iAddressControlEditor->EntryStartPos(
hgs
parents:
diff changeset
   376
                    iParsingInfo.iEntryNum );
hgs
parents:
diff changeset
   377
                FormatAndSetCursorPosL( firstPos + iParsingInfo.iEndPos );
hgs
parents:
diff changeset
   378
                break;
hgs
parents:
diff changeset
   379
                }
hgs
parents:
diff changeset
   380
            else if ( iParsingInfo.iEndPos > iParsingInfo.iStartPos )
hgs
parents:
diff changeset
   381
                {
hgs
parents:
diff changeset
   382
                // a string could not be found but there seems to be white
hgs
parents:
diff changeset
   383
                // spaces on an entry which may be also followed by the list
hgs
parents:
diff changeset
   384
                // separator, hence clean them up
hgs
parents:
diff changeset
   385
                iAddressControlEditor->DeleteEntryCharsL(
hgs
parents:
diff changeset
   386
                    iParsingInfo.iEntryNum,
hgs
parents:
diff changeset
   387
                    iParsingInfo.iStartPos,
hgs
parents:
diff changeset
   388
                    iParsingInfo.iEndPos );
hgs
parents:
diff changeset
   389
hgs
parents:
diff changeset
   390
                SetParsingInfo(
hgs
parents:
diff changeset
   391
                    entryNumber,
hgs
parents:
diff changeset
   392
                    iParsingInfo.iStartPos,
hgs
parents:
diff changeset
   393
                    iParsingInfo.iStartPos );
hgs
parents:
diff changeset
   394
                }
hgs
parents:
diff changeset
   395
            else if ( ( iParsingInfo.iEndPos == 0 ) &&
hgs
parents:
diff changeset
   396
                     ( iParsingInfo.iEntryNum < entryCount - 1 ) )
hgs
parents:
diff changeset
   397
                {
hgs
parents:
diff changeset
   398
                // there is just an EParagraphDelimiter on the entry
hgs
parents:
diff changeset
   399
                iAddressControlEditor->DeleteEntryL( iParsingInfo.iEntryNum );
hgs
parents:
diff changeset
   400
                SetParsingInfo( entryNumber, 0, 0 );
hgs
parents:
diff changeset
   401
                entryCount--;
hgs
parents:
diff changeset
   402
                }
hgs
parents:
diff changeset
   403
            else
hgs
parents:
diff changeset
   404
                {
hgs
parents:
diff changeset
   405
                // there are no strings left on the current entry
hgs
parents:
diff changeset
   406
                entryNumber++;
hgs
parents:
diff changeset
   407
                SetParsingInfo( entryNumber, 0, 0 );
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
    if ( entryNumber >= entryCount )
hgs
parents:
diff changeset
   413
        {
hgs
parents:
diff changeset
   414
        FormatAndSetCursorPosL( iAddressControlEditor->TextLength() );
hgs
parents:
diff changeset
   415
        }
hgs
parents:
diff changeset
   416
hgs
parents:
diff changeset
   417
    aString = string;
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
    if ( string )
hgs
parents:
diff changeset
   420
        {
hgs
parents:
diff changeset
   421
        CleanupStack::Pop();  // string
hgs
parents:
diff changeset
   422
        }
hgs
parents:
diff changeset
   423
hgs
parents:
diff changeset
   424
    return ret;
hgs
parents:
diff changeset
   425
    }
hgs
parents:
diff changeset
   426
hgs
parents:
diff changeset
   427
hgs
parents:
diff changeset
   428
// ---------------------------------------------------------
hgs
parents:
diff changeset
   429
// CMsgAddressControl::ReplaceUnverifiedStringL
hgs
parents:
diff changeset
   430
//
hgs
parents:
diff changeset
   431
// Replaces a string with contents of the recipient array aArray. 
hgs
parents:
diff changeset
   432
// The string is replaced according to the iParsingInfo.
hgs
parents:
diff changeset
   433
//
hgs
parents:
diff changeset
   434
// This function cannot undelete a string if it leaves after/while removing it.
hgs
parents:
diff changeset
   435
// ---------------------------------------------------------
hgs
parents:
diff changeset
   436
//
hgs
parents:
diff changeset
   437
EXPORT_C TInt CMsgAddressControl::ReplaceUnverifiedStringL(
hgs
parents:
diff changeset
   438
    CMsgRecipientArray& aArray )
hgs
parents:
diff changeset
   439
    {
hgs
parents:
diff changeset
   440
    __ASSERT_DEBUG( IsFocused(), Panic( EMsgControlNotFocused ) );
hgs
parents:
diff changeset
   441
hgs
parents:
diff changeset
   442
    if ( ( iParsingInfo.iEndPos <= iParsingInfo.iStartPos ) || 
hgs
parents:
diff changeset
   443
        ( iParsingInfo.iEntryNum >= iAddressControlEditor->EntryCount() ) )
hgs
parents:
diff changeset
   444
        {
hgs
parents:
diff changeset
   445
        return KErrNotFound;
hgs
parents:
diff changeset
   446
        }
hgs
parents:
diff changeset
   447
hgs
parents:
diff changeset
   448
    iAddressControlEditor->TurnHighlightingOffL();
hgs
parents:
diff changeset
   449
hgs
parents:
diff changeset
   450
    TInt entryLength = iAddressControlEditor->EntryLength( iParsingInfo.iEntryNum );
hgs
parents:
diff changeset
   451
    iAddressControlEditor->DeleteEntryCharsL(
hgs
parents:
diff changeset
   452
        iParsingInfo.iEntryNum,
hgs
parents:
diff changeset
   453
        iParsingInfo.iStartPos,
hgs
parents:
diff changeset
   454
        iParsingInfo.iEndPos );
hgs
parents:
diff changeset
   455
   
hgs
parents:
diff changeset
   456
    if ( ( iParsingInfo.iStartPos > 0 ) && ( iParsingInfo.iEndPos < entryLength ) )
hgs
parents:
diff changeset
   457
        {
hgs
parents:
diff changeset
   458
        iAddressControlEditor->InsertEntryBreakL(
hgs
parents:
diff changeset
   459
            iParsingInfo.iEntryNum,
hgs
parents:
diff changeset
   460
            iParsingInfo.iStartPos );
hgs
parents:
diff changeset
   461
        iParsingInfo.iEntryNum++;
hgs
parents:
diff changeset
   462
        }
hgs
parents:
diff changeset
   463
hgs
parents:
diff changeset
   464
    TInt entryNumber( iParsingInfo.iEntryNum );
hgs
parents:
diff changeset
   465
    TInt contactCount = aArray.Count();
hgs
parents:
diff changeset
   466
    CMsgRecipientItem* recipientItem = NULL;
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
    for ( TInt i = 0; i < contactCount; i++ )
hgs
parents:
diff changeset
   469
        {
hgs
parents:
diff changeset
   470
        recipientItem = aArray.At( i );
hgs
parents:
diff changeset
   471
        iAddressControlEditor->InsertEntryL(
hgs
parents:
diff changeset
   472
            entryNumber,
hgs
parents:
diff changeset
   473
            *recipientItem->Name(),
hgs
parents:
diff changeset
   474
            *recipientItem->Address(),
hgs
parents:
diff changeset
   475
            recipientItem->IsVerified(),
hgs
parents:
diff changeset
   476
            recipientItem->IsValidated(),
hgs
parents:
diff changeset
   477
            recipientItem->ContactLink() );
hgs
parents:
diff changeset
   478
            
hgs
parents:
diff changeset
   479
        entryNumber++;
hgs
parents:
diff changeset
   480
        }
hgs
parents:
diff changeset
   481
hgs
parents:
diff changeset
   482
    SetParsingInfo( iParsingInfo.iEntryNum, 0, 0 );
hgs
parents:
diff changeset
   483
    TInt firstPos = iAddressControlEditor->EntryStartPos( iParsingInfo.iEntryNum );
hgs
parents:
diff changeset
   484
    entryLength = iAddressControlEditor->EntryLength( iParsingInfo.iEntryNum );
hgs
parents:
diff changeset
   485
    TInt endPos = firstPos + entryLength - 1;
hgs
parents:
diff changeset
   486
    SetParsingInfo( iParsingInfo.iEntryNum, endPos, endPos );
hgs
parents:
diff changeset
   487
    FormatAndSetCursorPosL( endPos );
hgs
parents:
diff changeset
   488
    iControlModeFlags |= EMsgControlModeModified;
hgs
parents:
diff changeset
   489
    return KErrNone;
hgs
parents:
diff changeset
   490
    }
hgs
parents:
diff changeset
   491
hgs
parents:
diff changeset
   492
// ---------------------------------------------------------
hgs
parents:
diff changeset
   493
// CMsgAddressControl::RefreshL
hgs
parents:
diff changeset
   494
//
hgs
parents:
diff changeset
   495
// Refreshes the contents of address control.
hgs
parents:
diff changeset
   496
// ---------------------------------------------------------
hgs
parents:
diff changeset
   497
//
hgs
parents:
diff changeset
   498
EXPORT_C TInt CMsgAddressControl::RefreshL( const CMsgRecipientArray& aArray )
hgs
parents:
diff changeset
   499
    {
hgs
parents:
diff changeset
   500
    iEditor->SetEdwinSizeObserver( NULL );
hgs
parents:
diff changeset
   501
    
hgs
parents:
diff changeset
   502
    TRAPD( error, ResetL() );  // Clears the control and turns highlighting off
hgs
parents:
diff changeset
   503
    
hgs
parents:
diff changeset
   504
    iEditor->SetEdwinSizeObserver( this );
hgs
parents:
diff changeset
   505
    
hgs
parents:
diff changeset
   506
    if ( error != KErrNone )
hgs
parents:
diff changeset
   507
        {
hgs
parents:
diff changeset
   508
        User::Leave( error );
hgs
parents:
diff changeset
   509
        }
hgs
parents:
diff changeset
   510
hgs
parents:
diff changeset
   511
    TInt entryNumber = 0;
hgs
parents:
diff changeset
   512
    TInt contactCount = aArray.Count();
hgs
parents:
diff changeset
   513
    CMsgRecipientItem* item = NULL;
hgs
parents:
diff changeset
   514
hgs
parents:
diff changeset
   515
    for ( TInt i = 0; i < contactCount; i++ )
hgs
parents:
diff changeset
   516
        {
hgs
parents:
diff changeset
   517
        item = aArray.At( i );
hgs
parents:
diff changeset
   518
        iAddressControlEditor->InsertEntryL(
hgs
parents:
diff changeset
   519
            entryNumber,
hgs
parents:
diff changeset
   520
            *item->Name(),
hgs
parents:
diff changeset
   521
            *item->Address(),
hgs
parents:
diff changeset
   522
            item->IsVerified(),
hgs
parents:
diff changeset
   523
            item->IsValidated(),
hgs
parents:
diff changeset
   524
            item->ContactLink() );
hgs
parents:
diff changeset
   525
        entryNumber++;
hgs
parents:
diff changeset
   526
        }
hgs
parents:
diff changeset
   527
hgs
parents:
diff changeset
   528
    ResetParsingInfo();
hgs
parents:
diff changeset
   529
    FormatAndSetCursorPosL( iAddressControlEditor->TextLength() );
hgs
parents:
diff changeset
   530
    iControlModeFlags |= EMsgControlModeModified;
hgs
parents:
diff changeset
   531
hgs
parents:
diff changeset
   532
    return KErrNone;
hgs
parents:
diff changeset
   533
    }
hgs
parents:
diff changeset
   534
hgs
parents:
diff changeset
   535
// ---------------------------------------------------------
hgs
parents:
diff changeset
   536
// CMsgAddressControl::HighlightUnverifiedStringL
hgs
parents:
diff changeset
   537
//
hgs
parents:
diff changeset
   538
// Highlights the found unverified entry.
hgs
parents:
diff changeset
   539
// ---------------------------------------------------------
hgs
parents:
diff changeset
   540
//
hgs
parents:
diff changeset
   541
EXPORT_C TInt CMsgAddressControl::HighlightUnverifiedStringL()
hgs
parents:
diff changeset
   542
    {
hgs
parents:
diff changeset
   543
    __ASSERT_DEBUG( IsFocused(), Panic( EMsgControlNotFocused ) );
hgs
parents:
diff changeset
   544
hgs
parents:
diff changeset
   545
    TInt ret = iParsingInfo.iEndPos - iParsingInfo.iStartPos > 0
hgs
parents:
diff changeset
   546
        ? KErrNone
hgs
parents:
diff changeset
   547
        : KErrNotFound;
hgs
parents:
diff changeset
   548
hgs
parents:
diff changeset
   549
    if ( IsActivated() && ( ret == KErrNone ) && IsFocused() )
hgs
parents:
diff changeset
   550
        {
hgs
parents:
diff changeset
   551
        TInt entryLength( 0 );  // not really needed
hgs
parents:
diff changeset
   552
        TInt entryStart( iAddressControlEditor->RichText()->CharPosOfParagraph(
hgs
parents:
diff changeset
   553
            entryLength, iParsingInfo.iEntryNum ) );
hgs
parents:
diff changeset
   554
        FormatAndSetCursorPosL( entryStart + iParsingInfo.iEndPos );
hgs
parents:
diff changeset
   555
        iAddressControlEditor->SetSelectionL(
hgs
parents:
diff changeset
   556
            entryStart + iParsingInfo.iEndPos,
hgs
parents:
diff changeset
   557
            entryStart + iParsingInfo.iStartPos );
hgs
parents:
diff changeset
   558
        }
hgs
parents:
diff changeset
   559
hgs
parents:
diff changeset
   560
    return ret;
hgs
parents:
diff changeset
   561
    }
hgs
parents:
diff changeset
   562
hgs
parents:
diff changeset
   563
// ---------------------------------------------------------
hgs
parents:
diff changeset
   564
// CMsgAddressControl::SizeOfAddresses
hgs
parents:
diff changeset
   565
//
hgs
parents:
diff changeset
   566
// Returns size of addresses.
hgs
parents:
diff changeset
   567
// ---------------------------------------------------------
hgs
parents:
diff changeset
   568
//
hgs
parents:
diff changeset
   569
EXPORT_C void CMsgAddressControl::GetSizeOfAddresses(
hgs
parents:
diff changeset
   570
    TInt& aEntryCount, TInt& aSizeOfAddresses )
hgs
parents:
diff changeset
   571
    {
hgs
parents:
diff changeset
   572
    const CMsgAddressControlEditorField* field = NULL;
hgs
parents:
diff changeset
   573
    TBuf<KMaxEntryLength> entryBuf;
hgs
parents:
diff changeset
   574
    TInt ret( KErrNotFound );
hgs
parents:
diff changeset
   575
hgs
parents:
diff changeset
   576
    aEntryCount = 0;
hgs
parents:
diff changeset
   577
    aSizeOfAddresses = 0;
hgs
parents:
diff changeset
   578
hgs
parents:
diff changeset
   579
    for ( TInt entryNumber = iAddressControlEditor->EntryCount() - 1;
hgs
parents:
diff changeset
   580
         entryNumber >= 0;
hgs
parents:
diff changeset
   581
         entryNumber-- )
hgs
parents:
diff changeset
   582
        {
hgs
parents:
diff changeset
   583
        if ( iAddressControlEditor->IsEntryVerified( entryNumber ) )
hgs
parents:
diff changeset
   584
            {
hgs
parents:
diff changeset
   585
            field = iAddressControlEditor->Field( entryNumber );
hgs
parents:
diff changeset
   586
hgs
parents:
diff changeset
   587
            aSizeOfAddresses += field->Address()->Length();
hgs
parents:
diff changeset
   588
            aEntryCount++;
hgs
parents:
diff changeset
   589
            }
hgs
parents:
diff changeset
   590
        else
hgs
parents:
diff changeset
   591
            {
hgs
parents:
diff changeset
   592
            SetParsingInfo( entryNumber, 0, 0 );
hgs
parents:
diff changeset
   593
            ret = KErrNone;
hgs
parents:
diff changeset
   594
            while ( ret == KErrNone )
hgs
parents:
diff changeset
   595
                {
hgs
parents:
diff changeset
   596
                ret = GetNextItemOnEntry( entryBuf );
hgs
parents:
diff changeset
   597
                if ( ( ret == KErrNone ) && ( entryBuf.Length() > 0 ) )
hgs
parents:
diff changeset
   598
                    {
hgs
parents:
diff changeset
   599
                    aSizeOfAddresses += entryBuf.Length();
hgs
parents:
diff changeset
   600
                    aEntryCount++;
hgs
parents:
diff changeset
   601
                    entryBuf.Zero();
hgs
parents:
diff changeset
   602
                    }
hgs
parents:
diff changeset
   603
                }
hgs
parents:
diff changeset
   604
            }
hgs
parents:
diff changeset
   605
        }
hgs
parents:
diff changeset
   606
hgs
parents:
diff changeset
   607
    ResetParsingInfo();
hgs
parents:
diff changeset
   608
    }
hgs
parents:
diff changeset
   609
hgs
parents:
diff changeset
   610
// ---------------------------------------------------------
hgs
parents:
diff changeset
   611
// CMsgAddressControl::HighlightUnvalidatedStringL
hgs
parents:
diff changeset
   612
//
hgs
parents:
diff changeset
   613
// Highlights the found unvvalidated entry.
hgs
parents:
diff changeset
   614
// ---------------------------------------------------------
hgs
parents:
diff changeset
   615
//
hgs
parents:
diff changeset
   616
EXPORT_C TInt CMsgAddressControl::HighlightUnvalidatedStringL()
hgs
parents:
diff changeset
   617
    {
hgs
parents:
diff changeset
   618
    ResetParsingInfo();
hgs
parents:
diff changeset
   619
hgs
parents:
diff changeset
   620
    iAddressControlEditor->TurnHighlightingOffL();
hgs
parents:
diff changeset
   621
hgs
parents:
diff changeset
   622
    TInt entryCount = iAddressControlEditor->EntryCount();
hgs
parents:
diff changeset
   623
    TInt entryNumber( iParsingInfo.iEntryNum );
hgs
parents:
diff changeset
   624
    TBuf<KMaxEntryLength> entryBuf;
hgs
parents:
diff changeset
   625
    TInt ret( KErrNotFound );
hgs
parents:
diff changeset
   626
hgs
parents:
diff changeset
   627
    while ( entryNumber < entryCount )
hgs
parents:
diff changeset
   628
        {
hgs
parents:
diff changeset
   629
        entryBuf.Zero();
hgs
parents:
diff changeset
   630
        if ( iAddressControlEditor->IsEntryValidated( entryNumber ) )
hgs
parents:
diff changeset
   631
            {
hgs
parents:
diff changeset
   632
            entryNumber++;
hgs
parents:
diff changeset
   633
            SetParsingInfo( entryNumber, 0, 0 );
hgs
parents:
diff changeset
   634
            }
hgs
parents:
diff changeset
   635
        else
hgs
parents:
diff changeset
   636
            {
hgs
parents:
diff changeset
   637
            ret = GetNextItemOnEntry( entryBuf );
hgs
parents:
diff changeset
   638
            if ( ( ret == KErrNone ) && ( entryBuf.Length() > 0 ) )
hgs
parents:
diff changeset
   639
                {
hgs
parents:
diff changeset
   640
                TInt firstPos = iAddressControlEditor->EntryStartPos(
hgs
parents:
diff changeset
   641
                    iParsingInfo.iEntryNum );
hgs
parents:
diff changeset
   642
                FormatAndSetCursorPosL( firstPos + iParsingInfo.iEndPos );
hgs
parents:
diff changeset
   643
                break;
hgs
parents:
diff changeset
   644
                }
hgs
parents:
diff changeset
   645
            else if ( iParsingInfo.iEndPos > iParsingInfo.iStartPos )
hgs
parents:
diff changeset
   646
                {
hgs
parents:
diff changeset
   647
                // a string could not be found but there seems to be white
hgs
parents:
diff changeset
   648
                // spaces on an entry which may be also followed by the list
hgs
parents:
diff changeset
   649
                // separator, hence clean them up
hgs
parents:
diff changeset
   650
                iAddressControlEditor->DeleteEntryCharsL(
hgs
parents:
diff changeset
   651
                    iParsingInfo.iEntryNum,
hgs
parents:
diff changeset
   652
                    iParsingInfo.iStartPos,
hgs
parents:
diff changeset
   653
                    iParsingInfo.iEndPos );
hgs
parents:
diff changeset
   654
hgs
parents:
diff changeset
   655
                SetParsingInfo(
hgs
parents:
diff changeset
   656
                    entryNumber,
hgs
parents:
diff changeset
   657
                    iParsingInfo.iStartPos,
hgs
parents:
diff changeset
   658
                    iParsingInfo.iStartPos );
hgs
parents:
diff changeset
   659
                }
hgs
parents:
diff changeset
   660
            else if ( ( iParsingInfo.iEndPos == 0 ) &&
hgs
parents:
diff changeset
   661
                ( iParsingInfo.iEntryNum < entryCount - 1 ) )
hgs
parents:
diff changeset
   662
                {
hgs
parents:
diff changeset
   663
                // there is just an EParagraphDelimiter on the entry
hgs
parents:
diff changeset
   664
                iAddressControlEditor->DeleteEntryL( iParsingInfo.iEntryNum );
hgs
parents:
diff changeset
   665
                SetParsingInfo( entryNumber, 0, 0 );
hgs
parents:
diff changeset
   666
                entryCount--;
hgs
parents:
diff changeset
   667
                }
hgs
parents:
diff changeset
   668
            else
hgs
parents:
diff changeset
   669
                {
hgs
parents:
diff changeset
   670
                // there are no strings left on the current entry
hgs
parents:
diff changeset
   671
                entryNumber++;
hgs
parents:
diff changeset
   672
                SetParsingInfo( entryNumber, 0, 0 );
hgs
parents:
diff changeset
   673
                }
hgs
parents:
diff changeset
   674
            }
hgs
parents:
diff changeset
   675
        }
hgs
parents:
diff changeset
   676
hgs
parents:
diff changeset
   677
    if ( entryNumber >= entryCount )
hgs
parents:
diff changeset
   678
        {
hgs
parents:
diff changeset
   679
        FormatAndSetCursorPosL( iAddressControlEditor->TextLength() );
hgs
parents:
diff changeset
   680
        }
hgs
parents:
diff changeset
   681
hgs
parents:
diff changeset
   682
    ret = iParsingInfo.iEndPos - iParsingInfo.iStartPos > 0
hgs
parents:
diff changeset
   683
        ? KErrNone
hgs
parents:
diff changeset
   684
        : KErrNotFound;
hgs
parents:
diff changeset
   685
hgs
parents:
diff changeset
   686
    if ( IsActivated() && ( ret == KErrNone ) && IsFocused() )
hgs
parents:
diff changeset
   687
        {
hgs
parents:
diff changeset
   688
        TInt entryLength( 0 );  // not really needed
hgs
parents:
diff changeset
   689
        TInt entryStart( iAddressControlEditor->RichText()->CharPosOfParagraph(
hgs
parents:
diff changeset
   690
            entryLength, iParsingInfo.iEntryNum ) );
hgs
parents:
diff changeset
   691
        FormatAndSetCursorPosL( entryStart + iParsingInfo.iEndPos );
hgs
parents:
diff changeset
   692
        iAddressControlEditor->SetSelectionL(
hgs
parents:
diff changeset
   693
            entryStart + iParsingInfo.iEndPos,
hgs
parents:
diff changeset
   694
            entryStart + iParsingInfo.iStartPos );
hgs
parents:
diff changeset
   695
        }
hgs
parents:
diff changeset
   696
    return ret;
hgs
parents:
diff changeset
   697
    }
hgs
parents:
diff changeset
   698
hgs
parents:
diff changeset
   699
// ---------------------------------------------------------
hgs
parents:
diff changeset
   700
// CMsgAddressControl::IsPriorCharSemicolonL()
hgs
parents:
diff changeset
   701
//
hgs
parents:
diff changeset
   702
// Checks whether prior character is semicolon. Needed to variable
hgs
parents:
diff changeset
   703
// selection key functionality in editors.
hgs
parents:
diff changeset
   704
// ---------------------------------------------------------
hgs
parents:
diff changeset
   705
//
hgs
parents:
diff changeset
   706
EXPORT_C TBool CMsgAddressControl::IsPriorCharSemicolonL() const
hgs
parents:
diff changeset
   707
    {
hgs
parents:
diff changeset
   708
    TInt cursorPos = Editor().CursorPos();
hgs
parents:
diff changeset
   709
    HBufC* buf = Editor().GetTextInHBufL();
hgs
parents:
diff changeset
   710
    CleanupStack::PushL( buf );
hgs
parents:
diff changeset
   711
hgs
parents:
diff changeset
   712
    TBool semicolonFound = EFalse;
hgs
parents:
diff changeset
   713
    TUint character;
hgs
parents:
diff changeset
   714
    while ( cursorPos > 1 && !semicolonFound )
hgs
parents:
diff changeset
   715
        {
hgs
parents:
diff changeset
   716
        cursorPos--;
hgs
parents:
diff changeset
   717
        character = TUint( (*buf)[cursorPos] );
hgs
parents:
diff changeset
   718
hgs
parents:
diff changeset
   719
        if ( character == KMsgListSeparator || character == KArabicSemicolon )
hgs
parents:
diff changeset
   720
            {
hgs
parents:
diff changeset
   721
            semicolonFound = ETrue;
hgs
parents:
diff changeset
   722
            }
hgs
parents:
diff changeset
   723
        else if ( character != CEditableText::ESpace &&
hgs
parents:
diff changeset
   724
            character != CEditableText::EParagraphDelimiter )
hgs
parents:
diff changeset
   725
            {
hgs
parents:
diff changeset
   726
            break;
hgs
parents:
diff changeset
   727
            }
hgs
parents:
diff changeset
   728
        }
hgs
parents:
diff changeset
   729
    
hgs
parents:
diff changeset
   730
    CleanupStack::PopAndDestroy(); // buf
hgs
parents:
diff changeset
   731
    return semicolonFound;
hgs
parents:
diff changeset
   732
    }
hgs
parents:
diff changeset
   733
hgs
parents:
diff changeset
   734
// ---------------------------------------------------------
hgs
parents:
diff changeset
   735
// CMsgAddressControl::SetAddressFieldAutoHighlight()
hgs
parents:
diff changeset
   736
//
hgs
parents:
diff changeset
   737
// Turns on or off automatic recipient highlight on this address
hgs
parents:
diff changeset
   738
// field. Focus must stop to this control if highlight is enabled.
hgs
parents:
diff changeset
   739
// Updates also the highlight accordingly.
hgs
parents:
diff changeset
   740
// ---------------------------------------------------------
hgs
parents:
diff changeset
   741
//
hgs
parents:
diff changeset
   742
EXPORT_C void CMsgAddressControl::SetAddressFieldAutoHighlight( TBool aValidHighlightable )
hgs
parents:
diff changeset
   743
    {
hgs
parents:
diff changeset
   744
    iAddressControlEditor->SetAddressFieldAutoHighlight( aValidHighlightable );    
hgs
parents:
diff changeset
   745
    DrawDeferred();
hgs
parents:
diff changeset
   746
    }
hgs
parents:
diff changeset
   747
hgs
parents:
diff changeset
   748
// ---------------------------------------------------------
hgs
parents:
diff changeset
   749
// CMsgAddressControl::AddressFieldAutoHighlight()
hgs
parents:
diff changeset
   750
//
hgs
parents:
diff changeset
   751
// ---------------------------------------------------------
hgs
parents:
diff changeset
   752
//
hgs
parents:
diff changeset
   753
EXPORT_C TBool CMsgAddressControl::AddressFieldAutoHighlight()
hgs
parents:
diff changeset
   754
    {
hgs
parents:
diff changeset
   755
    return iAddressControlEditor->AddressFieldAutoHighlight();
hgs
parents:
diff changeset
   756
    }
hgs
parents:
diff changeset
   757
hgs
parents:
diff changeset
   758
// ---------------------------------------------------------
hgs
parents:
diff changeset
   759
// CMsgAddressControl::ConstructFromResourceL
hgs
parents:
diff changeset
   760
//
hgs
parents:
diff changeset
   761
// Creates this control from resource.
hgs
parents:
diff changeset
   762
// ---------------------------------------------------------
hgs
parents:
diff changeset
   763
//
hgs
parents:
diff changeset
   764
void CMsgAddressControl::ConstructFromResourceL( TInt aResourceId )
hgs
parents:
diff changeset
   765
    {
hgs
parents:
diff changeset
   766
    BaseConstructL();  // Sets margins only.
hgs
parents:
diff changeset
   767
hgs
parents:
diff changeset
   768
    TResourceReader reader;
hgs
parents:
diff changeset
   769
    iCoeEnv->CreateResourceReaderLC( reader, aResourceId );
hgs
parents:
diff changeset
   770
hgs
parents:
diff changeset
   771
    // Create caption.
hgs
parents:
diff changeset
   772
    iCaption = CreateCaptionFromResourceL( reader );
hgs
parents:
diff changeset
   773
    
hgs
parents:
diff changeset
   774
    // Read some information about control from resource.
hgs
parents:
diff changeset
   775
    ReadControlPropertiesFromResourceL( reader );
hgs
parents:
diff changeset
   776
hgs
parents:
diff changeset
   777
    // Create editor.
hgs
parents:
diff changeset
   778
    iEditor = CreateEditorFromResourceL( reader );
hgs
parents:
diff changeset
   779
    
hgs
parents:
diff changeset
   780
    iEditor->SetControlType(EMsgAddressControl);
hgs
parents:
diff changeset
   781
    iEditor->SetObserver( this );
hgs
parents:
diff changeset
   782
    iEditor->SetEdwinSizeObserver( this );
hgs
parents:
diff changeset
   783
    iEditor->AddEdwinObserverL( this );
hgs
parents:
diff changeset
   784
    
hgs
parents:
diff changeset
   785
    SetPlainTextMode( ETrue );
hgs
parents:
diff changeset
   786
hgs
parents:
diff changeset
   787
#ifdef RD_SCALABLE_UI_V2
hgs
parents:
diff changeset
   788
    if ( AknLayoutUtils::PenEnabled() )
hgs
parents:
diff changeset
   789
        {
hgs
parents:
diff changeset
   790
        CreateButtonL();
hgs
parents:
diff changeset
   791
        }
hgs
parents:
diff changeset
   792
#endif // RD_SCALABLE_UI_V2
hgs
parents:
diff changeset
   793
hgs
parents:
diff changeset
   794
    ResolveLayoutsL();
hgs
parents:
diff changeset
   795
    
hgs
parents:
diff changeset
   796
    iControlModeFlags |= EMsgControlModeForceFocusStop;
hgs
parents:
diff changeset
   797
    //Set the flag for Enabling Partial Screen
hgs
parents:
diff changeset
   798
    TInt flags = iEditor->AknEditorFlags();
hgs
parents:
diff changeset
   799
    flags |= EAknEditorFlagEnablePartialScreen;
hgs
parents:
diff changeset
   800
    iEditor->SetAknEditorFlags( flags );     
hgs
parents:
diff changeset
   801
    
hgs
parents:
diff changeset
   802
    CleanupStack::PopAndDestroy();  // reader
hgs
parents:
diff changeset
   803
    }
hgs
parents:
diff changeset
   804
hgs
parents:
diff changeset
   805
// ---------------------------------------------------------
hgs
parents:
diff changeset
   806
// CMsgAddressControl::NotifyViewEvent
hgs
parents:
diff changeset
   807
//
hgs
parents:
diff changeset
   808
// Builds up text fields for the control i.e. reads verified recipients and
hgs
parents:
diff changeset
   809
// creates corresponding text fields for them.
hgs
parents:
diff changeset
   810
// ---------------------------------------------------------
hgs
parents:
diff changeset
   811
//
hgs
parents:
diff changeset
   812
void CMsgAddressControl::NotifyViewEvent( TMsgViewEvent aEvent, TInt aParam )
hgs
parents:
diff changeset
   813
    {
hgs
parents:
diff changeset
   814
    if ( iAddressControlEditor->AddressFieldAutoHighlight() )
hgs
parents:
diff changeset
   815
        {
hgs
parents:
diff changeset
   816
        aParam |= EMsgViewEventAutoHighlight;
hgs
parents:
diff changeset
   817
        }
hgs
parents:
diff changeset
   818
hgs
parents:
diff changeset
   819
    CMsgExpandableControl::NotifyViewEvent( aEvent, aParam );
hgs
parents:
diff changeset
   820
hgs
parents:
diff changeset
   821
    if ( aEvent == EMsgViewEventPrepareForViewing )
hgs
parents:
diff changeset
   822
        {
hgs
parents:
diff changeset
   823
        if ( iAddressControlEditor->TextLength() && IsFocused() )
hgs
parents:
diff changeset
   824
            {
hgs
parents:
diff changeset
   825
            iAddressControlEditor->PrepareForViewing();
hgs
parents:
diff changeset
   826
            
hgs
parents:
diff changeset
   827
            }
hgs
parents:
diff changeset
   828
        }
hgs
parents:
diff changeset
   829
    }
hgs
parents:
diff changeset
   830
hgs
parents:
diff changeset
   831
// ---------------------------------------------------------
hgs
parents:
diff changeset
   832
// ReadControlPropertiesFromResourceL
hgs
parents:
diff changeset
   833
//
hgs
parents:
diff changeset
   834
// Reads control properties from resource.
hgs
parents:
diff changeset
   835
// ---------------------------------------------------------
hgs
parents:
diff changeset
   836
//
hgs
parents:
diff changeset
   837
void CMsgAddressControl::ReadControlPropertiesFromResourceL(
hgs
parents:
diff changeset
   838
    TResourceReader& aReader )
hgs
parents:
diff changeset
   839
    {
hgs
parents:
diff changeset
   840
    CMsgExpandableControl::ReadControlPropertiesFromResourceL( aReader );
hgs
parents:
diff changeset
   841
    }
hgs
parents:
diff changeset
   842
hgs
parents:
diff changeset
   843
// ---------------------------------------------------------
hgs
parents:
diff changeset
   844
// CMsgAddressControl::CreateEditorFromResourceL
hgs
parents:
diff changeset
   845
//
hgs
parents:
diff changeset
   846
// Creates editor (CEikRichTextEditor) for the control from resource and
hgs
parents:
diff changeset
   847
// returns pointer to it.
hgs
parents:
diff changeset
   848
// ---------------------------------------------------------
hgs
parents:
diff changeset
   849
//
hgs
parents:
diff changeset
   850
CMsgExpandableControlEditor* CMsgAddressControl::CreateEditorFromResourceL(
hgs
parents:
diff changeset
   851
    TResourceReader& aReader )
hgs
parents:
diff changeset
   852
    {
hgs
parents:
diff changeset
   853
    // Create an editor.
hgs
parents:
diff changeset
   854
    CMsgExpandableControlEditor* editor =
hgs
parents:
diff changeset
   855
        new ( ELeave ) CMsgAddressControlEditor(
hgs
parents:
diff changeset
   856
            this, iControlModeFlags, iBaseControlObserver );
hgs
parents:
diff changeset
   857
hgs
parents:
diff changeset
   858
    CleanupStack::PushL( editor );
hgs
parents:
diff changeset
   859
    editor->ConstructFromResourceL( aReader );
hgs
parents:
diff changeset
   860
    CleanupStack::Pop();  // editor
hgs
parents:
diff changeset
   861
hgs
parents:
diff changeset
   862
    return editor;
hgs
parents:
diff changeset
   863
    }
hgs
parents:
diff changeset
   864
hgs
parents:
diff changeset
   865
// ---------------------------------------------------------
hgs
parents:
diff changeset
   866
// CMsgAddressControl::EditPermission
hgs
parents:
diff changeset
   867
//
hgs
parents:
diff changeset
   868
// Checks and returns control's edit permissions. Edit permissions are needed
hgs
parents:
diff changeset
   869
// to check in order to know whether some key press is allowed to pass
hgs
parents:
diff changeset
   870
// to the control or not.
hgs
parents:
diff changeset
   871
// ---------------------------------------------------------
hgs
parents:
diff changeset
   872
//
hgs
parents:
diff changeset
   873
TUint32 CMsgAddressControl::EditPermission() const
hgs
parents:
diff changeset
   874
    {
hgs
parents:
diff changeset
   875
    return iAddressControlEditor->CheckEditPermission();
hgs
parents:
diff changeset
   876
    }
hgs
parents:
diff changeset
   877
hgs
parents:
diff changeset
   878
hgs
parents:
diff changeset
   879
// ---------------------------------------------------------
hgs
parents:
diff changeset
   880
// CMsgAddressControl::OfferKeyEventL
hgs
parents:
diff changeset
   881
//
hgs
parents:
diff changeset
   882
// Handles key events. The most of the keys are passed to the control editor.
hgs
parents:
diff changeset
   883
// ---------------------------------------------------------
hgs
parents:
diff changeset
   884
//
hgs
parents:
diff changeset
   885
TKeyResponse CMsgAddressControl::OfferKeyEventL(
hgs
parents:
diff changeset
   886
    const TKeyEvent& aKeyEvent, TEventCode aType )
hgs
parents:
diff changeset
   887
    {
hgs
parents:
diff changeset
   888
    // reset "trap" for extraneous multi-tap TextUpdate edwin events as we are
hgs
parents:
diff changeset
   889
    // now working on another input
hgs
parents:
diff changeset
   890
    iDuplicateEvent = EFalse;
hgs
parents:
diff changeset
   891
    
hgs
parents:
diff changeset
   892
    TKeyResponse keyResp = EKeyWasNotConsumed;
hgs
parents:
diff changeset
   893
    ResetParsingInfo();
hgs
parents:
diff changeset
   894
    TInt  cursorPos = iAddressControlEditor->CursorPos();
hgs
parents:
diff changeset
   895
hgs
parents:
diff changeset
   896
    if ( aKeyEvent.iModifiers & EModifierShift )
hgs
parents:
diff changeset
   897
        {
hgs
parents:
diff changeset
   898
        iControlModeFlags |= EMsgControlModeShiftPressed;
hgs
parents:
diff changeset
   899
        }
hgs
parents:
diff changeset
   900
    else
hgs
parents:
diff changeset
   901
        {
hgs
parents:
diff changeset
   902
        iControlModeFlags &= ~EMsgControlModeShiftPressed;
hgs
parents:
diff changeset
   903
        }
hgs
parents:
diff changeset
   904
hgs
parents:
diff changeset
   905
    switch ( aKeyEvent.iCode )
hgs
parents:
diff changeset
   906
        {
hgs
parents:
diff changeset
   907
        case EKeyHome:
hgs
parents:
diff changeset
   908
        case EKeyEnd:
hgs
parents:
diff changeset
   909
        case EKeyPageUp:
hgs
parents:
diff changeset
   910
        case EKeyPageDown:
hgs
parents:
diff changeset
   911
            {
hgs
parents:
diff changeset
   912
            break;
hgs
parents:
diff changeset
   913
            }
hgs
parents:
diff changeset
   914
        case EKeyUpArrow:
hgs
parents:
diff changeset
   915
        case EKeyDownArrow:
hgs
parents:
diff changeset
   916
            {
hgs
parents:
diff changeset
   917
            /*TInt fldpos = iAddressControlEditor->FirstFieldPos( cursorPos );
hgs
parents:
diff changeset
   918
            TInt entryNumber = iAddressControlEditor->EntryNumber( cursorPos );
hgs
parents:
diff changeset
   919
hgs
parents:
diff changeset
   920
            if ( cursorPos != fldpos )
hgs
parents:
diff changeset
   921
                {
hgs
parents:
diff changeset
   922
                    iAddressControlEditor->MoveCursorToEntryPosL( entryNumber, 0 );
hgs
parents:
diff changeset
   923
                }*/
hgs
parents:
diff changeset
   924
            break;
hgs
parents:
diff changeset
   925
            }
hgs
parents:
diff changeset
   926
        case EKeyLeftArrow:
hgs
parents:
diff changeset
   927
            {
hgs
parents:
diff changeset
   928
            if ( iAddressControlEditor->IsPosAtEntryBeginning( cursorPos ) )
hgs
parents:
diff changeset
   929
                {
hgs
parents:
diff changeset
   930
                TInt entryNumber = iAddressControlEditor->EntryNumber( cursorPos );
hgs
parents:
diff changeset
   931
                if ( iAddressControlEditor->IsEntryVerified( entryNumber ) )
hgs
parents:
diff changeset
   932
                    {
hgs
parents:
diff changeset
   933
                    if ( iAddressControlEditor->IsEntryRightToLeft( entryNumber ) )
hgs
parents:
diff changeset
   934
                        {
hgs
parents:
diff changeset
   935
                        iAddressControlEditor->MoveCursorToEntryPosL(
hgs
parents:
diff changeset
   936
                            entryNumber,
hgs
parents:
diff changeset
   937
                            iAddressControlEditor->EntryLength( entryNumber ) );
hgs
parents:
diff changeset
   938
                        iAddressControlEditor->CheckHighlightingL();
hgs
parents:
diff changeset
   939
                        return EKeyWasConsumed;
hgs
parents:
diff changeset
   940
                        }
hgs
parents:
diff changeset
   941
                    }
hgs
parents:
diff changeset
   942
                }
hgs
parents:
diff changeset
   943
                
hgs
parents:
diff changeset
   944
            if ( !iAddressControlEditor->IsPosAtEntryBeginning( cursorPos ) )
hgs
parents:
diff changeset
   945
                {
hgs
parents:
diff changeset
   946
                TInt entryNumber = iAddressControlEditor->EntryNumber( cursorPos );
hgs
parents:
diff changeset
   947
                if (iAddressControlEditor->IsEntryVerified( entryNumber ) )
hgs
parents:
diff changeset
   948
                    {
hgs
parents:
diff changeset
   949
                    if ( !iAddressControlEditor->IsEntryRightToLeft( entryNumber ) )
hgs
parents:
diff changeset
   950
                        {
hgs
parents:
diff changeset
   951
                        iAddressControlEditor->MoveCursorToEntryPosL( entryNumber, 0 );
hgs
parents:
diff changeset
   952
                        iAddressControlEditor->CheckHighlightingL();
hgs
parents:
diff changeset
   953
                        return EKeyWasConsumed;
hgs
parents:
diff changeset
   954
                        }
hgs
parents:
diff changeset
   955
                    }
hgs
parents:
diff changeset
   956
                }
hgs
parents:
diff changeset
   957
                
hgs
parents:
diff changeset
   958
            break;
hgs
parents:
diff changeset
   959
            }
hgs
parents:
diff changeset
   960
        case EKeyRightArrow:
hgs
parents:
diff changeset
   961
            {
hgs
parents:
diff changeset
   962
            if ( iAddressControlEditor->IsPosAtEntryBeginning( cursorPos ) )
hgs
parents:
diff changeset
   963
                {
hgs
parents:
diff changeset
   964
                TInt entryNumber = iAddressControlEditor->EntryNumber( cursorPos );
hgs
parents:
diff changeset
   965
                if (iAddressControlEditor->IsEntryVerified( entryNumber ) )
hgs
parents:
diff changeset
   966
                    {
hgs
parents:
diff changeset
   967
                    if( !iAddressControlEditor->IsEntryRightToLeft( entryNumber ) )
hgs
parents:
diff changeset
   968
                        {
hgs
parents:
diff changeset
   969
                        iAddressControlEditor->MoveCursorToEntryPosL(
hgs
parents:
diff changeset
   970
                            entryNumber,
hgs
parents:
diff changeset
   971
                            iAddressControlEditor->EntryLength( entryNumber ) );
hgs
parents:
diff changeset
   972
                        iAddressControlEditor->CheckHighlightingL();
hgs
parents:
diff changeset
   973
                        return EKeyWasConsumed;
hgs
parents:
diff changeset
   974
                        }
hgs
parents:
diff changeset
   975
                    }
hgs
parents:
diff changeset
   976
                }
hgs
parents:
diff changeset
   977
            if ( !iAddressControlEditor->IsPosAtEntryBeginning( cursorPos ) )
hgs
parents:
diff changeset
   978
                {
hgs
parents:
diff changeset
   979
                TInt entryNumber = iAddressControlEditor->EntryNumber( cursorPos );
hgs
parents:
diff changeset
   980
                if (iAddressControlEditor->IsEntryVerified( entryNumber ) )
hgs
parents:
diff changeset
   981
                    {
hgs
parents:
diff changeset
   982
                    if( iAddressControlEditor->IsEntryRightToLeft( entryNumber ) )
hgs
parents:
diff changeset
   983
                        {
hgs
parents:
diff changeset
   984
                        iAddressControlEditor->MoveCursorToEntryPosL( entryNumber, 0 );
hgs
parents:
diff changeset
   985
                        iAddressControlEditor->CheckHighlightingL();
hgs
parents:
diff changeset
   986
                        return EKeyWasConsumed;
hgs
parents:
diff changeset
   987
                        }
hgs
parents:
diff changeset
   988
                    }
hgs
parents:
diff changeset
   989
                }
hgs
parents:
diff changeset
   990
            break;
hgs
parents:
diff changeset
   991
            }
hgs
parents:
diff changeset
   992
        case EKeyTab:
hgs
parents:
diff changeset
   993
        case EKeyInsert:
hgs
parents:
diff changeset
   994
            {
hgs
parents:
diff changeset
   995
            return EKeyWasConsumed;
hgs
parents:
diff changeset
   996
            }
hgs
parents:
diff changeset
   997
        case EKeyEnter:
hgs
parents:
diff changeset
   998
            {
hgs
parents:
diff changeset
   999
            TUint32 editPermission = iAddressControlEditor->CheckEditPermission();
hgs
parents:
diff changeset
  1000
            if ( !( editPermission & EMsgEditParagraphDelimiter ) ||
hgs
parents:
diff changeset
  1001
                ( aKeyEvent.iModifiers & EModifierShift ) )
hgs
parents:
diff changeset
  1002
                {
hgs
parents:
diff changeset
  1003
                return EKeyWasConsumed;
hgs
parents:
diff changeset
  1004
                }
hgs
parents:
diff changeset
  1005
                
hgs
parents:
diff changeset
  1006
            iAddressControlEditor->TurnHighlightingOffL( iAddressControlEditor->Selection() );
hgs
parents:
diff changeset
  1007
                
hgs
parents:
diff changeset
  1008
            break;
hgs
parents:
diff changeset
  1009
            }
hgs
parents:
diff changeset
  1010
        case EKeyDelete:
hgs
parents:
diff changeset
  1011
            {
hgs
parents:
diff changeset
  1012
            TUint32 editPermission = iAddressControlEditor->CheckEditPermission();
hgs
parents:
diff changeset
  1013
            if ( editPermission & EMsgEditRemoveEntry &&
hgs
parents:
diff changeset
  1014
                 iAddressControlEditor->IsPosAtEntryBeginning( cursorPos ) )
hgs
parents:
diff changeset
  1015
                {
hgs
parents:
diff changeset
  1016
                RemoveHighlightedEntryL();
hgs
parents:
diff changeset
  1017
                return EKeyWasConsumed;
hgs
parents:
diff changeset
  1018
                }
hgs
parents:
diff changeset
  1019
            else if ( !( editPermission & EMsgEditDelete ) )
hgs
parents:
diff changeset
  1020
                {
hgs
parents:
diff changeset
  1021
                return EKeyWasConsumed;
hgs
parents:
diff changeset
  1022
                }
hgs
parents:
diff changeset
  1023
                
hgs
parents:
diff changeset
  1024
            iAddressControlEditor->TurnHighlightingOffL( iAddressControlEditor->Selection() );
hgs
parents:
diff changeset
  1025
            break;
hgs
parents:
diff changeset
  1026
            }
hgs
parents:
diff changeset
  1027
        case EKeyBackspace:
hgs
parents:
diff changeset
  1028
            {
hgs
parents:
diff changeset
  1029
            TUint32 editPermission = iAddressControlEditor->CheckEditPermission();
hgs
parents:
diff changeset
  1030
            
hgs
parents:
diff changeset
  1031
            if ( editPermission & EMsgEditRemoveEntry )
hgs
parents:
diff changeset
  1032
                {
hgs
parents:
diff changeset
  1033
                RemoveHighlightedEntryL();
hgs
parents:
diff changeset
  1034
                return EKeyWasConsumed;
hgs
parents:
diff changeset
  1035
                }
hgs
parents:
diff changeset
  1036
            else if ( editPermission & EMsgEditBackspaceMove )
hgs
parents:
diff changeset
  1037
                {
hgs
parents:
diff changeset
  1038
                TInt entryNumber = iAddressControlEditor->EntryNumber( cursorPos ) - 1;
hgs
parents:
diff changeset
  1039
                iAddressControlEditor->MoveCursorToEntryPosL(
hgs
parents:
diff changeset
  1040
                    entryNumber,
hgs
parents:
diff changeset
  1041
                    iAddressControlEditor->EntryLength( entryNumber ) );
hgs
parents:
diff changeset
  1042
                return EKeyWasConsumed;
hgs
parents:
diff changeset
  1043
                }
hgs
parents:
diff changeset
  1044
            else if ( !( editPermission & EMsgEditBackspace ) )
hgs
parents:
diff changeset
  1045
                {
hgs
parents:
diff changeset
  1046
                return EKeyWasConsumed;
hgs
parents:
diff changeset
  1047
                }
hgs
parents:
diff changeset
  1048
                
hgs
parents:
diff changeset
  1049
            iAddressControlEditor->TurnHighlightingOffL( iAddressControlEditor->Selection() );
hgs
parents:
diff changeset
  1050
            
hgs
parents:
diff changeset
  1051
            // This is for disabling paragraph adding when removing line feed after 
hgs
parents:
diff changeset
  1052
            // semicolon. OfferKeyEventL below will trigger EEventTextUpdate event.
hgs
parents:
diff changeset
  1053
            iDuplicateEvent = ETrue;
hgs
parents:
diff changeset
  1054
            
hgs
parents:
diff changeset
  1055
            break;
hgs
parents:
diff changeset
  1056
            }
hgs
parents:
diff changeset
  1057
        default:
hgs
parents:
diff changeset
  1058
            {
hgs
parents:
diff changeset
  1059
            if ( !iAddressControlEditor->IsHandleEditEvent() )
hgs
parents:
diff changeset
  1060
                {
hgs
parents:
diff changeset
  1061
                TUint32 editPermission = iAddressControlEditor->CheckEditPermission();
hgs
parents:
diff changeset
  1062
                if ( !( editPermission & EMsgEditCharInsert ) )
hgs
parents:
diff changeset
  1063
                    {
hgs
parents:
diff changeset
  1064
                    return EKeyWasConsumed;
hgs
parents:
diff changeset
  1065
                    }
hgs
parents:
diff changeset
  1066
                }
hgs
parents:
diff changeset
  1067
            iAddressControlEditor->TurnHighlightingOffL( iAddressControlEditor->Selection() );
hgs
parents:
diff changeset
  1068
            break;
hgs
parents:
diff changeset
  1069
            }
hgs
parents:
diff changeset
  1070
        }
hgs
parents:
diff changeset
  1071
hgs
parents:
diff changeset
  1072
    keyResp = iAddressControlEditor->OfferKeyEventL( aKeyEvent, aType );
hgs
parents:
diff changeset
  1073
hgs
parents:
diff changeset
  1074
    return keyResp;
hgs
parents:
diff changeset
  1075
    }
hgs
parents:
diff changeset
  1076
hgs
parents:
diff changeset
  1077
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1078
// CMsgAddressControl::HandleEdwinEventL
hgs
parents:
diff changeset
  1079
//
hgs
parents:
diff changeset
  1080
//
hgs
parents:
diff changeset
  1081
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1082
//
hgs
parents:
diff changeset
  1083
void CMsgAddressControl::HandleEdwinEventL(
hgs
parents:
diff changeset
  1084
    CEikEdwin* aEdwin, TEdwinEvent aEventType )
hgs
parents:
diff changeset
  1085
    {
hgs
parents:
diff changeset
  1086
    CMsgExpandableControl::HandleEdwinEventL( aEdwin, aEventType );
hgs
parents:
diff changeset
  1087
hgs
parents:
diff changeset
  1088
    if ( aEventType == MEikEdwinObserver::EEventNavigation )
hgs
parents:
diff changeset
  1089
        {
hgs
parents:
diff changeset
  1090
        if ( iAddressControlEditor->CursorPos() ==
hgs
parents:
diff changeset
  1091
            iAddressControlEditor->TextLength() )
hgs
parents:
diff changeset
  1092
            {
hgs
parents:
diff changeset
  1093
            iAddressControlEditor->TurnHighlightingOffFromPosL( 0 );
hgs
parents:
diff changeset
  1094
            }
hgs
parents:
diff changeset
  1095
        iAddressControlEditor->CheckHighlightingL();
hgs
parents:
diff changeset
  1096
        }
hgs
parents:
diff changeset
  1097
    if ( aEventType == MEikEdwinObserver::EEventTextUpdate )
hgs
parents:
diff changeset
  1098
        {
hgs
parents:
diff changeset
  1099
        iAddressControlEditor->PostInsertEditorFormattingL( iDuplicateEvent );
hgs
parents:
diff changeset
  1100
        
hgs
parents:
diff changeset
  1101
        // Reset duplicate event flag.
hgs
parents:
diff changeset
  1102
        iDuplicateEvent = EFalse;
hgs
parents:
diff changeset
  1103
        }
hgs
parents:
diff changeset
  1104
    }
hgs
parents:
diff changeset
  1105
hgs
parents:
diff changeset
  1106
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1107
// CMsgAddressControl::PrepareForReadOnly
hgs
parents:
diff changeset
  1108
//
hgs
parents:
diff changeset
  1109
// Prepares read only or non read only state.
hgs
parents:
diff changeset
  1110
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1111
//
hgs
parents:
diff changeset
  1112
void CMsgAddressControl::PrepareForReadOnly( TBool aReadOnly )
hgs
parents:
diff changeset
  1113
    {
hgs
parents:
diff changeset
  1114
    CMsgExpandableControl::PrepareForReadOnly( aReadOnly );
hgs
parents:
diff changeset
  1115
    
hgs
parents:
diff changeset
  1116
#ifdef RD_SCALABLE_UI_V2
hgs
parents:
diff changeset
  1117
    if ( !aReadOnly && 
hgs
parents:
diff changeset
  1118
         AknLayoutUtils::PenEnabled() )
hgs
parents:
diff changeset
  1119
        {
hgs
parents:
diff changeset
  1120
        if ( !iButton )
hgs
parents:
diff changeset
  1121
            {
hgs
parents:
diff changeset
  1122
            TRAPD( error, CreateButtonL() );
hgs
parents:
diff changeset
  1123
            if ( error == KErrNone )
hgs
parents:
diff changeset
  1124
                {
hgs
parents:
diff changeset
  1125
                LayoutButton();
hgs
parents:
diff changeset
  1126
                }
hgs
parents:
diff changeset
  1127
            else
hgs
parents:
diff changeset
  1128
                {
hgs
parents:
diff changeset
  1129
                delete iButton;
hgs
parents:
diff changeset
  1130
                iButton = NULL;
hgs
parents:
diff changeset
  1131
                }
hgs
parents:
diff changeset
  1132
            }
hgs
parents:
diff changeset
  1133
        }
hgs
parents:
diff changeset
  1134
    else 
hgs
parents:
diff changeset
  1135
        {
hgs
parents:
diff changeset
  1136
        // No button is created at the read only state or when pen is disabled
hgs
parents:
diff changeset
  1137
        delete iButton;
hgs
parents:
diff changeset
  1138
        iButton = NULL;
hgs
parents:
diff changeset
  1139
        }
hgs
parents:
diff changeset
  1140
#endif
hgs
parents:
diff changeset
  1141
    }
hgs
parents:
diff changeset
  1142
hgs
parents:
diff changeset
  1143
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1144
// CMsgAddressControl::FocusChanged
hgs
parents:
diff changeset
  1145
//
hgs
parents:
diff changeset
  1146
// This is called when the focus of the control is changed.
hgs
parents:
diff changeset
  1147
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1148
//
hgs
parents:
diff changeset
  1149
void CMsgAddressControl::FocusChanged( TDrawNow aDrawNow )
hgs
parents:
diff changeset
  1150
    {
hgs
parents:
diff changeset
  1151
    CMsgExpandableControl::FocusChanged( aDrawNow );
hgs
parents:
diff changeset
  1152
hgs
parents:
diff changeset
  1153
    }
hgs
parents:
diff changeset
  1154
hgs
parents:
diff changeset
  1155
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1156
// CMsgAddressControl::HandleResourceChange
hgs
parents:
diff changeset
  1157
//
hgs
parents:
diff changeset
  1158
// This is called when the focus of the control is changed.
hgs
parents:
diff changeset
  1159
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1160
//
hgs
parents:
diff changeset
  1161
void CMsgAddressControl::HandleResourceChange( TInt aType )
hgs
parents:
diff changeset
  1162
    {
hgs
parents:
diff changeset
  1163
hgs
parents:
diff changeset
  1164
    CMsgExpandableControl::HandleResourceChange( aType );
hgs
parents:
diff changeset
  1165
    }
hgs
parents:
diff changeset
  1166
hgs
parents:
diff changeset
  1167
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1168
// CMsgAddressControl::GetNextItemOnEntry
hgs
parents:
diff changeset
  1169
//
hgs
parents:
diff changeset
  1170
// Finds the next unverified string on entry and updates parsing info
hgs
parents:
diff changeset
  1171
// correspondingly. Returns ETrue if found.
hgs
parents:
diff changeset
  1172
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1173
//
hgs
parents:
diff changeset
  1174
TInt CMsgAddressControl::GetNextItemOnEntry( TDes& aEntryBuf )
hgs
parents:
diff changeset
  1175
    {
hgs
parents:
diff changeset
  1176
    TInt entryNumber = iParsingInfo.iEntryNum;
hgs
parents:
diff changeset
  1177
    TInt startPos = iParsingInfo.iEndPos;
hgs
parents:
diff changeset
  1178
    TInt endPos = iParsingInfo.iEndPos;
hgs
parents:
diff changeset
  1179
hgs
parents:
diff changeset
  1180
    TPtrC entryString( iAddressControlEditor->ReadEntry( entryNumber ) );
hgs
parents:
diff changeset
  1181
    TInt ret = ParseString( aEntryBuf, entryString, startPos, endPos );
hgs
parents:
diff changeset
  1182
    SetParsingInfo( entryNumber, startPos, endPos );
hgs
parents:
diff changeset
  1183
hgs
parents:
diff changeset
  1184
    return ret;
hgs
parents:
diff changeset
  1185
    }
hgs
parents:
diff changeset
  1186
hgs
parents:
diff changeset
  1187
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1188
// CMsgAddressControl::ParseString
hgs
parents:
diff changeset
  1189
//
hgs
parents:
diff changeset
  1190
// Finds and returns an unverified string aEntryItem from aString starting at
hgs
parents:
diff changeset
  1191
// position aStartPos. Returns a start position aStartPos and an end position
hgs
parents:
diff changeset
  1192
// aEndPos of the searched range. Returns KErrNotFound if the string cannot be
hgs
parents:
diff changeset
  1193
// found or KErrOverflow if a sting was too long.
hgs
parents:
diff changeset
  1194
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1195
//
hgs
parents:
diff changeset
  1196
TInt CMsgAddressControl::ParseString(
hgs
parents:
diff changeset
  1197
    TDes& aEntryItem, const TPtrC& aString, TInt& aStartPos, TInt& aEndPos )
hgs
parents:
diff changeset
  1198
    {
hgs
parents:
diff changeset
  1199
    __ASSERT_DEBUG( aStartPos >= 0, Panic( EMsgInvalidStartPos ) );
hgs
parents:
diff changeset
  1200
hgs
parents:
diff changeset
  1201
    aEntryItem.Zero();
hgs
parents:
diff changeset
  1202
    aEndPos = aStartPos;
hgs
parents:
diff changeset
  1203
    TInt stringLength = aString.Length();
hgs
parents:
diff changeset
  1204
    TInt ret( KErrNone );
hgs
parents:
diff changeset
  1205
hgs
parents:
diff changeset
  1206
    while ( aEndPos < stringLength )
hgs
parents:
diff changeset
  1207
        {
hgs
parents:
diff changeset
  1208
        // finds suitable strings e.g. kalle;^   kalle^   ______;^
hgs
parents:
diff changeset
  1209
        if ( ( ( aString[aEndPos] == KMsgListSeparator ) ||
hgs
parents:
diff changeset
  1210
            ( aString[aEndPos] == KArabicSemicolon ) ||
hgs
parents:
diff changeset
  1211
            ( aString[aEndPos] == CEditableText::ELineBreak ) ||
hgs
parents:
diff changeset
  1212
            ( aString[aEndPos] == KDownwardsArrowWithTipLeftwards ) ||
hgs
parents:
diff changeset
  1213
            ( aString[aEndPos] == KDownwardsArrowWithTipRightwards ) )
hgs
parents:
diff changeset
  1214
            // SJK 25.04.2005: Fixing "HNUN-6BPAVU":
hgs
parents:
diff changeset
  1215
            /*&& ( aStartPos != aEndPos )*/ )
hgs
parents:
diff changeset
  1216
            {
hgs
parents:
diff changeset
  1217
            aEndPos++;
hgs
parents:
diff changeset
  1218
            break;
hgs
parents:
diff changeset
  1219
            }
hgs
parents:
diff changeset
  1220
        else if ( ( ( aString[aEndPos] != KMsgListSeparator ) ||
hgs
parents:
diff changeset
  1221
            ( aString[aEndPos] != KArabicSemicolon ) ) &&
hgs
parents:
diff changeset
  1222
            ( aEntryItem.Length() < aEntryItem.MaxLength() ) )
hgs
parents:
diff changeset
  1223
            {
hgs
parents:
diff changeset
  1224
            aEntryItem.Append( aString[aEndPos] );
hgs
parents:
diff changeset
  1225
            }
hgs
parents:
diff changeset
  1226
        else if ( aString[aEndPos] != CEditableText::ESpace )
hgs
parents:
diff changeset
  1227
            {
hgs
parents:
diff changeset
  1228
            // Do we ever get here? Even in theory!?
hgs
parents:
diff changeset
  1229
            // What is this branch for?!
hgs
parents:
diff changeset
  1230
            aEndPos++;
hgs
parents:
diff changeset
  1231
            break;
hgs
parents:
diff changeset
  1232
            }
hgs
parents:
diff changeset
  1233
        aEndPos++;
hgs
parents:
diff changeset
  1234
        }
hgs
parents:
diff changeset
  1235
hgs
parents:
diff changeset
  1236
    aEntryItem.TrimAll();
hgs
parents:
diff changeset
  1237
hgs
parents:
diff changeset
  1238
    if ( ( aEntryItem.Length() == 0 ) && ( aStartPos == aEndPos ) )
hgs
parents:
diff changeset
  1239
        {
hgs
parents:
diff changeset
  1240
        ret = KErrNotFound;
hgs
parents:
diff changeset
  1241
        }
hgs
parents:
diff changeset
  1242
hgs
parents:
diff changeset
  1243
    return ret;
hgs
parents:
diff changeset
  1244
    }
hgs
parents:
diff changeset
  1245
hgs
parents:
diff changeset
  1246
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1247
// CMsgAddressControl::FormatAndSetCursorPosL
hgs
parents:
diff changeset
  1248
//
hgs
parents:
diff changeset
  1249
// Formats and sets the cursor to the beginning of the formatted band.
hgs
parents:
diff changeset
  1250
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1251
//
hgs
parents:
diff changeset
  1252
void CMsgAddressControl::FormatAndSetCursorPosL( TInt aPos )
hgs
parents:
diff changeset
  1253
    {
hgs
parents:
diff changeset
  1254
    if ( iControlModeFlags & EMsgControlModeInitialized )
hgs
parents:
diff changeset
  1255
        {
hgs
parents:
diff changeset
  1256
        iAddressControlEditor->SetAmountToFormatL( ETrue );
hgs
parents:
diff changeset
  1257
        iAddressControlEditor->CheckHighlightingL();
hgs
parents:
diff changeset
  1258
        }
hgs
parents:
diff changeset
  1259
hgs
parents:
diff changeset
  1260
    // Formats and draws the content
hgs
parents:
diff changeset
  1261
    iAddressControlEditor->SetCursorPosAndCancelSelectionL( aPos );
hgs
parents:
diff changeset
  1262
    if ( iControlModeFlags & EMsgControlModeInitialized )
hgs
parents:
diff changeset
  1263
        {
hgs
parents:
diff changeset
  1264
        iAddressControlEditor->CheckHighlightingL();
hgs
parents:
diff changeset
  1265
        iBaseControlObserver->HandleBaseControlEventRequestL(
hgs
parents:
diff changeset
  1266
            this, EMsgEnsureCorrectFormPosition );
hgs
parents:
diff changeset
  1267
        }
hgs
parents:
diff changeset
  1268
    }
hgs
parents:
diff changeset
  1269
hgs
parents:
diff changeset
  1270
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1271
// CMsgAddressControl::RemoveHightlightedEntryL
hgs
parents:
diff changeset
  1272
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1273
//
hgs
parents:
diff changeset
  1274
void CMsgAddressControl::RemoveHighlightedEntryL( )
hgs
parents:
diff changeset
  1275
    {
hgs
parents:
diff changeset
  1276
    iAddressControlEditor->TurnHighlightingOffL();
hgs
parents:
diff changeset
  1277
    TInt cursorPos( iAddressControlEditor->CursorPos() );
hgs
parents:
diff changeset
  1278
    TInt entryNumber = iAddressControlEditor->EntryNumber( iAddressControlEditor->CursorPos() );
hgs
parents:
diff changeset
  1279
    //Count the paragraph delimiter while capturing length
hgs
parents:
diff changeset
  1280
    TInt entryLength = iAddressControlEditor->EntryLength( entryNumber )+1;
hgs
parents:
diff changeset
  1281
    //Clear the entry
hgs
parents:
diff changeset
  1282
    iAddressControlEditor->DeleteEntryCharsL( entryNumber, 0, entryLength );
hgs
parents:
diff changeset
  1283
    iAddressControlEditor->DeleteEntryL( entryNumber );
hgs
parents:
diff changeset
  1284
    FormatAndSetCursorPosL(iAddressControlEditor->CursorPos()); 
hgs
parents:
diff changeset
  1285
hgs
parents:
diff changeset
  1286
    iControlModeFlags |= EMsgControlModeModified;
hgs
parents:
diff changeset
  1287
    }
hgs
parents:
diff changeset
  1288
hgs
parents:
diff changeset
  1289
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1290
// CMsgAddressControl::CreateButtonL
hgs
parents:
diff changeset
  1291
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1292
//
hgs
parents:
diff changeset
  1293
void CMsgAddressControl::CreateButtonL()
hgs
parents:
diff changeset
  1294
    {
hgs
parents:
diff changeset
  1295
#ifdef RD_SCALABLE_UI_V2
hgs
parents:
diff changeset
  1296
    delete iButton;
hgs
parents:
diff changeset
  1297
    iButton = NULL;
hgs
parents:
diff changeset
  1298
    
hgs
parents:
diff changeset
  1299
    iButton = CAknButton::NewL( NULL,
hgs
parents:
diff changeset
  1300
                                NULL,
hgs
parents:
diff changeset
  1301
                                NULL,
hgs
parents:
diff changeset
  1302
                                NULL,
hgs
parents:
diff changeset
  1303
                                *iCaption->Text(),
hgs
parents:
diff changeset
  1304
                                KNullDesC,
hgs
parents:
diff changeset
  1305
                                KAknButtonSizeFitText | KAknButtonTextLeft,
hgs
parents:
diff changeset
  1306
                                0 );
hgs
parents:
diff changeset
  1307
    
hgs
parents:
diff changeset
  1308
    iButton->SetTextColorIds( KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG63 );
hgs
parents:
diff changeset
  1309
    iButton->SetObserver( this );
hgs
parents:
diff changeset
  1310
    
hgs
parents:
diff changeset
  1311
    if ( Parent() )
hgs
parents:
diff changeset
  1312
        {
hgs
parents:
diff changeset
  1313
        iButton->SetContainerWindowL( *Parent() );
hgs
parents:
diff changeset
  1314
        iButton->ActivateL();
hgs
parents:
diff changeset
  1315
        }
hgs
parents:
diff changeset
  1316
#endif // RD_SCALABLE_UI_V2
hgs
parents:
diff changeset
  1317
    }
hgs
parents:
diff changeset
  1318
hgs
parents:
diff changeset
  1319
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1320
// CMsgAddressControl::LayoutButton
hgs
parents:
diff changeset
  1321
// ---------------------------------------------------------
hgs
parents:
diff changeset
  1322
//    
hgs
parents:
diff changeset
  1323
void CMsgAddressControl::LayoutButton()
hgs
parents:
diff changeset
  1324
    {
hgs
parents:
diff changeset
  1325
#ifdef RD_SCALABLE_UI_V2
hgs
parents:
diff changeset
  1326
    CMsgExpandableControl::LayoutButton();
hgs
parents:
diff changeset
  1327
    
hgs
parents:
diff changeset
  1328
    if ( iButton )
hgs
parents:
diff changeset
  1329
        {
hgs
parents:
diff changeset
  1330
        TMargins8 margins;
hgs
parents:
diff changeset
  1331
        TRect buttonRect = iButtonLayout.Rect();
hgs
parents:
diff changeset
  1332
        TRect textRect = iCaptionLayout.TextRect();
hgs
parents:
diff changeset
  1333
        margins.iTop = textRect.iTl.iY - buttonRect.iTl.iY;
hgs
parents:
diff changeset
  1334
        margins.iBottom = buttonRect.iBr.iY - textRect.iBr.iY;
hgs
parents:
diff changeset
  1335
        margins.iLeft = textRect.iTl.iX - buttonRect.iTl.iX;
hgs
parents:
diff changeset
  1336
        margins.iRight = buttonRect.iBr.iX - textRect.iBr.iX;
hgs
parents:
diff changeset
  1337
        
hgs
parents:
diff changeset
  1338
        iButton->SetMargins( margins );
hgs
parents:
diff changeset
  1339
        }
hgs
parents:
diff changeset
  1340
#endif // RD_SCALABLE_UI_V2
hgs
parents:
diff changeset
  1341
    }
hgs
parents:
diff changeset
  1342
hgs
parents:
diff changeset
  1343
//  End of File