diff -r 000000000000 -r eb1f2e154e89 textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutsmiley.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutsmiley.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,337 @@ +/* + * Copyright (c) 2009 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: implementation smiley classes + * + */ + +#include +#include +#include +#include +#include +#include "peninputlayoutsmiley.h" + +//resource file +_LIT( KSmileyMifFile, "z:\\resource\\apps\\smiley.mif" ); +_LIT( KSmileyResFile, "z:\\resource\\smiley.rsc" ); + +//string to calculate smiley width +_LIT( KSmileySizeTemplate, "\xf8e4" ); + +//invisible place holder for smiley character +const TUint16 KSmileyPlaceHolder = 0x3000; +const TInt KDefaultSmileySize = 24; + +// --------------------------------------------------------------------------- +// Symbian Constructor +// --------------------------------------------------------------------------- +// +CPeninputSmileyImage* CPeninputSmileyImage::NewL( TInt aSmileyId, TInt aBitmapId, + TInt aMaskId, const TSize& aImageSize ) + { + CPeninputSmileyImage* self = CPeninputSmileyImage::NewLC( aSmileyId, aBitmapId, + aMaskId, aImageSize ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Symbian Constructor +// --------------------------------------------------------------------------- +// +CPeninputSmileyImage* CPeninputSmileyImage::NewLC( TInt aSmileyId, TInt aBitmapId, + TInt aMaskId, const TSize& aImageSize ) + { + CPeninputSmileyImage* self = new ( ELeave ) CPeninputSmileyImage( aSmileyId, + aBitmapId, aMaskId,aImageSize ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// c++ destructor +// --------------------------------------------------------------------------- +// +CPeninputSmileyImage::~CPeninputSmileyImage() + { + delete iImageBitmap; + delete iMaskBitmap; + } + +// --------------------------------------------------------------------------- +// Create smiley image +// --------------------------------------------------------------------------- +// +void CPeninputSmileyImage::CreateImageL() + { + DestroyImage(); + + TInt maskid = iMaskBitmapId != 0 ? iMaskBitmapId : iImageBitmapId; + + AknIconUtils::CreateIconL( iImageBitmap, iMaskBitmap, + KSmileyMifFile, iImageBitmapId, maskid ); + + AknIconUtils::SetSize( iImageBitmap, iImageSize ); + } + +// --------------------------------------------------------------------------- +// Destroy smiley image +// --------------------------------------------------------------------------- +// +void CPeninputSmileyImage::DestroyImage() + { + if ( iImageBitmap ) + { + delete iImageBitmap; + iImageBitmap = NULL; + } + + if ( iMaskBitmap ) + { + delete iMaskBitmap; + iMaskBitmap = NULL; + } + } + +// --------------------------------------------------------------------------- +// Get image bitmap of smiley +// --------------------------------------------------------------------------- +// +CFbsBitmap* CPeninputSmileyImage::ImageBitmap() + { + return iImageBitmap; + } + +// --------------------------------------------------------------------------- +// Get mask bitmap of smiley +// --------------------------------------------------------------------------- +// +CFbsBitmap* CPeninputSmileyImage::MaskBitmap() + { + return iMaskBitmap; + } + +// --------------------------------------------------------------------------- +// Get smiley id +// --------------------------------------------------------------------------- +// +TInt CPeninputSmileyImage::SmileyId() + { + return iSmileyId; + } + +// --------------------------------------------------------------------------- +// Get smiley size +// --------------------------------------------------------------------------- +// +TSize CPeninputSmileyImage::SmileyImageSize() + { + return iImageSize; + } + +// --------------------------------------------------------------------------- +// Set smiley size +// --------------------------------------------------------------------------- +// +void CPeninputSmileyImage::SetImageSize( const TSize& aSize ) + { + if ( aSize != iImageSize ) + { + iImageSize = aSize; + if ( iImageBitmap ) + { + AknIconUtils::SetSize( iImageBitmap, aSize ); + } + } + } + +// --------------------------------------------------------------------------- +// c++ constructor +// --------------------------------------------------------------------------- +// +CPeninputSmileyImage::CPeninputSmileyImage( TInt aSmileyId, TInt aBitmapId, + TInt aMaskId, const TSize& aImageSize ) + : iSmileyId( aSmileyId ) + , iImageBitmapId( aBitmapId ) + , iMaskBitmapId( aMaskId ) + , iImageSize( aImageSize ) + { + } + + +// --------------------------------------------------------------------------- +// Symbian second-phase constructor +// --------------------------------------------------------------------------- +// +void CPeninputSmileyImage::ConstructL() + { + } + +////////////////////////////////////////////////////////////////////////////// +//CPeninputSmileyManager + +// --------------------------------------------------------------------------- +// Symbian Constructor +// --------------------------------------------------------------------------- +// +CPeninputSmileyManager* CPeninputSmileyManager::NewL() + { + CPeninputSmileyManager* self = CPeninputSmileyManager::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Symbian Constructor +// --------------------------------------------------------------------------- +// +CPeninputSmileyManager* CPeninputSmileyManager::NewLC() + { + CPeninputSmileyManager* self = new ( ELeave ) CPeninputSmileyManager; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// C++ destructor +// --------------------------------------------------------------------------- +// +CPeninputSmileyManager::~CPeninputSmileyManager() + { + iSmileyArray.ResetAndDestroy(); + iSmileyArray.Close(); + + iSmileyHash.Close(); + } + +// --------------------------------------------------------------------------- +// Get smiley object by id +// --------------------------------------------------------------------------- +// +CPeninputSmileyImage* CPeninputSmileyManager::SmileyImage( TInt aSmileyId ) + { + TInt key = aSmileyId; + CPeninputSmileyImage** ptr = iSmileyHash.Find( key ); + if ( ptr ) + { + return *ptr; + } + return NULL; + } + +// --------------------------------------------------------------------------- +// Detech if Specified character is smiley +// --------------------------------------------------------------------------- +// +TBool CPeninputSmileyManager::IsSmileyCode( TUint16 aCharCode ) + { + return ( aCharCode >= 0xf880 && aCharCode <= 0xf8e4 ); + } + +// --------------------------------------------------------------------------- +// Get smiley template +// --------------------------------------------------------------------------- +// +const TDesC& CPeninputSmileyManager::SmileySizeTemplate() + { + return KSmileySizeTemplate; + } + +// --------------------------------------------------------------------------- +// Get invisible character as place holder +// --------------------------------------------------------------------------- +// +TUint16 CPeninputSmileyManager::SmileyPlaceHolderCharacter() + { + return KSmileyPlaceHolder; + } + +// --------------------------------------------------------------------------- +// C++ constructor +// --------------------------------------------------------------------------- +// +CPeninputSmileyManager::CPeninputSmileyManager() + { + } + +// --------------------------------------------------------------------------- +// Symbian second-phase constructor +// --------------------------------------------------------------------------- +// +void CPeninputSmileyManager::ConstructL() + { + TInt id = CCoeEnv::Static()->AddResourceFileL( KSmileyResFile ); + ReadSmileyInfoL( R_SMILEY_ICONS_INFO ); + CCoeEnv::Static()->DeleteResourceFile( id ); + + PreLoadSmileyImageL(); + } + +// --------------------------------------------------------------------------- +// Read smiley info from resource +// --------------------------------------------------------------------------- +// +void CPeninputSmileyManager::ReadSmileyInfoL( TInt aResourceId ) + { + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, aResourceId );//resId + + TInt count = reader.ReadInt16(); + + CPeninputSmileyImage* smiley = NULL; + for ( TInt i = 0; i < count; i++ ) + { + TUint16 animation = reader.ReadUint16(); // read animation + + TUint16 smileyId = reader.ReadUint16(); + + TInt32 bitmapId = reader.ReadInt32(); + TInt32 maskId = reader.ReadInt32(); + TInt32 staticBitmapId = reader.ReadInt32(); + TInt32 staticMaskId = reader.ReadInt32(); + + TPtrC smileycode = reader.ReadTPtrC(); // read string + + TSize size( KDefaultSmileySize, KDefaultSmileySize ); + if ( animation ) + { + smiley = CPeninputSmileyImage::NewL( smileyId, staticBitmapId, + staticMaskId, size ); + } + else + { + smiley = CPeninputSmileyImage::NewL( smileyId, bitmapId, maskId, + size ); + } + iSmileyArray.Append( smiley ); + + iSmileyHash.Insert( smileyId, smiley ); + } + + CleanupStack::PopAndDestroy(); // reader + } + +// --------------------------------------------------------------------------- +// Initalize all smily images +// --------------------------------------------------------------------------- +// +void CPeninputSmileyManager::PreLoadSmileyImageL() + { + for ( TInt i = 0; i < iSmileyArray.Count(); i++ ) + { + iSmileyArray[i]->CreateImageL(); + } + }