--- /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 <coecntrl.h>
+#include <eikedwin.h>
+#include <frmtlay.h>
+
+#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();
+ }
+
+
+
+
+