diff -r ebd48d2de13c -r ecbabf52600f textinput/peninputfingerhwrar/src/peninputfingerhwrarnumsymboltable.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputfingerhwrar/src/peninputfingerhwrarnumsymboltable.cpp Wed Sep 01 12:23:33 2010 +0100 @@ -0,0 +1,566 @@ +/* +* 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" +#include "peninputfingerhwarvkbutility.h" + +const TUint16 KInvalidChar = 0xFFFF; +// --------------------------------------------------------------------------- +// 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; + UiLayout()->LockArea(UiLayout()->Rect(),this); + // signal server to add the pop area + if(UiLayout()->NotDrawToLayoutDevice()) + { + struct SData + { + TRect rr; + TBool flag; + } data; + + data.rr = iNumKeypad->Rect(); + data.flag = ETrue; + TPtrC ptrForAdd; + ptrForAdd.Set(reinterpret_cast(&data),sizeof(data)/sizeof(TUint16)); + + UiLayout()->SignalOwner(ESignalPopupArea,ptrForAdd); + } + + RefreshNumSymbolTable();; + } + +// --------------------------------------------------------------------------- +// cancel the popup. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::CloseSymbolTable() + { + CapturePointer( EFalse ); + iPopupVisible = EFalse; + // signal server to remove the pop area + if(UiLayout()->NotDrawToLayoutDevice()) + { + struct SData + { + TRect rr; + TBool flag; + } data; + + data.rr = iNumKeypad->Rect(); + data.flag = EFalse; + TPtrC ptrForRemove; + ptrForRemove.Set(reinterpret_cast(&data),sizeof(data)/sizeof(TUint16)); + + UiLayout()->SignalOwner(ESignalPopupArea,ptrForRemove); + } + 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) + { + // 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 ); + } + +// --------------------------------------------------------------------------- +// 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) + { + PeninputFingerHwrArVkbUtility::LoadVkbKeyImageL(*iNumKeypad,aResId,aKeySize); + } + +// --------------------------------------------------------------------------- +// Load virtual keys +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::LoadVirtualKeypadKeyL(const TInt aResId, const RArray& aCellRects) + { + PeninputFingerHwrArVkbUtility::LoadVirtualKeypadKeyL(*iNumKeypad,aResId,aCellRects); + } + +// --------------------------------------------------------------------------- +// accept editor's number mapping restriction. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::UpdateTableSymbol( const TDesC& aNumMapping ) + { + HBufC* charTable = GenerateCharTable(aNumMapping); + if(charTable) + { + TInt charTalbeCount = charTable->Length(); + + //numberpad + TInt keyCount = iNumKeypad->KeyArray().Count(); + for ( TInt i = 0; i < keyCount; i++ ) + { + CVirtualKey* vk = iNumKeypad->KeyArray()[i]; + + if(i < charTalbeCount && (*charTable)[i] != KInvalidChar) + { + TBuf<1> keydata; + TUint16 keyCode = (*charTable)[i]; + keydata.Append(keyCode); + vk->SetKeyData(keydata); + vk->SetKeyScancode(keyCode); + vk->SetDimmed( EFalse ); + } + else + { + vk->SetKeyData( KNullDesC ); + vk->SetKeyScancode( KInvalidChar ); + vk->SetDimmed( EFalse ); + } + } + + delete charTable; + + //sync feedback + UpdateAllVirtualKeysFeedback(); + } + } + +// --------------------------------------------------------------------------- +// Get reordered char table for key pad to render them +// --------------------------------------------------------------------------- +// +HBufC* CPeninputArabicFingerHwrNumSymbolTable::GenerateCharTable(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 tableSize = sizeof(KNumOffsets)/sizeof(TInt); + TInt mappingItemCount = aNumMapping.Length(); + + HBufC* reorderedCharTable = HBufC::New(mappingItemCount +1); + if(reorderedCharTable) + { + for(TInt i = 0; i < tableSize; i++) + { + if(KNumOffsets[i] < mappingItemCount) + { + TUint16 unicode = aNumMapping[KNumOffsets[i]]; + TUint16 mappedCode = MapLatinNumAccordingToNumMode(unicode); + reorderedCharTable->Des().Append(mappedCode); + } + else + { + reorderedCharTable->Des().Append(KInvalidChar); + } + } + } + + return reorderedCharTable; + } + +// --------------------------------------------------------------------------- +// Navigate the symbol page +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::RefreshNumSymbolTable() + { + // 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 numpad 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 ); + } + } + +// --------------------------------------------------------------------------- +// update rect of all virtual keys. +// --------------------------------------------------------------------------- +// +void CPeninputArabicFingerHwrNumSymbolTable::UpdateAllVirtualKeysRect(const RArray & aCellRects) + { + //update numpad keys rect + TInt keyCount = iNumKeypad->KeyArray().Count(); + TInt rectCount = aCellRects.Count(); + if(keyCount != rectCount) + { + return; + } + for ( TInt i = 0; i < keyCount; i++ ) + { + CVirtualKey* vk = iNumKeypad->KeyArray()[i]; + TRect rect = aCellRects[i%rectCount]; + vk->SetRect(aCellRects[i%rectCount]); + TRect innerrect = rect; + innerrect.Shrink( TSize(10,10) ); + vk->SetInnerRect( innerrect ); + } + } + +// --------------------------------------------------------------------------- +// 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