emailuis/emailui/src/ncsaifeditor.cpp
branchRCL_3
changeset 80 726fba06891a
parent 73 c8382f7b54ef
--- a/emailuis/emailui/src/ncsaifeditor.cpp	Wed Sep 15 11:52:37 2010 +0300
+++ b/emailuis/emailui/src/ncsaifeditor.cpp	Wed Oct 13 14:11:15 2010 +0300
@@ -216,17 +216,16 @@
     }
 
 // ---------------------------------------------------------------------------
-// Constructor
+// constructor/destructor
 // ---------------------------------------------------------------------------
 //
 CNcsAifEditor::CNcsAifEditor(
     MNcsFieldSizeObserver* aSizeObserver, const TDesC& aCaptionText ) 
-    : CNcsEditor( aSizeObserver, ETrue, ENcsEditorAddress, aCaptionText ),
-    iAddressPopupList( NULL ),
+    : CNcsEditor( aSizeObserver, ETrue, ENcsEditorAddress, aCaptionText ), iAddressPopupList( NULL ),
     iAddLeftover( ETrue )
     {
     FUNC_LOG;
-    SetEdwinObserver( this );
+	SetEdwinObserver( this );
     }
 
 // ---------------------------------------------------------------------------
@@ -249,15 +248,16 @@
 CNcsAifEditor::~CNcsAifEditor()
     {
     FUNC_LOG;
-    iArray.ResetAndDestroy();
-    iAddressArray.Reset();
-    if ( iAsyncCallBack )
-        {
-        iAsyncCallBack->Cancel();
-        delete iAsyncCallBack;
-        }
+	iArray.ResetAndDestroy();
+	iAddressArray.Reset();
+	if ( iAsyncCallBack )
+	    {
+	    iAsyncCallBack->Cancel();
+	    delete iAsyncCallBack;
+	    }
     }
 
+
 // -----------------------------------------------------------------------------
 // CNcsAifEditor::CursorLineNumber() const
 // -----------------------------------------------------------------------------
@@ -311,61 +311,22 @@
         {
         ret = SetEditorSelectionL( aKeyEvent, aType );
         }
-
+    
     //when press a key down, record the coursor position
     if ( aType == EEventKeyDown )
-        {
-        iLastTimeCursorPos = CursorPos();
-        }
+    	{
+    	iLastTimeCursorPos = CursorPos();
+    	}
 
     if ( ret == EKeyWasNotConsumed )
         {
         // enter completes the address entry
-        if ( aType == EEventKey && ( aKeyEvent.iCode == EKeyEnter || 
-             aKeyEvent.iScanCode == EStdKeyEnter ) )
-            {
-            // make sure there is really some text inputted 
-            const TInt cursorPos = CursorPos();
-            TCursorSelection selection = NonEntryTextAtPos( cursorPos );
-
-            const TInt length = selection.Length();
-            if ( length > 0 )
-                {
-                HBufC* text = HBufC::NewLC( length );
-                TPtr ptr = text->Des();
-                Text()->Extract( ptr, selection.LowerPos(), length );
-                ptr.Trim();
-
-                // complete the entry by adding a semicolon, 
-                // address will be added in HandleTextUpdateL
-                if ( ptr.Length() > 0 )
-                    {
-                    Text()->InsertL( cursorPos, KCharAddressDelimeterSemiColon );
-                    HandleTextChangedL();
-                    SetCursorPosL( cursorPos + 1, EFalse );
-                    iLastTimeCursorPos = CursorPos();
-                    HandleTextUpdateL();
-                    }
-
-                CleanupStack::PopAndDestroy( text );
-                }
-            }
-        else if ( IsCharacterKey( aKeyEvent ) )
-            {
-            PrepareForTextInputL( CursorPos() );
-            }
-        iTextSelection = Selection();
-        ret = CNcsEditor::OfferKeyEventL( aKeyEvent, aType );
-        }
-
-    // for Korean we need to simulate event 'text update' as FEP
-    // doesn't send it and the MRU is not shown
-    if ( User::Language() == ELangKorean )
-        {
-        if ( ret == EKeyWasNotConsumed && aType == EEventKeyUp )
-            {
+        if( aType == EEventKey && (aKeyEvent.iCode == EKeyEnter || 
+        	aKeyEvent.iScanCode == EStdKeyEnter) )
+        	{
+        	// make sure there is really some text inputted 
             TInt cursorPos( CursorPos() );
-
+        	
             TCursorSelection selection = NonEntryTextAtPos( cursorPos );
             
             TInt length( selection.Length() );
@@ -374,14 +335,20 @@
             TPtr ptr = text->Des();
             Text()->Extract( ptr, selection.LowerPos(), length );
             ptr.Trim();
-        
-            if ( TFsEmailUiUtility::IsKoreanWord( ptr ) )
-                {
-                HandleTextUpdateDeferred();
-                }
-        
-            CleanupStack::PopAndDestroy( text );
-            }
+            
+            // complete the entry by adding a semicolon, 
+            // address will be added in HandleTextUpdateL
+            if( ptr.Length() > 0 )
+            	{            
+				Text()->InsertL( cursorPos, KCharAddressDelimeterSemiColon );
+				HandleTextChangedL();
+				SetCursorPosL( cursorPos + 1, EFalse );
+            	}
+            
+            CleanupStack::PopAndDestroy( text );            
+        	}
+        iTextSelection = Selection();        
+        ret = CNcsEditor::OfferKeyEventL( aKeyEvent, aType );
         }
     
     return ret;
