textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutsmiley.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Feb 2010 23:09:27 +0200
branchRCL_3
changeset 3 f5a1e66df979
parent 0 eb1f2e154e89
permissions -rw-r--r--
Revision: 201003 Kit: 201007

/*
 * 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 <AknIconUtils.h> 
#include <barsread.h>
#include <coemain.h>
#include <smiley.mbg>
#include <smiley.rsg>
#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();
        }
    }