uifw/EikStd/coctlsrc/smileyiconrecord.cpp
changeset 0 2f259fa3e83a
child 38 c52421ed5f07
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/coctlsrc/smileyiconrecord.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,270 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  smiely engine class
+*
+*/
+
+#include "smileymanager.h"
+#include "smileyiconrecord.h"
+#include "smileyimagedata.h"
+
+// ======== MEMBER FUNCTIONS ========
+// ---------------------------------------------------------------------------
+// CSmileyIcon::CSmileyIcon
+// ---------------------------------------------------------------------------
+//
+CSmileyIcon::CSmileyIcon( TText aCode ) : iCode( aCode )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIcon::~CSmileyIcon
+// ---------------------------------------------------------------------------
+//
+CSmileyIcon::~CSmileyIcon()
+    {
+    if ( iImage )
+        {
+        iImage->RemoveFromRefArray( this );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIcon::SetSmileyString
+// ---------------------------------------------------------------------------
+//
+void CSmileyIcon::SetSmileyString( const TDesC& aString )
+    { 
+    TInt strLength( aString.Length() );
+    if ( strLength > CSmileyManager::KMaxLength )
+        {
+        strLength = CSmileyManager::KMaxLength;
+        }
+    iStr.Copy( aString.Mid( 0, strLength ) ); 
+    };
+
+// ======== MEMBER FUNCTIONS ========
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::CSmileyIconRecord
+// ---------------------------------------------------------------------------
+//
+CSmileyIconRecord::CSmileyIconRecord()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::~CSmileyIconRecord
+// ---------------------------------------------------------------------------
+//
+CSmileyIconRecord::~CSmileyIconRecord()
+    {
+    iIconArray.ResetAndDestroy();
+    iIconArray.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::InsertIcon
+// ---------------------------------------------------------------------------
+//
+void CSmileyIconRecord::InsertIconL( CSmileyIcon* aIcon )
+    {
+    if ( !aIcon )
+        {
+        return;
+        }
+    TInt index( 0 );
+    for ( ; index < iIconArray.Count(); index++ )
+        {
+        if ( iIconArray[index]->DocPos() >= aIcon->DocPos() )
+            {
+            break;
+            }
+        }
+    InsertIconAtL( aIcon, index );
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::HandleTextDelete
+// ---------------------------------------------------------------------------
+//
+void CSmileyIconRecord::HandleTextDelete( TInt aStart, TInt aLength )
+    {
+    DeleteIconsIn( aStart, aLength );
+    TInt index( FirstIndexAfter( aStart ) );
+    for ( ; index != KErrNotFound && index < iIconArray.Count(); index++ )
+        {
+        TInt newPos( iIconArray[index]->DocPos() - aLength );
+        iIconArray[index]->SetDocPos( newPos );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::HandleTextDelete
+// ---------------------------------------------------------------------------
+//
+void CSmileyIconRecord::HandleTextInsert( TInt aStart, TInt aLength )
+    {
+    TInt index( FirstIndexAfter( aStart ) );
+    for ( ; index != KErrNotFound && index < iIconArray.Count(); index++ )
+        {
+        TInt newPos( iIconArray[index]->DocPos() + aLength );
+        iIconArray[index]->SetDocPos( newPos );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::SmileyRange
+// ---------------------------------------------------------------------------
+//
+CSmileyIcon* CSmileyIconRecord::SmileyIconAtPos( TInt aDocPos )
+    {
+    TInt count( iIconArray.Count() );
+    for ( TInt i( 0 ); i < iIconArray.Count(); i++ )
+        {
+        CSmileyIcon* icon( iIconArray[i] );
+        if ( iIconArray[i]->DocPos() <= aDocPos && 
+            iIconArray[i]->DocPos() + iIconArray[i]->SmileyLength() > aDocPos )
+            {
+            return iIconArray[i];
+            }
+        }
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::SmileyRange
+// ---------------------------------------------------------------------------
+//
+void CSmileyIconRecord::CancelSelection()
+    {
+    for ( TInt i( 0 ); i < iIconArray.Count(); i++ )
+        {
+        iIconArray[i]->EnableHighlight( EFalse );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::SmileyRange
+// ---------------------------------------------------------------------------
+//
+void CSmileyIconRecord::SetSelection( TInt aStart, TInt aLength )
+    {
+    TInt firstIndex( FirstIndexIn( aStart, aLength ) );
+    TInt lastIndex( LastIndexIn( aStart, aLength, firstIndex ) );
+    for ( TInt i( firstIndex ); i != KErrNotFound && i <= lastIndex; i++ )
+        {
+        iIconArray[i]->EnableHighlight( ETrue );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::HasSmileyIcon
+// ---------------------------------------------------------------------------
+//
+TBool CSmileyIconRecord::HasSmileyIcon()
+    {
+    return ( iIconArray.Count() > 0 );
+    }
+
+//-------------------Private member function----------------------------------
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::InsertIconAtL
+// ---------------------------------------------------------------------------
+//
+void CSmileyIconRecord::InsertIconAtL( CSmileyIcon* aIcon, TInt aIndex )
+    {
+    TInt index( aIndex < 0 ? 0 : aIndex );
+    if ( index >= iIconArray.Count() )
+        {
+        iIconArray.AppendL( aIcon );
+        }
+    else
+        {
+        iIconArray.InsertL( aIcon, index );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::DeleteIconsIn
+// ---------------------------------------------------------------------------
+//
+void CSmileyIconRecord::DeleteIconsIn( TInt aStart, TInt aLength )
+    {
+    TInt startIndex( FirstIndexIn( aStart, aLength ) );
+    TInt endIndex( LastIndexIn( aStart, aLength, startIndex ) );
+    TInt count( endIndex - startIndex );
+    for ( TInt i( 0 ); startIndex != KErrNotFound && i <= count; i++ )
+        {
+        CSmileyIcon* icon( iIconArray[startIndex] );
+        iIconArray.Remove( startIndex );
+        delete icon;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::InsertIconAtL
+// ---------------------------------------------------------------------------
+//
+TInt CSmileyIconRecord::FirstIndexAfter( TInt aDocPos, TInt aSearchStart )
+    {
+    TInt i = ( aSearchStart < 0 || aSearchStart >= iIconArray.Count() ? 0 : 
+        aSearchStart );
+    for ( ; i < iIconArray.Count(); i++ )
+        {
+        if ( iIconArray[i]->DocPos() >= aDocPos )
+            {
+            return i;            
+            }
+        }
+    return KErrNotFound;
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::InsertIconAtL
+// ---------------------------------------------------------------------------
+//
+TInt CSmileyIconRecord::FirstIndexIn( TInt aStart, TInt aLength )
+    {
+    for ( TInt i( 0 ); i < iIconArray.Count(); i++ )
+        {
+        if ( iIconArray[i]->DocPos() < aStart + aLength && 
+            iIconArray[i]->EndPos() > aStart )
+            {
+            return i;
+            }
+        }
+    return KErrNotFound;
+    }
+
+// ---------------------------------------------------------------------------
+// CSmileyIconRecord::InsertIconAtL
+// ---------------------------------------------------------------------------
+//
+TInt CSmileyIconRecord::LastIndexIn( TInt aStart, TInt aLength, 
+    TInt aFirstIndex )
+    {
+    TInt index( FirstIndexAfter( aStart + aLength, aFirstIndex ) );
+    if ( index == KErrNotFound )
+        {
+        return iIconArray.Count() > 0 ? iIconArray.Count() - 1 : index;
+        }
+    if ( index > 0 )
+        {
+        return index - 1;
+        }
+    return aFirstIndex;
+    }
+
+
+