@@ -433,7 +400,7 @@
     if ( aKeyEvent.iCode == EKeyUpArrow || aKeyEvent.iCode == EKeyDownArrow )
         {
         CompleteEntryL();
-
+		
         response = CNcsEditor::OfferKeyEventL( aKeyEvent,aType );
         if ( response == EKeyWasConsumed ) 
             {
@@ -446,11 +413,10 @@
             }
         }
     // Check if the cursor is in any of the addresses
-    else if ( aKeyEvent.iCode == EKeyLeftArrow || aKeyEvent.iCode == EKeyBackspace ) 
+    else if( aKeyEvent.iCode == EKeyLeftArrow || aKeyEvent.iCode == EKeyBackspace ) 
         {
         // We're moving left, but haven't yet.
-        const TInt cursorPos = CursorPos();
-        entry = GetEntryAt( cursorPos, EDirectionLeft );
+        entry = GetEntryAt( CursorPos(), EDirectionLeft );
         if ( entry )
             {
             if ( selection.Length() && aKeyEvent.iCode == EKeyLeftArrow)
@@ -465,25 +431,11 @@
                 response = EKeyWasConsumed;
                 }
             }
-        else
-            {
-            // Complete entry, if cursor is being moved to the previous row.
-            TCursorSelection selection = NonEntryTextAndSpaceAtPos( cursorPos );
-            if ( cursorPos > 0 && selection.LowerPos() + 1 == cursorPos )
-                {
-                if ( IsDelimiter( CharAtPos( selection.LowerPos() ) ) )
-                    {
-                    CompleteEntryL();
-                    SetCursorPosL( cursorPos, EFalse );
-                    }
-                }
-            }
         }
-    else if ( aKeyEvent.iCode == EKeyRightArrow || aKeyEvent.iCode == EKeyDelete )
+    else if( aKeyEvent.iCode == EKeyRightArrow || aKeyEvent.iCode == EKeyDelete )
         {
         // We're moving right, but haven't yet.
-        const TInt cursorPos = CursorPos();
-        entry = GetEntryAt( cursorPos, EDirectionRight );
+        entry = GetEntryAt( CursorPos(), EDirectionRight );
         if ( entry )
             {
             if ( selection.Length() && aKeyEvent.iCode == EKeyRightArrow  )
@@ -498,18 +450,6 @@
                 response = EKeyWasConsumed;
                 }
             }
-        else
-            {
-            // Complete entry, if cursor is being moved to the next row.
-            TCursorSelection selection = NonEntryTextAndSpaceAtPos( cursorPos );
-            if ( cursorPos > 0 && selection.HigherPos() - 1 == cursorPos )
-                {
-                if ( IsDelimiter( CharAtPos( selection.HigherPos() - 1 ) ) )
-                    {
-                    CompleteEntryL();
-                    }
-                }
-            }
         }
     // to fix problems with updating CBA when hash key is pressed and hold
     else if ( aKeyEvent.iScanCode == EStdKeyHash ) 
@@ -567,11 +507,10 @@
                     break;
                     }
                 }
-
-            SetCursorVisible( EFalse );
+            
             ClearSelectionL();
-            RepositionEntries( entry );
-            SetCursorVisible( ETrue );
+            
+            RepositionEntriesL( entry );
 
             // The key event is set consumed only on delete and backpace
             // events, other events need to be forwarded to the editor.
@@ -590,26 +529,26 @@
 // ---------------------------------------------------------------------------
 //
 void CNcsAifEditor::DoCharChangeL()
