diff -r 000000000000 -r eb1f2e154e89 textinput/peninputsplititut/src/peninputsplititutwindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputsplititut/src/peninputsplititutwindow.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,1278 @@ +/* +* 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: drop-down list control +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include + +#include "peninputsplititutwindow.h" +#include "peninputsplititutdatamgr.h" +#include "peninputsplititutuimgrbase.h" +#include "peninputsplititutuistatebase.h" +#include "peninputsplititutchnuimgr.h" +#include "peninputsplititutwesternuimgr.h" +#include "peninputsplititutconverter.h" +#include "peninputcommonbgctrl.h" + +_LIT(KBmpFileName, "z:\\resource\\apps\\peninputsplititut.mbm"); + +const TInt KImageMajorSkinId = EAknsMajorGeneric; +const TUint KDefaultSpellTextColor = 0; + +const TInt KSpaceUnicode = 32; +const TInt KButtonOneUnicode = 49; +const TInt KInvalidBmp = -1; + + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// CSplitItutWindow::NewL +// --------------------------------------------------------------------------- +// +CSplitItutWindow* CSplitItutWindow::NewL(CSplitItutWindowManager* aWindowMgr, + CSplitItutUiLayout* aLayoutOwner, + CSplitItutDataMgr* aDataMgr) + { + CSplitItutWindow* window = new (ELeave) CSplitItutWindow(aWindowMgr,aLayoutOwner,aDataMgr); + + CleanupStack::PushL(window); + window->ConstructL(); + CleanupStack::Pop(window); + + return window; + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CSplitItutWindow +// --------------------------------------------------------------------------- +// +CSplitItutWindow::CSplitItutWindow(CSplitItutWindowManager* aWindowMgr, + CSplitItutUiLayout* aLayoutOwner, + CSplitItutDataMgr* aDataMgr) + : iDataMgr(aDataMgr), + iLayoutOwner(aLayoutOwner), + iWindowMgr(aWindowMgr) + { + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::~CSplitItutWindow +// --------------------------------------------------------------------------- +// +CSplitItutWindow::~CSplitItutWindow() + { + delete iBmpRotator; + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::SetPropertyL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::SetPropertyL(MItutPropertySubscriber::TItutProperty aPropertyName, + const TDesC& aPropertyValue) + { + switch (aPropertyName) + { + case MItutPropertySubscriber::EItutPropertyKeypadResourceId: + case MItutPropertySubscriber::EItutPropertyCandidateListResourceId: + { + TInt resId = TItutDataConverter::AnyToInt(const_cast(aPropertyValue.Ptr())); + + if (resId == KInvalidResId) + { + return; + } + + if (aPropertyName == MItutPropertySubscriber::EItutPropertyKeypadResourceId) + { + ConstructItutKeypadFromResourceL(resId); + } + else if (iCandsList) + { + iCandsList->ResetAndClear(CFepCtrlDropdownList::EListExpandable); + iCandsList->SetResourceId(resId); + iCandsList->ConstructFromResourceL(); + } + } + break; + case MItutPropertySubscriber::EItutPropertyLandscape: + { + TBool landscape = *((TInt*)(aPropertyValue.Ptr())); + + if (iDataMgr->IsChinese()) + { + if (landscape) + { + // expand upward + iSpellCandsList->SetCandExpandType(CFepCtrlDropdownList::ECandExpandUpward); + iCandsList->SetCandExpandType(CFepCtrlDropdownList::ECandExpandUpward); + } + else + { + // portrait, expand downward + iSpellCandsList->SetCandExpandType(); + iCandsList->SetCandExpandType(); + } + } + } + break; + default: + break; + } + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CreateItutKeypadL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::CreateItutKeypadL() + { + TRect keypadRect = TItutDataConverter::AnyToRect(iDataMgr->RequestData(EKeypadRect)); + + TFontSpec spec; + + iStandardItutKp = CVirtualKeyboard::NewL(keypadRect, + iLayoutOwner, + ECtrlIdStdItut, + spec); + AddControlL(iStandardItutKp); + + iStandardItutKp->SetResourceId(KInvalidResId); + + // read keypad image info + ConstructKeyImageFromResourceL( R_ITUT_KEYPAD_BITMAP ); + + iStandardItutKp->SetKeyTextColorGroup( EAknsCIQsnTextColorsCG68 ); + iStandardItutKp->SetDrawOpaqueBackground(EFalse); + + // read key shift icon res + CPenInputColorIcon* shiftIcon = CPenInputColorIcon::NewL( R_ITUT_KEYPAD_SHIFT_ICON ); + shiftIcon->ResizeL( iDataMgr->iShiftIconRect.Size() ); + iStandardItutKp->SetShiftIcon( shiftIcon ); + + //set key to be 9 piece graphics + iStandardItutKp->SetKeySkinId( EKeyBmpNormal, KAknsIIDQsnFrKeypadButtonFrNormal ); + iStandardItutKp->SetKeySkinId( EKeyBmpHighlight, KAknsIIDQsnFrKeypadButtonFrPressed ); + iStandardItutKp->SetKeySkinId( EKeyBmpDim, KAknsIIDQsnFrKeypadButtonFrInactive ); + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CreateLayoutIconL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::CreateLayoutIconL(TInt aMajorSkinId, + TInt aMinorSkinId, + const TDesC& aBmpFileName, + TInt aBmpId, + TInt aMaskBmpId, + CFbsBitmap*& aBmp, + CFbsBitmap*& aMaskBmp, + TSize aSize) + { + TAknsItemID id; + MAknsSkinInstance* skininstance = AknsUtils::SkinInstance(); + id.Set(TInt(aMajorSkinId), aMinorSkinId); + + if (aBmpId != KInvalidBmp) + { + if (aMaskBmpId != KInvalidBmp) + { + AknsUtils::CreateIconL(skininstance, + id, + aBmp, + aMaskBmp, + aBmpFileName, + aBmpId, + aMaskBmpId); + AknIconUtils::SetSize(aMaskBmp, aSize, EAspectRatioNotPreserved); + } + else + { + AknsUtils::CreateIconL(skininstance, + id, + aBmp, + aBmpFileName, + aBmpId); + } + + AknIconUtils::SetSize(aBmp, aSize, EAspectRatioNotPreserved); + } + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::ConstructItutKeypadFromResourceL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::ConstructItutKeypadFromResourceL(TInt aResId) + { + iStandardItutKp->SetResourceId(aResId); + + iStandardItutKp->SetTextLineLayout( + TItutDataConverter::AnyToTextLine(iDataMgr->RequestData(EKeypadLeftTextLine)), + EPosLeft); + iStandardItutKp->SetTextLineLayout( + TItutDataConverter::AnyToTextLine(iDataMgr->RequestData(EKeypadRightTextLine1)), + EPosRight1); + iStandardItutKp->SetTextLineLayout( + TItutDataConverter::AnyToTextLine(iDataMgr->RequestData(EKeypadRightTextLine2)), + EPosRight2); + iStandardItutKp->SetTextLineLayout( + TItutDataConverter::AnyToTextLine(iDataMgr->RequestData(EKeypadRightTextLine3)), + EPosRight3); + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, aResId); + + // construct keys + TInt countkeys = reader.ReadInt16(); + + RPointerArray& keys = + const_cast&>(iStandardItutKp->KeyArray()); + + if (keys.Count() == 0) + { + for (TInt i = 0; i < countkeys; i++) + { + RArray& cellrects = + TItutDataConverter::AnyToRectArray(iDataMgr->RequestData(EKeypadCellRects)); + + CVirtualKey* vk = CreateKeyL(reader, + cellrects[i]); + CleanupStack::PushL(vk); + iStandardItutKp->AddRawKeyL(vk); + CleanupStack::Pop(vk); + } + } + else + { + countkeys = keys.Count(); + for (TInt i = 0; i < countkeys; i++) + { + ChangeVirtualKeyInfoL(reader, keys[i]); + } + } + + CleanupStack::PopAndDestroy(1); // reader + + iStandardItutKp->Draw(); + iStandardItutKp->UpdateArea( iStandardItutKp->Rect() ); + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::ChangeVirtualKeyInfoL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::ChangeVirtualKeyInfoL( TResourceReader& aReader, + CVirtualKey* aKey) + { + + TBuf<5> mapData; + //Init Data + for (TInt i = 0; i < 5; i++) + { + mapData.Append(0); + } + + RPointerArray unicodesArr; + for (TInt i = 0; i <= EPosLast; i++) + { + HBufC* unicode = aReader.ReadHBufCL(); + if (i == 0 && unicode != NULL) + { + mapData = unicode->Des(); + } + unicodesArr.AppendL(unicode); + } + + TInt keyscancode = aReader.ReadInt16(); + if (keyscancode != aKey->ScanCode()) + { + return; + } + + TInt curMode = TItutDataConverter::AnyToInt( + iLayoutOwner->DataMgr()->RequestData(EInputMode)); + TBool isChinese = iLayoutOwner->DataMgr()->IsChinese(); + TBool isThai = iLayoutOwner->DataMgr()->IsThai(); + + TInt latinOnly = TItutDataConverter::AnyToInt( + iLayoutOwner->DataMgr()->RequestData(ELatinOnly)); + + //No symbol in Number range. Symbols under chinese are read from res + if ( curMode != ENumber && curMode != ENativeNumber + && iSymbolData.iSymbol1 != 0 && keyscancode == KButtonOneUnicode + && ( !isChinese || latinOnly ) + && ( !isThai ) ) + { + //So we should delete it + for (TInt i = 0; i <= EPosLast; i++) + { + delete unicodesArr[i]; + } + SetUnicodesForHardKey1(aKey, mapData); + } + else + { + aKey->SetUnicodesL(unicodesArr); + } + + unicodesArr.Close(); + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CreateKeyL +// --------------------------------------------------------------------------- +// +CVirtualKey* CSplitItutWindow::CreateKeyL(TResourceReader& aReader, + TRect aKeyRect) + { + RPointerArray unicodesArr; + for (TInt i = 0; i <= EPosLast; i++) + { + HBufC* unicode = aReader.ReadHBufCL(); + unicodesArr.AppendL(unicode); + } + + TInt keyscancode = aReader.ReadInt16(); + + CVirtualKey* vk = CVirtualKey::NewL(unicodesArr, + keyscancode, + aKeyRect); + unicodesArr.Close(); + CleanupStack::PushL(vk); + + TRect innerrect = aKeyRect; + innerrect.Shrink(TSize(7, 7)); + vk->SetInnerRect(innerrect); + + CleanupStack::Pop(vk); + + return vk; + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CreateBackGroundControlL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::CreateBackGroundControlL() + { + iBackgroundCtrl = CAknFepCtrlCommonBgCtrl::NewL( + iLayoutOwner, + ECtrlIdBackground, + KAknsIIDQsnFrPopup, + KAknsIIDQsnFrPopupCenter); + + + iBackgroundCtrl->SetRect(TItutDataConverter::AnyToRect( + iLayoutOwner->DataMgr()->RequestData(EBackgroundRect))); + + AddControlL(iBackgroundCtrl); + } + + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CreateRawKeyButtonL +// --------------------------------------------------------------------------- +// +CAknFepCtrlCommonButton* CSplitItutWindow::CreateRawKeyButtonL(const TInt aControlId, + const TInt aCommand) + { + CAknFepCtrlCommonButton* temp = NULL; + + if (aCommand == KUnavailableID) + { + temp = CAknFepCtrlRawKeyButton::NewL(iLayoutOwner, + aControlId, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrFunctionButtonInactive, + EEventRawKeyDownEvent, + EEventRawKeyUpEvent); + } + else + { + temp = CAknFepCtrlRawKeyButton::NewL(iLayoutOwner, + aControlId, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrFunctionButtonInactive, + EEventRawKeyDownEvent, + EEventRawKeyUpEvent, + aCommand); + } + + return temp; + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CreateCommonButtonL +// --------------------------------------------------------------------------- +// +CAknFepCtrlCommonButton* CSplitItutWindow::CreateCommonButtonL(const TInt aControlId) + { + return CAknFepCtrlCommonButton::NewL(iLayoutOwner, + aControlId, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrFunctionButtonInactive ); + + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CreateRepeatButtonL +// --------------------------------------------------------------------------- +// +CAknFepCtrlCommonButton* CSplitItutWindow::CreateRepeatButtonL(const TInt /*aControlId*/, + const TInt /*aCommand*/) + { + return NULL; + + } + + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CreateButtonL +// --------------------------------------------------------------------------- +// +CFepUiBaseCtrl* CSplitItutWindow::CreateButtonL(TButtonType aType, + const TInt aControlId, + const TInt aRectId, + const TInt aInnerRectId, + const TInt aResourceId, + const TInt aCommand) + { + CAknFepCtrlCommonButton* temp = NULL; + + switch(aType) + { + case ERawKeyButton: + { + temp = CreateRawKeyButtonL(aControlId, aCommand); + } + break; + case ECommonButton: + { + temp = CreateCommonButtonL(aControlId); + } + break; + default: + { + User::Leave(KErrArgument); + } + } + + TRect btnrect; + TRect btnInnerRect; + + if (aRectId != KUnavailableID && + aInnerRectId != KUnavailableID) + { + btnrect = TItutDataConverter::AnyToRect(iDataMgr->RequestData(aRectId)); + btnInnerRect = TItutDataConverter::AnyToRect(iDataMgr->RequestData(aInnerRectId)); + + temp->SetRect(btnrect); + temp->SetForgroundBmpRect(btnInnerRect); + } + + if (aResourceId != KUnavailableID) + { + temp->SetResourceId(aResourceId); + temp->ConstructFromResourceL(); + } + + if (aRectId != KUnavailableID && + aInnerRectId != KUnavailableID) + { + temp->SizeChanged(temp->Rect(), btnInnerRect, ETrue); + } + + AddControlL(temp); + + return temp; + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CreateAllButtonL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::CreateAllButtonL() + { + //create backgrand + CreateBackGroundControlL(); + + //create backspace + CreateButtonL(ERawKeyButton, ECtrlIdBackspace, EBackspaceRect, + EBackspaceInnerRect,R_FINGER_RAWKEY_BACKSPACE); + + // create navi + CreateButtonL(ERawKeyButton, ECtrlIdArrowLeft, EArrowLeftRect, + ELeftInnerRect,R_FINGER_RAWKEY_LEFTARROW); + + CreateButtonL(ERawKeyButton, ECtrlIdArrowRight, EArrowRightRect, + ERightInnerRect,R_FINGER_RAWKEY_RIGHTARROW); + + /* + CreateButtonL(ERepeatButtonEx, ECtrlIdArrowUp, EArrowUpRect, + EUpInnerRect,R_PENINPUT_FINGER_CURSOR_UP); + + CreateButtonL(ERepeatButtonEx, ECtrlIdArrowDown, EArrowDownRect, + EDownInnerRect,R_PENINPUT_FINGER_CURSOR_DOWN); + */ + //create option + CreateButtonL(ECommonButton, ECtrlIdOptions, EOptionsRect, + EOptionInnerRect, R_PENINPUT_FINGER_OPTIONS); + + //Crease close + CreateButtonL(ECommonButton, ECtrlIdClose, ECloseRect, + ECloseInnerRect, R_PENINPUT_FINGER_CLOSE); + + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CreateDropdownListL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::CreateDropdownListL() + { + TRect outrect,innerrect; + outrect = TItutDataConverter::AnyToRect(iDataMgr->RequestData(EPreviewBubbleRect)); + innerrect = TItutDataConverter::AnyToRect(iDataMgr->RequestData(EPreviewBubbleInnerRect)); + TAknTextLineLayout bubbleTextLayout = + TItutDataConverter::AnyToTextLine(iDataMgr->RequestData(EPreviewBubbleTextlayout)); + CFont* bubbleFont = TItutDataConverter::AnyToFont(iDataMgr->RequestData(EPreviewBubbleFont)); + + TDropdownListDrawInfo candiDrawInfo(KAknsIIDQsnFrFunctionButtonInactive, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrItutButtonCandiSideL, + KAknsIIDQsnFrItutButtonCandiMiddle, + KAknsIIDQsnFrItutButtonCandiSideR, + KAknsIIDQsnFrItutButtonCandiPressedSideL, + KAknsIIDQsnFrItutButtonCandiPressedMiddle, + KAknsIIDQsnFrItutButtonCandiPressedSideR, + TRgb(194, 221, 242), + ETrue); + + TDropdownListDrawInfo compositionDrawInfo(KAknsIIDQsnFrFunctionButtonInactive, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrItutButtonComposeSideL, + KAknsIIDQsnFrItutButtonComposeMiddle, + KAknsIIDQsnFrItutButtonComposeSideR, + KAknsIIDQsnFrItutButtonComposePressedSideL, + KAknsIIDQsnFrItutButtonComposePressedSideR, + KAknsIIDQsnFrItutButtonComposePressedMiddle, + TRgb(194, 221, 242), + ETrue); + TInt unitWidth = TItutDataConverter::AnyToInt(iDataMgr->RequestData(EDropdownlistUnitWidth)); + TInt unitHeight = TItutDataConverter::AnyToInt(iDataMgr->RequestData(EDropdownlistUnitHeight)); + TInt horizontalMargin = + TItutDataConverter::AnyToInt(iDataMgr->RequestData(EDropdownlistHorizontalMargin)); + TInt verticalMargin = + TItutDataConverter::AnyToInt(iDataMgr->RequestData(EDropdownlistVerticalMargin)); + + CFont* listfont = TItutDataConverter::AnyToFont(iDataMgr->RequestData(EDropdownListFont)); + TInt textmargin = TItutDataConverter::AnyToInt(iDataMgr->RequestData(EDropdownListTextMargin)); + TRgb textcolor = TItutDataConverter::AnyToRgb(iDataMgr->RequestData(EDropdownListTextColor)); + + TPoint spellListLTPos = + TItutDataConverter::AnyToPoint(iDataMgr->RequestData(EDropdownListSpellLTPos)); + // create spelling drop list + iSpellCandsList = CFepCtrlDropdownList::NewL(iLayoutOwner, + ECtrlIdSpellCandsList, + R_AKN_FEP_PINYIN_SPELLING_DROP_DOWN_LIST, + spellListLTPos, + TSize(unitWidth, unitHeight), + 5, + 3); + + + iSpellCandsList->SetCellMargin(horizontalMargin, verticalMargin); + iSpellCandsList->SetFont(listfont); + AddControlL(iSpellCandsList); + iSpellCandsList->SetEventIdForCandidateSelected(EItutCmdCandidateSelected); + iSpellCandsList->SetCandTruncateType(CFepCtrlDropdownList::ECandTruncateFromBeginning); + iSpellCandsList->SetFuzzyBoundry(10); + iSpellCandsList->Hide(ETrue); + iSpellCandsList->SetDropdownListImgID(compositionDrawInfo); + + TPoint candListLTPos = + TItutDataConverter::AnyToPoint(iDataMgr->RequestData(EDropdownListCandsLTPos)); + // create candidate drop list + iCandsList = CFepCtrlDropdownList::NewL(iLayoutOwner, + ECtrlIdStdCandsList, + R_AKN_FEP_NORMAL_CAND_DROP_DOWN_LIST, + candListLTPos, + TSize(unitWidth, unitHeight), + 5, + 3); + + + iCandsList->SetCellMargin(horizontalMargin, verticalMargin); + iCandsList->SetFont(listfont); + AddControlL(iCandsList); + iCandsList->SetEventIdForCandidateSelected(EItutCmdCandidateSelected); + iCandsList->SetEventIdForNextPageCandidate(EItutCmdGetNextCandidatePage); + iCandsList->SetEventIdForCandidateExisted(EItutCmdCandidateExisted); + iCandsList->SetCandTruncateType(CFepCtrlDropdownList::ECandTruncateAsEllipsis); + iCandsList->SetFuzzyBoundry(10); + iCandsList->Hide(ETrue); + iCandsList->SetDropdownListImgID(candiDrawInfo); + + TPoint puncListLTPos = + TItutDataConverter::AnyToPoint(iDataMgr->RequestData(EDropdownListPuncLTPos)); + // create punctuation drop list + iPuncCandsList = CFepCtrlDropdownList::NewL(iLayoutOwner, + ECtrlIdPuncCandsList, + R_AKN_FEP_PUNC_DROP_DOWN_LIST, + puncListLTPos, + TSize(unitWidth, unitHeight), + 5, + 1); + iPuncCandsList->SetCellMargin(horizontalMargin, verticalMargin); + iPuncCandsList->SetFont(listfont); + AddControlL(iPuncCandsList); + iPuncCandsList->SetEventIdForCandidateSelected(EItutCmdCandidateSelected); + iPuncCandsList->SetDropdownListImgID(candiDrawInfo); + iPuncCandsList->Hide(ETrue); + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::ConstructL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::ConstructL() + { + iBmpRotator = CPeninputSyncBitmapRotator::NewL(); + CreateAllButtonL(); + CreateItutKeypadL(); + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::AddControlL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::AddControlL(CFepUiBaseCtrl* aControl) + { + iLayoutOwner->AddControlL(aControl); + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CreateChineseSpecificCtrlsIfNeededL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::CreateChineseSpecificCtrlsIfNeededL() + { + if (iChnCtrlInited) + { + return; + } + + CreateDropdownListL(); + // create spell control for stroke/zhuyin + TRect rect = TItutDataConverter::AnyToRect(iDataMgr->RequestData(ESpellRect)); + iSpell = CFepInputContextField::NewL(rect, iLayoutOwner, ECtrlIdSpellICF); + + iSpell->SetResourceId(R_FINGER_SPELL); + ConstructSpellCtrlFromResourceL(); + + iSpell->SetFont(TItutDataConverter::AnyToFont(iDataMgr->RequestData(ESpellFont))); + AddControlL(iSpell); + + iSpell->Hide(ETrue); + + + iChnCtrlInited = ETrue; + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::ConstructSpellCtrlFromResourceL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::ConstructSpellCtrlFromResourceL() + { + if (!iSpell || !iSpell->ResourceId()) + { + return; + } + + TResourceReader spellreader; + CCoeEnv::Static()->CreateResourceReaderLC(spellreader, iSpell->ResourceId()); + + TInt bgimgResId = spellreader.ReadInt32(); + TResourceReader bgreader; + CCoeEnv::Static()->CreateResourceReaderLC(bgreader, bgimgResId); + + TInt bmpid = bgreader.ReadInt16(); + TInt maskbmpid = bgreader.ReadInt16(); + TInt bmpskinid = bgreader.ReadInt16(); + + CFbsBitmap* bmp = NULL; + CFbsBitmap* maskbmp = NULL; + + CreateLayoutIconL(KImageMajorSkinId, + bmpskinid, + KBmpFileName, + bmpid, + maskbmpid, + bmp, + maskbmp, + iSpell->Rect().Size()); + + if (bmp) + { + iSpell->SetBackgroundBitmapL(bmp); + } + + delete maskbmp; + + CleanupStack::PopAndDestroy( 1 ); // bgreader + + TInt colorMajorSkinId = spellreader.ReadInt32(); + TInt skinitemid= spellreader.ReadInt16(); + TInt coloridx = spellreader.ReadInt16(); + + TAknsItemID colorid; + colorid.Set(TInt(colorMajorSkinId), skinitemid); + + TRgb spelltextcolor; + MAknsSkinInstance* skininstance = AknsUtils::SkinInstance(); + TInt error = AknsUtils::GetCachedColor(skininstance, + spelltextcolor, + colorid, + coloridx); + + if (error != KErrNone) + { + spelltextcolor = TRgb(KDefaultSpellTextColor); + } + + iSpell->SetTextColor(spelltextcolor); + + CleanupStack::PopAndDestroy( 1 ); // spellreader + } + + +// --------------------------------------------------------------------------- +// CSplitItutWindow::PenInputType +// --------------------------------------------------------------------------- +// +TInt CSplitItutWindow::PenInputType() + { + return EPluginInputModeItut; + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::SetCtrlRect +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::SetCtrlRect(CFepUiBaseCtrl* aCtrl, TInt aRectIdx) + { + aCtrl->SetRect(TItutDataConverter::AnyToRect(iDataMgr->RequestData(aRectIdx))); + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::SizeChanged +// --------------------------------------------------------------------------- +// +TInt CSplitItutWindow::SizeChanged() + { + // resize all controls + SetCtrlRect(iStandardItutKp, EKeypadRect); + + iStandardItutKp->SetTextLineLayout( + TItutDataConverter::AnyToTextLine(iDataMgr->RequestData(EKeypadLeftTextLine)), + EPosLeft); + iStandardItutKp->SetTextLineLayout( + TItutDataConverter::AnyToTextLine(iDataMgr->RequestData(EKeypadRightTextLine1)), + EPosRight1); + iStandardItutKp->SetTextLineLayout( + TItutDataConverter::AnyToTextLine(iDataMgr->RequestData(EKeypadRightTextLine2)), + EPosRight2); + iStandardItutKp->SetTextLineLayout( + TItutDataConverter::AnyToTextLine(iDataMgr->RequestData(EKeypadRightTextLine3)), + EPosRight3); + + RPointerArray& keys = + const_cast&>(iStandardItutKp->KeyArray()); + RArray& cellRects = + TItutDataConverter::AnyToRectArray(iDataMgr->RequestData(EKeypadCellRects)); + + for (TInt i = 0 ; i < keys.Count(); i++) + { + keys[i]->SetRect(cellRects[i]); + TRect innerrect = cellRects[i]; + innerrect.Shrink(TSize(4, 4)); + keys[i]->SetInnerRect(innerrect); + } + // set key background image size + TSize curSize = cellRects[0].Size(); + if( iStandardItutKp->NonIrregularKeyBitmap(EKeyBmpNormal) ) + { + TSize size = iStandardItutKp->NonIrregularKeyBitmap(EKeyBmpNormal)->SizeInPixels(); + if( curSize != size ) + { + for ( TInt i = 0; i <= EKeyBmpLastType; i++ ) + { + if( iStandardItutKp->NonIrregularKeyBitmap((TVirtualKeyBmpType)i) ) + { + AknIconUtils::SetSize( + iStandardItutKp->NonIrregularKeyBitmap((TVirtualKeyBmpType)i), + curSize, EAspectRatioNotPreserved ); + } + } + } + } + + // should set textline when it is defined in laf + iBackgroundCtrl->SizeChanged( + TItutDataConverter::AnyToRect(iDataMgr->RequestData( EBackgroundRect ) ) ); + + TRAP_IGNORE(ApplyVariantLafDataL(ETrue); + /*iLayoutOwner->HandleCommand(EItutExtCmdSizeChanged, NULL)*/); + + + if (iChnCtrlInited) + { + SetCtrlRect(iSpell, ESpellRect); + iSpell->SetFont(TItutDataConverter::AnyToFont(iDataMgr->RequestData(ESpellFont))); + + ResizeCandidateList(iSpellCandsList, EDropdownListSpellLTPos, ETrue); + ResizeCandidateList(iCandsList, EDropdownListCandsLTPos, ETrue); + ResizeCandidateList(iPuncCandsList, EDropdownListPuncLTPos, EFalse); + } + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::ControlSizeChanged +// --------------------------------------------------------------------------- +// +TBool CSplitItutWindow::ControlSizeChanged(const TInt aControlId, + const TInt aRect, + const TInt aInnerRect, + TBool aIsReloadImages) + { + CAknFepCtrlCommonButton* temp = CommonButtonControl(aControlId); + if( !temp ) + return EFalse; + + + TRect rect; + TRect innerRect; + + rect = TItutDataConverter::AnyToRect(iDataMgr->RequestData(aRect)); + innerRect = TItutDataConverter::AnyToRect(iDataMgr->RequestData(aInnerRect)); + + TBool bSizedChanged = (rect.Size() != temp->Rect().Size()) && + (innerRect.Size() != temp->ForgroundBmpRect().Size()); + temp->SizeChanged(rect, innerRect, aIsReloadImages); + + return bSizedChanged; + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::ApplyVariantLafDataL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::ApplyVariantLafDataL(TBool /*aResolutionChange*/) + { + if( iDataMgr->IsChinese() ) + { + // ControlSizeChanged(ECtrlIdArrowUp, EArrowUpRect, EUpInnerRect, ETrue); + // ControlSizeChanged(ECtrlIdArrowDown, EArrowDownRect, EDownInnerRect, ETrue); + } + + TBool bSizeChanged = EFalse; + ControlSizeChanged(ECtrlIdArrowLeft, EArrowLeftRect, ELeftInnerRect, ETrue); + ControlSizeChanged(ECtrlIdArrowRight, EArrowRightRect, ERightInnerRect, ETrue); + bSizeChanged = ControlSizeChanged(ECtrlIdBackspace, EBackspaceRect, EBackspaceInnerRect, ETrue); + ControlSizeChanged(ECtrlIdOptions, EOptionsRect, EOptionInnerRect, ETrue); + ControlSizeChanged(ECtrlIdClose, ECloseRect, ECloseInnerRect, ETrue); + + // resize all controls + SetCtrlRect(iStandardItutKp, EKeypadRect); + + // Handle control res when language direction changing here. + if( iDataMgr->IsLangDirectionSwitch() || + ( bSizeChanged && iDataMgr->IsRtoLLanguage() ) ) + { + HandleButtonResOnLangDirChange( ECtrlIdBackspace ); + iDataMgr->SetLangDirectionSwitch( EFalse ); + } + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::ResizeCandidateList +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::ResizeCandidateList(CFepCtrlDropdownList* aList, + TInt aLTPosIdx, TBool aExpandable) + { + if (!aList) + { + return; + } + + TInt unitWidth = TItutDataConverter::AnyToInt( + iDataMgr->RequestData(EDropdownlistUnitWidth)); + TInt unitHeight = TItutDataConverter::AnyToInt( + iDataMgr->RequestData(EDropdownlistUnitHeight)); + TInt horizontalMargin = + TItutDataConverter::AnyToInt(iDataMgr->RequestData(EDropdownlistHorizontalMargin)); + TInt verticalMargin = + TItutDataConverter::AnyToInt(iDataMgr->RequestData(EDropdownlistVerticalMargin)); + TInt naviWidth = TItutDataConverter::AnyToInt( + iDataMgr->RequestData(EDropdownlistUnitWidth)); + CFont* listfont = TItutDataConverter::AnyToFont( + iDataMgr->RequestData(EDropdownListFont)); + TPoint listLTPos = TItutDataConverter::AnyToPoint(iDataMgr->RequestData(aLTPosIdx)); + + aList->SizeChanged(unitWidth, + unitHeight, + naviWidth, + listLTPos); + + aList->SetCellMargin(horizontalMargin, verticalMargin); + + if (aExpandable) + { + TInt naviSpinBtnHeight = + TItutDataConverter::AnyToInt(iDataMgr->RequestData(EDropdownListSpinBtnHeight)); + + aList->SetSpinBtnHeight(naviSpinBtnHeight); + } + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::OnSkinChange +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::OnSkinChange() + { + // when skin change all control with skin image should be reload. + TRAP_IGNORE(ConstructKeyImageFromResourceL( R_ITUT_KEYPAD_BITMAP )); + + // reconstruct shift icon when skin changed + TRAP_IGNORE(iStandardItutKp->ShiftIcon()->ReConstructL()); + TRAP_IGNORE(iStandardItutKp->ShiftIcon()->ResizeL(iDataMgr->iShiftIconRect.Size())); + + //Skin change will case the reconstuction of the button graphic. + //When language is RToL, it should be mirrored again. + if( iDataMgr->IsRtoLLanguage() ) + { + HandleButtonResOnLangDirChange( ECtrlIdBackspace ); + } + } + + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CalculateFrameRects +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::CalculateFrameRects(const TRect aRect, + TRect& aOuterRect, + TRect& aInnerRect ) + { + TRect windowRect = aRect; + + TAknLayoutRect topLeft; + topLeft.LayoutRect(windowRect, SkinLayout::Submenu_skin_placing_Line_2()); + + TAknLayoutRect bottomRight; + bottomRight.LayoutRect(windowRect, SkinLayout::Submenu_skin_placing_Line_5()); + + aOuterRect = TRect(topLeft.Rect().iTl, bottomRight.Rect().iBr); + aInnerRect = TRect(topLeft.Rect().iBr, bottomRight.Rect().iTl); + } + + +// --------------------------------------------------------------------------- +// CSplitItutWindow::CommonButtonControl +// --------------------------------------------------------------------------- +// +CAknFepCtrlCommonButton* CSplitItutWindow::CommonButtonControl(const TInt aControlId) + { + CFepUiBaseCtrl* ctrl = NULL; + ctrl = Control(aControlId); + + if (!ctrl) + { + return NULL; + } + + if (!ctrl->IsKindOfControl(ECtrlButton)) + + { + return NULL; + } + + return static_cast(ctrl); + } + + +// --------------------------------------------------------------------------- +// CSplitItutWindow::Control +// --------------------------------------------------------------------------- +// +CFepUiBaseCtrl* CSplitItutWindow::Control(const TInt aCtrlId) + { + CFepUiBaseCtrl* ctrl = NULL; + RPointerArray todo; + TInt current = 0; + TBool found = EFalse; + + todo.Append(iLayoutOwner->RootControl()); + CControlGroup* temp; + + while (current < todo.Count() && !found) + { + ctrl = todo[current]; + + if(ctrl->ControlId() == aCtrlId) //Find control + { + found = ETrue; + } + else + { + if(ctrl->IsKindOfControl(ECtrlControlGroup)) + { + temp = static_cast(ctrl); + for (int i = 0; i < temp->NumOfControls(); i++) + { + todo.Append(temp->At(i)); + } + } + + current++; + } + } + + todo.Close(); + + return found ? ctrl : NULL; + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::IsChineseMode +// --------------------------------------------------------------------------- +// +TBool CSplitItutWindow::IsChineseMode() + { + TInt immode = iDataMgr->InputMode(); + TBool chineseMode = EFalse; + + if (immode == EPinyin || immode == EStroke || immode == EZhuyin) + { + chineseMode = ETrue; + } + + return chineseMode; + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::ConstructKeyImageFromResourceL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::ConstructKeyImageFromResourceL( TInt aKeyImageResID ) + { + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, aKeyImageResID ); + + TPtrC bmpFileName = reader.ReadTPtrC(); + TInt32 imgMajorSkinId = reader.ReadInt32(); + TAknsItemID id; + + RArray& cellRects = + TItutDataConverter::AnyToRectArray(iDataMgr->RequestData(EKeypadCellRects)); + TSize keySize = cellRects[0].Size(); + 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 != KInvalidBmp) + { + CFbsBitmap* bmp = NULL; + CFbsBitmap* maskbmp = NULL; + + if (bmpMskId != KInvalidBmp) + { + AknsUtils::CreateIconL(AknsUtils::SkinInstance(), + id, + bmp, + maskbmp, + bmpFileName, + bmpId, + bmpMskId); + + // set maskbmp and size + AknIconUtils::SetSize( maskbmp, keySize, EAspectRatioNotPreserved ); + iStandardItutKp->SetNonIrregularKeyBitmapL( + TVirtualKeyBmpType(EKeyBmpNormal + index + 1), maskbmp ); + } + else + { + AknsUtils::CreateIconL(AknsUtils::SkinInstance(), + id, + bmp, + bmpFileName, + bmpId); + } + // set bmp and size + AknIconUtils::SetSize( bmp, keySize, EAspectRatioNotPreserved ); + iStandardItutKp->SetNonIrregularKeyBitmapL( + TVirtualKeyBmpType(EKeyBmpNormal + index), bmp ); + } + } + // Pop and destroy reader + CleanupStack::PopAndDestroy( 1 ); + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::HandleButtonResOnLangDirChange +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::HandleButtonResOnLangDirChange( TInt aControlId ) + { + TRAP_IGNORE(HandleButtonResOnLangDirChangeL(aControlId)); + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::HandleButtonResOnLangDirChangeL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::HandleButtonResOnLangDirChangeL( TInt aControlId ) + { + CAknFepCtrlCommonButton* ctrl = CommonButtonControl(aControlId); + if( ctrl && iBmpRotator) + { + TSyncRotationAngle rotChoice = CBitmapRotator::EMirrorVerticalAxis; + User::LeaveIfError( iBmpRotator->Rotate( *ctrl->ForgroundBmp() , + rotChoice ) ); + User::LeaveIfError( iBmpRotator->Rotate( *ctrl->ForgroundBmpMask() , + rotChoice ) ); + } + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::SetHardKeyOneSymbol +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::SetHardKeyOneSymbol(TUint8* aData) + { + TRAP_IGNORE(SetHardKeyOneSymbolL(aData)); + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::SetHardKeyOneSymbolL +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::SetHardKeyOneSymbolL(TUint8* aData) + { + //Read stream + RDesReadStream readStream; + + TPtr8 countPtr( aData, 3*sizeof(TInt), 3*sizeof(TInt) ); + readStream.Open(countPtr); + CleanupClosePushL(readStream); + + iSymbolData.iSymbol1 = readStream.ReadInt32L(); + iSymbolData.iSymbol2 = readStream.ReadInt32L(); + iSymbolData.iSymbol3 = readStream.ReadInt32L(); + + CleanupStack::PopAndDestroy(&readStream); + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::SetUnicodesForHardKey1 +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::SetUnicodesForHardKey1(CVirtualKey* aKey, const TDesC& aMapData) + { + TRAP_IGNORE(SetUnicodesForHardKey1L(aKey, aMapData)); + } + +// --------------------------------------------------------------------------- +// CSplitItutWindow::SetUnicodesForHardKey1L +// --------------------------------------------------------------------------- +// +void CSplitItutWindow::SetUnicodesForHardKey1L(CVirtualKey* aKey, const TDesC& aMapData) + { + RPointerArray unicodesArr1; + RArray unicodesInt; + + unicodesInt.Append(iSymbolData.iSymbol1); + unicodesInt.Append(iSymbolData.iSymbol2); + unicodesInt.Append(iSymbolData.iSymbol3); + + TInt curMode = TItutDataConverter::AnyToInt( + iLayoutOwner->DataMgr()->RequestData(EInputMode)); + + TInt curLang = TItutDataConverter::AnyToInt( + iLayoutOwner->DataMgr()->RequestData(ELanguage)); + + TInt latinOnly = TItutDataConverter::AnyToInt( + iLayoutOwner->DataMgr()->RequestData(ELatinOnly)); + + HBufC* symbols = HBufC::NewL( 20 ); + for (TInt i = 0; i <= 2; i++) + { + symbols->Des().Append( unicodesInt[i] ); + if (EHindi == curMode || + (ELatin == curMode && curLang == ELangThai && !latinOnly)) + { + continue; + } + else + { + symbols->Des().Append( KSpaceUnicode ); + } + } + + HBufC* number = HBufC::NewL( 1 ); + number->Des().Append( aMapData ); + unicodesArr1.AppendL(number); + unicodesArr1.AppendL(symbols); + + aKey->SetUnicodesL(unicodesArr1); + + unicodesArr1.Close(); + unicodesInt.Close(); + + } +// End Of File