diff -r ebd48d2de13c -r ecbabf52600f textinput/peninputfingerhwr/src/peninputfingerhwrwnd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputfingerhwr/src/peninputfingerhwrwnd.cpp Wed Sep 01 12:23:33 2010 +0100 @@ -0,0 +1,2542 @@ +/* +* 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 of main window of finger hwr. +* +*/ + +// INCLUDE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "peninputfingerhwrwnd.h" +#include "peninputfingerhwrlafmanager.h" +#include "peninputfingerhwrevent.h" +#include "peninputfingerhwrcontrolid.h" +#include "peninputfingerhwrstoreconstants.h" +#include "peninputfingerhwrlayout.h" +#include "peninputfingerhwrdatastore.h" +#include "peninputlayouthwrwnd.h" + +#include "peninputmultipagevkb.h" +#include "peninputfingerhwrrangeselector.h" +#include "hbufcarray.h" + +const TUint32 KDefaultTextColor = 0x000000; +const TUint KDefaultFrameColor = 0x000000; +const TUint32 KDefaultWriteBoxBgColor = 0xdddddd; +const TUint32 KDefaultWriteBoxFrameColor = 0x000000; + +// --------------------------------------------------------------------------- +// Symbian Constructor +// --------------------------------------------------------------------------- +// +CPeninputFingerHwrWnd* CPeninputFingerHwrWnd::NewL( CFepUiLayout* aFepUiLayout, + TInt aControlId, TBool aLandscapeStyle ) + { + CPeninputFingerHwrWnd* self = NewLC( aFepUiLayout, aControlId, aLandscapeStyle ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// Symbian Constructor +// --------------------------------------------------------------------------- +// +CPeninputFingerHwrWnd* CPeninputFingerHwrWnd::NewLC( CFepUiLayout* aFepUiLayout, + TInt aControlId, TBool aLandscapeStyle ) + { + CPeninputFingerHwrWnd* self = new ( ELeave ) CPeninputFingerHwrWnd( aFepUiLayout, aControlId ); + CleanupStack::PushL( self ); + self->ConstructL( aLandscapeStyle ); + + return self; + } + +// --------------------------------------------------------------------------- +// c++ destructor +// --------------------------------------------------------------------------- +// +CPeninputFingerHwrWnd::~CPeninputFingerHwrWnd() + { + //delete by it's owner + iContextField = NULL; + +#ifndef RD_INTELLIGENT_TEXT_INPUT + iFixEngSymbolList1 = NULL; + iFixEngSymbolList2 = NULL; +#endif + + iCandidateList = NULL; + iPredictList = NULL; + iWritingBox = NULL; + + iCloseBtn = NULL; + iOptionBtn = NULL; + iImeSwitchBtn = NULL; + iBackspaceBtn = NULL; + iArrowLeftBtn = NULL; + iArrowRightBtn = NULL; + iArrowUpBtn = NULL; + iArrowDownBtn = NULL; + iRangeSpecialBtn = NULL; + iRangeSelector = NULL; + + iSctPage0Btn = NULL; + iSctPage1Btn = NULL; + iSctPage2Btn = NULL; + + iVirtualNumpad = NULL; + iVirtualSctpad = NULL; + iVirtualSctpadFix = NULL; + iRangeSelector = NULL; + iInputModeSwitch = NULL; + + delete iLafManager; + iLafManager = NULL; + } + +// --------------------------------------------------------------------------- +// Construct control from resource. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::ConstructFromResourceL() + { + if ( iResourceId == KInvalidResId ) + { + User::Leave( KErrArgument ); + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, iResourceId ); + + TInt supportskin = reader.ReadInt16(); + + if ( iFirstTimeConstruct && ( supportskin != KNotSupportSkin ) ) + { + UiLayout()->AddControlL( this ); + } + + // read shadow resources + TInt32 shadow = reader.ReadInt32(); + ReadShadowInfoL( shadow ); + + // read icf resource + TInt32 icf = reader.ReadInt32(); + ReadICFInfoL( icf ); + + + if ( iFirstTimeConstruct ) + { + const TInt32 boxwndResId = reader.ReadInt32(); + const TInt32 bgImageResId = reader.ReadInt32(); + + ReadWritingBoxInfoL( boxwndResId ); + ReadBackgroundInfoL( bgImageResId ); + } + else + { + CControlGroup::ConstructFromResourceL(); + + const TInt32 boxwndResId = reader.ReadInt32(); + const TInt32 bgImageResId = reader.ReadInt32(); + ReadWritingBoxInfoL( boxwndResId ); + ReadBackgroundInfoL( bgImageResId ); + } + + CleanupStack::PopAndDestroy(); // reader + + // read keypad image info + if ( iVirtualNumpad ) + { + TSize keysize = iLafManager->VirtualNumpadCellSize().Size(); + LoadVkbKeyImageL( iVirtualNumpad, R_FINGER_HWR_NUMPAD_IMAGE, keysize ); + + RArray rects; + CleanupClosePushL( rects ); + iLafManager->GetVirtualKeyRects( rects ); + LoadVirtualNumpadKeysL( R_FINGER_HWR_NUMPAD, rects ); + CleanupStack::PopAndDestroy(); //rects + } + + if ( iVirtualSctpad ) + { + TSize keysize = iLafManager->VirtualSctpadCellSize().Size(); + LoadVkbKeyImageL( iVirtualSctpad, R_FINGER_HWR_SCTPAD_IMAGE, keysize ); + + RArray rects; + CleanupClosePushL( rects ); + iLafManager->GetVirtualKeyRects( rects ); + LoadVirtualSctpadKeysL( R_FINGER_HWR_SCTPAD, rects ); + CleanupStack::PopAndDestroy(); //rects + } + + if ( iVirtualSctpadFix ) + { + TSize keysize = iLafManager->FixVirtualSctpadCellSize().Size(); + LoadVkbKeyImageL( iVirtualSctpadFix, R_FINGER_HWR_SCTPAD_IMAGE, keysize ); + + RArray rects; + CleanupClosePushL( rects ); + iLafManager->GetFixVirtualKeyRects( rects ); + LoadFixVirtualSctpadKeysL( R_FINGER_HWR_SCTPAD_FIX, rects ); + CleanupStack::PopAndDestroy(); //rects + } + + if (!iFirstTimeConstruct) + { + Draw(); + } + + iFirstTimeConstruct = EFalse; + } + + +// --------------------------------------------------------------------------- +// Draw window. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::Draw() + { + DrawOpaqueMaskBackground( Rect() ); + + if( BackgroundBmp() && BackgroundBmp()->SizeInPixels() != Rect().Size() ) + { + AknIconUtils::SetSize(BackgroundBmp(), Rect().Size(), EAspectRatioNotPreserved); + } + + DrawBackground(); + + CControlGroup::Draw(); + + UpdateArea( Rect(), EFalse ); + } + +// --------------------------------------------------------------------------- +// Resize. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SizeChangedL( TBool /*aLandscapeStyle*/ ) + { + iLafManager->ReadLafInfo(); + ResetLayoutL(); + + if ( iLafManager->IsLandscape() ) + { + iPredictList->SetCandExpandType( CFepCtrlDropdownList::ECandExpandUpward ); + } + else + { + iPredictList->SetCandExpandType( CFepCtrlDropdownList::ECandExpandDownward ); + } + + iCandidateList->SizeChanged( iLafManager->CandidateUnitWidth(), + iLafManager->CandidateUnitHeight(), + iLafManager->CandidateUnitWidth(), + iLafManager->CandidateLTPos(), + KCandidateCountPerRow, + 1 ); + + iPredictList->SizeChanged( iLafManager->CandidateUnitWidth(), + iLafManager->CandidateUnitHeight(), + iLafManager->CandidateUnitWidth(), + iLafManager->PredictiveLTPos(), + KPredictiveCountPerRow, + KPredictiveRowCount ); + + if ( iFixEngSymbolList1 ) + { + iFixEngSymbolList1->SizeChanged( iLafManager->CandidateUnitWidth(), + iLafManager->CandidateUnitHeight(), + iLafManager->CandidateUnitWidth(), + iLafManager->CandidateLTPos(), + KCandidateCountPerRow, + 1 ); + } + + if ( iFixEngSymbolList2 ) + { + iFixEngSymbolList2->SizeChanged( iLafManager->CandidateUnitWidth(), + iLafManager->CandidateUnitHeight(), + iLafManager->CandidateUnitWidth(), + iLafManager->PredictiveLTPos(), + KPredictiveCountPerRow, + 1 ); + } + + iContextField->SetTextMargin ( iLafManager->IcfLeftMargin(), + iLafManager->IcfRightMargin(), + iLafManager->IcfTopMargin(), + iLafManager->IcfBottomMargin() ); + + iContextField->SetLineSpace( iLafManager->IcfLineSpaceMargin() ); + iContextField->SizeChangedL( iLafManager->IcfRect(), + iLafManager->IcfTextHeight(), + iLafManager->IcfFont()->FontMaxHeight(), + iLafManager->IcfFont() ); +} + +// --------------------------------------------------------------------------- +// accept editor's text alignment. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SetTextAlignmentL( TInt aAlignment, TInt aLangId ) + { + if ( iContextField ) + { + iContextField->SetTextAlignmentL( aAlignment, aLangId ); + } + } + +// --------------------------------------------------------------------------- +// accept editor's text +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SetEditorTextL( const TFepInputContextFieldData& aData ) + { + if ( iContextField ) + { + iContextField->SetTextL( aData ); + } + } + +// --------------------------------------------------------------------------- +// accept editor's promopt txt. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SetPromptTextL( TUint8* aPromoptData ) + { + RDesReadStream readStream; + + TPtr8 countPtr( aPromoptData, 2*sizeof( TInt ), 2*sizeof( TInt ) ); + readStream.Open( countPtr ); + CleanupClosePushL( readStream ); + const TInt dataCount = readStream.ReadInt32L(); + const TInt textCount = readStream.ReadInt32L(); + CleanupStack::PopAndDestroy( &readStream ); + + TPtr8 ptr( aPromoptData+2*sizeof( TInt ), dataCount+textCount, dataCount+textCount ); + readStream.Open( ptr ); + CleanupClosePushL( readStream ); + + HBufC8* dataBuf = HBufC8::NewLC( dataCount ); + TPtr8 dataBufPtr = dataBuf->Des(); + readStream.ReadL( dataBufPtr, dataCount ); + + TFepPromptText* pIcfData = reinterpret_cast( const_cast( dataBufPtr.Ptr() ) ); + + HBufC* textBuf; + if ( textCount > 0 ) + { + textBuf = HBufC::NewLC( textCount/2 ); + TPtr textBufPtr = textBuf->Des(); + readStream.ReadL( textBufPtr, textCount/2 ); + iContextField->SetPromptTextL( textBuf->Des(), ETrue ); + CleanupStack::PopAndDestroy( textBuf ); + } + else + { + iContextField->SetPromptTextL( KNullDesC, ETrue ); + } + + CleanupStack::PopAndDestroy( dataBuf ); + CleanupStack::PopAndDestroy( &readStream ); + } + +// --------------------------------------------------------------------------- +// Dim option button +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SetEnableSettingBtn(const TBool aEnable) + { + if ( aEnable ) + { + iOptionBtn->SetDimmed(EFalse); + } + else + { + iOptionBtn->SetDimmed(ETrue); + iOptionBtn->SetActive(EFalse); + } + + } + +// --------------------------------------------------------------------------- +// accept editor's bubble text. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SetBubbleTextL( const TDesC& aInfo ) + { + if ( aInfo.Length() > 0 ) + { + iContextField->ShowBubble( aInfo, iContextField->MsgBubbleCtrl()->Rect() ); + } + else + { + iContextField->HideBubble(); + } + } + +// --------------------------------------------------------------------------- +// accept editor's char ranges restriction. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SetPermittedRanges( const TInt aPermittedRanges ) + { + if(aPermittedRanges == 0) + return; + + iPermittedRanges = aPermittedRanges; + + iRangeSelector->SetPermittedRanges( aPermittedRanges ); + } + +// --------------------------------------------------------------------------- +// accept editor's number mapping restriction. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::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[] = + { + 1, 2, 3, 15, + 4, 5, 6, 14, + 7, 8, 9, 13, + 10, 0, 11, 12 + }; + + TInt maxMappingItemCount = sizeof(KNumOffsets)/sizeof(TInt); + TInt mappingItemCount = aNumMapping.Length(); + + //numberpad + TInt keyCount = iVirtualNumpad->KeyArray().Count(); + for ( TInt i = 0; i < keyCount; i++ ) + { + CVirtualKey* vk = iVirtualNumpad->KeyArray()[i]; + + TInt offset = ( i < maxMappingItemCount ) ? KNumOffsets[i] : -1; + + if ( offset > -1 && offset < mappingItemCount ) + { + TUint16 unicode = aNumMapping[offset]; + vk->SetKeyData( aNumMapping.Mid( offset,1 ) ); + vk->SetKeyScancode( unicode ); + vk->SetDimmed( EFalse ); + } + else + { + vk->SetKeyData( KNullDesC ); + vk->SetKeyScancode( 0xFFFF ); + vk->SetDimmed( EFalse ); + } + } + + //sctpad + keyCount = iVirtualSctpad->KeyArray().Count(); + + if ( iPermittedRanges == ERangeNumber ) + { + for ( TInt i = 0; i < keyCount; i++ ) + { + CVirtualKey* vk = iVirtualSctpad->KeyArray()[i]; + TInt pos = aNumMapping.Find( vk->KeyUnicodes() ); + vk->SetDimmed( pos == KErrNotFound ); + } + } + else + { + for ( TInt i = 0; i < keyCount; i++ ) + { + CVirtualKey* vk = iVirtualSctpad->KeyArray()[i]; + vk->SetDimmed( EFalse ); + } + } + + //sync feedback + UpdateAllVirtualKeysFeedback( CurrentCharRange() ); + } + +// --------------------------------------------------------------------------- +// accept editor's input language. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SetInputLanguage( const TInt aLanguageId ) + { + if ( iContextField ) + { + iContextField->SetLanguageId( aLanguageId ); + } + + // special punctuations + const TInt KSpecialPuncPos[] = { 14, 15 }; + const TInt KSpecialChsPunc[] = { 0x300A, 0x300B }; + const TInt KSpecialChtPunc[] = { 0x300C, 0x300D }; + + TBool isCht = ( ELangHongKongChinese == aLanguageId ) || + ( ELangTaiwanChinese == aLanguageId ); + + TInt specialPuncCount = sizeof(KSpecialPuncPos)/sizeof(TInt); + + + for ( TInt i = 0; i < specialPuncCount; i++ ) + { + TInt keypos = KSpecialPuncPos[i]; + TInt charcode = isCht ? KSpecialChtPunc[i] : KSpecialChsPunc[i]; + + CVirtualKey* vk = iVirtualSctpad->KeyArray()[keypos]; + if ( vk ) + { + TBuf<1> buf; + buf.Append( charcode ); + vk->SetKeyData( buf ); + vk->SetKeyScancode( charcode ); + } + } + } + +// --------------------------------------------------------------------------- +// get strokes from hwr writing box. +// --------------------------------------------------------------------------- +// +const RArray& CPeninputFingerHwrWnd::StrokeList() + { + return iWritingBox->StrokeList(); + } + +// --------------------------------------------------------------------------- +// set end mark of hwr +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SetStrokeEndMark( const TPoint& aEndMark ) + { + iWritingBox->SetStrokeEndMark( aEndMark ); + } + +// --------------------------------------------------------------------------- +// set pen color of hwr writing. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SetBoxPenColor( const TInt aPenColor ) + { + iWritingBox->SetPenColor( aPenColor ); + } + +// --------------------------------------------------------------------------- +// set pen size of hwr writing. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SetBoxPenSize( const TSize aPenSize ) + { + iWritingBox->SetPenSize( aPenSize ); + } + +// --------------------------------------------------------------------------- +// set writing speed hwr writing. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SetBoxWritingSpeed( const TTimeIntervalMicroSeconds32& aCharDelay ) + { + iWritingBox->SetCharacterDelay( aCharDelay ); + iWritingBox->SetStrokeDelay( 90000 ); + } + +// --------------------------------------------------------------------------- +// retrieve rect of hwr writingbox. +// --------------------------------------------------------------------------- +// +TRect CPeninputFingerHwrWnd::WritingBoxRect() + { + return iWritingBox->Rect(); + } + + +// --------------------------------------------------------------------------- +// Cancel wrting +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::CancelWriting() + { + iWritingBox->CancelCharWriting(); + } + +// --------------------------------------------------------------------------- +// Popup ime switch list. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::PopupImeSwitcher() + { + TRAP_IGNORE( iInputModeSwitch->PopUpSwitchListL( iImeSwitchBtn->Rect() ) ); + } + + +// --------------------------------------------------------------------------- +// show range selection list. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::ShowRangeDropList( TInt aDirect ) + { + iRangeSelector->SetCurRange( iCurCharRangeNoSct, iCurCharRange == iCurCharRangeNoSct ); + iRangeSelector->Popup( aDirect ); + } + +// --------------------------------------------------------------------------- +// cancel range selection. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::CancelRangeDropList() + { + iRangeSelector->CancelPopup(); + + UpdateArea( Rect(), EFalse ); + } + +// --------------------------------------------------------------------------- +// test whether the range selection list is visible. +// --------------------------------------------------------------------------- +// +TBool CPeninputFingerHwrWnd::RangeDropListVisible() + { + return iRangeSelector ? iRangeSelector->IsPopup() : EFalse; + } + + +// --------------------------------------------------------------------------- +// Change SCT page. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::ShowSctPage( TInt aPageNo, TInt aPos ) + { + switch ( aPos ) + { + case EPagePosPageNo: + { + iVirtualSctpad->NavToPage( aPageNo ); + } + break; + default: + break; + } + UpdateSctPageButtonsUi(); + UpdateAllVirtualKeysFeedback( EFingerHwrSymbolRange ); + } + +// --------------------------------------------------------------------------- +// sync sct paging buttons. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::UpdateSctPageButtonsUi() + { + TInt curpage = iVirtualSctpad->CurPageIndex(); + TInt pagecount = iVirtualSctpad->PageCount(); + + iSctPage0Btn->Hide( curpage != 0 ); + iSctPage1Btn->Hide( curpage != 1 ); + iSctPage2Btn->Hide( curpage != 2 ); + + } + +// --------------------------------------------------------------------------- +// retrieve the ICF control. +// --------------------------------------------------------------------------- +// +CFepLayoutMultiLineIcf* CPeninputFingerHwrWnd::Icf() + { + return iContextField; + } + +// --------------------------------------------------------------------------- +// retrieve the predictive List control. +// --------------------------------------------------------------------------- +// +CFepCtrlDropdownList* CPeninputFingerHwrWnd::PredictiveList() + { + return iPredictList; + } + +// --------------------------------------------------------------------------- +// retrieve the candicate list control. +// --------------------------------------------------------------------------- +// +CFepCtrlDropdownList* CPeninputFingerHwrWnd::CandidateList() + { + return iCandidateList; + } + +// --------------------------------------------------------------------------- +// cancel all popped list. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::CancelAllPopList() + { + if ( iRangeSelector->IsPopup() ) + { + iRangeSelector->CancelPopup(); + } + } + +// --------------------------------------------------------------------------- +// Update layout +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::UpdateLayout( const TBool aIsStandby, const TBool aReloadCandicate, const TBool aReloadPredictive ) + { + TRAP_IGNORE( UpdateLayoutL( aIsStandby, aReloadCandicate, aReloadPredictive ) ); + } + +// --------------------------------------------------------------------------- +// Update layout +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::UpdateLayoutL( const TBool aIsStandby, + const TBool aReloadCandicate, const TBool aReloadPredictive ) + { + // Set the candidates when dropdown list is shown + if ( !aIsStandby ) + { + typedef CFepCtrlDropdownList::TListType TDropListType; + + CPeninputFingerHwrLayout* hwrLayout = NULL; + hwrLayout = static_cast( UiLayout() ); + CPeninputFingerHwrDataStore& datastore = hwrLayout->DataStore(); + + const RPointerArray& candidates = datastore.Candidate(); + const RPointerArray& predictives = datastore.Predictive(); + + TDropListType expandable = CFepCtrlDropdownList::EListExpandableWithBubble; + TDropListType unexpandable = CFepCtrlDropdownList::EListNoExpandableWithBubble; + + if ( datastore.PrimaryRange() == ERangeNative ) + { + iCandidateList->Hide( EFalse ); + iPredictList->Hide( EFalse ); + + if ( aReloadCandicate ) + { + iCandidateList->SetCandidatesL( candidates, unexpandable ); + } + + SetCandHighlightCell(); + + // Re draw preview bubble after drawing highlight cell + iCandidateList->ReDrawBubble(); + iPredictList->ReDrawBubble(); + + if ( aReloadPredictive ) + { + iPredictList->SetCandidatesL( predictives, expandable ); + } + } + else if ( datastore.PrimaryRange() == ERangeEnglish ) + { +#ifdef RD_INTELLIGENT_TEXT_INPUT + iCandidateList->Hide(EFalse); + iPredictList->Hide(EFalse); + + if ( aReloadCandicate ) + { + iCandidateList->SetCandidatesL( candidates, unexpandable ); + } + + if ( aReloadPredictive ) + { + TBool canExpand = datastore.PredictiveCount() > KCandidateCount; + TDropListType type = canExpand ? expandable : unexpandable; + iPredictList->SetCandidatesL( predictives, type ); + } + + SetCandHighlightCell(); + + // Re draw preview bubble after drawing highlight cell + iCandidateList->ReDrawBubble(); + iPredictList->ReDrawBubble(); + +#else + + if(!iCandidateList->Hiden() && !iPredictList->Hiden()) + { + if ( aReloadPredictive ) + { + iCandidateList->SetCandidatesL( candidates, unexpandable ); + iPredictList->SetCandidatesL( predictives, unexpandable ); + } + iPredictList->SetHighlightCell( 0 ); + + // Re draw preview bubble after drawing highlight cell + iCandidateList->ReDrawBubble(); + iPredictList->ReDrawBubble(); + } + + if(!iFixEngSymbolList1->Hiden() && !iFixEngSymbolList2->Hiden()) + { + iFixEngSymbolList1->SetCandidatesL( candidates, unexpandable ); + iFixEngSymbolList2->SetCandidatesL( predictives,unexpandable ); + } +#endif + } + } + else + { + // hide all the dropdown list in standby state + iCandidateList->Hide( ETrue ); + iPredictList->Hide( ETrue ); + + iCandidateList->ClearBubble(); + iPredictList->ClearBubble(); + +#ifndef RD_INTELLIGENT_TEXT_INPUT + iFixEngSymbolList1->Hide( ETrue ); + iFixEngSymbolList2->Hide( ETrue ); +#endif + + } + + iArrowLeftBtn->Hide( !aIsStandby ); + iArrowRightBtn->Hide( !aIsStandby ); + iArrowUpBtn->Hide( !aIsStandby ); + iArrowDownBtn->Hide( !aIsStandby ); + + iOptionBtn->Hide( !aIsStandby ); + iImeSwitchBtn->Hide( !aIsStandby ); + } + +// --------------------------------------------------------------------------- +// Set highlight candidate cell when expand another list. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::SetCandHighlightCell() + { + // if expand predictive list upward before charactor time out, + // the candidate list will cover on expand predictive list. + // To avoid this problem, add this function. + CPeninputFingerHwrLayout* hwrLayout = NULL; + hwrLayout = static_cast( UiLayout() ); + CPeninputFingerHwrDataStore& datastore = hwrLayout->DataStore(); + + CFepUiBaseCtrl* capCtrl = RootControl()->CtrlCapPointer(); + + if(!(capCtrl && capCtrl->ControlId() == EHwrCtrlIdPredictiveList && + iPredictList->CandExpandType() == CFepCtrlDropdownList::ECandExpandUpward)) + { + // Set and draw highlight cell + iCandidateList->SetHighlightCell( 0, datastore.Highlight() ); + } + else + { + // Just set the highlight cell without draw + iCandidateList->SetHighlightCell( 0, datastore.Highlight(), EFalse ); + } + } + + +#ifndef RD_INTELLIGENT_TEXT_INPUT +// --------------------------------------------------------------------------- +// hide or show two eng-symbol candidate lists. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::HideTwoRowEngSymbolList( const TBool aIsHide ) + { + iCandidateList->Hide( !aIsHide ); + iPredictList->Hide( !aIsHide ); + iFixEngSymbolList1->Hide( aIsHide ); + iFixEngSymbolList2->Hide( aIsHide ); + } +#endif + +// --------------------------------------------------------------------------- +// dim arrow buttons. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::DimArrowKeys( TBool aDimArrow ) + { + iArrowLeftBtn->SetDimmed( aDimArrow ); + iArrowRightBtn->SetDimmed( aDimArrow ); + iArrowUpBtn->SetDimmed( aDimArrow ); + iArrowDownBtn->SetDimmed( aDimArrow ); + } + +// --------------------------------------------------------------------------- +// change layout to specified char range. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::TryToChangeCharRange( TInt aCharRange ) + { + //CancelPopup must be called before LayoutStandby???? + //if not, pointer is captured, unregister feedback area will failed. + if ( iRangeSelector->IsPopup() ) + { + iRangeSelector->CancelPopup(); + } + + if ( iCurCharRange != aCharRange ) + { + switch ( aCharRange ) + { + case EFingerHwrNativeRange: + { + iCurCharRange = EFingerHwrNativeRange; + iCurCharRangeNoSct = EFingerHwrNativeRange; + LayoutStandbyChinese(); + } + break; + case EFingerHwrEnglishRange: + { + iCurCharRange = EFingerHwrEnglishRange; + iCurCharRangeNoSct = EFingerHwrEnglishRange; + LayoutStandbyEnglish(); + } + break; + case EFingerHwrNumberRange: + { + iCurCharRange = EFingerHwrNumberRange; + iCurCharRangeNoSct = EFingerHwrNumberRange; + LayoutStandbyNumeric(); + } + break; + case EFingerHwrSymbolRange: + { + iCurCharRange = EFingerHwrSymbolRange; + LayoutStandbySymbol(); + } + break; + default: + break; + } + TRAP_IGNORE(ReloadWritingGuideLinesL()); + } + + iRangeSelector->SetCurRange( iCurCharRangeNoSct, iCurCharRange == iCurCharRangeNoSct ); + } + +// --------------------------------------------------------------------------- +// retrieve char range of layout, including sct. +// --------------------------------------------------------------------------- +// +TInt CPeninputFingerHwrWnd::CurrentCharRange() + { + return iCurCharRange; + } + +// --------------------------------------------------------------------------- +// restore the char range saved before sct. +// --------------------------------------------------------------------------- +// +TInt CPeninputFingerHwrWnd::RestoreNonSctLayout() + { + TInt rangeFlag = ERangeInvalid; + + switch ( iCurCharRangeNoSct ) + { + case EFingerHwrNativeRange: + { + rangeFlag = ERangeNative; + } + break; + case EFingerHwrEnglishRange: + { + rangeFlag = ERangeEnglish; + } + break; + case EFingerHwrNumberRange: + { + rangeFlag = ERangeNumber; + } + break; + default: + { + rangeFlag = ERangeInvalid; + } + break; + } + TryToChangeCharRange( iCurCharRangeNoSct ); + return rangeFlag; + } + +// --------------------------------------------------------------------------- +// c++ constructor +// --------------------------------------------------------------------------- +// +CPeninputFingerHwrWnd::CPeninputFingerHwrWnd( + CFepUiLayout* aFepUiLayout, TInt aControlId ) + : CControlGroup( aFepUiLayout,aControlId ), iFirstTimeConstruct( ETrue ) + { + iInEditWordQueryDlg = EFalse; + } + +// --------------------------------------------------------------------------- +// Symbian second-phase constructor +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::ConstructL( TBool /*aLandscapeStyle*/ ) + { + BaseConstructL(); + + iLafManager = CPeninputFingerHwrLAFManager::NewL(); + iLafManager->ReadLafInfo(); + + //crate writing + CreateWritingBoxL(); + + //create icf + CreateContextFieldL(); + + //create candidate lists + CreateCandidateListL(); + + //create predictive lists + CreatePredictListL(); + + //create virtual num pad + CreateVirtualNumpadL(); + + //create virtual sct pad + CreateVirtualSctpadL(); + + //create space and backspace virtual pad + CreateFixVirtualSctpadL(); + + //create control buttons + CreateButtonsL(); + + //create range selecor + iRangeSelector = CPeninputFingerHwrRangeSelector::NewL( + UiLayout(), EHwrCtrlIdRangeSelector ); + AddControlL( iRangeSelector ); + + //create ime selector + iInputModeSwitch = CPeninputLayoutInputmodelChoice::NewL( + UiLayout(), EHwrCtrlIdInputModeSwitcher, + EPluginInputModeFingerHwr ); + + iInputModeSwitch->SetListSkinID( KAknsIIDQsnFrList, KAknsIIDQsnFrPopupSub ); + UiLayout()->AddControlL( iInputModeSwitch ); + iInputModeSwitch->AddEventObserver( UiLayout() ); + + iCurCharRangeNoSct = EFingerHwrNativeRange; + iCurCharRange = EFingerHwrNativeRange; + ResetLayoutL(); + + LayoutStandbyChinese(); + } + +// --------------------------------------------------------------------------- +// create icf. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::CreateContextFieldL() + { + const CFont* icffont =iLafManager->IcfFont(); + + iContextField = CFepLayoutMultiLineIcf::NewL( + iLafManager->IcfRect(), + UiLayout(), + EHwrCtrlIdInputContextField, + icffont->HeightInPixels(), + icffont->FontMaxHeight(), + icffont ); + + iContextField->SetTextMargin ( iLafManager->IcfLeftMargin(), + iLafManager->IcfRightMargin(), + iLafManager->IcfTopMargin(), + iLafManager->IcfBottomMargin() ); + + iContextField->SetLineSpace( iLafManager->IcfLineSpaceMargin() ); + + iContextField->SizeChangedL( iLafManager->IcfRect(), + iLafManager->IcfTextHeight(), + iLafManager->IcfFont()->FontMaxHeight(), + iLafManager->IcfFont() ); + + TAknWindowLineLayout bubbleLineLayout = AknLayoutScalable_Apps::popup_char_count_window().LayoutLine(); + TAknTextLineLayout bubbleTextLayout = AknLayoutScalable_Apps::popup_char_count_window_t1( 0 ).LayoutLine(); + + iContextField->MsgBubbleCtrl()->SetTextFormat( bubbleTextLayout ); + iContextField->MsgBubbleCtrl()->SetTextColorIndex( EAknsCIQsnTextColorsCG67 ); + //Change the ID when ID into release + iContextField->MsgBubbleCtrl()->SetBitmapParam( NULL, + NULL, + KAknsIIDQsnFrInputPreviewSideL, + KAknsIIDQsnFrInputPreviewMiddle, + KAknsIIDQsnFrInputPreviewSideR ); + iContextField->SetMsgBubbleCtrlSize( TSize( bubbleLineLayout.iW,bubbleLineLayout.iH ) ); + + + //transfer to headerPane + AddControlL( iContextField ); + + //add layout as event observer + iContextField->AddEventObserver( UiLayout() ); + iContextField->SetFocus(); + + } + +// --------------------------------------------------------------------------- +// create candidate lists. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::CreateCandidateListL() + { + TDropdownListDrawInfo candiDrawInfo( + KAknsIIDQsnFrFunctionButtonInactive, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrItutButtonCandiSideL, + KAknsIIDQsnFrItutButtonCandiMiddle, + KAknsIIDQsnFrItutButtonCandiSideR, + KAknsIIDQsnFrItutButtonCandiPressedSideL, + KAknsIIDQsnFrItutButtonCandiPressedMiddle, + KAknsIIDQsnFrItutButtonCandiPressedSideR, + TRgb( 194, 221, 242 ), + ETrue ); + + TInt unitWidth = iLafManager->CandidateUnitWidth(); + TInt unitHeight = iLafManager->CandidateUnitHeight(); + TPoint ltPosition = iLafManager->CandidateLTPos(); + iCandidateList = CFepCtrlDropdownList::NewL( UiLayout(), + EHwrCtrlIdCandidateList, + R_FSHWR_CANDIDATE_DROP_DOWN_LIST, ltPosition, + TSize(unitWidth, unitHeight), KCandidateCountPerRow, 1 ); + + AddControlL( iCandidateList ); + + const CFont *font = iLafManager->CandidateFont(); + TInt horizontalMargin = iLafManager->CandidateHorizontalMargin(); + TInt verticalMargin = iLafManager->CandidateVerticalMargin(); + iCandidateList->SetCellMargin( horizontalMargin, verticalMargin ); + iCandidateList->SetFont( font ); + + // set the needed events + iCandidateList->SetEventIdForCandidateSelected( EHwrEventCandidateSelected ); + iCandidateList->AddEventObserver( UiLayout() ); + + // hide the candidate list + iCandidateList->Hide( ETrue ); + iCandidateList->SetDropdownListImgID( candiDrawInfo ); + + +#ifndef RD_INTELLIGENT_TEXT_INPUT + iFixEngSymbolList1 = CFepCtrlDropdownList::NewL( UiLayout(), + EHwrCtrlIdFixEngSymbolList, + R_FSHWR_CANDIDATE_DROP_DOWN_LIST, + ltPosition, + TSize( unitWidth, unitHeight ), + KCandidateCountPerRow, + 1 ); + + AddControlL( iFixEngSymbolList1 ); + + iFixEngSymbolList1->SetCellMargin( horizontalMargin, verticalMargin ); + iFixEngSymbolList1->SetFont( font ); + iFixEngSymbolList1->SetEventIdForCandidateSelected( EHwrEventCandidateSelected ); + iFixEngSymbolList1->AddEventObserver( UiLayout() ); + + // hide the candidate list + iFixEngSymbolList1->Hide( ETrue ); + iFixEngSymbolList1->SetDropdownListImgID( candiDrawInfo ); + +#endif + } + +// --------------------------------------------------------------------------- +// create predictive lists. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::CreatePredictListL() + { + TDropdownListDrawInfo predicDrawInfo( + KAknsIIDQsnFrFunctionButtonInactive, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrItutButtonComposeSideL, + KAknsIIDQsnFrItutButtonComposeMiddle, + KAknsIIDQsnFrItutButtonComposeSideR, + KAknsIIDQsnFrItutButtonComposePressedSideL, + KAknsIIDQsnFrItutButtonComposePressedSideR, + KAknsIIDQsnFrItutButtonComposePressedMiddle, + TRgb( 194, 221, 242 ), + ETrue ); + + TInt unitWidth = iLafManager->CandidateUnitWidth(); + TInt unitHeight = iLafManager->CandidateUnitHeight(); + TPoint ltPosition = iLafManager->PredictiveLTPos(); + iPredictList = CFepCtrlDropdownList::NewL( UiLayout(), + EHwrCtrlIdPredictiveList, + R_FSHWR_PREDICT_DROP_DOWN_LIST, + ltPosition, + TSize( unitWidth, unitHeight ), + KPredictiveCountPerRow, + KPredictiveRowCount ); + + if ( iLafManager->IsLandscape() ) + { + iPredictList->SetCandExpandType( CFepCtrlDropdownList::ECandExpandUpward ); + } + + AddControlL( iPredictList ); + + const CFont *font = iLafManager->CandidateFont(); + TInt horizontalMargin = iLafManager->CandidateHorizontalMargin(); + TInt verticalMargin = iLafManager->CandidateVerticalMargin(); + iPredictList->SetCellMargin( horizontalMargin, verticalMargin ); + iPredictList->SetFont( font ); + + // set the needed events + iPredictList->SetEventIdForCandidateSelected( EHwrEventPredictiveSelected ); + iPredictList->SetEventIdForNextPageCandidate( EHwrEventGetNextCandidatePage ); + iPredictList->AddEventObserver( UiLayout() ); + + // hide the predictive list + iPredictList->Hide( ETrue ); + iPredictList->SetDropdownListImgID( predicDrawInfo ); + + +#ifndef RD_INTELLIGENT_TEXT_INPUT + TDropdownListDrawInfo candiDrawInfo( + KAknsIIDQsnFrFunctionButtonInactive, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrItutButtonCandiSideL, + KAknsIIDQsnFrItutButtonCandiMiddle, + KAknsIIDQsnFrItutButtonCandiSideR, + KAknsIIDQsnFrItutButtonCandiPressedSideL, + KAknsIIDQsnFrItutButtonCandiPressedMiddle, + KAknsIIDQsnFrItutButtonCandiPressedSideR, + TRgb( 194, 221, 242 ), + ETrue ); + + iFixEngSymbolList2 = CFepCtrlDropdownList::NewL( UiLayout(), + EHwrCtrlIdFixEngSymbolList, + R_FSHWR_CANDIDATE_DROP_DOWN_LIST, + ltPosition, + TSize( unitWidth, unitHeight ), + KCandidateCountPerRow, + 1 ); + + AddControlL( iFixEngSymbolList2 ); + + iFixEngSymbolList2->SetCellMargin( horizontalMargin, verticalMargin ); + iFixEngSymbolList2->SetFont( font ); + iFixEngSymbolList2->SetEventIdForCandidateSelected( EHwrEventCandidateSelected ); + iFixEngSymbolList2->AddEventObserver( UiLayout() ); + + // hide the candidate list + iFixEngSymbolList2->Hide( ETrue ); + iFixEngSymbolList2->SetDropdownListImgID( candiDrawInfo ); +#endif + } + +// --------------------------------------------------------------------------- +// create writing box. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::CreateWritingBoxL() + { + iWritingBox = CTransparentHwrWnd::NewL( TRect( 0,0,0,0 ), UiLayout(), + EHwrCtrlIdWritingBox, EFalse ); + + AddControlL( iWritingBox ); + + + //set it to window + iWritingBox->SetStrokeEndMark( TPoint( -1,0 ) ); + iWritingBox->AddEventObserver( UiLayout() ); + iWritingBox->EnableTraceOutsideWindow( EFalse ); + iWritingBox->SetWndTransparencyFactor( 0 ); + + iWritingBox->InstallPenTraceDecoratorL( KNullDesC ); + } + +// --------------------------------------------------------------------------- +// create all function buttons. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::CreateButtonsL() + { + iCloseBtn = CreateEventBtnL( EHwrCtrlIdClose, R_AKN_FEP_HWR_CLOSE ); + iOptionBtn = CreateEventBtnL( EHwrCtrlIdLanguageOption, R_AKN_FEP_HWR_OPTION ); + iImeSwitchBtn = CreateEventBtnL( EHwrCtrlIdVkbSwitcher, R_AKN_FEP_HWR_VKB ); + + iBackspaceBtn = CreateRepBtnL( EHwrCtrlIdBackspace, R_AKN_FEP_HWR_BACK_SPACE, + EHwrEventKeyBack, EKeyBackspace ); + iArrowLeftBtn = CreateRepBtnL( EHwrCtrlIdArrowLeft, R_AKN_FEP_HWR_ARROWLEFT, + EHwrEventNavKeyClicked, EKeyLeftArrow ); + iArrowRightBtn = CreateRepBtnL( EHwrCtrlIdArrowRight, R_AKN_FEP_HWR_ARROWRIGHT, + EHwrEventNavKeyClicked, EKeyRightArrow ); + iArrowUpBtn = CreateRepBtnL( EHwrCtrlIdArrowUp, R_AKN_FEP_HWR_ARROWUP, + EHwrEventNavKeyClicked, EKeyUpArrow ); + iArrowDownBtn = CreateRepBtnL( EHwrCtrlIdArrowDown, R_AKN_FEP_HWR_ARROWDOWN, + EHwrEventNavKeyClicked, EKeyDownArrow ); + + iRangeSpecialBtn = CreateEventBtnL( EHwrCtrlIdSymbolButton, R_AKN_FEP_HWR_RANGE_SPECIAL ); + + iSctPage0Btn = CreateEventBtnL( EHwrCtrlIdSctPage0Btn, R_AKN_FEP_HWR_SCT_PAGE_1 ); + iSctPage1Btn = CreateEventBtnL( EHwrCtrlIdSctPage1Btn, R_AKN_FEP_HWR_SCT_PAGE_2 ); + iSctPage2Btn = CreateEventBtnL( EHwrCtrlIdSctPage2Btn, R_AKN_FEP_HWR_SCT_PAGE_3 ); + } + +// --------------------------------------------------------------------------- +// create virtual number pad. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::CreateVirtualNumpadL() + { + TFontSpec spec; + + iVirtualNumpad = CVirtualKeyboard::NewL( + TRect( 0,0,0,0 ), + UiLayout(), + EHwrCtrlIdNumpad, + spec ); + AddControlL( iVirtualNumpad ); + iVirtualNumpad->AddEventObserver( UiLayout() ); + + iVirtualNumpad->SetResourceId( KInvalidResId ); + + // read keypad image info + TSize keysize = iLafManager->VirtualNumpadCellSize().Size(); + + + LoadVkbKeyImageL( iVirtualNumpad, R_FINGER_HWR_NUMPAD_IMAGE, keysize ); + + RArray rects; + CleanupClosePushL( rects ); + + iLafManager->GetVirtualKeyRects( rects ); + LoadVirtualNumpadKeysL( R_FINGER_HWR_NUMPAD, rects ); + + CleanupStack::PopAndDestroy(); //rects + + iVirtualNumpad->SetKeyTextColorGroup( EAknsCIQsnTextColorsCG65 ); + iVirtualNumpad->SetDrawOpaqueBackground( EFalse ); + + //set key to be 9 piece graphics + iVirtualNumpad->SetKeySkinId( EKeyBmpNormal, KAknsIIDQsnFrKeypadButtonFrNormal ); + iVirtualNumpad->SetKeySkinId( EKeyBmpHighlight, KAknsIIDQsnFrKeypadButtonFrPressed ); + iVirtualNumpad->SetKeySkinId( EKeyBmpDim, KAknsIIDQsnFrKeypadButtonFrInactive ); + } + +// --------------------------------------------------------------------------- +// create virtual sct pad. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::CreateVirtualSctpadL() + { + TFontSpec spec; + + iVirtualSctpad = CMultiPageVirtualKeyboard::NewL( + iLafManager->CtrlRect(EHwrCtrlIdSctpad), + UiLayout(), + EHwrCtrlIdSctpad, + spec ); + AddControlL( iVirtualSctpad ); + iVirtualSctpad->AddEventObserver( UiLayout() ); + + iVirtualSctpad->SetResourceId( KInvalidResId ); + + // read keypad image info + TSize keysize = iLafManager->VirtualSctpadCellSize().Size(); + + LoadVkbKeyImageL( iVirtualSctpad, R_FINGER_HWR_SCTPAD_IMAGE, keysize ); + + RArray rects; + CleanupClosePushL( rects ); + + iLafManager->GetVirtualKeyRects( rects ); + LoadVirtualSctpadKeysL( R_FINGER_HWR_SCTPAD, rects ); + + CleanupStack::PopAndDestroy();//rects + + TInt rows = iLafManager->VirtualSctpadRowCount(); + TInt cols = iLafManager->VirtualSctpadColCount(); + iVirtualSctpad->UpdatePaging( rows, cols ); + + iVirtualSctpad->SetKeyTextColorGroup( EAknsCIQsnTextColorsCG65 ); + iVirtualSctpad->SetDrawOpaqueBackground( EFalse ); + + //set key to be 9 piece graphics + iVirtualSctpad->SetKeySkinId( EKeyBmpNormal, KAknsIIDQsnFrKeypadButtonFrNormal ); + iVirtualSctpad->SetKeySkinId( EKeyBmpHighlight, KAknsIIDQsnFrKeypadButtonFrPressed ); + iVirtualSctpad->SetKeySkinId( EKeyBmpDim, KAknsIIDQsnFrKeypadButtonFrInactive ); + } + + +// --------------------------------------------------------------------------- +// create virtual sct pad. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::CreateFixVirtualSctpadL() + { + TFontSpec spec; + + iVirtualSctpadFix = CVirtualKeyboard::NewL( + iLafManager->CtrlRect(EHwrCtrlIdSctpadFix), + UiLayout(), + EHwrCtrlIdSctpadFix, + spec ); + AddControlL( iVirtualSctpadFix ); + iVirtualSctpadFix->AddEventObserver( UiLayout() ); + + iVirtualSctpadFix->SetResourceId( KInvalidResId ); + + // read keypad image info + TSize keysize = iLafManager->FixVirtualSctpadCellSize().Size(); + + LoadVkbKeyImageL( iVirtualSctpadFix, R_FINGER_HWR_SCTPAD_IMAGE, keysize ); + + RArray rects; + CleanupClosePushL( rects ); + + iLafManager->GetFixVirtualKeyRects( rects ); + LoadFixVirtualSctpadKeysL( R_FINGER_HWR_SCTPAD_FIX, rects ); + + CleanupStack::PopAndDestroy();//rects + + iVirtualSctpadFix->SetKeyTextColorGroup( EAknsCIQsnTextColorsCG65 ); + iVirtualSctpadFix->SetDrawOpaqueBackground( EFalse ); + + //set key to be 9 piece graphics + iVirtualSctpadFix->SetKeySkinId( EKeyBmpNormal, KAknsIIDQsnFrKeypadButtonFrNormal ); + iVirtualSctpadFix->SetKeySkinId( EKeyBmpHighlight, KAknsIIDQsnFrKeypadButtonFrPressed ); + iVirtualSctpadFix->SetKeySkinId( EKeyBmpDim, KAknsIIDQsnFrKeypadButtonFrInactive ); + } + +// --------------------------------------------------------------------------- +// EventButton creation helper. +// --------------------------------------------------------------------------- +// +CAknFepCtrlEventButton* CPeninputFingerHwrWnd::CreateEventBtnL( TInt aCtrlId, + TInt32 aResId, TInt aEvent/*= 0xFFFF*/,TInt aUnicode/*=0*/ ) + { + CAknFepCtrlEventButton* button = CAknFepCtrlEventButton::NewL( + UiLayout(), aCtrlId, aEvent, aUnicode, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrFunctionButtonInactive ); + + button->SetResourceId( aResId ); + button->ConstructFromResourceL(); + button->AddEventObserver( UiLayout() ); + AddControlL( button ); + return button; + } + +// --------------------------------------------------------------------------- +// RepeatButton creation helper. +// --------------------------------------------------------------------------- +// +CAknFepCtrlRepeatButton* CPeninputFingerHwrWnd::CreateRepBtnL( const TInt aCtrlId, + TInt32 aResId, const TInt aEvent, const TInt aUnicode ) + { + CAknFepCtrlRepeatButton* button = CAknFepCtrlRepeatButton::NewL( + UiLayout(), aCtrlId, aEvent, aUnicode, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrFunctionButtonInactive ); + + button->SetResourceId( aResId ); + button->ConstructFromResourceL( ); + button->AddEventObserver( UiLayout() ); + AddControlL( button ); + + return button; + } + +// --------------------------------------------------------------------------- +// load virtual number pad images. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::LoadVkbKeyImageL( CVirtualKeyboard* aVkb, + 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( UiLayout()->SkinInstance(), + id, bmp, maskbmp, bmpFileName, bmpId, bmpMskId ); + + // set maskbmp and size + AknIconUtils::SetSize( maskbmp, keySize, EAspectRatioNotPreserved ); + aVkb->SetNonIrregularKeyBitmapL( + TVirtualKeyBmpType( EKeyBmpNormal + index + 1 ), maskbmp ); + } + else + { + AknsUtils::CreateIconL( UiLayout()->SkinInstance(), id, + bmp, bmpFileName, bmpId ); + } + // set bmp and size + AknIconUtils::SetSize( bmp, keySize, EAspectRatioNotPreserved ); + aVkb->SetNonIrregularKeyBitmapL( + TVirtualKeyBmpType( EKeyBmpNormal + index ), bmp ); + } + } + // Pop and destroy reader + CleanupStack::PopAndDestroy( 1 ); + } + + +// --------------------------------------------------------------------------- +// create virtual key. +// --------------------------------------------------------------------------- +// +CVirtualKey* CPeninputFingerHwrWnd::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 CPeninputFingerHwrWnd::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 + + + TRect innerrect = aKeyRect; + innerrect.Shrink( TSize(10,10) ); + aVirtualKey->SetInnerRect( innerrect ); + + } + +// --------------------------------------------------------------------------- +// load virtual number keys. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::LoadVirtualNumpadKeysL( + const TInt aResId, const RArray& aCellRects ) + { + iVirtualNumpad->SetResourceId( aResId ); + + TAknTextLineLayout txtlayout = iLafManager->NumpadKeyTxtLayout(); + iVirtualNumpad->SetTextLineLayout( txtlayout ); + + TInt fontid = txtlayout.FontId(); + const CFont* font = AknLayoutUtils::FontFromId( fontid ); + iVirtualNumpad->SetFont( font ); + + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, aResId ); + + + // construct keys + TInt resKeyCount = reader.ReadInt16(); + TInt existsKeyCount = iVirtualNumpad->KeyArray().Count(); + TInt rectCount = aCellRects.Count(); + + for ( TInt i = 0; i < resKeyCount; i++ ) + { + if ( i < existsKeyCount ) + { + CVirtualKey* vk = iVirtualNumpad->KeyArray()[i]; + UpdateVkbKeyL( vk, reader, aCellRects[i%rectCount] ); + } + else + { + CVirtualKey* vk = CreateVkbKeyL( reader, aCellRects[i%rectCount] ); + CleanupStack::PushL( vk ); + iVirtualNumpad->AddKeyL( vk ); + CleanupStack::Pop( vk ); + } + } + CleanupStack::PopAndDestroy( 1 ); // reader + + iVirtualNumpad->Draw(); + iVirtualNumpad->UpdateArea( iVirtualNumpad->Rect() ); + } + + +// --------------------------------------------------------------------------- +// load virtual sct keys. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::LoadVirtualSctpadKeysL( const TInt aResId, + const RArray& aCellRects ) + { + iVirtualSctpad->SetResourceId( aResId ); + + TAknTextLineLayout txtlayout = iLafManager->SctpadKeyTxtLayout(); + iVirtualSctpad->SetTextLineLayout( txtlayout ); + + TInt fontid = txtlayout.FontId(); + const CFont* font = AknLayoutUtils::FontFromId( fontid ); + iVirtualSctpad->SetFont( font ); + + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, aResId ); + + // construct keys + TInt resKeyCount = reader.ReadInt16(); + TInt existsKeyCount = iVirtualSctpad->KeyArray().Count(); + TInt rectCount = aCellRects.Count(); + + for ( TInt i = 0; i < resKeyCount; i++ ) + { + if ( i < existsKeyCount ) + { + CVirtualKey* vk = iVirtualSctpad->KeyArray()[i]; + UpdateVkbKeyL( vk, reader, aCellRects[i%rectCount] ); + } + else + { + CVirtualKey* vk = CreateVkbKeyL( reader, aCellRects[i%rectCount] ); + CleanupStack::PushL( vk ); + iVirtualSctpad->AddKeyL( vk ); + CleanupStack::Pop( vk ); + } + } + + CleanupStack::PopAndDestroy( 1 ); // reader + + iVirtualSctpad->Draw(); + iVirtualSctpad->UpdateArea( iVirtualSctpad->Rect() ); + + } + +// --------------------------------------------------------------------------- +// load virtual sct keys. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::LoadFixVirtualSctpadKeysL( const TInt aResId, + const RArray& aCellRects ) + { + iVirtualSctpadFix->SetResourceId( aResId ); + + TAknTextLineLayout txtlayout = iLafManager->FixSctpadKeyTxtLayout(); + iVirtualSctpadFix->SetTextLineLayout( txtlayout ); + + TInt fontid = txtlayout.FontId(); + const CFont* font = AknLayoutUtils::FontFromId( fontid ); + iVirtualSctpadFix->SetFont( font ); + + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, aResId ); + + // construct keys + TInt resKeyCount = reader.ReadInt16(); + TInt existsKeyCount = iVirtualSctpadFix->KeyArray().Count(); + TInt rectCount = aCellRects.Count(); + + for ( TInt i = 0; i < resKeyCount; i++ ) + { + if ( i < existsKeyCount ) + { + CVirtualKey* vk = iVirtualSctpadFix->KeyArray()[i]; + UpdateVkbKeyL( vk, reader, aCellRects[i] ); + } + else + { + CVirtualKey* vk = CreateVkbKeyL( reader, aCellRects[i] ); + CleanupStack::PushL( vk ); + iVirtualSctpadFix->AddKeyL( vk ); + CleanupStack::Pop( vk ); + } + } + + CleanupStack::PopAndDestroy( 1 ); // reader + + iVirtualSctpadFix->Draw(); + iVirtualSctpadFix->UpdateArea( iVirtualSctpadFix->Rect() ); + + } + +// --------------------------------------------------------------------------- +// relayout full ui, reset all controls position. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::ResetLayoutL() + { + TRect rcScreen = iLafManager->LayoutRect(); + SetRect( rcScreen ); + + TRect rect; + + //Move ICF + rect = iLafManager->CtrlRect( iContextField->ControlId() ); + iContextField->SetRect( rect ); + + //Move Writing box + rect = iLafManager->CtrlRect( iWritingBox->ControlId() ); + iWritingBox->SetRect( rect ); + + //Move Virtual Numpad + if ( iVirtualNumpad ) + { + rect = iLafManager->CtrlRect( iVirtualNumpad->ControlId() ); + iVirtualNumpad->SetRect( rect ); + + TAknTextLineLayout txtlayout = iLafManager->NumpadKeyTxtLayout(); + iVirtualNumpad->SetTextLineLayout( txtlayout ); + + const RPointerArray& keys = iVirtualNumpad->KeyArray(); + RArray rects; + iLafManager->GetVirtualKeyRects( rects ); + + const TInt count = keys.Count(); + for ( TInt i = 0; i < count; i++ ) + { + CVirtualKey* vk = keys[i]; + vk->SetRect( rects[i] ); + } + rects.Reset(); + rects.Close(); + } + + //move virtual Sctpad + if ( iVirtualSctpad ) + { + rect = iLafManager->CtrlRect( iVirtualSctpad->ControlId() ); + iVirtualSctpad->SetRect( rect ); + + TAknTextLineLayout txtlayout = iLafManager->SctpadKeyTxtLayout(); + iVirtualSctpad->SetTextLineLayout( txtlayout ); + + const RPointerArray& keys = iVirtualSctpad->KeyArray(); + RArray rects; + iLafManager->GetVirtualKeyRects( rects ); + + TInt n = rects.Count(); //num of cells in one page + for ( TInt i = 0; i < keys.Count(); i++ ) + { + CVirtualKey* vk = keys[i]; + vk->SetRect( rects[i%n] ); + } + rects.Reset(); + rects.Close(); + } + + //move virtual Sctpad + if ( iVirtualSctpadFix ) + { + rect = iLafManager->CtrlRect( iVirtualSctpadFix->ControlId() ); + iVirtualSctpadFix->SetRect( rect ); + + TAknTextLineLayout txtlayout = iLafManager->FixSctpadKeyTxtLayout(); + iVirtualSctpadFix->SetTextLineLayout( txtlayout ); + + const RPointerArray& keys = iVirtualSctpadFix->KeyArray(); + RArray rects; + iLafManager->GetFixVirtualKeyRects( rects ); + + TInt n = rects.Count(); // + for ( TInt i = 0; i < keys.Count(); i++ ) + { + CVirtualKey* vk = keys[i]; + vk->SetRect( rects[i] ); + } + rects.Reset(); + rects.Close(); + } + + //Move buttons + TSize siBtnPadding = iLafManager->ButtonInnerPadding(); + TInt pdx = siBtnPadding.iWidth; + TInt pdy = siBtnPadding.iHeight; + + rect = iLafManager->CtrlRect( iCloseBtn->ControlId() ); + MoveIconButton( iCloseBtn, rect, pdx, pdy, ETrue ); + + rect = iLafManager->CtrlRect( iRangeSpecialBtn->ControlId() ); + MoveIconButton( iRangeSpecialBtn, rect, pdx, pdy, ETrue ); + + rect = iLafManager->CtrlRect( iBackspaceBtn->ControlId() ); + MoveIconButton( iBackspaceBtn, rect, pdx, pdy, ETrue ); + + rect = iLafManager->CtrlRect( iArrowUpBtn->ControlId() ); + MoveIconButton( iArrowUpBtn, rect, pdx, pdy, ETrue ); + + rect = iLafManager->CtrlRect( iArrowLeftBtn->ControlId() ); + MoveIconButton( iArrowLeftBtn, rect, pdx, pdy, ETrue ); + + rect = iLafManager->CtrlRect( iArrowRightBtn->ControlId() ); + MoveIconButton( iArrowRightBtn, rect, pdx, pdy, ETrue ); + + rect = iLafManager->CtrlRect( iArrowDownBtn->ControlId() ); + MoveIconButton( iArrowDownBtn, rect, pdx, pdy, ETrue ); + + rect = iLafManager->CtrlRect( iOptionBtn->ControlId() ); + MoveIconButton( iOptionBtn, rect, pdx, pdy, ETrue ); + + rect = iLafManager->CtrlRect( iImeSwitchBtn->ControlId() ); + MoveIconButton( iImeSwitchBtn, rect, pdx, pdy, ETrue ); + + rect = iLafManager->CtrlRect( iSctPage0Btn->ControlId() ); + MoveSwitchPageButton( iSctPage0Btn, rect, pdx, pdy, ETrue ); + + rect = iLafManager->CtrlRect( iSctPage1Btn->ControlId() ); + MoveSwitchPageButton( iSctPage1Btn, rect, pdx, pdy, ETrue ); + + rect = iLafManager->CtrlRect( iSctPage2Btn->ControlId() ); + MoveSwitchPageButton( iSctPage2Btn, rect, pdx, pdy, ETrue ); + + //save range buttons position + iRectOfRangeBtn = iLafManager->CtrlRect( iRangeSelector->ControlId() ); + + //move range selector + iRangeSelector->SetRect( iRectOfRangeBtn ); + iRangeSelector->SetBaseRect( iRectOfRangeBtn ); + } + + +// --------------------------------------------------------------------------- +// layout for chinese range standby. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::LayoutStandbyChinese() + { + + iCandidateList->Hide( ETrue ); + iPredictList->Hide( ETrue ); + +#ifndef RD_INTELLIGENT_TEXT_INPUT + iFixEngSymbolList1->Hide( ETrue ); + iFixEngSymbolList2->Hide( ETrue ); +#endif + + iWritingBox->Hide( EFalse ); + iVirtualNumpad->Hide( ETrue ); + iVirtualSctpad->Hide( ETrue ); + iVirtualSctpadFix->Hide( ETrue ); + + iArrowLeftBtn->Hide( EFalse ); + iArrowRightBtn->Hide( EFalse ); + iArrowUpBtn->Hide( EFalse ); + iArrowDownBtn->Hide( EFalse ); + iOptionBtn->Hide( EFalse ); + iImeSwitchBtn->Hide( EFalse ); + + iSctPage0Btn->Hide( ETrue ); + iSctPage1Btn->Hide( ETrue ); + iSctPage2Btn->Hide( ETrue ); + + iRangeSpecialBtn->SetHighlight( EFalse ); + + UpdateAllVirtualKeysFeedback( EFingerHwrNativeRange ); + } + +// --------------------------------------------------------------------------- +// layout for english range standby. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::LayoutStandbyEnglish() + { + iCandidateList->Hide( ETrue ); + iPredictList->Hide( ETrue ); + +#ifndef RD_INTELLIGENT_TEXT_INPUT + iFixEngSymbolList1->Hide( ETrue ); + iFixEngSymbolList2->Hide( ETrue ); +#endif + + iWritingBox->Hide( EFalse ); + iVirtualNumpad->Hide( ETrue ); + iVirtualSctpad->Hide( ETrue ); + iVirtualSctpadFix->Hide( ETrue ); + + iArrowLeftBtn->Hide( EFalse ); + iArrowRightBtn->Hide( EFalse ); + iArrowUpBtn->Hide( EFalse ); + iArrowDownBtn->Hide( EFalse ); + iOptionBtn->Hide( EFalse ); + iImeSwitchBtn->Hide( EFalse ); + + iSctPage0Btn->Hide( ETrue ); + iSctPage1Btn->Hide( ETrue ); + iSctPage2Btn->Hide( ETrue ); + + iRangeSpecialBtn->SetHighlight( EFalse ); + + UpdateAllVirtualKeysFeedback( EFingerHwrEnglishRange ); + } + +// --------------------------------------------------------------------------- +// layout for number range standby. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::LayoutStandbyNumeric() + { + iCandidateList->Hide( ETrue ); + iPredictList->Hide( ETrue ); + +#ifndef RD_INTELLIGENT_TEXT_INPUT + iFixEngSymbolList1->Hide( ETrue ); + iFixEngSymbolList2->Hide( ETrue ); +#endif + + iWritingBox->Hide( ETrue ); + iVirtualNumpad->Hide( EFalse ); + iVirtualSctpad->Hide( ETrue ); + iVirtualSctpadFix->Hide( ETrue ); + + iArrowLeftBtn->Hide( EFalse ); + iArrowRightBtn->Hide( EFalse ); + iArrowUpBtn->Hide( EFalse ); + iArrowDownBtn->Hide( EFalse ); + iOptionBtn->Hide( EFalse ); + iImeSwitchBtn->Hide( EFalse ); + + iSctPage0Btn->Hide( ETrue ); + iSctPage1Btn->Hide( ETrue ); + iSctPage2Btn->Hide( ETrue ); + + iRangeSpecialBtn->SetHighlight( EFalse ); + + UpdateAllVirtualKeysFeedback( EFingerHwrNumberRange ); + } + +// --------------------------------------------------------------------------- +// layout for symbol range standby. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::LayoutStandbySymbol() + { + iCandidateList->Hide( ETrue ); + iPredictList->Hide( ETrue ); + +#ifndef RD_INTELLIGENT_TEXT_INPUT + iFixEngSymbolList1->Hide( ETrue ); + iFixEngSymbolList2->Hide( ETrue ); +#endif + + iWritingBox->Hide( ETrue ); + iVirtualNumpad->Hide( ETrue ); + iArrowLeftBtn->Hide( ETrue ); + iArrowRightBtn->Hide( ETrue ); + iArrowUpBtn->Hide( ETrue ); + iArrowDownBtn->Hide( ETrue ); + + iVirtualSctpad->Hide( EFalse ); + iVirtualSctpadFix->Hide( EFalse ); + iOptionBtn->Hide( EFalse ); + iImeSwitchBtn->Hide( EFalse ); + + iRangeSpecialBtn->SetHighlight( ETrue ); + + TInt pageno = ( iCurCharRangeNoSct == EFingerHwrNativeRange ) ? 0 : 1; + ShowSctPage( pageno, EPagePosPageNo ); + + UpdateAllVirtualKeysFeedback( EFingerHwrSymbolRange ); + + UiLayout()->RootControl()->ReDrawRect( iVirtualSctpadFix->Rect() ); + UpdateArea( iVirtualSctpadFix->Rect() ); + } + + +// --------------------------------------------------------------------------- +// EventButton layout helper. Move button to specified rect. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::MoveIconButton( CAknFepCtrlEventButton* aButton, + const TRect& aRect, TInt aXPadding, TInt aYPadding, TBool aReloadImages ) + { + if ( !aButton ) + { + return; + } + + aButton->SetRect( aRect ); + TRect rcInner = aRect; + if ( rcInner.Width()> rcInner.Height() ) + { + TInt dx = ( rcInner.Width() - rcInner.Height() ) / 2; + rcInner.Move( dx, 0 ); + rcInner.SetWidth( rcInner.Height() ); + } + else + { + TInt dy = ( rcInner.Height() - rcInner.Width() ) / 2; + rcInner.Move( 0, dy ); + rcInner.SetHeight( rcInner.Width() ); + } + + rcInner.Shrink( aXPadding, aYPadding ); + aButton->SizeChanged( aRect, rcInner, aReloadImages ); + } + +// --------------------------------------------------------------------------- +// EventButton layout helper. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::MoveSwitchPageButton( CAknFepCtrlEventButton* aButton, + const TRect& aRect, TInt aXPadding, TInt aYPadding, TBool aReloadImages ) + { + if ( !aButton ) + { + return; + } + + aButton->SetRect( aRect ); + TRect rcInner = aRect; + + rcInner.Shrink( aXPadding + 5, aYPadding ); + aButton->SizeChanged( aRect, rcInner, aReloadImages ); + } + + +// --------------------------------------------------------------------------- +// Read control's shadow info. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::ReadShadowInfoL( const TInt aResId ) + { + TResourceReader resReader; + CCoeEnv::Static()->CreateResourceReaderLC( resReader, aResId ); + + TPtrC bmpFileName = resReader.ReadTPtrC(); + TInt32 imgMajorSkinId = resReader.ReadInt32(); + + TAknsItemID id; + TInt skinitemid; + + MAknsSkinInstance* skininstance = UiLayout()->SkinInstance(); + + for ( TInt i = 0; i < KShadowBmpBr + 1; i++ ) + { + const TInt16 bmpId = resReader.ReadInt16(); + const TInt16 bmpMskId = resReader.ReadInt16(); + skinitemid = resReader.ReadInt16(); + + id.Set( TInt( imgMajorSkinId ), skinitemid ); + + if ( bmpId != KInvalidImg ) + { + CFbsBitmap* shadowImg = NULL; + CFbsBitmap* shadowMaskImg = NULL; + + if ( bmpMskId != KInvalidImg ) + { + AknsUtils::CreateIconL( skininstance, + id, + shadowImg, + shadowMaskImg, + bmpFileName, + bmpId, + bmpMskId ); + } + else + { + AknsUtils::CreateIconL( skininstance, + id, + shadowImg, + bmpFileName, + bmpId ); + } + + SetShadowBmp( shadowImg, shadowMaskImg, TShadowBitmapIndex( i ) ); + } + } + CleanupStack::PopAndDestroy( 1 ); // reader + + } + +// --------------------------------------------------------------------------- +// Read control's background info. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::ReadBackgroundInfoL( 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 = UiLayout()->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 + } + +// --------------------------------------------------------------------------- +// read icf appearance info. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::ReadICFInfoL( const TInt aResId ) + { + if ( aResId == 0 ) + { + return; + } + + TResourceReader icfreader; + CCoeEnv::Static()->CreateResourceReaderLC( icfreader, aResId ); + + TInt32 colorMajorSkinId = icfreader.ReadInt32(); + TInt skinitemid = icfreader.ReadInt16(); + TInt coloridx = icfreader.ReadInt16(); + + TAknsItemID colorid; + colorid.Set( TInt( colorMajorSkinId ), skinitemid ); + + TRgb icftextcolor; + MAknsSkinInstance* skininstance = UiLayout()->SkinInstance(); + TInt error = AknsUtils::GetCachedColor( skininstance, icftextcolor, + colorid, coloridx ); + + if ( error != KErrNone ) + { + icftextcolor = TRgb( KDefaultTextColor ); + } + + iContextField->SetTextColorL( icftextcolor ); + + // Set highlight color + TRgb icfhightlightcolor; + error = AknsUtils::GetCachedColor( skininstance, + icfhightlightcolor, + KAknsIIDQsnHighlightColors, + EAknsCIQsnHighlightColorsCG2 ); + if ( error == KErrNone ) + { + iContextField->SetTextSelColorL( icfhightlightcolor ); + } + + skinitemid = icfreader.ReadInt16(); + coloridx = icfreader.ReadInt16(); + + colorid.Set( TInt( colorMajorSkinId ), skinitemid ); + + TRgb icfframecolor; + error = AknsUtils::GetCachedColor( skininstance, icfframecolor, + colorid, coloridx ); + + if ( error != KErrNone ) + { + icfframecolor = TRgb( KDefaultFrameColor ); + } + + iContextField->SetBorderColor( icfframecolor ); + iContextField->SetBgImgSkinId( KAknsIIDQgnGrafFepInputBg ); + CleanupStack::PopAndDestroy( 1 ); // icfreader + } + +// --------------------------------------------------------------------------- +// read writingbox appearance info. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::ReadWritingBoxInfoL( const TInt aResId ) + { + if ( aResId == 0 ) + { + return; + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, aResId ); + + // get write box bg color + TInt32 colorMajorSkinId = reader.ReadInt32(); + TInt skinitemid = reader.ReadInt16(); + TInt coloridx = reader.ReadInt16(); + + TAknsItemID colorid; + colorid.Set( TInt( colorMajorSkinId ), skinitemid ); + + TRgb boxcolor; + MAknsSkinInstance* skininstance = UiLayout()->SkinInstance(); + TInt error = AknsUtils::GetCachedColor( skininstance, + boxcolor, + colorid, + coloridx ); + + if ( error != KErrNone ) + { + boxcolor = TRgb( KDefaultWriteBoxBgColor ); + } + + iWritingBoxBkColor = boxcolor; + iWritingBox->SetBkColor( boxcolor ); + + skinitemid = reader.ReadInt16(); + coloridx = reader.ReadInt16(); + + colorid.Set( TInt( colorMajorSkinId ), skinitemid ); + + TRgb boxframecolor; + error = AknsUtils::GetCachedColor( skininstance, + boxframecolor, + colorid, + coloridx ); + + if ( error != KErrNone ) + { + boxframecolor = TRgb( KDefaultWriteBoxFrameColor ); + } + + iWritingBoxFrameColor = boxframecolor; + iWritingBox->SetFrameCol( boxframecolor ); + + CleanupStack::PopAndDestroy(); // reader + + ReloadWritingGuideLinesL(); + } + +// --------------------------------------------------------------------------- +// update feedback state of all virtual keys. +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrWnd::UpdateAllVirtualKeysFeedback( TInt aType ) + { + if ( !UiLayout()->SupportTactileFeedback() ) + { + // return ; + // CFepUiLayout::OnActivate() is incorrect + // SupportTactileFeedback return is false when touch is about to active + } + + TBool isNumpad = ( aType == EFingerHwrNumberRange ) ? ETrue : EFalse; + TBool isSctpad = ( aType == EFingerHwrSymbolRange ) ? ETrue : EFalse; + + //update numpad keys + TInt keyCount = iVirtualNumpad->KeyArray().Count(); + for ( TInt i = 0; i < keyCount; i++ ) + { + CVirtualKey* vk = iVirtualNumpad->KeyArray()[i]; + TBool enable = !vk->Dimmed() && isNumpad; + iVirtualNumpad->EnableKeyFeedback( vk, enable ); + } + + //update sctpad keys + keyCount = iVirtualSctpad->KeyArray().Count(); + TInt pageSize = iVirtualSctpad->PageSize(); + TInt curPage = iVirtualSctpad->CurPageIndex(); + for ( TInt i = 0; i < keyCount; i++ ) + { + CVirtualKey* vk = iVirtualSctpad->KeyArray()[i]; + TInt page = i / pageSize; + TBool enable = !vk->Dimmed() && isSctpad && ( page == curPage ); + iVirtualSctpad->EnableKeyFeedback( vk, enable ); + } + } + + +void CPeninputFingerHwrWnd::ReloadWritingGuideLinesL() + { + TInt resid = -1; + + if( iCurCharRange == EFingerHwrNativeRange ) + { + resid = R_FINGER_HWR_GUIDELINE_CHS; + } + else if( iCurCharRange == EFingerHwrEnglishRange ) + { + resid = R_FINGER_HWR_GUIDELINE_ENG; + } + else + { + return; + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, resid ); + + TPtrC fileName = reader.ReadTPtrC(); + TInt32 majorSkinId = reader.ReadInt32(); + TInt16 indexOfColor = reader.ReadInt16(); + + TInt16 imageid = reader.ReadInt16(); + TInt16 maskid = reader.ReadInt16(); + TInt16 skinid = reader.ReadInt16(); + + TAknsItemID id; + id.Set( TInt( majorSkinId ), skinid ); + + CFbsBitmap* bmpImage = NULL; + CFbsBitmap* bmpMask = NULL; + + //AknsUtils::CreateIconL(UiLayout()->SkinInstance(), id, bmpImage, bmpMask, bmpFileName, imageid,maskid); + + TRgb colorBkgnd = iWritingBoxBkColor; + TRgb colorGuideLine = AKN_LAF_COLOR( 0 ); + if ( ETrue ) + { + TRgb color1 = colorBkgnd; + TRgb color2 = colorGuideLine; + + TInt k = 64; + TInt brightness = Max( color1.Red(), color1.Green() ); + brightness = Max( brightness, color1.Blue() ); + + color2 = ( brightness > 128 ) ? TRgb(0,0,0) : TRgb(255,255,255); + + TInt r = ( color1.Red() * ( 256 - k ) + color2.Red() * k ) / 256; + TInt g = ( color1.Green()* ( 256 - k ) + color2.Green() * k ) / 256; + TInt b = ( color1.Blue() * ( 256 - k ) + color2.Blue() * k ) / 256; + + colorGuideLine = TRgb(r,g,b); + } + + AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(), + id, KAknsIIDQsnIconColors, -1, + bmpImage, bmpMask, fileName, imageid, maskid, + colorGuideLine ); + + CleanupStack::PushL( bmpImage ); //1 + CleanupStack::PushL( bmpMask ); //2 + + TSize imgsize = iLafManager->CtrlRect(EHwrCtrlIdWritingBox).Size(); + + AknIconUtils::SetSize( bmpImage, imgsize, EAspectRatioNotPreserved ); + AknIconUtils::SetSize( bmpMask, imgsize, EAspectRatioNotPreserved ); + + //prepare to merge + CFbsBitmap* bmpMerged = new(ELeave) CFbsBitmap(); + CleanupStack::PushL( bmpMerged ); //3 + bmpMerged->Create( imgsize, BitmapDevice()->DisplayMode() ); + + CFbsBitmapDevice* dev=CFbsBitmapDevice::NewL( bmpMerged ); + CleanupStack::PushL( dev ); //4 + + CFbsBitGc* gc = CFbsBitGc::NewL(); + CleanupStack::PushL( gc ); //5 + + //merge image and mask to dest + TRect rcImage( TPoint(0,0), imgsize ); + gc->Activate( dev ); + gc->SetPenStyle( CGraphicsContext::ENullPen ); + gc->SetBrushColor( colorBkgnd ); + gc->SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc->DrawRect( rcImage ); + gc->SetBrushStyle( CGraphicsContext::ENullBrush ); + gc->BitBltMasked( TPoint(0,0), bmpImage, rcImage, bmpMask, EFalse ); + + CleanupStack::PopAndDestroy( 2 ); //gc, dev + + iWritingBox->SetBackgroundBitmapL( bmpMerged ); + iWritingBox->SetBackgroundMaskBitmapL( bmpMask ); + + CleanupStack::Pop( 2 ); //bmpMerged, bmpMask + CleanupStack::PopAndDestroy( 1 ); //bmpImage + CleanupStack::PopAndDestroy(); //reader + + iWritingBox->ReDrawRect( iWritingBox->Rect() ); + iWritingBox->UpdateArea( iWritingBox->Rect() ); + } + +void CPeninputFingerHwrWnd::ShowBubble(TInt aShow) + { + if (aShow > 0) + { + TRect outrect,innerrect; + + + + + iCandidateList->ShowBubble(ETrue); + iPredictList->ShowBubble(ETrue); + +#ifndef RD_INTELLIGENT_TEXT_INPUT + iFixEngSymbolList1->ShowBubble(ETrue); + iFixEngSymbolList2->ShowBubble(ETrue); +#endif + // Set priview popup size + iCandidateList->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview); + + outrect = iLafManager->PreviewBubbleRect(); + innerrect = iLafManager->PreviewBubbleInnerRect(); + iCandidateList->SetTextFormat(iLafManager->PreviewBubbleTextLayout()); + iCandidateList->SetBubbleTextFont(iLafManager->PreviewBubbleFont()); + iCandidateList->SetBubbleSize(TSize(outrect.Width(),outrect.Height())); // Read laf + iCandidateList->SetFrameDiff(innerrect.iTl.iX - outrect.iTl.iX, + innerrect.iTl.iY - outrect.iTl.iY, + outrect.iBr.iX - innerrect.iBr.iX, + outrect.iBr.iY - innerrect.iBr.iY); + + iPredictList->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview); + iPredictList->SetTextFormat(iLafManager->PreviewBubbleTextLayout()); + iPredictList->SetBubbleTextFont(iLafManager->PreviewBubbleFont()); + iPredictList->SetBubbleSize(TSize(outrect.Width(),outrect.Height())); // Read laf + iPredictList->SetFrameDiff(innerrect.iTl.iX - outrect.iTl.iX, + innerrect.iTl.iY - outrect.iTl.iY, + outrect.iBr.iX - innerrect.iBr.iX, + outrect.iBr.iY - innerrect.iBr.iY); + +#ifndef RD_INTELLIGENT_TEXT_INPUT + iFixEngSymbolList1->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview); + iFixEngSymbolList1->SetTextFormat(iLafManager->PreviewBubbleTextLayout()); + iFixEngSymbolList1->SetBubbleTextFont(iLafManager->PreviewBubbleFont()); + iFixEngSymbolList1->SetBubbleSize(TSize(outrect.Width(),outrect.Height())); // Read laf + iFixEngSymbolList1->SetFrameDiff(innerrect.iTl.iX - outrect.iTl.iX, + innerrect.iTl.iY - outrect.iTl.iY, + outrect.iBr.iX - innerrect.iBr.iX, + outrect.iBr.iY - innerrect.iBr.iY); + + iFixEngSymbolList2->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview); + iFixEngSymbolList2->SetTextFormat(iLafManager->PreviewBubbleTextLayout()); + iFixEngSymbolList2->SetBubbleTextFont(iLafManager->PreviewBubbleFont()); + iFixEngSymbolList2->SetBubbleSize(TSize(outrect.Width(),outrect.Height())); // Read laf + iFixEngSymbolList2->SetFrameDiff(innerrect.iTl.iX - outrect.iTl.iX, + innerrect.iTl.iY - outrect.iTl.iY, + outrect.iBr.iX - innerrect.iBr.iX, + outrect.iBr.iY - innerrect.iBr.iY); +#endif + + } + else + { + iCandidateList->ShowBubble(EFalse); + iPredictList->ShowBubble(EFalse); +#ifndef RD_INTELLIGENT_TEXT_INPUT + iFixEngSymbolList1->ShowBubble(EFalse); + iFixEngSymbolList2->ShowBubble(EFalse); +#endif + } + } +// End Of File