-    {
+	{
     FUNC_LOG;
-    RecalculateEntryPositions();
+	RecalculateEntryPositions();
 
-    TChar previousChar = CharAtPos( CursorPos() - 1 );
-    TBool sentinel = ( previousChar == KCharAddressDelimeterSemiColon || 
-        previousChar == KCharAddressDelimeterComma );
-    if ( sentinel )
+	TChar previousChar = CharAtPos( CursorPos() - 1 );
+	TBool sentinel = ( previousChar == KCharAddressDelimeterSemiColon || 
+	    previousChar == KCharAddressDelimeterComma );
+	if ( sentinel )
         {
         // if comma was pressed we replace it with semicolon
-        if ( previousChar == KCharAddressDelimeterComma )
+		if ( previousChar == KCharAddressDelimeterComma )
             {
-            CPlainText* text = Text();
-            text->DeleteL( CursorPos() - 1, 1 );
-            text->InsertL( CursorPos() - 1, KCharAddressDelimeterSemiColon );
+			CPlainText* text = Text();
+			text->DeleteL( CursorPos() - 1, 1 );
+			text->InsertL( CursorPos() - 1, KCharAddressDelimeterSemiColon );
             }
-        ParseNewAddressL();
+		ParseNewAddressL();
         }
-    UpdateAddressAutoCompletionL();
-    }
+	UpdateAddressAutoCompletionL();
+	}
 
 // ---------------------------------------------------------------------------
 // CNcsAddressInputField::CharAtPos
@@ -618,15 +557,15 @@
 TChar CNcsAifEditor::CharAtPos( TInt aPos ) const
     {
     FUNC_LOG;
-    if ( aPos >= 0 && aPos < TextLength() )
+	if ( aPos >= 0 && aPos < TextLength() )
         {
-        TBuf<1> buf;
-        Text()->Extract( buf, aPos, 1 );
-        return buf[0];
+		TBuf<1> buf;
+		Text()->Extract( buf, aPos, 1 );
+		return buf[0];
         }
-    else
+	else
         {
-        return 0;
+		return 0;
         }
     }
 
@@ -645,8 +584,7 @@
 // CNcsAifEditor::AppendAddressesL()
 // -----------------------------------------------------------------------------
 //
-void CNcsAifEditor::AppendAddressesL( 
-    const RPointerArray<CNcsEmailAddressObject>& aAddresses )
+void CNcsAifEditor::AppendAddressesL( const RPointerArray<CNcsEmailAddressObject>& aAddresses )
     {
     FUNC_LOG;
     // First, add all the addresses without updating the editor text contents 
@@ -654,13 +592,8 @@
         {
         AddAddressL( *aAddresses[i], EFalse );
         }
-
-    // Update editor text content after all the items have been added.
-    SetCursorVisible( EFalse );
-    const TInt count = iArray.Count();
-    CNcsAifEntry* lastEntry = count ? iArray[count-1] : NULL;
-    RepositionEntries( lastEntry );
-    SetCursorVisible( ETrue );
+    // Update editor text content after all the items have been added
+    RepositionEntriesL( NULL );
     }
 
 // -----------------------------------------------------------------------------
@@ -669,17 +602,17 @@
 //   
 const RPointerArray<CNcsEmailAddressObject>& CNcsAifEditor::GetAddressesL()
     {
-    // Clear the existing array since it may be out of sync
-    iAddressArray.Reset();
+	// Clear the existing array since it may be out of sync
+	iAddressArray.Reset();
 
-    for ( TInt i=0; i<iArray.Count(); i++ ) 
+	for ( TInt i=0 ; i<iArray.Count() ; i++ ) 
         {
-        iAddressArray.AppendL( &iArray[i]->Address() );
+		iAddressArray.AppendL(&iArray[i]->Address());
         }
 
-    return iAddressArray;
+	return iAddressArray;
     }
-
+    
 // -----------------------------------------------------------------------------
 // CNcsAifEditor::GetEntryAt()
 // -----------------------------------------------------------------------------
@@ -777,29 +710,29 @@
 void CNcsAifEditor::ParseNewAddressL()
 	{
     FUNC_LOG;
-    HBufC* text = GetNonEntryTextLC();
-    __ASSERT_ALWAYS( text, Panic(EFSEmailUiNullPointerException) );
+	HBufC* text = GetNonEntryTextLC();
+	__ASSERT_ALWAYS( text, Panic(EFSEmailUiNullPointerException) );
 
-    if ( text->Length() )
-        {
+	if ( text->Length() )
+		{
         // if changing focus leftover text is parsed to email
         // object - we don't need to add it anymore
         iAddLeftover = EFalse;
         // check if there is a name for the email address
         HBufC* name = CFsDelayedLoader::InstanceL()->GetContactHandlerL()->GetLastSearchNameL( *text );
-        if ( name )
-            {
+	if ( name )
+		{
             CleanupStack::PushL( name );
-            AddAddressL( *name, *text, ETrue );
-            CleanupStack::PopAndDestroy( name );
-            }
-        else
-            {
-            AddAddressL( KNullDesC, *text );
-            }
-        }
-
-    CleanupStack::PopAndDestroy(text);
+		AddAddressL( *name, *text, ETrue );
+		CleanupStack::PopAndDestroy( name );
+		}
+	else
+		{
+		AddAddressL( KNullDesC, *text );
+		}
+	    }
+	
+	CleanupStack::PopAndDestroy(text);
 	}
 
 // -----------------------------------------------------------------------------
