emailuis/emailui/src/ncsaifeditor.cpp
changeset 1 12c456ceeff2
parent 0 8466d47a6819
child 4 e7aa27f58ae1
--- a/emailuis/emailui/src/ncsaifeditor.cpp	Thu Dec 17 08:39:21 2009 +0200
+++ b/emailuis/emailui/src/ncsaifeditor.cpp	Thu Jan 07 12:38:38 2010 +0200
@@ -219,8 +219,8 @@
 // ---------------------------------------------------------------------------
 //
 CNcsAifEditor::CNcsAifEditor(
-    MNcsFieldSizeObserver* aSizeObserver ) 
-    : CNcsEditor( aSizeObserver, ETrue, ENcsEditorAddress ), iAddressPopupList( NULL ),
+    MNcsFieldSizeObserver* aSizeObserver, const TDesC& aCaptionText ) 
+    : CNcsEditor( aSizeObserver, ETrue, ENcsEditorAddress, aCaptionText ), iAddressPopupList( NULL ),
     iAddLeftover( ETrue )
     {
     FUNC_LOG;
@@ -346,7 +346,7 @@
             
             CleanupStack::PopAndDestroy( text );            
         	}
-        
+        iTextSelection = Selection();        
         ret = CNcsEditor::OfferKeyEventL( aKeyEvent, aType );
         }
     return ret;
@@ -375,6 +375,7 @@
         }
     else if ( aEventType == MEikEdwinObserver::EEventNavigation )
         {
+        iTextSelection = Selection();
         HandleNavigationEventL();
         }
     }
@@ -396,31 +397,7 @@
     // move the cursor for us.  Then we check if it's in an entry.
     if ( aKeyEvent.iCode == EKeyUpArrow || aKeyEvent.iCode == EKeyDownArrow )
         {
-    	// make sure there is really some text inputted 
-        TInt cursorPos( CursorPos() );
-    	
-        TCursorSelection selection = NonEntryTextAtPos( cursorPos );
-        
-        TInt length( selection.Length() );
-        
-        HBufC* text = HBufC::NewLC( length );
-        TPtr ptr = text->Des();
-        
-        if( selection.LowerPos() >= 0 )
-        	{
-			Text()->Extract( ptr, selection.LowerPos(), length );
-			ptr.Trim();
-			
-			// complete the entry
-			if( ptr.Length() > 0 )
-				{
-				Text()->InsertL( selection.HigherPos(), KCharAddressDelimeterSemiColon );
-				HandleTextChangedL();
-				HandleTextUpdateL( TCursorSelection(selection.LowerPos(), selection.HigherPos() + 1) );
-				}
-        	}
-		
-		CleanupStack::PopAndDestroy( text );
+        CompleteEntryL();
 		
         response = CNcsEditor::OfferKeyEventL( aKeyEvent,aType );
         if ( response == EKeyWasConsumed ) 
@@ -1063,8 +1040,9 @@
         {
         TInt matchesInText;
         TInt matchesInArray;
-        TInt arrayItemCurPos( iArray[i]->LowerPos() );
-        
+        TInt arrayItemLowPos( iArray[i]->LowerPos() );
+        TInt arrayItemHighPos( iArray[i]->HigherPos());
+
         GetMatchingEntryCountsL( iArray[i], matchesInText, matchesInArray );
 
         // Entry is removed if:
@@ -1074,13 +1052,18 @@
         // In b) case the correct duplicate is the one that is in current
         // cursor position (or one off due to possible whitespace).
         if ( 0 == matchesInText ||
-             ( matchesInText < matchesInArray &&
-               ( currentCursorPos == arrayItemCurPos || 
-                 (1 + currentCursorPos) == arrayItemCurPos ) ) )
+             ( matchesInText < matchesInArray ) &&
+               ( currentCursorPos >= arrayItemLowPos && 
+                 currentCursorPos <= arrayItemHighPos )) 
             {
             delete iArray[i];
             iArray.Remove(i);
             removedEntryIndex = i;
+            if ( iTextSelection.iAnchorPos != iTextSelection.iCursorPos &&
+                 iTextSelection.HigherPos() < arrayItemHighPos )
+                {
+                iPartialRemove = ETrue;
+                }
             }
         }
     
