diff -r c8fb4cf7b3ae -r 5e18d8c489d6 textinput/peninputfingerhwrar/src/peninputfingerhwrarnumsymboltable.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputfingerhwrar/src/peninputfingerhwrarnumsymboltable.cpp Tue May 25 13:03:44 2010 +0300 @@ -0,0 +1,645 @@ +/* +* Copyright (c) 2009-2010 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 of symbol table. +* +*/ + + +// INCLUDE +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "hbufcarrayar.h" +#include "peninputfingerhwrarevent.h" +#include "peninputfingerhwrarcontrolid.h" +#include "peninputfingerhwrarstoreconstants.h" +#include "peninputlayoutvkb.h" +#include "peninputfingerhwrarnumsymboltable.h" + + +// --------------------------------------------------------------------------- +// Symbian Constructor +// --------------------------------------------------------------------------- +// +CPeninputArabicFingerHwrNumSymbolTable* CPeninputArabicFingerHwrNumSymbolTable::NewL( + CFepUiLayout* aUiLayout, TInt aId ) + { + CPeninputArabicFingerHwrNumSymbolTable* self = CPeninputArabicFingerHwrNumSymbolTable::NewLC( + aUiLayout, aId ); + + CleanupStack::Pop( self ); // self; + return self; + } + +// --------------------------------------------------------------------------- +// Symbian Constructor +// --------------------------------------------------------------------------- +// +CPeninputArabicFingerHwrNumSymbolTable* CPeninputArabicFingerHwrNumSymbolTable::NewLC( + CFepUiLayout* aUiLayout, TInt aId ) + { + CPeninputArabicFingerHwrNumSymbolTable* self = new (ELeave) CPeninputArabicFingerHwrNumSymbolTable( + aUiLayout, aId ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// C++ constructor. +// --------------------------------------------------------------------------- +// +CPeninputArabicFingerHwrNumSymbolTable::CPeninputArabicFingerHwrNumSymbolTable( + CFepUiLayout* aFepUiLayout, TInt aControlId ) + : CControlGroup( aFepUiLayout, aControlId ),iIsNativeNumMode(EFalse) + { + SetControlType(ECtrlControlGroup|ECtrlTactileFeedback); + SetTactileFeedbackType(ETouchFeedbackSensitiveInput); + } + +// --------------------------------------------------------------------------- +// c++ destructor +// --------------------------------------------------------------------------- +// +CPeninputArabicFingerHwrNumSymbolTable::~CPeninputArabicFingerHwrNumSymbolTable() + { + } + +// --------------------------------------------------------------------------- +// popup the list. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::OpenSymbolTable() + { + CapturePointer( ETrue ); + iPopupVisible = ETrue; + iCurrentNumSCTType = ENumSCTLatin; + UiLayout()->LockArea(UiLayout()->Rect(),this); + UpdateNumSymbolTable(ENumSCTLatin); + } + +// --------------------------------------------------------------------------- +// cancel the popup. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::CloseSymbolTable() + { + CapturePointer( EFalse ); + iPopupVisible = EFalse; + UiLayout()->UnLockArea(UiLayout()->Rect(),this); + } + +// --------------------------------------------------------------------------- +// get visibility of popup. +// --------------------------------------------------------------------------- +// +TBool CPeninputArabicFingerHwrNumSymbolTable::IsPopup() + { + return iPopupVisible; + } + +// --------------------------------------------------------------------------- +// Handle pointer down event. +// --------------------------------------------------------------------------- +// +CFepUiBaseCtrl* CPeninputArabicFingerHwrNumSymbolTable::HandlePointerDownEventL( + const TPoint& aPoint ) + { + CancelPointerDownL(); + CFepUiBaseCtrl* ctrl = CControlGroup::HandlePointerDownEventL( aPoint ); + + if(!ctrl) + { + ReportEvent(EHwrEventOutsideEvent); + } + else + { + #ifdef RD_TACTILE_FEEDBACK + if (UiLayout()->SupportTactileFeedback()) + { + UiLayout()->DoTactileFeedback(ETouchFeedbackSensitiveInput); + } + #endif //RD_TACTILE_FEEDBACK + ctrl->UpdateArea(ctrl->Rect(),EFalse); + } + + return ctrl; + } + +// --------------------------------------------------------------------------- +// Handle pointer up event. +// --------------------------------------------------------------------------- +// +CFepUiBaseCtrl* CPeninputArabicFingerHwrNumSymbolTable::HandlePointerUpEventL( + const TPoint& aPoint ) + { + CFepUiBaseCtrl* ctrl = CControlGroup::HandlePointerUpEventL( aPoint ); + + if(ctrl) + { + ctrl->UpdateArea(ctrl->Rect(),EFalse); + } + + return ctrl; + } + +// --------------------------------------------------------------------------- +// Handle pointer move event. +// --------------------------------------------------------------------------- +// +CFepUiBaseCtrl* CPeninputArabicFingerHwrNumSymbolTable::HandlePointerMoveEventL( + const TPoint& aPoint ) + { + CFepUiBaseCtrl* ctrl = CControlGroup::HandlePointerMoveEventL( aPoint ); + if(ctrl) + { + HandlePointerEnter(aPoint); + ctrl->UpdateArea(ctrl->Rect(),EFalse); + } + else + { + HandlePointerLeave(aPoint); + UpdateArea(iRect,EFalse); + } + + return ctrl; + } + +// --------------------------------------------------------------------------- +// Symbian second-phase constructor. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::ConstructL() + { + BaseConstructL(); + + // disable border + SetBorderSize( TSize(0,0) ); + + // construct virtual keypad + CreateVirtualKeypadL(); + } + +// --------------------------------------------------------------------------- +// SizeChanged +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::SizeChanged( + const TRect aVirtualKeypadRect, const RArray /*aBtnRects*/, + const TInt /*aKeypadRow*/, const TInt /*aKeypadCol*/, TBool aIsLandscape) + { + iIsLandscape = aIsLandscape; + + // relayout the virtual key pad + iNumKeypad->SetRect(aVirtualKeypadRect); + + } + +// --------------------------------------------------------------------------- +// create symbol table keypad. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::CreateVirtualKeypadL() + { + TFontSpec spec; + + iNumKeypad = CVirtualKeyboard::NewL( + TRect(0,0,0,0), + UiLayout(), + EHwrCtrlIdNumSymbolTableVkb, + spec ); + + AddControlL( iNumKeypad ); + iNumKeypad->AddEventObserver( UiLayout() ); + + iNumKeypad->SetKeySkinId( EKeyBmpNormal, KAknsIIDQsnFrKeypadButtonFrNormal ); + iNumKeypad->SetKeySkinId( EKeyBmpHighlight, KAknsIIDQsnFrKeypadButtonFrPressed ); + iNumKeypad->SetKeySkinId( EKeyBmpDim, KAknsIIDQsnFrKeypadButtonFrInactive ); + iNumKeypad->SetResourceId( KInvalidResId ); + + iNumKeypad->SetKeyTextColorGroup( EAknsCIQsnTextColorsCG68 ); + iNumKeypad->SetDrawOpaqueBackground( EFalse ); + } + +void CPeninputArabicFingerHwrNumSymbolTable::OnActivate() + { + CControlGroup::OnActivate(); + } + +// --------------------------------------------------------------------------- +// Read control's background info. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::ConstructFromResourceL() + { + if ( iResourceId == KInvalidResId ) + { + User::Leave( KErrArgument ); + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, iResourceId ); + + const TInt32 bgImageResId = reader.ReadInt32(); + LoadBackgroundFromResourceL(bgImageResId); + + CleanupStack::PopAndDestroy( 1 ); //reader + + + CControlGroup::ConstructFromResourceL(); + } + +// --------------------------------------------------------------------------- +// Read control's background info. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::LoadBackgroundFromResourceL( const TInt aResId ) + { + if ( aResId == 0 ) + return; + + if ( BackgroundBmp() ) + { + CFbsBitmap* bkBmp = BackgroundBmp(); + delete bkBmp; + SetBackgroundBmp( NULL ); + } + if ( BkMaskBmp() ) + { + CFbsBitmap* bkMaskBmp = BkMaskBmp(); + delete bkMaskBmp; + SetBackgroundMaskBmp( NULL ); + } + + TResourceReader resReader; + CCoeEnv::Static()->CreateResourceReaderLC( resReader, aResId ); + + TPtrC bmpFileName = resReader.ReadTPtrC(); + TInt32 imgMajorSkinId = resReader.ReadInt32(); + + TAknsItemID id; + TInt skinitemid; + + MAknsSkinInstance* skininstance = AknsUtils::SkinInstance(); + const TInt16 bmpId = resReader.ReadInt16(); + const TInt16 bmpMskId = resReader.ReadInt16(); + skinitemid = resReader.ReadInt16(); + id.Set( TInt( imgMajorSkinId ), skinitemid ); + + if ( bmpId != KInvalidImg ) + { + CFbsBitmap* backgroundImg = NULL; + CFbsBitmap* backgroundMaskImg = NULL; + if ( bmpMskId != KInvalidImg ) + { + AknsUtils::CreateIconL( skininstance, id, backgroundImg, + backgroundMaskImg, bmpFileName, bmpId, bmpMskId ); + } + else + { + AknsUtils::CreateIconL( skininstance, id, backgroundImg, + bmpFileName, bmpId ); + } + + SetBackgroundBmp( backgroundImg ); + SetBackgroundMaskBmp( backgroundMaskImg ); + } + CleanupStack::PopAndDestroy( 1 ); //reader + } + +// --------------------------------------------------------------------------- +// Load virtual keys image +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::LoadVkbKeyImageL(TInt aResId, const TSize& aKeySize) + { + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, aResId ); + + TPtrC bmpFileName = reader.ReadTPtrC(); + TInt32 imgMajorSkinId = reader.ReadInt32(); + TAknsItemID id; + + TSize keySize = aKeySize; + + for ( TInt index = 0; index <= EKeyBmpLastType ; index += 2 ) + { + // Get the image ids and mask ids from resource + TInt bmpId = reader.ReadInt16(); + TInt bmpMskId = reader.ReadInt16(); + + // read skin item id + const TInt skinitemid = reader.ReadInt16(); + id.Set( TInt( imgMajorSkinId ), skinitemid ); + + if ( bmpId != KInvalidImg ) + { + CFbsBitmap* bmp = NULL; + CFbsBitmap* maskbmp = NULL; + + if ( bmpMskId != KInvalidImg ) + { + AknsUtils::CreateIconL( AknsUtils::SkinInstance(), + id, bmp, maskbmp, bmpFileName, bmpId, bmpMskId ); + + // set maskbmp and size + AknIconUtils::SetSize( maskbmp, keySize, EAspectRatioNotPreserved ); + iNumKeypad->SetNonIrregularKeyBitmapL( + TVirtualKeyBmpType( EKeyBmpNormal + index + 1 ), maskbmp ); + } + else + { + AknsUtils::CreateIconL( AknsUtils::SkinInstance(), id, + bmp, bmpFileName, bmpId ); + } + // set bmp and size + AknIconUtils::SetSize( bmp, keySize, EAspectRatioNotPreserved ); + iNumKeypad->SetNonIrregularKeyBitmapL( + TVirtualKeyBmpType( EKeyBmpNormal + index ), bmp ); + } + } + // Pop and destroy reader + CleanupStack::PopAndDestroy( 1 ); + } + +// --------------------------------------------------------------------------- +// Load virtual keys +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::LoadVirtualKeypadKeyL(const TInt aResId, const RArray& aCellRects) + { + iNumKeypad->SetResourceId(aResId); + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, aResId ); + + // construct keys + TInt resKeyCount = reader.ReadInt16(); + TInt existsKeyCount = iNumKeypad->KeyArray().Count(); + TInt rectCount = aCellRects.Count(); + + for ( TInt i = 0; i < resKeyCount; i++ ) + { + if ( i < existsKeyCount ) + { + CVirtualKey* vk = iNumKeypad->KeyArray()[i]; + UpdateVkbKeyL( vk, reader, aCellRects[i%rectCount] ); + } + else + { + CVirtualKey* vk = CreateVkbKeyL( reader, aCellRects[i%rectCount] ); + CleanupStack::PushL( vk ); + iNumKeypad->AddKeyL( vk ); + + CleanupStack::Pop( vk ); + } + } + + CleanupStack::PopAndDestroy( 1 ); // reader + + iNumKeypad->Draw(); + iNumKeypad->UpdateArea( iNumKeypad->Rect() ); + } + +// --------------------------------------------------------------------------- +// create virtual key. +// --------------------------------------------------------------------------- +// +CVirtualKey* CPeninputArabicFingerHwrNumSymbolTable::CreateVkbKeyL( TResourceReader& aReader, + const TRect aKeyRect ) + { + CHBufCArray* keytexts = CHBufCArray::NewL(); + CleanupStack::PushL( keytexts ); + + for ( TInt i = 0; i <= EPosLast; i++ ) + { + HBufC* unicode = aReader.ReadHBufCL(); + keytexts->Array().AppendL( unicode ); + } + + TInt keyscancode = aReader.ReadInt16(); + + HBufC* text = keytexts->Array()[0]; + + CVirtualKey* vk = NULL; + if ( text ) + { + vk = CVirtualKey::NewL( *text, keyscancode, aKeyRect, aKeyRect, 0 ); + } + else + { + vk = CVirtualKey::NewL( KNullDesC, keyscancode, aKeyRect, aKeyRect, 0 ); + } + + CleanupStack::PopAndDestroy( keytexts ); //keytexts + + + TRect innerrect = aKeyRect; + innerrect.Shrink( TSize(10, 10) ); + vk->SetInnerRect( innerrect ); + + return vk; + } + +// --------------------------------------------------------------------------- +// update virtual key info. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::UpdateVkbKeyL( CVirtualKey* aVirtualKey, + TResourceReader& aReader, const TRect aKeyRect ) + { + CHBufCArray* keytexts = CHBufCArray::NewL(); + CleanupStack::PushL( keytexts ); + + for ( TInt i = 0; i <= EPosLast; i++ ) + { + HBufC* unicode = aReader.ReadHBufCL(); + keytexts->Array().AppendL( unicode ); + } + + TInt keyscancode = aReader.ReadInt16(); + + HBufC* text = keytexts->Array()[0]; + if ( text ) + { + aVirtualKey->SetKeyData( *text ); + } + else + { + aVirtualKey->SetKeyData( KNullDesC ); + } + + aVirtualKey->SetKeyScancode( keyscancode ); + + CleanupStack::PopAndDestroy( keytexts ); //keytexts + + aVirtualKey->SetRect(aKeyRect); + TRect innerrect = aKeyRect; + innerrect.Shrink( TSize(10,10) ); + aVirtualKey->SetInnerRect( innerrect ); + } + +// --------------------------------------------------------------------------- +// accept editor's number mapping restriction. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::SetNumericMapping( const TDesC& aNumMapping ) + { + //format of aNumMapping is "0123456789******" + + //char offset in aNumMapping + //cell 0 using aNumMapping[KNumOffsets[0]] + //cell 1 using aNumMapping[KNumOffsets[1]] + const TInt KNumOffsets[] = + { + 12, 1, 2, 3, + 13, 4, 5, 6, + 14, 7, 8, 9, + 15, 10, 0, 11 + }; + + TInt maxMappingItemCount = sizeof(KNumOffsets)/sizeof(TInt); + TInt mappingItemCount = aNumMapping.Length(); + + //numberpad + TInt keyCount = iNumKeypad->KeyArray().Count(); + for ( TInt i = 0; i < keyCount; i++ ) + { + CVirtualKey* vk = iNumKeypad->KeyArray()[i]; + + TInt offset = ( i < maxMappingItemCount ) ? KNumOffsets[i] : -1; + + if ( offset > -1 && offset < mappingItemCount ) + { + TUint16 unicode = aNumMapping[offset]; + TUint16 mappedCode = MapLatinNumAccordingToNumMode(unicode); + TBuf<1> keydata; + keydata.Append(mappedCode); + vk->SetKeyData(keydata); + vk->SetKeyScancode( mappedCode); + vk->SetDimmed( EFalse ); + } + else + { + vk->SetKeyData( KNullDesC ); + vk->SetKeyScancode( 0xFFFF ); + vk->SetDimmed( EFalse ); + } + } + + + //sync feedback + UpdateAllVirtualKeysFeedback(); + } + +// --------------------------------------------------------------------------- +// Navigate the symbol page +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::UpdateNumSymbolTable( TInt aNumSctType) + { + + iCurrentNumSCTType = aNumSctType; + // Draw the symbol table + Draw(); + + // Update the feedback for the virtual key + UpdateAllVirtualKeysFeedback(); + + // Bitblt the whole symbol table to screen + UpdateArea(iRect); + } + +// --------------------------------------------------------------------------- +// update feedback state of all virtual keys. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::UpdateAllVirtualKeysFeedback() + { + //update sctpad keys + TInt keyCount = iNumKeypad->KeyArray().Count(); + for ( TInt i = 0; i < keyCount; i++ ) + { + CVirtualKey* vk = iNumKeypad->KeyArray()[i]; + TBool enable = !vk->Dimmed(); + iNumKeypad->EnableKeyFeedback( vk, enable ); + } + } + +// --------------------------------------------------------------------------- +// Draw new content to the screen +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::Draw() + { + if(AbleToDraw()) + { + DrawOpaqueMaskBackground( Rect() ); + + if( BackgroundBmp() && BackgroundBmp()->SizeInPixels() != Rect().Size() ) + { + AknIconUtils::SetSize(BackgroundBmp(), Rect().Size(), EAspectRatioNotPreserved); + } + // draw background + DrawBackground(); + + // draw group + CControlGroup::Draw(); + + // bitblt the new content to screen + UpdateArea(iRect); + } + } +// --------------------------------------------------------------------------- +// set native number mode on or off. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::SetNativeNumMode( + const TBool aIsNativeNumMode) + { + iIsNativeNumMode = aIsNativeNumMode; + } +// --------------------------------------------------------------------------- +// map latin number to arabic native number. +// --------------------------------------------------------------------------- +// +TInt16 CPeninputArabicFingerHwrNumSymbolTable:: MapLatinNumAccordingToNumMode( + TInt16 aUnicode) + { + TInt16 ret = aUnicode; + if(aUnicode >= 0x30 && aUnicode <= 0x39) + { + if(iIsNativeNumMode) + { + ret = aUnicode + 0x0660 - 0x30; + } + } + return ret; + } +// End Of File