@@ -915,8 +848,7 @@
 // CNcsAifEditor::AddAddressL()
 // -----------------------------------------------------------------------------
 //
-void CNcsAifEditor::AddAddressL( const CNcsEmailAddressObject& aAddress,
-    TBool aUpdateEditorText /*= ETrue*/ )
+void CNcsAifEditor::AddAddressL( const CNcsEmailAddressObject& aAddress, TBool aUpdateEditorText /*= ETrue*/ )
     {
     FUNC_LOG;
     CNcsAifEntry* entry = CNcsAifEntry::NewL( aAddress );
@@ -934,59 +866,57 @@
     FUNC_LOG;
     CNcsAifEntry* entry = CNcsAifEntry::NewL( aDisplayName, aEmail, aDisplayFull );
     CleanupStack::PushL( entry );
-    AddAddressL( entry, aUpdateEditorText );
-    CleanupStack::Pop( entry );
+	AddAddressL( entry, aUpdateEditorText );
+	CleanupStack::Pop( entry );
     }
 
 void CNcsAifEditor::AddAddressL( CNcsAifEntry* aNewEntry, TBool aUpdateEditorText )
     {
     FUNC_LOG;
-    TInt idx;
-
-    // Check for duplicate display names
-    for ( idx=0 ; idx<iArray.Count() ; idx++ ) 
+	TInt idx;
+	
+	// Check for duplicate display names
+	for ( idx=0 ; idx<iArray.Count() ; idx++ ) 
         {
-        if ( iArray[idx]->IsSameDN(*aNewEntry) ) 
+		if ( iArray[idx]->IsSameDN(*aNewEntry) ) 
             {
-            iArray[idx]->SetDupL();
-            aNewEntry->SetDupL();
+			iArray[idx]->SetDupL();
+			aNewEntry->SetDupL();
             }
         }
 
-    // Find the location where we need to insert the address.
-    // Browse from back to forth to make last index as default index. 
-    // This ensures items remain in correct order when populating field from
-    // existing message.
-    TInt cursorPos = CursorPos();
+	// Find the location where we need to insert the address.
+	// Browse from back to forth to make last index as default index. 
+	// This ensures items remain in correct order when populating field from
+	// existing message.
+	TInt cursorPos = CursorPos();
     // if we are at the end of editor the address was
     // added from MRU list or separator was typed in
     if ( cursorPos == Text()->DocumentLength() )
         {
         iAddLeftover = EFalse;
         }
-
-    for ( idx = iArray.Count() ; idx > 0 ; idx-- ) 
+	
+	for ( idx = iArray.Count() ; idx > 0 ; idx-- ) 
         {
-        if ( cursorPos >= iArray[idx-1]->End() ) break;
+		if ( cursorPos >= iArray[idx-1]->End() ) break;
         }
-    if ( idx == iArray.Count() ) 
-        {
-        // Tack the address onto the end of the array
-        iArray.AppendL( aNewEntry );
-        }
-    else
+	if ( idx == iArray.Count() ) 
         {
-        iArray.InsertL( aNewEntry, idx );
+		// Tack the address onto the end of the array
+		iArray.AppendL( aNewEntry );
         }
-
-    if ( aUpdateEditorText )
+	else
         {
-        // Trap because we must not leave after we have taken the ownership of
-        // aNewEntry. Otherwise douple deletion might happen.
-        SetCursorVisible( EFalse );
-        RepositionEntries( aNewEntry );
-        SetCursorVisible( ETrue );
+		iArray.InsertL( aNewEntry, idx );
         }
+	
+	if ( aUpdateEditorText )
+	    {
+	    // Trap because we must not leave after we have taken the ownership of aNewEntry.
+	    // Otherwise douple deletion might happen.
+	    TRAP_IGNORE( RepositionEntriesL( aNewEntry ) );
+	    }
     }
 
 // ---------------------------------------------------------------------------
@@ -1036,37 +966,27 @@
 	}
 
 // ---------------------------------------------------------------------------
-// CNcsAifEditor::RepositionEntries()
-// ---------------------------------------------------------------------------
-//
-TInt CNcsAifEditor::RepositionEntries( const CNcsAifEntry* aPosEntry )
-    {
-    FUNC_LOG;
-    TRAPD( err, RepositionEntriesL( aPosEntry ) );
-    return err;
-    }
-
-// ---------------------------------------------------------------------------
 // CNcsAifEditor::RepositionEntriesL()
 // ---------------------------------------------------------------------------
 //
 void CNcsAifEditor::RepositionEntriesL( const CNcsAifEntry* aPosEntry )