@@ -1270,16 +1253,19 @@
     const TInt entryCount = iArray.Count();
     for ( TInt ii = entryCount - 1; ii >= 0; --ii )
         {
-        TBool duplicateFound = EFalse;
-        for ( TInt jj = ii - 1; jj >= 0; --jj )
+        if ( ii > 0 )
             {
-            if ( iArray[ii]->IsSameDN( *iArray[jj] ) )
+            TBool duplicateFound = EFalse;
+            for ( TInt jj = ii - 1; jj >= 0; --jj )
                 {
-                duplicateFound = ETrue;
-                iArray[jj]->SetDupL( ETrue );
+                if ( iArray[ii]->IsSameDN( *iArray[jj] ) )
+                    {
+                    duplicateFound = ETrue;
+                    iArray[jj]->SetDupL( ETrue );
+                    }
                 }
+            iArray[ii]->SetDupL( duplicateFound );
             }
-        iArray[ii]->SetDupL( duplicateFound );
         }
     }
 
@@ -1332,9 +1318,13 @@
         
         // add line feed after new entry
         TInt cursorPos( CursorPos() );
-        Text()->InsertL( cursorPos, TChar(CEditableText::ELineBreak) );
+        if ( !iPartialRemove )
+            {
+            Text()->InsertL( cursorPos, TChar(CEditableText::ELineBreak) );
+            }
         HandleTextChangedL();
-    	SetCursorPosL( cursorPos + 1, EFalse );
+        SetCursorPosL( cursorPos + 1, EFalse );
+        iPartialRemove = EFalse;
         }
     else
         {
@@ -1604,5 +1594,78 @@
         }
     }
 
+// -----------------------------------------------------------------------------
+// CNcsAifEditor::HandlePointerEventL()
+// Handles pointer events
+// -----------------------------------------------------------------------------
+//
+void CNcsAifEditor::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+    FUNC_LOG;
+    
+    if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
+        {
+        CTextLayout* textLayout = TextLayout();
+        TInt cursorPos = CursorPos();
+        TPoint touchPoint( aPointerEvent.iPosition );
+
+        //adjust touch point to mach editor coordinates
+        touchPoint.iX -= Position().iX;
+        
+        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 = NULL;
+            entry = GetEntryAt( CursorPos() );
+            if ( entry )
+                {
+                SetSelectionL( entry->iCursorPos, entry->iAnchorPos );
+                }
+            }    
+        }
+            
+    CEikEdwin::HandlePointerEventL( aPointerEvent );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CNcsAifEditor::CompleteEntryL()
+// Adds semicolol to the of the entry
+// -----------------------------------------------------------------------------
+//
+void CNcsAifEditor::CompleteEntryL()
+    {
+    // make sure there is really some text inputted 
+    TInt cursorPos( CursorPos() );
+
+    TCursorSelection selection = NonEntryTextAtPos( cursorPos );
+
+    TInt length( selection.Length() );
+
+    HBufC* text = HBufC::NewLC( length );
+    TPtr ptr = text->Des();
+
+    if( selection.LowerPos() >= 0 )
+        {
+        Text()->Extract( ptr, selection.LowerPos(), length );
+        ptr.Trim();
+        
+        // complete the entry
+        if( ptr.Length() > 0 )
+            {
+            Text()->InsertL( selection.HigherPos(), KCharAddressDelimeterSemiColon );
+            HandleTextChangedL();
+            HandleTextUpdateL( TCursorSelection(selection.LowerPos(), selection.HigherPos() + 1) );
+            }
+        }
+
+    CleanupStack::PopAndDestroy( text );
+    }
 // End of File