diff -r 000000000000 -r 2f259fa3e83a uifw/EikStd/coctlsrc/smileymodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/EikStd/coctlsrc/smileymodel.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,392 @@ +/* +* 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 + +#include "smileymanager.h" +#include "smileymodel.h" + +const TText KSpace = ' '; +const TInt KLinkIndexMark = 0x8000; + +// ======== MEMBER FUNCTIONS ======== +// --------------------------------------------------------------------------- +// CSmileyInfo::CSmileyInfo +// --------------------------------------------------------------------------- +// +CSmileyInfo::CSmileyInfo() + { + } + +CSmileyInfo::~CSmileyInfo() + { + iStrArray.Reset(); + iStrArray.Close(); + } + +void CSmileyInfo::Reset() + { + iImageInfo.Reset(); + iStrArray.Reset(); + } + +void CSmileyInfo::SetSmileyText( const TDesC& aText ) + { + TInt startIndex( KErrNotFound ); + for ( TInt i( 0 ); i <= aText.Length(); i++ ) + { + if ( ( i == aText.Length() || aText[i] == KSpace ) && + startIndex != KErrNotFound ) + { + iStrArray.Append( aText.Mid( startIndex, i - startIndex ) ); + startIndex = KErrNotFound; + } + if ( startIndex == KErrNotFound && i < aText.Length() && + aText[i] != KSpace ) + { + startIndex = i; + } + } + } + +// ======== MEMBER FUNCTIONS ======== +// --------------------------------------------------------------------------- +// TImageInfo::TImageInfo +// --------------------------------------------------------------------------- +// +TImageInfo::TImageInfo() : iCode( 0 ), iBmpId( 0 ), iMaskId( 0 ), + iIsAnimation( EFalse ), iStaticBmpId( 0 ), iStaticMaskId( 0 ) + { + } + +void TImageInfo::Reset() + { + iCode = iBmpId = iMaskId = iStaticBmpId = iStaticMaskId = 0; + iIsAnimation = EFalse; + } + +// ======== MEMBER FUNCTIONS ======== +// --------------------------------------------------------------------------- +// CSmileyModel::TLinkToImage::TLinkToImage +// --------------------------------------------------------------------------- +// +CSmileyModel::TLinkToImage::TLinkToImage() : iStrLength( 0 ), + iStrNode( KInvalidIndex ), iImageIndex( KInvalidIndex ) + { + } + +// ======== MEMBER FUNCTIONS ======== +// --------------------------------------------------------------------------- +// CSmileyModel::TStrNode::TStrNode +// --------------------------------------------------------------------------- +// +CSmileyModel::TStrNode::TStrNode() : iCode(0), iSibling( KInvalidIndex ), + iChild( KInvalidIndex ), iParent( KInvalidIndex ) + { + } + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSmileyModel::CSmileyModel +// --------------------------------------------------------------------------- +// +CSmileyModel::CSmileyModel() + { + } + +// --------------------------------------------------------------------------- +// CSmileyModel::~CSmileyModel +// --------------------------------------------------------------------------- +// +CSmileyModel::~CSmileyModel() + { + Reset(); + iStrArray.Close(); + iImageInfoArray.Close(); + iLinkArray.Close(); + delete iFileName; + } + +// --------------------------------------------------------------------------- +// CSmileyModel::Reset +// --------------------------------------------------------------------------- +// +void CSmileyModel::Reset() + { + iStrArray.Reset(); + iStrArray.Compress(); + iImageInfoArray.Reset(); + iImageInfoArray.Compress(); + iLinkArray.Reset(); + iLinkArray.Compress(); + delete iFileName; + iFileName = NULL; + } + +// --------------------------------------------------------------------------- +// CSmileyModel::SetSmileyIconFileL +// --------------------------------------------------------------------------- +// +void CSmileyModel::SetSmileyIconFileL( const TDesC& aIconFileName ) + { + if ( aIconFileName.Length() > 0 ) + { + delete iFileName; + iFileName = NULL; + iFileName = HBufC::NewL( aIconFileName.Length() ); + TPtr ptr( iFileName->Des() ); + ptr.Copy( aIconFileName ); + } + } + +// --------------------------------------------------------------------------- +// CSmileyModel::SupportedCodesL +// --------------------------------------------------------------------------- +// +HBufC* CSmileyModel::SupportedCodesL() + { + HBufC* codes( NULL ); + if ( iImageInfoArray.Count() > 0 ) + { + codes = HBufC::NewL( iImageInfoArray.Count() ); + TPtr ptr( codes->Des() ); + for ( TInt i = 0; i < iImageInfoArray.Count(); i++ ) + { + if ( ptr.Locate( iImageInfoArray[i].iCode ) == KErrNotFound ) + { + ptr.Append( iImageInfoArray[i].iCode ); + } + } + } + return codes; + } + +// --------------------------------------------------------------------------- +// CSmileyModel::GetImageInfo +// --------------------------------------------------------------------------- +// +void CSmileyModel::GetImageInfo( TImageInfo& aImageInfo, HBufC** aFileName ) + { + TInt count( iImageInfoArray.Count() ); + if ( count == 0 ) + { + aFileName = NULL; + aImageInfo.Reset(); + return; + } + for ( TInt i = 0; i < count; i++ ) + { + if ( iImageInfoArray[i].iCode == aImageInfo.iCode ) + { + aImageInfo = iImageInfoArray[i]; + *aFileName = iFileName; + } + } + } + +// --------------------------------------------------------------------------- +// CSmileyModel::AddSimleyL +// --------------------------------------------------------------------------- +// +void CSmileyModel::AddSimleyL( CSmileyInfo& aInfo ) + { + if ( aInfo.iImageInfo.iCode < CSmileyManager::KSmileyCodeMin || + aInfo.iImageInfo.iCode > CSmileyManager::KSmileyCodeMax || + aInfo.iStrArray.Count() == 0 ) + { + return; + } + for ( TInt i = 0; i < aInfo.iStrArray.Count(); i++ ) + { + TInt imageIndex = AddLinkAndImageInfoL( aInfo, i ); + AddStringL( aInfo, imageIndex, i ); + } + } + +// --------------------------------------------------------------------------- +// CSmileyModel::AddLinkAndImageInfoL +// --------------------------------------------------------------------------- +// +TInt CSmileyModel::AddLinkAndImageInfoL( CSmileyInfo& aInfo, TInt aStrIndex ) + { + TLinkToImage link; + for ( TInt i( 0 ); i < iImageInfoArray.Count(); i++ ) + { + if ( iImageInfoArray[i].iCode == aInfo.iImageInfo.iCode ) + { + link.iImageIndex = i; + break; + } + } + if ( link.iImageIndex == KInvalidIndex ) + { + link.iImageIndex = iImageInfoArray.Count(); + iImageInfoArray.Append( aInfo.iImageInfo ); + } + link.iStrLength = aInfo.iStrArray[aStrIndex].Length(); + iLinkArray.Append( link ); + return ( iLinkArray.Count() - 1 ); + } + +// --------------------------------------------------------------------------- +// CSmileyModel::AddStringL +// --------------------------------------------------------------------------- +// +void CSmileyModel::AddStringL( CSmileyInfo& aInfo, TInt aLinkIndex, + TInt aStrIndex ) + { + TInt index( KInvalidIndex ); + for ( TInt i = 0; i < aInfo.iStrArray[aStrIndex].Length(); i++ ) + { + TStrNode str; + str.iCode = aInfo.iStrArray[aStrIndex][i]; + index = AddStrNodeL( index, str ); + } + iStrArray[index].iChild = ( KLinkIndexMark | aLinkIndex ); + iLinkArray[aLinkIndex].iStrNode = index; + } + +// --------------------------------------------------------------------------- +// CSmileyModel::AddStrNodeL +// --------------------------------------------------------------------------- +// +TInt CSmileyModel::AddStrNodeL( TInt aIndex, TStrNode& aNode ) + { + TInt count = iStrArray.Count(); + if ( count > 0 ) + { + TInt child( aIndex == KInvalidIndex ? 0 : + iStrArray[aIndex].iChild ); + if ( child != KInvalidIndex ) + { + TInt index = FindInSibling( child, aNode.iCode ); + if ( index != KInvalidIndex ) + { + return index; + } + iStrArray[child].iSibling = count; + } + else + { + iStrArray[aIndex].iChild = count; + } + } + aNode.iParent = aIndex; + iStrArray.Append( aNode ); + return count; + } + +// --------------------------------------------------------------------------- +// CSmileyModel::FindInSibling +// --------------------------------------------------------------------------- +// +TInt CSmileyModel::FindInSibling( TInt& aIndex, TText aCode ) + { + TInt ret( KInvalidIndex ); + if ( iStrArray.Count() > 0 ) + { + TInt index( aIndex == KInvalidIndex ? 0 : aIndex ); + while ( index != KInvalidIndex ) + { + if ( iStrArray[index].iCode == aCode ) + { + ret = index; + break; + } + aIndex = index; + index = iStrArray[index].iSibling; + } + } + return ret; + } + +// --------------------------------------------------------------------------- +// CSmileyModel::FindInSibling +// --------------------------------------------------------------------------- +// +TBool CSmileyModel::IsFinalNode( TInt aIndex ) + { + return ( aIndex != KInvalidIndex && + ( iStrArray[aIndex].iChild & KLinkIndexMark ) != 0 ); + } + +// --------------------------------------------------------------------------- +// CSmileyModel::FindMatchStr +// --------------------------------------------------------------------------- +// +TInt CSmileyModel::TryFindMatchNode( const TDesC& aText, TInt aTextPos ) + { + TInt index( 0 ); + index = FindInSibling( index, aText[aTextPos] ); + TInt textPos( aTextPos + 1 ); + while ( index != KInvalidIndex && !IsFinalNode( index ) && + textPos < aText.Length() ) + { + index = iStrArray[index].iChild; + index = FindInSibling( index, aText[textPos] ); + if ( index != KInvalidIndex ) + { + textPos++; + } + } + return index; + } + +// --------------------------------------------------------------------------- +// CSmileyModel::SmileyStringLength +// --------------------------------------------------------------------------- +// +TInt CSmileyModel::SmileyStringLength( TInt aNodeIndex ) + { + if ( IsFinalNode( aNodeIndex ) ) + { + TInt linkIndex( iStrArray[aNodeIndex].iChild & ~KLinkIndexMark ); + return iLinkArray[linkIndex].iStrLength; + } + return 0; + } + +// --------------------------------------------------------------------------- +// CSmileyModel::SmileyCode +// --------------------------------------------------------------------------- +// +TText CSmileyModel::SmileyCode( TInt aNodeIndex ) + { + TInt linkIndex( iStrArray[aNodeIndex].iChild & ~KLinkIndexMark ); + TInt imageIndex( iLinkArray[linkIndex].iImageIndex ); + return iImageInfoArray[imageIndex].iCode; + } + +// --------------------------------------------------------------------------- +// CSmileyModel::ReplaceTextWithCodes +// --------------------------------------------------------------------------- +// +void CSmileyModel::ReplaceTextWithCodes( TDes& aText, TInt aDocPos, + TInt aNodeIndex ) + { + TInt linkIndex( iStrArray[aNodeIndex].iChild & ~KLinkIndexMark ); + TInt len( iLinkArray[linkIndex].iStrLength ); + TInt imageIndex( iLinkArray[linkIndex].iImageIndex ); + aText[aDocPos] = iImageInfoArray[imageIndex].iCode; + aText[aDocPos + 1] = CSmileyManager::KCompensateChar; + const TInt KThirdIndex = 2; + for ( TInt i( KThirdIndex ); i < len; i++ ) + { + aText[i + aDocPos] = CSmileyManager::KPlaceHolder; + } + }