-    {
+	{
     FUNC_LOG;
-    TInt pos = 0;
-    CNcsAifEntry* entry;
-    for ( TInt i=0 ; i<iArray.Count() ; i++ ) 
-        {
-        entry = iArray[i];
-        pos = entry->SetPos( pos );
-        pos++; // for whitespace
-        }
+	TInt pos = 0;
+	CNcsAifEntry* entry;
+	for ( TInt i=0 ; i<iArray.Count() ; i++ ) 
+		{
+		entry = iArray[i];
+		pos = entry->SetPos( pos );
+		pos++; // for whitespace
+		}
 
-    // Reset the text
-    HBufC* text = GetFormattedAddressListLC( iArray );
-    // fix for dissapearing text PWAN-82DNEJ
-    //SetCursorPosL( 0, EFalse ); //In case the cursor pos is invalid
-
+  // Reset the text
+	HBufC* text = NULL;
+	text = GetFormattedAddressListLC( iArray );
+	// fix for dissapearing text PWAN-82DNEJ	
+	SetCursorPosL( 0, EFalse ); //In case the cursor pos is invalid
+	
     if ( iAddLeftover )
         {
         TInt lengthBefore = Text()->DocumentLength();
@@ -1081,10 +1001,10 @@
         HBufC* newText = HBufC::NewLC( text->Length() + leftover.Length() );
         TPtr newTextPtr = newText->Des();
         // add all email addresses
-        newTextPtr.Append( *text );
+        newTextPtr.Append( text->Des() );
         // add the text that was after last email object
         newTextPtr.Append( leftover );
-
+    
         SetTextL( newText );
         CleanupStack::PopAndDestroy( newText );
         CleanupStack::PopAndDestroy( textBefore );
@@ -1093,21 +1013,19 @@
         {
         SetTextL( text );
         }
-
-    if ( !aPosEntry )
-        {
-        // Set cursor at the beginning of the document.
-        SetCursorPosL( 0, EFalse );
-        }
-    else
-        {
-        // Set the cursor at the end of the given entry 
-        SetCursorPosL( aPosEntry->End(), EFalse );
-        }
-
     CleanupStack::PopAndDestroy( text );
     HandleTextChangedL();
-    }
+    
+    // Set the cursor at the end of the given entry 
+    if ( !aPosEntry )
+    	{
+	    SetCursorPosL( 0, EFalse );
+    	}
+    else
+    	{
+    	SetCursorPosL( aPosEntry->End(), EFalse );
+    	}
+	}
 
 // ---------------------------------------------------------------------------
 // CNcsAifEditor::CheckAndRemoveInvalidEntriesL()
@@ -1165,19 +1083,19 @@
 HBufC* CNcsAifEditor::GetLookupTextLC() const
     {
     FUNC_LOG;
-    HBufC* text = GetTextInHBufL();
-    CleanupStack::PushL( text );
-    if ( text )
+	HBufC* text = GetTextInHBufL();
+	
+	if (text == NULL) return NULL;
+
+	CleanupStack::PushL( text );
+	TPtr ptr( text->Des() );
+	TInt location = ptr.LocateReverse( KCharAddressDelimeterSemiColon );
+	if( location != KErrNotFound )
         {
-        TPtr ptr( text->Des() );
-        TInt location = ptr.LocateReverse( KCharAddressDelimeterSemiColon );
-        if ( location != KErrNotFound )
-            {
-            ptr = ptr.RightTPtr( ptr.Length() - location -1 );
-            ptr.TrimLeft();
-            }
+		ptr = ptr.RightTPtr( ptr.Length() - location -1 );
+		ptr.TrimLeft();
         }
-    return text;
+	return text;
     }
 
 // ---------------------------------------------------------------------------
@@ -1189,17 +1107,17 @@
     TBool aDisplayList ) const
     {
     FUNC_LOG;
-    TInt length = CalculateAddressListLength( aEntries, aDisplayList );
-    if ( length <= 0 )
+	TInt length = CalculateAddressListLength( aEntries, aDisplayList );
+	if ( length <= 0 )
         {
-        return HBufC::NewLC(0);
+		return HBufC::NewLC(0);
         }
-
-    HBufC* buf = HBufC::NewLC( length );
-    TPtr ptr = buf->Des();
-
-    TInt count = aEntries.Count();
-    for ( TInt i = 0; i < count; i++ )
+    
+	HBufC* buf = HBufC::NewLC( length );
+	TPtr ptr = buf->Des();
+    
+	TInt count = aEntries.Count();
+	for ( TInt i = 0; i < count; i++ )
         {
         if ( aDisplayList )
             {
@@ -1228,12 +1146,12 @@
 HBufC* CNcsAifEditor::GetFormattedAddressListL(
     RPointerArray<CNcsAifEntry>& aEntries,
     TBool aDisplayList ) const
-    {
+	{
     FUNC_LOG;
     HBufC* buf = GetFormattedAddressListLC( aEntries, aDisplayList );
     CleanupStack::Pop( buf );
     return buf;
-    }
+	}
 
 // ---------------------------------------------------------------------------
 // CNcsAifEditor::CalculateAddressListLength()
@@ -1284,12 +1202,12 @@
 void CNcsAifEditor::UpdateAddressAutoCompletionL()
     {
     FUNC_LOG;
-    HBufC* text = GetNonEntryTextLC();
-    __ASSERT_ALWAYS( text, Panic(EFSEmailUiNullPointerException) );
+	HBufC* text = GetNonEntryTextLC();
+	__ASSERT_ALWAYS( text, Panic(EFSEmailUiNullPointerException) );
 
-    iAddressPopupList->UpdatePopupContactListL( *text, EFalse );
-    CleanupStack::PopAndDestroy( text );
-    }
+		iAddressPopupList->UpdatePopupContactListL( *text, EFalse );
+		CleanupStack::PopAndDestroy( text );
+        }
 
 // ---------------------------------------------------------------------------
 // CNcsAifEditor::UpdateAddressAutoCompletionL()
@@ -1322,9 +1240,10 @@
 void CNcsAifEditor::UpdateAddressListAllL()
     {
     FUNC_LOG;
-    iAddressPopupList->UpdatePopupContactListL( KNullDesC, ETrue );
+	iAddressPopupList->UpdatePopupContactListL( KNullDesC, ETrue );
     }
 
+
 // ---------------------------------------------------------------------------
 // Updates the duplicate markings in the entry array.
 // ---------------------------------------------------------------------------
@@ -1387,23 +1306,38 @@
     FUNC_LOG;
     RecalculateEntryPositions();
     TCursorSelection textSelection = NonEntryTextAtPos( CursorPos() );
+    TBool newEntryCreated = EFalse;
     if ( textSelection.Length() )
         {
         // Check non-entry text for complete entries.
-        const TBool newEntriesAdded = HandleTextUpdateL( textSelection );
-        if ( newEntriesAdded )
+        newEntryCreated = HandleTextUpdateL( textSelection );
+        }
+    
+    if ( newEntryCreated )
+        {
+        iAddressPopupList->ClosePopupContactListL();
+        
+        // add line feed after new entry
+        TInt cursorPos( CursorPos() );
+        // related to PWAN-82DNEJ cursorPos shouldn't be 0 here
+        if (cursorPos == 0)
+          {
+          cursorPos = TextLength();
+          }
+          
+        if ( !iPartialRemove )
             {
-            iAddressPopupList->ClosePopupContactListL();
-            iSizeObserver->UpdateFieldSizeL( ETrue );
-            iPartialRemove = EFalse;
+            Text()->InsertL( cursorPos, TChar(CEditableText::ELineBreak) );
             }
-        else
-            {
-            MoveNonEntryTextToDedicatedRowsL( CursorPos() );
-            }
-        textSelection = NonEntryTextAtPos( CursorPos() );
+        HandleTextChangedL();
+        SetCursorPosL( cursorPos + 1, EFalse );
+        iSizeObserver->UpdateFieldSizeL( ETrue );
+        iPartialRemove = EFalse;
         }
-    UpdateAddressAutoCompletionL( textSelection );
+    else
+        {
+        UpdateAddressAutoCompletionL( textSelection );
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -1416,10 +1350,10 @@
     iAddLeftover = ETrue;
     TInt firstCharacter = aSelection.LowerPos();
     TInt lastCharacter = aSelection.HigherPos();
-
+    
     // get the inputted text
-    const TInt length = lastCharacter - firstCharacter;
-
+    TInt length = lastCharacter - firstCharacter;
+    
     HBufC* text = HBufC::NewLC( length );
     TPtr ptr = text->Des();
     Text()->Extract( ptr, firstCharacter, length );
@@ -1477,114 +1411,30 @@
                 }
             }
         }
