diff -r 000000000000 -r 2f259fa3e83a uifw/EikStd/coctlsrc/smileymanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/EikStd/coctlsrc/smileymanager.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,366 @@ +/* +* 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 +#include + +#include "smileymodel.h" +#include "smileyinforeader.h" +#include "smileydrawer.h" +#include "smileyimagedata.h" +#include "smileymanager.h" +#include "smileyiconrecord.h" + +// ======== MEMBER FUNCTIONS ======== +// --------------------------------------------------------------------------- +// CSmileyManager::NewL +// --------------------------------------------------------------------------- +// +CSmileyManager* CSmileyManager::NewL( CEikEdwin& aEdwin ) + { + CSmileyManager* self = CSmileyManager::NewLC( aEdwin ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSmileyManager::NewLC +// --------------------------------------------------------------------------- +// +CSmileyManager* CSmileyManager::NewLC( CEikEdwin& aEdwin ) + { + CSmileyManager* self( new( ELeave ) CSmileyManager ); + CleanupStack::PushL( self ); + self->ConstructL( aEdwin ); + return self; + } + +// --------------------------------------------------------------------------- +// destructor +// --------------------------------------------------------------------------- +// +CSmileyManager::~CSmileyManager() + { + delete iDrawer; + delete iReader; + delete iModel; + delete iIconRecord; + } + +// --------------------------------------------------------------------------- +// CSmileyManager::ConvertSmileyStrings +// --------------------------------------------------------------------------- +// +TBool CSmileyManager::ConvertTextForSmileyL( TInt aStart, TDes& aText, + TBool aStringToCodes ) + { + TBool ret( EFalse ); + if ( aStringToCodes ) + { + ret = ConvertTextToCodesL( aText, aStart ); + } + else if ( iIconRecord->HasSmileyIcon() ) + { + ret = ConvertCodesToTextL( aText, aStart ); + } + return ret; + } + +// --------------------------------------------------------------------------- +// CSmileyManager::ConvertCodesToTextL +// --------------------------------------------------------------------------- +// +TBool CSmileyManager::ConvertCodesToTextL( TDes& aText, TInt aStart ) + { + TBool ret( EFalse ); + for ( TInt i( 0 ); i < aText.Length(); i++ ) + { + if ( IsSmileyCode( aText[i] ) ) + { + ret = ETrue; + CSmileyIcon* icon( iIconRecord->SmileyIconAtPos( i + aStart ) ); + if ( icon ) + { + const TDesC& smileyText( icon->SmileyString() ); + aText.Replace( i, smileyText.Length(), smileyText ); + } + } + } + return ret; + } + +TBool CSmileyManager::ConvertTextToCodesL( TDes& aText, TInt aStart ) + { + TBool ret( EFalse ); + TInt i( 0 ); + while ( i < aText.Length() ) + { + TInt index( iModel->TryFindMatchNode( aText, i ) ); + if ( iModel->IsFinalNode( index ) ) + { + TInt smileyLength( iModel->SmileyStringLength( index ) ); + TInt docPos( aStart + i ); + CSmileyIcon* icon( iIconRecord->SmileyIconAtPos( docPos ) ); + if ( !icon || ( icon && !icon->IsDisabled() ) ) + { + if ( !icon ) + { + TText smileyCode( iModel->SmileyCode( index ) ); + AddSmileyToRecordL( aText.Mid( i, smileyLength ), docPos, + smileyCode ); + } + iModel->ReplaceTextWithCodes( aText, i, index ); + ret = ETrue; + } + i += smileyLength; + } + else + { + i++; + } + } + return ret; + } + +void CSmileyManager::AddSmileyToRecordL( const TDesC& aSmileyText, TInt aDocPos, + TText aCode ) + { + CSmileyIcon* icon( new( ELeave ) CSmileyIcon( aCode ) ); + icon->SetDocPos( aDocPos ); + icon->SetSmileyString( aSmileyText ); + iIconRecord->InsertIconL( icon ); + } + +// --------------------------------------------------------------------------- +// CSmileyManager::SetHighlightColor +// --------------------------------------------------------------------------- +// +void CSmileyManager::SetHighlightColor( TRgb aColor ) + { + iDrawer->SetHighlightColor( aColor ); + } + +// --------------------------------------------------------------------------- +// CSmileyManager::SetAnimationPlayTimes +// --------------------------------------------------------------------------- +// +void CSmileyManager::SetAnimationPlayTimes( TInt aPlayTimes ) + { + iDrawer->SetPlayTimes( aPlayTimes ); + } + +// --------------------------------------------------------------------------- +// CSmileyManager::DrawIcon +// --------------------------------------------------------------------------- +// +void CSmileyManager::DrawIconL( CBitmapContext& aGc, const TRect& aRect, + TInt aDocPos ) + { + CSmileyIcon* icon( iIconRecord->SmileyIconAtPos( aDocPos ) ); + if ( icon && !icon->IsDisabled() ) + { + icon->SetRect( aRect ); + CSmileyImageData* image( icon->ImageData() ); + if ( image && aRect.Size() != image->BitmapSize() ) + { + image->SetBitmapSize( aRect.Size() ); + if ( icon->IsPlayFinished() ) + { + icon->PlayOneTime(); + iDrawer->CreateImageL( image ); + } + } + else if ( !image ) + { + iDrawer->CreateImageByIconL( icon ); + } + iDrawer->DrawImageByIconL( aGc, icon ); + } + } + +// --------------------------------------------------------------------------- +// CSmileyManager::IsSmileyCode +// --------------------------------------------------------------------------- +// +TBool CSmileyManager::IsSmileyCode( TText aCode ) + { + return ( aCode >= KSmileyCodeMin && aCode <= KSmileyCodeMax ); + } + +// --------------------------------------------------------------------------- +// CSmileyManager::HandleDeleteL +// --------------------------------------------------------------------------- +// +void CSmileyManager::HandleDeleteL( TInt aStart, TInt aLength ) + { + iIconRecord->HandleTextDelete( aStart, aLength ); + } + +// --------------------------------------------------------------------------- +// CSmileyManager::HandleInsertL +// --------------------------------------------------------------------------- +// +void CSmileyManager::HandleInsertL( TInt aStart, TInt aLength ) + { + if ( aLength > 0 ) + { + iIconRecord->HandleTextInsert( aStart, aLength ); + } + } + +// --------------------------------------------------------------------------- +// CSmileyManager::HandleSetCursorL +// --------------------------------------------------------------------------- +// +void CSmileyManager::HandleSetCursor( TInt aOldCursor, TInt& aNewCursor ) + { + CSmileyIcon* icon( iIconRecord->SmileyIconAtPos( aNewCursor ) ); + if ( icon && !icon->IsDisabled() && aNewCursor != icon->DocPos() ) + { + if ( aOldCursor <= aNewCursor ) + { + aNewCursor = icon->EndPos(); + } + else + { + aNewCursor = icon->DocPos(); + } + } + } + +// --------------------------------------------------------------------------- +// CSmileyManager::HandleSelectionL +// --------------------------------------------------------------------------- +// +void CSmileyManager::HandleSelection( TInt aStart, TInt aLength ) + { + iIconRecord->CancelSelection(); + iIconRecord->SetSelection( aStart, aLength ); + iSelStart = aStart; + iSelLength = aLength; + } + +// --------------------------------------------------------------------------- +// CSmileyManager::SmileyCodeByPos +// --------------------------------------------------------------------------- +// +TText CSmileyManager::SmileyCodeByPos( TInt aDocPos ) + { + CSmileyIcon* icon( iIconRecord->SmileyIconAtPos( aDocPos ) ); + if ( icon ) + { + return icon->Code(); + } + return 0; + } + +// --------------------------------------------------------------------------- +// CSmileyManager::SetVisibleRange +// --------------------------------------------------------------------------- +// +void CSmileyManager::SetVisibleRange( TInt aDocPos, TInt aLength ) + { + iDrawer->SetVisibleRange( aDocPos, aLength ); + } + +// --------------------------------------------------------------------------- +// CSmileyManager::TextBlockLength +// --------------------------------------------------------------------------- +// +TInt CSmileyManager::SmileyLength( TInt aDocPos ) + { + CSmileyIcon* icon( iIconRecord->SmileyIconAtPos( aDocPos ) ); + if ( icon ) + { + return icon->SmileyLength(); + } + return 0; + } + +// --------------------------------------------------------------------------- +// CSmileyManager::TotalTextLength +// --------------------------------------------------------------------------- +// +TBool CSmileyManager::HasSmileyIconsInText() + { + return iIconRecord->HasSmileyIcon(); + } + +// --------------------------------------------------------------------------- +// CSmileyManager::RemoveIconsInRange +// --------------------------------------------------------------------------- +// +void CSmileyManager::RemoveIconsInRange( TInt aStart, TInt aLength ) + { + iIconRecord->HandleTextDelete( aStart, aLength ); + } + +// --------------------------------------------------------------------------- +// CSmileyManager::DisableSmileyIcon +// --------------------------------------------------------------------------- +// +void CSmileyManager::DisableSmileyIcon( TInt aDocPos ) + { + CSmileyIcon* icon( iIconRecord->SmileyIconAtPos( aDocPos ) ); + if ( icon ) + { + icon->DisableIcon(); + } + } + +// --------------------------------------------------------------------------- +// CSmileyManager::IsDisabledSmileyIcon +// --------------------------------------------------------------------------- +// +TBool CSmileyManager::IsDisabledSmileyIcon( TInt aDocPos ) + { + CSmileyIcon* icon( iIconRecord->SmileyIconAtPos( aDocPos ) ); + if ( icon ) + { + return icon->IsDisabled(); + } + return EFalse; + } + +// ================= Private member functions ====================== +// --------------------------------------------------------------------------- +// CSmileyManager::CSmileyManager +// c++ default constructor +// --------------------------------------------------------------------------- +// +CSmileyManager::CSmileyManager() + { + } + +// --------------------------------------------------------------------------- +// second phase constructor +// --------------------------------------------------------------------------- +// +void CSmileyManager::ConstructL( CEikEdwin& aEdwin ) + { + iIconRecord = new( ELeave ) CSmileyIconRecord; + iModel = new( ELeave ) CSmileyModel; + iReader = new( ELeave ) CSmileyInfoReader( *iModel ); + iDrawer = new( ELeave ) CSmileyDrawer( *iModel, aEdwin ); + iReader->LoadSmileysFromResourceL(); + } + + + + +