diff -r 000000000000 -r eb1f2e154e89 textinput/peninputvkbcn/ctrlsrc/peninputvkbclientarea.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputvkbcn/ctrlsrc/peninputvkbclientarea.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,2224 @@ +/* +* Copyright (c) 2002-2005 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: vkb client area implementation +* +*/ + + +// system includes +#include +#include +#include +#include +#include +#include +#include +#include //command from fep or IME to plugin +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// user includes +#include "peninputvkbevent.h" +#include "peninputvkbdataprovider.h" +#include "peninputvkbclientarea.h" +#include "peninputvkbctrlpool.h" +#include "peninputvkblayoutpool.h" +#include "peninputvkbcompositionfield.h" +#include "peninputvkbImlayout.h" +#include "peninputvkbnumerickeymappingmgr.h" +#include "peninputvkbwindow.h" +#include "peninputvkbdatamgr.h" +#include "peninputvkbuistate.h" + +// constant definition +const TInt KDropdownRowsForStroke = 3; +const TInt KDropdownRowsForOthers = 4; + +const TUint16 KStrokeSeparator = 0x2022; +const TUint16 KPinyinSeparator = 0x0027; + + + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::CAknFepVkbClientArea +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +CAknFepVkbClientArea::CAknFepVkbClientArea(CFepUiLayout* aUiLayout, + TInt aControlId, + MAknFepVkbDataProvider* aDataProvider, + CPeninputCnGenericVkbLafMgr* aLafMgr) + :CControlGroup(aUiLayout, aControlId, EFalse), + iDataProvider(aDataProvider), + iTextPropertySet(EFalse), + iDropdownPropertySet(EFalse), + iLafMgr(aLafMgr) + { + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::NewL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +CAknFepVkbClientArea* CAknFepVkbClientArea::NewL(CFepUiLayout* aUiLayout, + TInt aControlId, + MAknFepVkbDataProvider* aDataProvider, + CPeninputCnGenericVkbLafMgr* aLafMgr) + { + CAknFepVkbClientArea* self = CAknFepVkbClientArea::NewLC(aUiLayout, aControlId, + aDataProvider, aLafMgr); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::NewLC +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +CAknFepVkbClientArea* CAknFepVkbClientArea::NewLC(CFepUiLayout* aUiLayout, + TInt aControlId, + MAknFepVkbDataProvider* aDataProvider, + CPeninputCnGenericVkbLafMgr* aLafMgr) + { + CAknFepVkbClientArea* self = new (ELeave) CAknFepVkbClientArea(aUiLayout, aControlId, + aDataProvider, aLafMgr); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::SetTextProperty +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::SetTextProperty() + { + TAknTextLineLayout compositionText; + compositionText = AknLayoutScalable_Avkon::cell_vkb_candidate_pane_t1().LayoutLine(); + + iCompositionField->SetNormalColor(AKN_LAF_COLOR_STATIC(compositionText.iC)); + iCompositionField->SetWarningColor(KRgbRed); + + iCompositionField->SetFont(AknLayoutUtils::FontFromId(compositionText.iFont, NULL)); + + iTextPropertySet = ETrue; + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::ConstructL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::ConstructL() + { + BaseConstructL(); + + iCtrlPool = CAknFepVkbCtrlPool::NewL(); + iVkbLayout = CAknFepCtrlVkbLayout::NewL(); + iLayoutPool = CAknFepLayoutPool::NewL( *iVkbLayout ); + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, R_AKN_FEP_VKB_KEY_MAPPING_STRING_LIST); + iKeyMappingMgr = CAknFepVkbNumericKepMappingMgr::NewL(reader); + CleanupStack::PopAndDestroy(); // reader + + // 1.Create all control in the client, including all kinds of control in different layout + // Composition field + iCompositionField = CAknFepVkbCompositionField::NewL(KMaxLengthCompFieldElemCount,TRect(), + UiLayout(), + EAknFepVkbCtrlIdCompositionField, + iDataProvider ); + iCompositionField->SetResourceId(R_AKN_FEP_VKB_COMPOSITION_FIELD); + iCompositionField->ConstructFromResourceL(); + iCtrlPool->AddControl(iCompositionField); + AddButtonL(EAknFepVkbCtrlIdArrowUpBtn, + EVkbEventUpArrow, + R_AKN_FEP_VKB_ARROW_UP_BUTTON, + EKeyUpArrow, + ETrue); + + AddButtonL(EAknFepVkbCtrlIdArrowDownBtn, + EVkbEventDownArrow, + R_AKN_FEP_VKB_ARROW_DOWN_BUTTON, + EKeyDownArrow, + ETrue + ); + + AddButtonL(EAknFepVkbCtrlIdArrowLeftBtn, + EVkbEventLeftArrow, + R_AKN_FEP_VKB_ARROW_LEFT_BUTTON, + EKeyLeftArrow, + ETrue + ); + + AddButtonL(EAknFepVkbCtrlIdArrowRightBtn, + EVkbEventRightArrow, + R_AKN_FEP_VKB_ARROW_RIGHT_BUTTON, + EKeyRightArrow, + ETrue + ); + + // Vkb control + iVkbCtrl = CPeninputVkbCtrlExt::NewL(TRect(), + UiLayout(), + EAknFepVkbCtrlIdVkbCtrl, + NULL); + iVkbCtrl->SetResourceId( R_PENINPUT_LAYOUT_VKB_KEYBOARD ); + iVkbCtrl->ConstructFromResourceL(); + iVkbCtrl->SetKeyTextColorGroup( EAknsCIQsnTextColorsCG68 ); + iVkbLayout->SetVkbKeyboard( iVkbCtrl ); + if (UiLayout()->PenInputType() == EPluginInputModeVkb) + { + iVkbCtrl->SetIrregularKeyBoard(ETrue); + iVkbLayout->SetIrregularResourceId(R_AKN_FEP_VKBCN_IRREGULAR_BITMAP); + iVkbLayout->ConstructFromIrregularResourceL(); + } + else if (UiLayout()->PenInputType() == EPluginInputModeFSQ) + { + iVkbCtrl->SetIrregularKeyBoard(EFalse); + iVkbLayout->SetNonIrregularResourceId(R_AKN_FEP_VKBCN_NONIRREGULAR_BITMAP); + iVkbLayout->ConstructFromNonIrregularResourceL(); + + //set key to be 9 piece graphics + iVkbCtrl->SetKeySkinId( EKeyBmpNormal, KAknsIIDQsnFrKeypadButtonFrNormal ); + iVkbCtrl->SetKeySkinId( EKeyBmpHighlight, KAknsIIDQsnFrKeypadButtonFrPressed ); + iVkbCtrl->SetKeySkinId( EKeyBmpDim, KAknsIIDQsnFrKeypadButtonFrInactive ); + + } + iCtrlPool->AddControl(iVkbCtrl); + + // Add bubble support + iVkbCtrl->ShowBubble(ETrue); + iVkbCtrl->SetGowithPointerDown(ETrue); + iVkbCtrl->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview); //Change the ID when ID into release + + + AddButtonL(EAknFepVkbCtrlIdTouchInputOption, + EVkbEventTouchInputOption, + R_AKN_FEP_VKB_TOUCH_INPUT_OPTION); + + // Enter button + AddButtonL(EAknFepVkbCtrlIdEnterBtn,EVkbEventKeyEnter,R_AKN_FEP_VKB_ENTER, EKeyEnter); + + // Drop down list + AddDropdownListL(); + + // Range bar + AddRangeBarL(); + + // Shift and capslock merged button + CAknFepCtrlMultiModeButton* button = + CAknFepCtrlMultiModeButton::NewLC( UiLayout(), EAknFepVkbCtrlIdShiftBtn ); + if ( button ) + { + // Read resource + TResourceReader reader; + + CCoeEnv::Static()->CreateResourceReaderLC( reader, + R_AKN_FEP_VKB_SHIFT_CAPSLOCK ); + button->SetResourceId( R_AKN_FEP_VKB_SHIFT_CAPSLOCK ); + button->ConstructFromResourceL(); + // Pop and destroy reader + CleanupStack::PopAndDestroy( 1 ); + + // Add into the control pool + iCtrlPool->AddControl( button ); + } + CleanupStack::Pop( button ); + + // Space button + CAknFepCtrlEventButton* spaceButton = AddButtonL( + EAknFepVkbCtrlIdSpaceBtn, + EVkbEventKeySpace, + R_AKN_FEP_VKB_SPACE1, + EKeySpace); + // Create 3-pieces color icon for space button + CPenInput3PiecesColorIcons* colorIcons = + CPenInput3PiecesColorIcons::NewL( R_AKN_FEP_VKB_SPACE_ICON1, + R_AKN_FEP_VKB_SPACE_ICON2, + R_AKN_FEP_VKB_SPACE_ICON3 ); + spaceButton->Set3PiecesColorIcons( colorIcons ); + + //set background of space button to be 9 piece graphics + if ( UiLayout()->PenInputType() == EPluginInputModeFSQ ) + { + spaceButton->SetImageFrameId( KAknsIIDQsnFrKeypadButtonFrNormal, + KAknsIIDQsnFrKeypadButtonFrPressed, + KAknsIIDQsnFrKeypadButtonFrInactive ); + } + + + // switch to hwr button + AddButtonL(EAknFepVkbCtrlIdSwitchToHwrBtn,EVkbEventHwr,R_AKN_FEP_VKB_HWR); + + SetTextProperty(); + + for (TInt i=0; i < iCtrlPool->ControlCount(); i++) + { + if ( iCtrlPool ) + { + iCtrlPool->ControlByIndex(i)->AddEventObserver(UiLayout()); + } + } + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::~CAknFepVkbClientArea +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +CAknFepVkbClientArea::~CAknFepVkbClientArea() + { + delete iVkbLayout; + delete iCtrlPool; + delete iLayoutPool; + delete iKeyMappingMgr; + iRemainedPoolControlIDs.Close(); + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::SizeChanged +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::SizeChanged() + { + TAknTextLineLayout keypadText, compositionText, dropDownText; + + TInt btnWidth = iDataProvider->RequestData(EAknFepDataTypeUnitWidth); + TInt btnHeight = iDataProvider->RequestData(EAknFepDataTypeUnitHeight); + + if (iDataProvider->SizeChanging() || (!iTextPropertySet)) + { + SetTextProperty(); + } + + // modify drop down list font + if (iDataProvider->SizeChanging() || (!iDropdownPropertySet)) + { + TAknTextLineLayout listText = + AknLayoutScalable_Avkon::cell_vkb_candidate_pane_t1().LayoutLine(); + iDropdownList->SetFont(AknLayoutUtils::FontFromId(listText.iFont, NULL)); + //iDropdownList->SetTextColor(AKN_LAF_COLOR_STATIC(listText.iC), ETrue); + + iDropdownList->SizeChanged(btnWidth, btnHeight, btnWidth); + } + + if ( iCurrentImLayout ) + { + //3.Change the postion and size of controls in current layout + ReorganizeControls(iCurrentImLayout, EFalse); + } + + //calculate current vkblayout according current imlayout + if ( iCurrentVkbLayout ) + { + //dimmed some keys if needed + TRAP_IGNORE(DimKeys()); + } + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::ChangeImLayout +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::ChangeImLayout(TInt aImLayout, TBool aChangeVkb) + { + iDataProvider->SetData(EAknFepDataTypeIMLayout, aImLayout); + static_cast(iDataProvider)->ResetUnitSize(); + + TInt currentRange = iDataProvider->RequestData(EAknFepDataTypeCurrentRange); + + CAknFepVkbImLayout* newImLayout = iLayoutPool->GetImLayout(aImLayout); + + if ( iCurrentImLayout != newImLayout) + { + iCurrentImLayout = newImLayout; + if ( currentRange == ERangeNative) + { + iDropdownList->SetRowNum(aImLayout == EAknFepVkbImCnStroke ? + KDropdownRowsForStroke : KDropdownRowsForOthers ); + } + ReorganizeControls(iCurrentImLayout, ETrue); + } + + if ( iRangeBar ) + { + iRangeBar->SetRange(currentRange); + } + + //calculate current vkblayout according current imlayout + if (aChangeVkb) + { + if ( ( currentRange == ERangeEnglish ) || ( currentRange == ERangeAccent ) ) + { + // Change shift and capslock button status according to the current case + TInt curCase = iDataProvider->RequestData( EAknFepDataTypeCase ); + TInt shfit; + TInt capslock; + + switch ( curCase ) + { + case ECaseUpper: + shfit = 0; + capslock = 1; + break; + case ECaseText: + shfit = 1; + capslock = 0; + break; + case ECaseInverseText: + shfit = 1; + capslock = 1; + break; + case ECaseLower: + case ECaseInvalide: + default: + shfit = 0; + capslock = 0; + break; + } + + iDataProvider->SetData( EAknFepDataTypeShfitDown, shfit ); + //ChangeButtonStatus( shfit, EAknFepVkbCtrlIdShiftBtn ); + iDataProvider->SetData( EAknFepDataTypeCapslockDown, capslock ); + //ChangeButtonStatus( capslock, EAknFepVkbCtrlIdCapslockBtn ); + ChangeMergedButtonStatus(shfit, capslock); + + if ( ( shfit && capslock ) || ( !shfit && !capslock ) ) + { + ChangeVkbLayout(); + } + else + { + TAknFepVkbLayout vkbLayout = ShiftCapsSingleVkbLayoutId( currentRange ); + ChangeVkbLayout( vkbLayout ); + } + } + else + { + iDataProvider->SetData( EAknFepDataTypeShfitDown, 0 ); + //ChangeButtonStatus( 0, EAknFepVkbCtrlIdShiftBtn ); + iDataProvider->SetData( EAknFepDataTypeCapslockDown, 0 ); + //ChangeButtonStatus( 0, EAknFepVkbCtrlIdCapslockBtn ); + ChangeMergedButtonStatus(0, 0); + + ChangeVkbLayout(); + } + } + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::ShiftCapsSingleVkbLayoutId +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TAknFepVkbLayout CAknFepVkbClientArea::ShiftCapsSingleVkbLayoutId( TInt aRange ) + { + TInt defaultIMLayout = iDataProvider->RequestData(EAknFepDataTypeDefaultIMLayout); + TInt curLanguage = iDataProvider->RequestData(EAknFepDataTypeInputLanguage); + TAknFepVkbLayout vkbLayout = EAknFepVkbVkbLatinShift; + TInt imLayout = iDataProvider->RequestData(EAknFepDataTypeIMLayout); + + switch (aRange) + { + case ERangeEnglish: + if (curLanguage == ELangTaiwanChinese && defaultIMLayout != EAknFepVkbImCnStroke) + { + vkbLayout = EAknFepVkbVkbLatinForZhuyinShift; + } + else + { + vkbLayout = EAknFepVkbVkbLatinShift; + } + break; + case ERangeNumber: + if (curLanguage == ELangTaiwanChinese && defaultIMLayout != EAknFepVkbImCnStroke) + { + vkbLayout = EAknFepVkbVkbNumberForZhuyinShift; + } + else + { + vkbLayout = EAknFepVkbVkbNumberShift; + } + break; + case ERangeSymbol: + vkbLayout = EAknFepVkbVkbSymbolShift; + break; + case ERangeAccent: + { + TInt accent = iDataProvider->RequestData(EAknFepDataTypeCurrentAccent); + switch (accent) + { + case EAknFepVkbVkbAccented1: + vkbLayout = EAknFepVkbVkbAccentedShfit1; + break; + case EAknFepVkbVkbAccented2: + vkbLayout = EAknFepVkbVkbAccentedShfit2; + break; + case EAknFepVkbVkbAccented3: + vkbLayout = EAknFepVkbVkbAccentedShfit3; + break; + default: + vkbLayout = EAknFepVkbVkbAccentedShfit1; + break; + } + } + + break; + default: + break; + } + return vkbLayout; + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::ChangeVkbLayout +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::ChangeVkbLayout(TInt aVkbLayoutId) + { + TAknFepVkbLayout vkbLayoutId; + TInt range = iDataProvider->RequestData(EAknFepDataTypeCurrentRange); + if ( aVkbLayoutId >= 0 ) + { + CPeninputVkbLayoutInfo* tempLayout = iLayoutPool->GetVkbLayout(aVkbLayoutId); + if ( iCurrentVkbLayout == tempLayout) + { + return; + } + else + { + iCurrentVkbLayout = tempLayout; + } + vkbLayoutId = static_cast(aVkbLayoutId); + } + else + { + + vkbLayoutId = GetDefaultVkbLayout(range); + iCurrentVkbLayout = iLayoutPool->GetVkbLayout(vkbLayoutId); + } + + iVkbLayout->ChangeVkbLayout( vkbLayoutId ); + iVkbLayoutId = aVkbLayoutId; + SetVkbLayoutSize(vkbLayoutId); + + iVkbCtrl->SetRect( TRect( iVkbBoardLeftTop, iLafMgr->KeypadRect().Size() ) ); + + //dimmed some keys if needed + TRAP_IGNORE(DimKeys()); + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::SetVkbLayoutSize +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::SetVkbLayoutSize(TInt aVkbLayoutId) + { + TInt currentRange = iDataProvider->RequestData(EAknFepDataTypeCurrentRange); + TAknFepVkbLayout vkbLayoutid; + + if(aVkbLayoutId < 0) + { + vkbLayoutid = GetDefaultVkbLayout(currentRange); + } + else + { + vkbLayoutid = static_cast(aVkbLayoutId); + } + + CPeninputVkbLayoutInfo* vkbLayout = iLayoutPool->GetVkbLayout( vkbLayoutid ); + + // Calculate current vkblayout according current layout + if ( vkbLayout ) + { + const TInt columns = vkbLayout->Columns(); + const TInt rows = vkbLayout->Rows(); + TRect keyRect; + TRect charRect; + + iLafMgr->SetLayoutType(iLafMgr->LayoutTypeFromRowsColumns(rows,columns)); + + // Set priview popup size + TRect outrect,innerrect; + iLafMgr->GetPreviewWndRect(outrect,innerrect); + iVkbCtrl->SetTextFormat(iLafMgr->PreviewWndText()); //Read laf + iVkbCtrl->SetBubbleSize(TSize(outrect.Width(),outrect.Height())); // Read laf + iVkbCtrl->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); + + if(iDropdownList) + { + iDropdownList->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview); + + iDropdownList->SetTextFormat(iLafMgr->PreviewWndText()); //Read laf + iDropdownList->SetBubbleTextFont(iLafMgr->PreviewFont()); + iDropdownList->SetBubbleSize(TSize(outrect.Width(),outrect.Height())); // Read laf + iDropdownList->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); + } + + for (TInt exter = 0; exter < rows; exter ++) + { + for (TInt inter = 0; inter < columns; inter ++ ) + { + iLafMgr->GetKeyRect(inter,exter, keyRect, charRect); + vkbLayout->SetKeyInfo(exter,inter,keyRect,charRect,iLafMgr->KeyTextFont()); + } + } + TSize curSize = vkbLayout->KeyInfoList()[0]->Key()->Rect().Size(); + + if ( iVkbCtrl->IsIrregularKeyBoard() ) + { + TSize size = + iVkbCtrl->IrregularKeyBitmap(EKeyLeftDown,EKeyStateNormal)->SizeInPixels(); + if ( curSize != size ) + { + for ( TInt i = 0; i <= EKeyRightUp; i++ ) + { + for ( TInt j = 0; j <= EKeyStateDimmedMask; j++ ) + { + AknIconUtils::SetSize( iVkbCtrl->IrregularKeyBitmap( + (TVirtualKeyIrregularKeyType)i,(TVirtualKeyIrregularKeyState)j), + curSize, EAspectRatioNotPreserved ); + + AknIconUtils::SetSize( iVkbCtrl->IrregularKeyBitmap( + (TVirtualKeyIrregularKeyType)i,(TVirtualKeyIrregularKeyState)j), + curSize, EAspectRatioNotPreserved ); + } + } + } + } + else + { + TSize size = iVkbCtrl->NonIrregularKeyBitmap(EKeyBmpNormal)->SizeInPixels(); + if( curSize != size ) + { + for ( TInt i = 0; i <= EKeyBmpLastType; i++ ) + { + if( iVkbCtrl->NonIrregularKeyBitmap((TVirtualKeyBmpType)i) ) + { + AknIconUtils::SetSize( + iVkbCtrl->NonIrregularKeyBitmap((TVirtualKeyBmpType)i), curSize, + EAspectRatioNotPreserved ); + } + } + } + } + } + } + + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::LoopVkbLayout +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::LoopVkbLayout(TVkbShiftType aType, TBool aNotify) + { + TInt currentRange = iDataProvider->RequestData(EAknFepDataTypeCurrentRange); + + if (currentRange!=ERangeNative) + { + TBool shiftDown = iDataProvider->RequestData(EAknFepDataTypeShfitDown); + TBool capslockDown = iDataProvider->RequestData(EAknFepDataTypeCapslockDown); + + if ( aType == EVkbShift) + { + if ((currentRange == ERangeEnglish) || (currentRange == ERangeAccent)) + { + capslockDown = !capslockDown; + iDataProvider->SetData( EAknFepDataTypeCapslockDown, capslockDown ); + ChangeMergedButtonStatus( shiftDown, capslockDown ); + } + } + else if ( aType == EVkbCapslock ) + { + if(static_cast(iDataProvider)->IsShiftPermitted()) + { + if ((currentRange == ERangeEnglish) || (currentRange == ERangeAccent)) + { + shiftDown = !shiftDown; + ChangeMergedButtonStatus( shiftDown, capslockDown ); + iDataProvider->SetData( EAknFepDataTypeShfitDown, shiftDown ); + } + + } + else + { + if(static_cast(iDataProvider)->IsCapsLockPermitted()) + { + capslockDown = !capslockDown; + iDataProvider->SetData( EAknFepDataTypeCapslockDown, capslockDown ); + ChangeMergedButtonStatus( shiftDown, capslockDown ); + } + } + } + else if( aType == EVkbBoth ) + { + if ( shiftDown ) + { + shiftDown = 0; + } + else + { + shiftDown = 1; + } + iDataProvider->SetData( EAknFepDataTypeShfitDown, shiftDown ); + + if ((currentRange == ERangeEnglish) || (currentRange == ERangeAccent)) + { + capslockDown = !capslockDown; + iDataProvider->SetData( EAknFepDataTypeCapslockDown, capslockDown ); + ChangeMergedButtonStatus( shiftDown, capslockDown ); + } + } + else + { + ChangeMergedButtonStatus( shiftDown, capslockDown ); + } + + // Update indicator + TInt caseid = CaseByShiftCapslockStatus(); + + + if ( aNotify && (currentRange == ERangeEnglish || currentRange == ERangeAccent)) + { + TBuf<4> buf; + TInt fepcase = FepCaseByCaseId( caseid ); + iDataProvider->SetData( EAknFepDataTypeCase, fepcase ); + buf.Append(reinterpret_cast(&fepcase), 4); + UiLayout()->LayoutOwner()->SignalOwner( ESignalCaseMode, buf ); + } + + + if ( ( shiftDown && capslockDown ) || ( !shiftDown && !capslockDown ) ) + { + ChangeVkbLayout(); + } + else + { + TAknFepVkbLayout vkbLayout = ShiftCapsSingleVkbLayoutId( currentRange ); + ChangeVkbLayout( vkbLayout ); + } + } + Draw(); + UpdateArea(Rect(), EFalse); + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::FepCaseByCaseId +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CAknFepVkbClientArea::FepCaseByCaseId( TInt aCaseId ) + { + switch ( aCaseId ) + { + case 0: + return ECaseLower; + case 1: + return ECaseText; + case 2: + return ECaseUpper; + case 3: + return ECaseInverseText; + default: + return ECaseLower; + } + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::CaseByShiftCapslockStatus +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CAknFepVkbClientArea::CaseByShiftCapslockStatus() + { + TBool shiftDown = iDataProvider->RequestData(EAknFepDataTypeShfitDown); + TBool capslockDown = iDataProvider->RequestData(EAknFepDataTypeCapslockDown); + + return ( (TInt)capslockDown * 2 + (TInt)shiftDown ); + } + +void CAknFepVkbClientArea::ReorganizeZhuYinControls( TBool aShowArrowKey ) + { + if ( UiLayout()->PenInputType() != EPluginInputModeFSQ ) + { + return; + } + + CAknFepCtrlRepeatButton* arrowUpBtn = static_cast + ( ControlById( EAknFepVkbCtrlIdArrowUpBtn ) ); + CAknFepCtrlRepeatButton* arrowDownBtn = static_cast + ( ControlById( EAknFepVkbCtrlIdArrowDownBtn ) ); + CAknFepCtrlRepeatButton* arrowLeftBtn = static_cast + ( ControlById( EAknFepVkbCtrlIdArrowLeftBtn ) ); + CAknFepCtrlRepeatButton* arrowRightBtn = static_cast + ( ControlById( EAknFepVkbCtrlIdArrowRightBtn ) ); + CAknFepVkbCompositionField* compositionField = static_cast + (ControlById( EAknFepVkbCtrlIdCompositionField)); + CFepCtrlDropdownList* dropdownList = static_cast + (ControlById( EAknFepVkbCtrlIdCandidateList)); + + if ( iDataProvider->RequestData(EAknFepDataTypeIMLayout) == EAknFepVkbImCnZhuyin ) + { + if ( aShowArrowKey ) + { + compositionField->Hide(ETrue); + dropdownList->Hide(ETrue); + arrowUpBtn->Hide(EFalse); + arrowDownBtn->Hide(EFalse); + arrowLeftBtn->Hide(EFalse); + arrowRightBtn->Hide(EFalse); + } + else + { + arrowUpBtn->Hide(ETrue); + arrowDownBtn->Hide(ETrue); + arrowLeftBtn->Hide(ETrue); + arrowRightBtn->Hide(ETrue); + compositionField->Hide(EFalse); + dropdownList->Hide(EFalse); + } + } + else if( iDataProvider->RequestData(EAknFepDataTypeIMLayout) == EAknFepVkbImCnPinyin || + iDataProvider->RequestData(EAknFepDataTypeIMLayout) == EAknFepVkbImCnStroke || + iDataProvider->RequestData(EAknFepDataTypeIMLayout) == EAknFepVkbImCnCangjie ) + { + compositionField->Hide(EFalse); + dropdownList->Hide(EFalse); + } + } + + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::ReorganizeControls +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::ReorganizeControls(CAknFepVkbImLayout* aImLayout, + TBool aImLayoutChanged) + { + // First remove all controls in the group, but don't delete them + Reset(aImLayoutChanged); + + // Then add controls according to the configuration of clientlayout + RPointerArray& controlList = aImLayout->ControlInfoList(); + + TInt count = controlList.Count(); + TInt controlID = 0; + + + CFepUiBaseCtrl* ctrl = NULL; + + TInt range = iDataProvider->RequestData(EAknFepDataTypeCurrentRange); + TInt curLanguage = iDataProvider->RequestData(EAknFepDataTypeInputLanguage); + + TInt vkbLayoutId = GetDefaultVkbLayout(range); + CPeninputVkbLayoutInfo* vkbLayout = iLayoutPool->GetVkbLayout(vkbLayoutId); + + TInt vkbRows = vkbLayout->Rows(); + TInt vkbColumns = vkbLayout->Columns(); + iLafMgr->SetLayoutType(iLafMgr->LayoutTypeFromRowsColumns(vkbRows,vkbColumns)); + + TPeninputCnCellType cellType = GetCellType(vkbColumns); + iCellAidGap = iLafMgr->CellAidGap(cellType); + + TRect rect; + TInt btnWidth = iDataProvider->RequestData(EAknFepDataTypeUnitWidth); + TInt btnHeight = iDataProvider->RequestData(EAknFepDataTypeUnitHeight); + TInt layoutType = iDataProvider->RequestData(EAknFepDataTypeIMLayout); + + TInt candidateHeight = 0; + if ( layoutType == EAknFepVkbImCnZhuyin ) + { + candidateHeight = btnHeight; + } + else if (UiLayout()->PenInputType() != EPluginInputModeFSQ) + { + candidateHeight = iLafMgr->KeypadRect().Height() / vkbRows + 1; + } + else if (UiLayout()->PenInputType() == EPluginInputModeFSQ) + { + candidateHeight = iLafMgr->KeypadRect().Height() / vkbRows; + } + + TSize size; + TInt width = UiLayout()->PenInputType() == EPluginInputModeFSQ ? + iLafMgr->EntirePaneRect().Width() : iLafMgr->KeypadRect().Width(); + if (range == ERangeNative) + { + size = TSize( width, + iLafMgr->KeypadRect().Height() + + ( aImLayout->Rows() - vkbRows - 1)*btnHeight + + candidateHeight); + } + else + { + size = TSize( width, + iLafMgr->KeypadRect().Height() + + ( aImLayout->Rows() - vkbRows)*btnHeight); + } + + if (UiLayout()->PenInputType() == EPluginInputModeFSQ ) + { + TRect screenrect; + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EScreen, screenrect); + + size = screenrect.Size(); + } + + rect.SetSize( size ); + + //Set owner rect + SetWholeWindowRect(rect); + + TInt needJustify = iDataProvider->RequestData(EAknFepDataTypeNeedBRJustify); + if (needJustify) + { + BottomRightJustify(); + iDataProvider->SetData(EAknFepDataTypeNeedBRJustify, EFalse); + } + + TPoint point = Rect().iTl; + TInt i = 0; + // Copy ctrl ID from ctrl pool + iRemainedPoolControlIDs.Reset(); + for( i = 0; i < iCtrlPool->ControlCount(); i++ ) + { + TInt id = iCtrlPool->ControlByIndex(i)->ControlId(); + iRemainedPoolControlIDs.Append(id); + } + + for (i=0;iControlID(); + ctrl = iCtrlPool->Control(controlID); + + if ( ctrl ) + { + + TRAP_IGNORE(AddControlL(ctrl)); + + // Remove control IDs added to the control group in the array + TInt n = iRemainedPoolControlIDs.Find( controlID ); + if( n != KErrNotFound) + iRemainedPoolControlIDs.Remove(n); + } + } + + if ( iCtrlList.Count() != count ) + { + return; + } + TRect optionRect; + TRect compositionRect; + TRect innerRect; + + if (range == ERangeNative) + { + if ( layoutType == EAknFepVkbImCnZhuyin ) + { + // Option Btn + optionRect.iTl = Rect().iTl; + optionRect.SetSize(TSize(btnWidth, btnHeight)); + AknPenImageUtils::CalculateGraphicRect( optionRect, innerRect ); + static_cast + (ControlById(EAknFepVkbCtrlIdTouchInputOption))->SizeChanged(optionRect, + innerRect, + ETrue); + + TRect arrowRect; + TRect innerRect; + + if ( UiLayout()->PenInputType() == EPluginInputModeFSQ ) + { + arrowRect.iTl = TPoint( optionRect.iBr.iX, optionRect.iTl.iY ); + arrowRect.SetSize(TSize(btnWidth + btnWidth, btnHeight)); + AknPenImageUtils::CalculateGraphicRect( arrowRect, innerRect ); + static_cast + ( ControlById( EAknFepVkbCtrlIdArrowUpBtn ) )->SizeChanged(arrowRect, + innerRect, + ETrue); + + arrowRect.iTl = TPoint(arrowRect.iBr.iX, arrowRect.iTl.iY); + arrowRect.SetSize(TSize(btnWidth + btnWidth, btnHeight)); + AknPenImageUtils::CalculateGraphicRect( arrowRect, innerRect ); + static_cast + ( ControlById( EAknFepVkbCtrlIdArrowDownBtn ) )->SizeChanged(arrowRect, + innerRect, + ETrue); + + arrowRect.iTl = TPoint(arrowRect.iBr.iX, arrowRect.iTl.iY); + arrowRect.SetSize(TSize(btnWidth + btnWidth, btnHeight)); + AknPenImageUtils::CalculateGraphicRect( arrowRect, innerRect ); + static_cast + ( ControlById( EAknFepVkbCtrlIdArrowLeftBtn ) )->SizeChanged(arrowRect, + innerRect, + ETrue); + + arrowRect.iTl = TPoint(arrowRect.iBr.iX, arrowRect.iTl.iY); + arrowRect.SetSize(TSize(btnWidth + btnWidth, btnHeight)); + AknPenImageUtils::CalculateGraphicRect( arrowRect, innerRect ); + static_cast + ( ControlById( EAknFepVkbCtrlIdArrowRightBtn ) )->SizeChanged(arrowRect, + innerRect, + ETrue); + } + + compositionRect.iTl = TPoint(optionRect.iBr.iX, optionRect.iTl.iY); + compositionRect.SetSize(TSize(btnWidth * 3 + iCellAidGap, candidateHeight)); + } + else + { + compositionRect.iTl = Rect().iTl; + compositionRect.SetSize(TSize(btnWidth * 3 + iCellAidGap, candidateHeight)); + } + iCompositionField->SetReady(ETrue); + iCompositionField->Hide(EFalse); + iCompositionField->SizeChanged(compositionRect); + + TRect candidateRect; + candidateRect.iTl = TPoint(compositionRect.iBr.iX, compositionRect.iTl.iY); + candidateRect.SetSize(TSize(btnWidth * 6, candidateHeight)); + + static_cast(ControlById( EAknFepVkbCtrlIdCandidateList))-> + SizeChanged(btnWidth, candidateHeight, btnWidth, candidateRect.iTl); + if( iDropdownList && iDropdownList->Hiden() ) + iDropdownList->Hide(EFalse); + + ReorganizeZhuYinControls( ETrue ); + } + else + { + // Hide composition field when is not native range, since + // Hide process also can deregister its tactile feedback + // area, or else click button '3' when it is dimmed will + // cause tactile feedback, because '3' is just at the same + // place in number range as the composition filed in the + // native range. + if (iCompositionField) + iCompositionField->Hide(ETrue); + + if( iDropdownList && !iDropdownList->Hiden() ) + iDropdownList->Hide(ETrue); + } + iVkbBoardLeftTop = Rect().iTl; + if (range == ERangeNative) + { + if( layoutType == EAknFepVkbImCnZhuyin ) + { + iVkbBoardLeftTop = TPoint(optionRect.iTl.iX, optionRect.iBr.iY); + } + else + { + iVkbBoardLeftTop = TPoint(compositionRect.iTl.iX, compositionRect.iBr.iY); + } + } + //TPoint vkbLeftTop = iVkbBoardLeftTop; + iVkbBoardLeftTop.iX += UiLayout()->PenInputType() == EPluginInputModeFSQ ? + iLafMgr->KeypadRect().iTl.iX : 0; + // After update LAF data for grid gap feature, the keyboard height is cut. + // This modification affact FSQ window size. + TInt yAxisOffset = UiLayout()->PenInputType() == EPluginInputModeFSQ ? + 3 : 0; + iVkbBoardLeftTop.iY += yAxisOffset; + + TRect vkbRect = TRect( iVkbBoardLeftTop, iLafMgr->KeypadRect().Size() ); + CPeninputVkbCtrlExt* vkbCtrl = + static_cast(ControlById( EAknFepVkbCtrlIdVkbCtrl)); + vkbCtrl->SetRect( vkbRect ); + vkbCtrl->SetFont( iLafMgr->KeyTextFont() ); + vkbCtrl->SetTextLineLayout( iLafMgr->KeyTextLayout() ); + vkbCtrl->SetTextFormat( iLafMgr->KeyTextLayout() ); //Read laf + + TInt tempHeightForFSQ = btnHeight; + if (UiLayout()->PenInputType() == EPluginInputModeFSQ ) + { + tempHeightForFSQ = btnHeight + 3; + } + + TPoint rangeBarRefPoint = TPoint(vkbRect.iTl.iX, vkbRect.iBr.iY); + rangeBarRefPoint.iY += yAxisOffset; + + if (range != ERangeNative) + { + TRect shiftRect; + shiftRect.iTl = TPoint(Rect().iTl.iX, vkbRect.iBr.iY); + shiftRect.iTl.iY += yAxisOffset; + shiftRect.SetSize(TSize(btnWidth, tempHeightForFSQ)); + AknPenImageUtils::CalculateGraphicRect( shiftRect, innerRect ); + ControlById( EAknFepVkbCtrlIdShiftBtn)->SetReady(ETrue); + static_cast(ControlById( EAknFepVkbCtrlIdShiftBtn))-> + SizeChanged(shiftRect, innerRect, ETrue); + + rangeBarRefPoint = TPoint(shiftRect.iBr.iX, shiftRect.iTl.iY); + } + + TRect rangeBarRect; + //rangeBarRect.iTl = TPoint(shiftRect.iBr.iX, shiftRect.iTl.iY); + rangeBarRect.iTl = rangeBarRefPoint; + rangeBarRect.SetSize(TSize(btnWidth, tempHeightForFSQ)); + static_cast + (ControlById( EAknFepVkbCtrlIdRangeBar))->SizeChanged(rangeBarRect); + rangeBarRect = + static_cast(ControlById( EAknFepVkbCtrlIdRangeBar))->Rect(); + + TRect spaceBtnRect; + TInt spaceWidthCount = 4; + /* if( range == ERangeNumber && UiLayout()->PenInputType() == EPluginInputModeFSQ ) + { + spaceWidthCount = 5; + }*/ + + if (range == ERangeNative || curLanguage == ELangTaiwanChinese) + { + spaceWidthCount = (vkbLayoutId == EAknFepVkbVkbCnZhuyinInitial) ? 6 : 5; + } + + TInt defaultIMLayout = iDataProvider->RequestData(EAknFepDataTypeDefaultIMLayout); + if (curLanguage == ELangTaiwanChinese && + defaultIMLayout == EAknFepVkbImCnStroke && range != ERangeNative) + { + spaceWidthCount = 4; + } + + spaceBtnRect.iTl = TPoint(rangeBarRect.iBr.iX, rangeBarRect.iTl.iY); + spaceBtnRect.SetSize(TSize(btnWidth * spaceWidthCount + iCellAidGap, tempHeightForFSQ)); + //AknPenImageUtils::CalculateGraphicRect( spaceBtnRect, innerRect ); + innerRect = spaceBtnRect; + TSize iconOffset = iLafMgr->GetSpaceIconOffset(); + innerRect.Shrink( iconOffset ); + + static_cast + (ControlById(EAknFepVkbCtrlIdSpaceBtn))->SizeChanged(spaceBtnRect, innerRect, ETrue); + + TRect spaceIconRect = innerRect; + spaceIconRect.Shrink( iLafMgr->GetSpaceSideIconWidth(), 0); + static_cast + (ControlById(EAknFepVkbCtrlIdSpaceBtn))->SetDraw3PieceFrameInfo( + TDraw3PiecesFrame(KAknsIIDQgnIndiInputSpaceL, + KAknsIIDQgnIndiInputSpaceMiddle, + KAknsIIDQgnIndiInputSpaceR, + spaceIconRect)); + + TRect returnBtnRect; + returnBtnRect.iTl = TPoint(spaceBtnRect.iBr.iX, spaceBtnRect.iTl.iY); + returnBtnRect.SetSize(TSize(btnWidth, tempHeightForFSQ)); + AknPenImageUtils::CalculateGraphicRect( returnBtnRect, innerRect ); + static_cast + (ControlById(EAknFepVkbCtrlIdEnterBtn))->SizeChanged(returnBtnRect, innerRect, ETrue); + + TRect inputModeSwitchBtnRect; + inputModeSwitchBtnRect.iTl = TPoint(returnBtnRect.iBr.iX, returnBtnRect.iTl.iY); + inputModeSwitchBtnRect.SetSize(TSize(btnWidth, tempHeightForFSQ)); + AknPenImageUtils::CalculateGraphicRect( inputModeSwitchBtnRect, innerRect ); + static_cast + (ControlById(EAknFepVkbCtrlIdSwitchToHwrBtn))->SizeChanged(inputModeSwitchBtnRect, + innerRect, + ETrue); + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::Reset +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::Reset(TBool aImLayoutChanged) + { + iActiveCtrl = NULL; + iCtrlList.Reset(); + + if (aImLayoutChanged) + { + iVkbCtrl->Reset(); + } + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::HandleControlEvent +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::HandleControlEvent(TInt aEventType, + CFepUiBaseCtrl* aCtrl, + const TDesC& aEventData) + { + TInt* data = (TInt*) aEventData.Ptr(); + TInt layoutType = iDataProvider->RequestData(EAknFepDataTypeIMLayout); + switch (aEventType) + { + case EVkbEventResetShift: + LoopVkbLayout(EVkbCapslock, ETrue); + break; + + case EVkbEventSetPermittedRange: + iRangeBar->SetPermittedRanges(*data); + break; + case EVkbEventPositionChanged: + { + TInt style = *( ( TUint16* ) aEventData.Ptr() ); + CalculatePosition( style ); + } + break; + + //Events need to send to composition field + case EVkbEventWindowClose: + case EVkbEventCandidateSelected: + case EVkbEventCompFieldAnalysisResponse: + case EPeninputLayoutEventBack: + case EVkbEventKeySpace: + case EVkbEventKeyEnter: + case EEventVirtualKeyUp: + case EVkbEventLeftArrow: + case EVkbEventRightArrow: + { + TInt imLayout = iDataProvider->RequestData(EAknFepDataTypeIMLayout); + + if ((imLayout == EAknFepVkbImCnStroke) && (aEventType == EVkbEventKeySpace)) + { + TBuf<1> buf; + buf.Append(KStrokeSeparator); + iCompositionField->HandleControlEvent(aEventType,aCtrl,buf); + } + else if(((imLayout == EAknFepVkbImCnPinyin)) + && (aEventType == EVkbEventKeySpace)) + { + TBuf<1> buf; + buf.Append(KPinyinSeparator); + iCompositionField->HandleControlEvent(aEventType,aCtrl,buf); + } + else + { + iCompositionField->HandleControlEvent(aEventType,aCtrl,aEventData); + } + } + + break; + case EVkbEventCompFieldDataFlush: + UiLayout()->SignalOwner(ESignalKeyEvent,aEventData); + ClearCandidatesInList(); + ReorganizeZhuYinControls( ETrue ); + break; + + case EVkbEventClearContent: + { + TBool isChineseInputting = EFalse; + TInt imLayout = iDataProvider->RequestData(EAknFepDataTypeIMLayout); + if(imLayout == EAknFepVkbImCnPinyin || + imLayout == EAknFepVkbImCnZhuyin || + imLayout == EAknFepVkbImCnStroke || + imLayout == EAknFepVkbImCnCangjie) + { + isChineseInputting = ETrue; + } + + if (isChineseInputting) + { + //Clear context in composition field + iCompositionField->HandleControlEvent(aEventType,aCtrl,aEventData); + } + //Clear all candidates in the list if needed + if ( layoutType!= EAknFepVkbImLatin ) + { + if (isChineseInputting) + { + ClearCandidatesInList(); + } + ReorganizeZhuYinControls( ETrue ); + } + } + break; + case EVkbEventCompFieldNoChars: + //Clear all candidates in the list + ClearCandidatesInList(); + ReorganizeZhuYinControls( ETrue ); + break; + + case EEventControlFocusGained: + if ( *data == ECompotisionFieldGetFocus ) + { + iCompositionField->HandleControlEvent(aEventType,aCtrl,aEventData); + } + break; + case EEventControlFocusLost: + if ( ( aCtrl ) && ( aCtrl->ControlId() == EPeninputWindowCtrlIdMultiLineICF) ) + { + iCompositionField->HandleControlEvent(aEventType,aCtrl,aEventData); + } + break; + //Events sent to composition field are over + + case EVkbEventResetShiftCapslock: +// ChangeButtonStatus(EFalse, EAknFepVkbCtrlIdShiftBtn); +// ChangeButtonStatus(EFalse, EAknFepVkbCtrlIdCapslockBtn); + ChangeMergedButtonStatus(0, 0); + break; + case EVkbEventCandidatesChanged: + { + RPointerArray* list = (RPointerArray*)aCtrl; + if (list && iCompositionField->IsValidSpell() ) + { + ReorganizeZhuYinControls( EFalse ); + if(UiLayout()->PenInputType() == EPluginInputModeFSQ) + { + TRAP_IGNORE(iDropdownList->SetCandidatesL(*list, + CFepCtrlDropdownList::EListExpandableWithBubble)); + } + else + { + TRAP_IGNORE(iDropdownList->SetCandidatesL(*list, + CFepCtrlDropdownList::EListExpandable)); + } + } + else + { + ClearCandidatesInList(); + // Not display arrow keys when composition field get focus + if(!(iCompositionField->IsFocused())) + { + ReorganizeZhuYinControls( ETrue ); + } + } + } + break; + case EVkbEventGetNextPageCandidate: + { + RPointerArray* list = (RPointerArray*)aCtrl; + + if (list) + { + TRAP_IGNORE(iDropdownList->AddCandidatesL(*list, + CFepCtrlDropdownList::EListExpandable)); + } + } + break; + case EVkbEventComposition2Standby: + //Change vkb layout to standy ui state + if ( layoutType == EAknFepVkbImCnPinyin) + { + ChangeVkbLayout(EAknFepVkbVkbCnPinyinInitial); + } + else if ( layoutType == EAknFepVkbImCnZhuyin) + { + ChangeVkbLayout(EAknFepVkbVkbCnZhuyinInitial); + } + else if ( layoutType == EAknFepVkbImCnStroke || EAknFepVkbImCnCangjie) + { + iVkbCtrl->CancelDims(); + } + break; + case EVkbEventStandby2Composition: + TRAP_IGNORE( HandleStandby2CompositionEventL() ); + break; + default: + break; + } + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::CompositionFieldStringLength +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CAknFepVkbClientArea::CompositionFieldStringLength() + { + if ( iCurrentImLayout->FindControlInfo(EAknFepVkbCtrlIdCompositionField) ) + { + if ( iCompositionField ) + { + return iCompositionField->Length(); + } + } + + return 0; + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::GetDefaultVkbLayout +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TAknFepVkbLayout CAknFepVkbClientArea::GetDefaultVkbLayout(const TInt aRange) + { + TInt defaultIMLayout = iDataProvider->RequestData(EAknFepDataTypeDefaultIMLayout); + + TInt curLanguage = iDataProvider->RequestData(EAknFepDataTypeInputLanguage); + TInt imLayout = iDataProvider->RequestData(EAknFepDataTypeIMLayout); + switch (aRange) + { + case ERangeNative: + { + switch (imLayout) + { + case EAknFepVkbImCnPinyin: + return EAknFepVkbVkbCnPinyinInitial; + case EAknFepVkbImCnZhuyin: + return EAknFepVkbVkbCnZhuyinInitial; + case EAknFepVkbImCnStroke: + return EAknFepVkbVkbCnStroke; + case EAknFepVkbImCnCangjie: + return EAknFepVkbVkbCnCangjie; + } + } + if (curLanguage == ELangTaiwanChinese && defaultIMLayout != EAknFepVkbImCnStroke) + { + return EAknFepVkbVkbLatinForZhuyin; + } + else + { + return EAknFepVkbVkbLatin; + } + case ERangeEnglish: + if (curLanguage == ELangTaiwanChinese && defaultIMLayout != EAknFepVkbImCnStroke) + { + return EAknFepVkbVkbLatinForZhuyin; + } + else + { + return EAknFepVkbVkbLatin; + } + + case ERangeNumber: + if (curLanguage == ELangTaiwanChinese && defaultIMLayout != EAknFepVkbImCnStroke) + { + return EAknFepVkbVkbNumberForZhuyin; + } + else + { + return EAknFepVkbVkbNumber; + } + case ERangeSymbol: + return EAknFepVkbVkbSymbol; + case ERangeAccent: + { + TInt accent = iDataProvider->RequestData(EAknFepDataTypeCurrentAccent); + switch (accent) + { + case EAknFepVkbVkbAccented1: + return EAknFepVkbVkbAccented1; + case EAknFepVkbVkbAccented2: + return EAknFepVkbVkbAccented2; + case EAknFepVkbVkbAccented3: + return EAknFepVkbVkbAccented3; + default: + return EAknFepVkbVkbAccented1; + } + } + default: + if (curLanguage == ELangTaiwanChinese && defaultIMLayout != EAknFepVkbImCnStroke) + { + return EAknFepVkbVkbLatinForZhuyin; + } + else + { + return EAknFepVkbVkbLatin; + } + } + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::SetWholeWindowRect +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::SetWholeWindowRect(const TRect& aRect) + { + TRect rect = aRect; + + TInt btnHeight = iDataProvider->RequestData(EAknFepDataTypeUnitHeight); + //rect.iTl.iY = rect.iTl.iY - iDataProvider->RequestData(EAknFepDataTypeUnitHeight) * 2; + TInt imLayout = iDataProvider->RequestData(EAknFepDataTypeIMLayout); + TInt titlebarHeight = iDataProvider->RequestData(EAknFepDataTypeTitleBarHeight); + + rect.iTl.iY = aRect.iTl.iY - titlebarHeight; + + + iTopParent->SetRect(rect); + + TPoint tl = TPoint( iTopParent->Rect().iTl.iX, + iTopParent->Rect().iTl.iY + titlebarHeight ); + + //rect.SetSize(TSize((10 * iUnitWidth), iDataProvider->RequestData(EAknFepDataTypeUnitHeight) * 2 + 6 * iUnitHeight)); + + SetRect( TRect( tl, iTopParent->Rect().iBr ) ); + + + } + +// --------------------------------------------------------------------------- +// CAknFepVkbWindow::CalculatePosition +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::CalculatePosition( TInt aJustifyMode ) + { + switch ( aJustifyMode ) + { + case EVkbPositionChangeBrJustify: + BottomRightJustify(); + break; + + case EVkbPositionChangeDataQuery: + //BottomRightJustify(); + DataQueryJustify(); + break; + + /*case EVkbPositionChangeNone: + break;*/ + + default: + TopLeftJustify(); + break;; + } + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::TopLeftJustify +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::TopLeftJustify() + { + // Read position from datamgr + TRect newRect = TRect(UiLayout()->Position(),UiLayout()->Rect().Size()); + TPoint tl = UiLayout()->Position(); + + if (tl.iX < 0) + { + tl.iX = 0; + } + + if (tl.iY < 0) + { + tl.iY = 0; + } + + newRect.iTl = tl; + newRect.SetSize(iTopParent->Rect().Size()); + + if (newRect != UiLayout()->Rect()) + { + //Write the new position into CenRep + TInt x = 0; + TInt y = 0; + x = 0x0000FFFF & newRect.iBr.iX; + y = 0xFFFF0000 & ( newRect.iBr.iY << 16 ); + iDataProvider->SetData(EAknFepDataTypeWindowPosition,x | y); + } + + //Set the layout position + UiLayout()->SetRect(newRect); + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::BottomRightJustify +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::BottomRightJustify() + { + if(UiLayout()->PenInputType() == EPluginInputModeFSQ) + { + return; + } + + // Read position from datamgr + TRect newRect = TRect(UiLayout()->Position(),UiLayout()->Rect().Size()); + TPoint oldbr,br; + TPoint tl; + TSize screenSize; + + TInt screenSizeData = iDataProvider->RequestData(EAknFepDataTypeScreenSize); + screenSize.iWidth = screenSizeData & 0x0000FFFF; + screenSize.iHeight = ( screenSizeData & 0xFFFF0000 ) >> 16; + + TRect screenRect = TRect(TPoint(0,0),screenSize); + + TInt windowPosition = iDataProvider->RequestData(EAknFepDataTypeWindowPosition); + + oldbr.iX = windowPosition & 0x0000FFFF; + oldbr.iY = ( windowPosition & 0xFFFF0000 ) >> 16; + + br = oldbr; + + if ( !screenRect.Contains(br) ) + { + if (screenSize.iWidth < br.iX) + { + br.iX = screenSize.iWidth; + } + if (screenSize.iHeight < br.iY) + { + br.iY = screenSize.iHeight; + } + } + + // Check the top left point is in screen + tl.iX = br.iX - UiLayout()->Rect().Width(); + if (tl.iX < 0) + { + tl.iX = 0; + } + + tl.iY = br.iY - UiLayout()->Rect().Height(); + if (tl.iY < 0) + { + tl.iY = 0; + } + + if (UiLayout()->PenInputType() == EPluginInputModeFSQ) + { + tl.iX = 0; + tl.iY = 0; + } + newRect.iTl = tl; + newRect.SetSize(UiLayout()->Rect().Size()); + + if (oldbr != newRect.iBr) + { + //Write the new position into CenRep + TInt x = 0; + TInt y = 0; + x = 0x0000FFFF & newRect.iBr.iX; + y = 0xFFFF0000 & ( newRect.iBr.iY << 16 ); + iDataProvider->SetData(EAknFepDataTypeWindowPosition,x | y); + + //Set the layout position + UiLayout()->SetRect(TRect(tl,newRect.Size())); + } + + //Set the layout position + UiLayout()->SetRect(newRect); + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::DataQueryJustify +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::DataQueryJustify() + { + TRect* dataQueryRect = (TRect*) (iDataProvider->RequestData(EAknFepDataTypeDataQueryRect)); + + TRect rect = TRect(UiLayout()->Position(),UiLayout()->Rect().Size()); + + CCoeEnv* coeEnv = CCoeEnv::Static(); + TPixelsTwipsAndRotation ptSize; + coeEnv->ScreenDevice()->GetDefaultScreenSizeAndRotation(ptSize); + + // Landscape mode: move window to the br of the screen + if (ptSize.iPixelSize.iWidth > ptSize.iPixelSize.iHeight) + { + rect.SetRect(ptSize.iPixelSize.iWidth - rect.Width(), + ptSize.iPixelSize.iHeight/2 - rect.Height()/2, + ptSize.iPixelSize.iWidth, + ptSize.iPixelSize.iHeight/2 + rect.Height()/2); + } + // Portrait mode: dodge the dataquery + else if ( rect.Intersects(*dataQueryRect) ) + { + TInt Y = dataQueryRect->iTl.iY; + TInt height = rect.iBr.iY - rect.iTl.iY; + rect.iTl.iY = Y - height; + rect.iBr.iY = Y; + if( rect.iTl.iY <0 ) + { + rect.iTl.iY = 0; + rect.iBr.iY = height; + } + } + + + //Write the new position into CenRep + TInt x = 0; + TInt y = 0; + x = 0x0000FFFF & rect.iBr.iX; + y = 0xFFFF0000 & ( rect.iBr.iY << 16 ); + iDataProvider->SetData(EAknFepDataTypeWindowPosition,x | y); + + //Set the layout position + UiLayout()->SetRect(rect); + + /* + TInt fontHeight = aData & 0x0000FFFF; + + TInt bottomY = ( aData & 0xFFFF0000 ) >> 16; + + if ( ( (bottomY - fontHeight) >= UiLayout()->Rect().iBr.iY ) + || ( (bottomY + fontHeight) <= UiLayout()->Rect().iTl.iY ) ) + { + return; + } + else + { + tl = UiLayout()->Rect().iTl; + br = UiLayout()->Rect().iBr; + TInt middleY = UiLayout()->Rect().iTl.iY + UiLayout()->Rect().Height() / 2; + if ( middleY <= bottomY ) + { + br.iY = bottomY - fontHeight; + tl.iY = br.iY - UiLayout()->Rect().Height(); + if (tl.iY < 0) // Then skip to the bottom of the current editor + { + tl.iY = bottomY + fontHeight; + br.iY = tl.iY + UiLayout()->Rect().Height(); + } + } + else + { + tl.iY = bottomY + fontHeight; + br.iY = tl.iY + UiLayout()->Rect().Height(); + if (br.iY > screenSize.iHeight) + { + br.iY = bottomY - fontHeight; + tl.iY = br.iY - UiLayout()->Rect().Height(); + } + } + + TInt x = 0; + TInt y = 0; + x = 0x0000FFFF & br.iX; + y = 0xFFFF0000 & ( br.iY << 16 ); + iDataProvider->SetData(EAknFepDataTypeWindowPosition,x | y); + } + */ + } + + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::SetTopParent +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::SetTopParent(CFepUiBaseCtrl* aParent) + { + iTopParent = aParent; + } + + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::AddDropdownListL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::AddDropdownListL() + { + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader,R_AKN_FEP_VKB_DROP_DOWN_LIST); + + if (!iDataProvider->UnitShadowSizeSet()) + { + iDataProvider->ReadUnitShadowSize(); + } + + + TInt btnWidth = iDataProvider->RequestData(EAknFepDataTypeUnitWidth); + TInt btnHeight = iDataProvider->RequestData(EAknFepDataTypeUnitHeight); + + + TAknTextLineLayout listText = + AknLayoutScalable_Avkon::cell_vkb_candidate_pane_t1().LayoutLine(); + + TDropdownListDrawInfo candiDrawInfo(KAknsIIDQsnFrFunctionButtonInactive, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrItutButtonCandiSideL, + KAknsIIDQsnFrItutButtonCandiMiddle, + KAknsIIDQsnFrItutButtonCandiSideR, + KAknsIIDQsnFrItutButtonCandiPressedSideL, + KAknsIIDQsnFrItutButtonCandiPressedMiddle, + KAknsIIDQsnFrItutButtonCandiPressedSideR, + TRgb(194, 221, 242), + ETrue); + + iDropdownList = CFepCtrlDropdownList::NewL(TPoint(0,btnWidth), + UiLayout(), + EAknFepVkbCtrlIdCandidateList, + reader, + 0, + 0, + btnWidth, + 6, + 4, + AknLayoutUtils::FontFromId(listText.iFont, NULL), + NULL, + CGraphicsContext::ECenter, + 3, + KRgbBlack, // border color + TRgb(0xeeeeee), // content bg color + KRgbWhite, // navi bg color + AKN_LAF_COLOR_STATIC(listText.iC), + KRgbRed); + + iDropdownPropertySet = ETrue; + + iDropdownList->SetResourceId(R_AKN_FEP_VKB_DROP_DOWN_LIST); + iDropdownList->SetEventIdForCandidateSelected(EVkbEventCandidateSelected); + iDropdownList->SetEventIdForNextPageCandidate(EVkbEventGetNextPageCandidate); + iDropdownList->SetEventIdForPreviousPageCandidate(EVkbEventGetPreviousPageCandidate); + iDropdownList->SetEventIdForCandidateExisted(EVkbEventQueryCandidateExisted); + iDropdownList->SetDropdownListImgID(candiDrawInfo); + //iDropdownList->AddEventObserver(UiLayout()); + CleanupStack::PopAndDestroy(); // reader + if ( iCtrlPool ) + { + iCtrlPool->AddControl(iDropdownList); + } + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::AddButtonL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +CAknFepCtrlEventButton* CAknFepVkbClientArea::AddButtonL(const TInt aControlId, + const TInt aEventId, + const TInt aResId, + const TInt aUnicode, + const TBool aIsRepeat) + { + CAknFepCtrlEventButton* button = NULL; + + if ( aIsRepeat ) + { + button = CAknFepCtrlRepeatButton::NewL( UiLayout(), + aControlId, + aEventId, + aUnicode, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrFunctionButtonInactive); + } + else + { + button = CAknFepCtrlEventButton::NewL(UiLayout(), + aControlId, + aEventId, + aUnicode, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrFunctionButtonInactive); + } + + if ( button ) + { + // Read resource + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, aResId); + button->SetResourceId( aResId ); + button->ConstructFromResourceL(); + CleanupStack::PopAndDestroy(); // reader + + // Add into the control pool + if ( iCtrlPool ) + { + iCtrlPool->AddControl(button); + } + } + return button; + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::AddRangeBarL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::AddRangeBarL() + { + // Range bar + iRangeBar = CAknFepCtrlRangeBar::NewL(UiLayout(), + EAknFepVkbCtrlIdRangeBar, + CAknFepCtrlRangeBar::EBtnGroupHorizontal); + + iRangeBar->SetActionStyle( CAknFepCtrlRangeBar::ERangeBarActionStyleHighLight ); + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, R_AKN_FEP_VKB_RANGE_LIST); + iRangeBar->ConstructFromResourceL(reader); + CleanupStack::PopAndDestroy(); // reader + + //Set event id + iRangeBar->SetEventIdForRange(EVkbEventSetRange); + + iCtrlPool->AddControl(iRangeBar); + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::ChangeMergedButtonStatus +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::ChangeMergedButtonStatus( + const TInt aIsShiftCase, + const TInt aIsCapslockCase ) + { + CAknFepCtrlMultiModeButton* button = + static_cast + (ControlById( EAknFepVkbCtrlIdShiftBtn ) ); + + if( !button ) + { + return; + } + switch ( aIsCapslockCase * 2 + aIsShiftCase ) + { + case 1: // text case + { + TRAP_IGNORE( button->SetCurrentModeL( EBtnBmpActive, 1 ) ); + button->SetHighlight( ETrue ); + } + break; + case 2: // upper case + { + TRAP_IGNORE( button->SetCurrentModeL( EBtnBmpActive, 2 ) ); + button->SetHighlight( ETrue ); + } + break; + default: + { + TRAP_IGNORE( button->SetCurrentModeL( EBtnBmpActive, 0 ) ); + button->SetHighlight( EFalse ); + } + break; + } + } + + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::CompositionField +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +CFepLayoutEditAreaBase* CAknFepVkbClientArea::CompositionField() + { + if ( iCurrentImLayout && iCurrentImLayout->FindControlInfo(EAknFepVkbCtrlIdCompositionField) ) + { + return iCompositionField; + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::AddControlL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::AddControlL(CFepUiBaseCtrl* aControl) + { + //do nothing if we already has the control. + if(KErrNotFound != iCtrlList.Find(aControl)) + return; + + if(aControl) + { + aControl->SetReady( Ready() ); + iCtrlList.AppendL(aControl); + + RRegion region(8); + region.Copy(Region()); + + region.AddRect(aControl->Rect()); + SetRegion(region); + } + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::DimKeys +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::DimKeys() + { + TRAP_IGNORE(DimKeysL()); + } + +void CAknFepVkbClientArea::DimKeysL() + { + iVkbCtrl->CancelDims(); + TInt currentRange = iDataProvider->RequestData(EAknFepDataTypeCurrentRange); + TInt permitRange = iDataProvider->RequestData(EAknFepDataTypePermittedRange); + if ( (currentRange == ERangeNumber ) + && ( permitRange == ERangeNumber ) ) + { + TInt keyMapping = iDataProvider->RequestData(EAknFepDataTypeNumericKeymap); + HBufC* rs = NULL; + if ( keyMapping == EKeymapFromResource ) + { + HBufC* customRes = + (HBufC*) iDataProvider->RequestData(EAknFepDataTypeUseDefinedResource); + _LIT(KTenNumbers,"0123456789"); + rs = HBufC::NewL(KTenNumbers().Length() + customRes->Length()); + rs->Des().Copy(*customRes); + rs->Des().Append(KTenNumbers); + iVkbCtrl->DimKeys(rs); + } + else + { + rs = iKeyMappingMgr->KeyMappingStringL(keyMapping); + iVkbCtrl->DimKeys(rs); + } + + delete rs; + } + iVkbCtrl->Draw(); + UpdateArea(iVkbCtrl->Rect(), EFalse); + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::ClearCandidatesInList +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::ClearCandidatesInList() + { + RPointerArray candidates; + if(UiLayout()->PenInputType() == EPluginInputModeFSQ) + { + TRAP_IGNORE(iDropdownList->SetCandidatesL(candidates, + CFepCtrlDropdownList::EListNoExpandableWithBubble)); + } + else + { + TRAP_IGNORE(iDropdownList->SetCandidatesL(candidates, + CFepCtrlDropdownList::EListNoExpandable)); + } + + iDataProvider->SetData(EAknFepDataTypeCandidateCount,0); + candidates.Close(); + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::NeedCreateWord +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TBool CAknFepVkbClientArea::NeedCreateWord() + { + return iCompositionField->NeedCreateWord(); + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::SetNextCandidateExistFlag +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::SetNextCandidateExistFlag(TBool aFlag) + { + iDropdownList->SetFlagCandidateExist(aFlag); + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::ConstructFromResourceL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::ConstructFromResourceL() + { + CControlGroup::ConstructFromResourceL(); + // Construct for rest controls not in the control group + for(TInt i = 0; i < iRemainedPoolControlIDs.Count(); i++ ) + { + iCtrlPool->Control( iRemainedPoolControlIDs[i] )->ConstructFromResourceL(); + } + + if( iVkbLayout ) + { + if( iVkbCtrl->IsIrregularKeyBoard() ) + iVkbLayout->ConstructFromIrregularResourceL(); + else + iVkbLayout->ConstructFromNonIrregularResourceL(); + SetVkbLayoutSize( iVkbLayoutId ); + } +// iVkbLayout->ConstructFromResourceL(); + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::SetEnableSwitchToHwr +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::SetEnableSwitchToHwr(TBool aEnable) + { + CAknFepCtrlEventButton* switchToHwrBtn = static_cast + ( iCtrlPool->Control( EAknFepVkbCtrlIdSwitchToHwrBtn ) ); + + if ( aEnable ) + { + switchToHwrBtn->SetDimmed(EFalse); + } + else + { + switchToHwrBtn->SetDimmed(ETrue); + switchToHwrBtn->SetActive(EFalse); + } + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::ActiveCurrentRange +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +void CAknFepVkbClientArea::ActiveCurrentRange() + { + TInt curRange = iDataProvider->RequestData(EAknFepDataTypeCurrentRange); + + if ( iRangeBar ) + { + iRangeBar->SetRange(curRange); + } + } + +// --------------------------------------------------------------------------- +// CAknFepVkbClientArea::GetCreatedWordSpell +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +TPtrC CAknFepVkbClientArea::GetCreatedWordSpell() + { + return iCompositionField->GetCreatedWordSpell(); + } + +TPeninputCnCellType CAknFepVkbClientArea::GetCellType(TInt aColumns) + { +/* TInt curRange = iDataProvider->RequestData(EAknFepDataTypeCurrentRange); + TBool zhuyinIm = iDataProvider->RequestData(EAknFepDataTypeIMLayout) == EAknFepVkbImCnZhuyin; + TPeninputCnCellType cellType; + + if( UiLayout()->PenInputType() == EPluginInputModeFSQ ) + { + cellType = ( aColumns == 10 )? EVkbCangjieAndPinying_FSQ : EVkbZhuyin_FSQ; + } + else if( UiLayout()->PenInputType() == EPluginInputModeVkb ) + { + if (curRange == ERangeEnglish) + { + cellType = EVkbLatin; + } + if (curRange == ERangeNumber) + { + cellType = EVkbNumber; + } + if (curRange == ERangeAccent) + { + cellType = EVkbAccent; + } + else + { + cellType = ( zhuyinIm )? EVkbZhuyin : EVkbCangjieAndPinying; + } + }*/ + TInt curLanguage = iDataProvider->RequestData(EAknFepDataTypeInputLanguage); + + TPeninputCnCellType cellType = EVkbCangjieAndPinying; + if( UiLayout()->PenInputType() == EPluginInputModeFSQ ) + { + if (aColumns == 10) + { + cellType = EVkbCangjieAndPinying_FSQ; + } + else if(aColumns == 11) + { + cellType = EVkbZhuyin_FSQ; + } + } + else + { + if (aColumns == 10) + { + cellType = EVkbCangjieAndPinying; + } + else if(aColumns == 11) + { + cellType = EVkbZhuyin; + } + } + return cellType; + } + +void CAknFepVkbClientArea::ShowBubble(TBool aShow) + { + if (iVkbCtrl) + { + iVkbCtrl->ShowBubble(aShow); + } + if(iDropdownList) + { + iDropdownList->ShowBubble(aShow); + } + } + + +void CAknFepVkbClientArea::DimArrowKeys( TBool aDimArrow ) + { + static_cast + ( iCtrlPool->Control( EAknFepVkbCtrlIdArrowUpBtn ) )->SetDimmed(aDimArrow); + static_cast + ( iCtrlPool->Control( EAknFepVkbCtrlIdArrowDownBtn ) )->SetDimmed(aDimArrow); + static_cast + ( iCtrlPool->Control( EAknFepVkbCtrlIdArrowLeftBtn ) )->SetDimmed(aDimArrow); + static_cast + ( iCtrlPool->Control( EAknFepVkbCtrlIdArrowRightBtn ) )->SetDimmed(aDimArrow); + } +void CAknFepVkbClientArea::HandleStandby2CompositionEventL() + { + TInt layoutType = iDataProvider->RequestData(EAknFepDataTypeIMLayout); + //Change vkb layout to composition ui state + ReorganizeZhuYinControls( EFalse ); + + if ( layoutType == EAknFepVkbImCnPinyin) + { + ChangeVkbLayout(EAknFepVkbVkbCnPinyinComposition); + } + else if ( layoutType == EAknFepVkbImCnZhuyin) + { + ChangeVkbLayout(EAknFepVkbVkbCnZhuyinComposition); + } + else if ( layoutType == EAknFepVkbImCnStroke || EAknFepVkbImCnCangjie) + { + HBufC* symbolNumSet = HBufC::NewLC( KLengthSymbolNeedToFilter ); + + for (TInt index = 0; index < KLengthSymbolNeedToFilter; index ++) + { + symbolNumSet->Des().Append( KSymbolsNeedToFilter[index] ); + } + + iVkbCtrl->DimKeySet( symbolNumSet, ETrue ); + CleanupStack::PopAndDestroy( symbolNumSet ); + } + } +// End Of File