-
+    
     // add email that wasn't ended with semicolon
     if ( lastSentinel != KErrNotFound )
         {
         if ( lastSentinel < end && start < end )
             {
             AddAddressL( KNullDesC(), ptr.Mid(start, end-start) );
-            entriesFound = ETrue;
             }
         }
-
+    
     CleanupStack::PopAndDestroy( text );
+        
     return entriesFound;
     }
 
 // ---------------------------------------------------------------------------
-// Moves inputted non-entry text to separate row
-// ---------------------------------------------------------------------------
-//
-void CNcsAifEditor::MoveNonEntryTextToDedicatedRowsL( TUint aPosition )
-    {
-    // Get the non-entry text and whitespace at given location
-    TCursorSelection textSelection = NonEntryTextAndSpaceAtPos( aPosition );
-    const TInt start = textSelection.LowerPos();
-    const TInt end = textSelection.HigherPos();
-    const TInt length = end - start;
-
-    const TChar lineBreak = TChar( CEditableText::ELineBreak );
-    const TChar paragraphDelimiter =
-        TChar( CEditableText::EParagraphDelimiter );
-
-    // Make sure that the inputted non-entry text is not on the same lines
-    // with existing entries.
-    if ( length )
-        {
-        HBufC* text = HBufC::NewLC( length );
-        TPtr ptr = text->Des();
-        Text()->Extract( ptr, start, length );
-
-        const TChar firstCharacter = TChar( ptr[0] );
-        const TChar lastCharacter = TChar( ptr[length-1] );
-        const TInt documentLength = Text()->DocumentLength();
-
-        TBool textChanged = EFalse;
-
-        if ( end < documentLength &&
-             lastCharacter != paragraphDelimiter &&
-             lastCharacter != lineBreak )
-            {
-            Text()->InsertL( end, lineBreak );
-            HandleTextChangedL();
-            textChanged = ETrue;
-            }
-
-        if ( start > 0 && start < end &&
-             firstCharacter != paragraphDelimiter &&
-             firstCharacter != lineBreak )
-            {
-            Text()->InsertL( start, lineBreak );
-            SetCursorVisible( EFalse );
-            HandleTextChangedL();
-            SetCursorPosL( CursorPos() + 1, EFalse );
-            SetCursorVisible( ETrue );
-            textChanged = ETrue;
-            }
-
-        if ( textChanged )
-            {
-            RecalculateEntryPositions();
-            }
-
-        CleanupStack::PopAndDestroy( text );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// Prepares for text entry to given cursor position making sure that the
-// new text will not be entered on same row with existing 
-// ---------------------------------------------------------------------------
-//
-void CNcsAifEditor::PrepareForTextInputL( TUint aPosition )
-    {
-    FUNC_LOG;
-    // Get the non-entry text and whitespace at given position.
-    TCursorSelection textSelection = NonEntryTextAndSpaceAtPos( aPosition );
-    const TInt start = textSelection.LowerPos();
-    const TInt end = textSelection.HigherPos();
-    const TInt length = end - start;
-
-    const TChar lineBreak = TChar( CEditableText::ELineBreak );
-
-    if ( start > 0 && ( !length || aPosition == start ) )
-        {
-        Text()->InsertL( start, lineBreak );
-        HandleTextChangedL();
-        SetCursorPosL( start + 1, EFalse );
-        }
-    }
-
-// ---------------------------------------------------------------------------
 // Handles navigation event.
 // ---------------------------------------------------------------------------
 //
 void CNcsAifEditor::HandleNavigationEventL()
     {
     FUNC_LOG;
-    // Close the contact popup when cursor is moved withing the field to make
-    // it less distracting. It's reopened when user types something.
+    // Close the contact popup when cursor is moved withing the field to make it less distracting. 
+    // It's reopened when user types something.
     iAddressPopupList->ClosePopupContactListL();
     }
 
@@ -1595,51 +1445,6 @@
 TCursorSelection CNcsAifEditor::NonEntryTextAtPos( TUint aPosition ) const
     {
     FUNC_LOG;
-    // Get the range of non-entry text and whitespace at given position.
-    TCursorSelection text = NonEntryTextAndSpaceAtPos( aPosition );
-
-    // Get the selected text to remove whitespace
-    const TInt length = text.Length();
-
-    HBufC* selectedText = NULL;
-    TRAPD( err, selectedText = HBufC::NewL( length ) );
-
-    if( err == KErrNone )
-        {
-        TPtr ptr = selectedText->Des();
-        Text()->Extract( ptr, text.LowerPos(), length );
-
-        // trim from end
-        TInt index( length - 1 );
-
-        while( index >= 0 && IsWhitespace( ptr[index--] ) )
-            {
-            text.iCursorPos--;
-            }
-
-        // trim from begin
-        index = 0;
-
-        while( index < length && IsWhitespace( ptr[index++] ) )
-            {
-            text.iAnchorPos++;
-            }
-
-        delete selectedText;
-        selectedText = NULL;
-        }    
-
-    return text;
-    }
-
-// ---------------------------------------------------------------------------
-// Gets non-entry text including surrounding whitespace at given position.
-// ---------------------------------------------------------------------------
-//
-TCursorSelection CNcsAifEditor::NonEntryTextAndSpaceAtPos(
-    TUint aPosition ) const
-    {
-    FUNC_LOG;
     TCursorSelection text( TextLength(), 0 );
     for ( TInt ii = iArray.Count() - 1; ii >= 0; --ii )
         {
@@ -1662,6 +1467,37 @@
             }
         }
 
+    // get the selected text to remove whitespace
+    TInt length( text.Length() );    
+    
+    HBufC* selectedText = NULL;
+    TRAPD( err, selectedText = HBufC::NewL( length ) );
+    
+    if( err == KErrNone )
+    	{
+		TPtr ptr = selectedText->Des();
+		Text()->Extract( ptr, text.LowerPos(), length );
+		
+		// trim from end
+		TInt index( length - 1 );
+		
+		while( index >= 0 && IsWhitespace( ptr[index--] ) )
+			{
+			text.iCursorPos--;
+			}
+		
+		// trim from begin
+		index = 0;
+		
+		while( index < length && IsWhitespace( ptr[index++] ) )
+			{
+			text.iAnchorPos++;
+			}
+
+		delete selectedText;
+		selectedText = NULL;
+    	}    
+    	
     return text;
     }
 
@@ -1704,18 +1540,6 @@
     }
 
 // ---------------------------------------------------------------------------
-// Checks whether given character is considered as line delimiter.
-// ---------------------------------------------------------------------------
-//
-//
-TBool CNcsAifEditor::IsDelimiter( TChar aCharacter ) const
-    {
-    FUNC_LOG;
-    return ( aCharacter == TChar( CEditableText::ELineBreak) || 
-             aCharacter == TChar( CEditableText::EParagraphDelimiter) );
-    }
-
-// ---------------------------------------------------------------------------
 // Checks whether given character is considered as whitespace.
 // ---------------------------------------------------------------------------
 //
@@ -1723,8 +1547,8 @@
     {
     FUNC_LOG;
     return ( aCharacter == KCharSpace || 
-             aCharacter == TChar(CEditableText::ELineBreak) || 
-             aCharacter == TChar(CEditableText::EParagraphDelimiter) );
+    		 aCharacter == TChar(CEditableText::ELineBreak) || 
+    		 aCharacter == TChar(CEditableText::EParagraphDelimiter) );
     }
 
 // ---------------------------------------------------------------------------
@@ -1824,68 +1648,61 @@
 
         //adjust touch point to mach editor coordinates
         touchPoint.iX -= Position().iX;
-
-        TInt pointerLineNbr = textLayout->GetLineNumber( 
-            textLayout->XyPosToDocPosL( touchPoint ) );
+        
+        TInt pointerLineNbr = textLayout->GetLineNumber( textLayout->XyPosToDocPosL( touchPoint ));
         TInt cursorLineNbr = textLayout->GetLineNumber( cursorPos );
-
+        
+        
         if ( pointerLineNbr != cursorLineNbr )
             {
             CompleteEntryL();
             
             // We're moving to a new line.
-            CNcsAifEntry* entry = GetEntryAt( CursorPos() );
+            CNcsAifEntry* entry = NULL;
+            entry = GetEntryAt( CursorPos() );
             if ( entry )
                 {
                 SetSelectionL( entry->iCursorPos, entry->iAnchorPos );
                 }
-            }
+            }    
         }
-
+            
     CEikEdwin::HandlePointerEventL( aPointerEvent );
-
-    // Do not allow to insert cursor into the middle of some entry
-    CNcsAifEntry* entry = GetEntryAt( CursorPos() );
-    if ( entry )
-        {
-        SetSelectionL( entry->iCursorPos, entry->iAnchorPos );
-        }
     }
 
 
 // -----------------------------------------------------------------------------
 // CNcsAifEditor::CompleteEntryL()
-// Adds semicolon to the end of the entry.
+// Adds semicolol to the of the entry
 // -----------------------------------------------------------------------------
 //
 void CNcsAifEditor::CompleteEntryL()
     {
     // make sure there is really some text inputted 
-    const TInt cursorPos = CursorPos();
+    TInt cursorPos( CursorPos() );
 
     TCursorSelection selection = NonEntryTextAtPos( cursorPos );
-    const TInt length =  selection.Length();
+
+    TInt length( selection.Length() );
 
-    if ( length > 0 && selection.LowerPos() >= 0 )
+    HBufC* text = HBufC::NewLC( length );
+    TPtr ptr = text->Des();
+
+    if( selection.LowerPos() >= 0 )
         {
-        HBufC* text = HBufC::NewLC( length );
-        TPtr ptr = text->Des();
-
         Text()->Extract( ptr, selection.LowerPos(), length );
         ptr.Trim();
-
+        
         // complete the entry
-        if ( ptr.Length() > 0 )
+        if( ptr.Length() > 0 )
             {
             Text()->InsertL( selection.HigherPos(), KCharAddressDelimeterSemiColon );
             HandleTextChangedL();
-            HandleTextUpdateL( TCursorSelection( selection.LowerPos(),
-                selection.HigherPos() + 1 ) );
+            HandleTextUpdateL( TCursorSelection(selection.LowerPos(), selection.HigherPos() + 1) );
             }
+        }
 
-        CleanupStack::PopAndDestroy( text );
-        }
+    CleanupStack::PopAndDestroy( text );
     }
-
 // End of File