diff -r 000000000000 -r eb1f2e154e89 fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlPinyinPopup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlPinyinPopup.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,1271 @@ +/* +* Copyright (c) 2004 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: +* Provides the CAknFepUICtrlPinyinPopup methods. +* +*/ + + + + + + + + + + + + +#include +#include +#include +#include +#include + +#include +#include + +#include "AknFepUiInterfacePanic.h" +#include "AknFepUIAvkonCtrlPinyinPopup.h" +#include "AknFepUIAvkonCtrlInputPane.h" +#include "aknfepchineseuidataconv.h" +#include "aknfepuilayoutdatamgr.h" +#include + +#include "data_caging_path_literals.hrh" + +_LIT(KFepUiControlsBitmapFile, "aknfepuictrls.mbm"); + +CAknFepUICtrlPinyinPopup* CAknFepUICtrlPinyinPopup::NewL(RWindow& aParent, CAknFepUiLayoutDataMgr* aLafDataMgr ) + { + CAknFepUICtrlPinyinPopup* self = new(ELeave) CAknFepUICtrlPinyinPopup( aLafDataMgr ); + CleanupStack::PushL(self); + self->ConstructL(aParent); + CleanupStack::Pop(); + return self; + } + +CAknFepUICtrlPinyinPopup::~CAknFepUICtrlPinyinPopup() + { + iInputPaneArray.ResetAndDestroy(); + iPages.Reset(); + delete iSpellingArray; + delete iSpellingIndexArray; + delete iNaviArrowBitmapLeft; + delete iNaviArrowBitmapLeftMask; + delete iNaviArrowBitmapRight; + delete iNaviArrowBitmapRightMask; + delete iBgContext; + delete iKeystrokeArray; + delete iInEffectKeystrokeArray; + delete iShowKeystrokeArray; + delete iOptimizeSpelling; + delete iTempSpelling; + delete iChooseChineseCharacterArray; + delete iChooseChineseCharacterArrayKeystroke; + + delete iKeystrokeArrayForStroke; + delete iInEffectKeystrokeArrayForStroke; + delete iShowKeystrokeArrayForStroke; + delete iChooseChineseCharacterArrayForStroke; + delete iChooseChineseCharacterArrayKeystrokeForStroke; + + delete iZhuyinSymbols; + delete iZhuyinShowSymbols; + delete iFirstValidZhuyinGrp; + delete iChineseCharsDisped; + delete iZhuyinSymbolsForChineseCharsDisped; + } + +void CAknFepUICtrlPinyinPopup::SetSizeChangedObserver( + MAknFepUICtrlPinyinPopupSizeChangedObserver* aObserver) + { + iSizeChangedObserver = aObserver; + } + +TBool CAknFepUICtrlPinyinPopup::IsEnabled() const + { + return iEnabled; + } + +void CAknFepUICtrlPinyinPopup::Enable(TBool aEnable) + { + // fix the refresh bug. + TBool redraw = ( aEnable || iEnabled != aEnable ); + + iEnabled = aEnable; + if(aEnable) + { + Window().SetOrdinalPosition(0, ECoeWinPriorityFep); // right at the front + } + + iSizeChangedObserver->SelectionPopupEnabled(aEnable); + if (!aEnable) + { + for(TInt i = 0; i < iVisibleCount; i++) + { + CAknFepUICtrlInputPane* inputPane = iInputPaneArray[i]; + inputPane->SetText(KNullDesC); + } + iVisibleCount = 0; + } + MakeVisible(aEnable); + + // fix the refresh bug. + if( redraw ) + { + DrawDeferred(); + } + } + +void CAknFepUICtrlPinyinPopup::SetVisibleSelectionCount(TInt aCount) + { + __ASSERT_DEBUG(aCount <= EMaxPhraseCandidate, AknFepUiInterfacePanic(EAknFepUiInterfacePanicNewVisibleCountExceedsRange)); + __ASSERT_DEBUG(aCount >= 1, AknFepUiInterfacePanic(EAknFepUiInterfacePanicNewVisibleCountExceedsRange)); + + if(iVisibleCount != aCount) + { + iVisibleCount = aCount; + TInt oldSelected = iSelected; + + if (iVisibleCount > 1) //the layout does not support a visible count of 1 + { + if(aCount - 1 < oldSelected) + { + // automatically move the selection to be at the end of the new + // candidate buffer, by forcing the one that will become the new + // highlighted one to be layout out highlighted before we are resized + // (note that briefly, there will be two items highlighted, but at least + // there will be no flicker) + iSelected = aCount - 1; + LayoutInputPane(aCount - 1); + } + + // note that the old highlighted one isn't shown any more, so we don't need to lay it out again to hide its highlight + SetInputPaneVisibility(); + iSizeChangedObserver->SelectionPopupSizeChanged(iVisibleCount); + DrawDeferred(); + } + } + } + +void CAknFepUICtrlPinyinPopup::SetVisibleCount(TInt aCount) + { + if(iVisibleCount != aCount) + { + iVisibleCount = aCount; + } + } + +TInt CAknFepUICtrlPinyinPopup::VisibleSelectionCount() const + { + return iVisibleCount; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::PhoneticSpellingArray(void) + { + return iSpellingArray; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::PhoneticSpellingIndexArray(void) + { + return iSpellingIndexArray; + } + +void CAknFepUICtrlPinyinPopup::SplitPhraseSpellingIntoPages(void) + { + iPages.Reset(); + TPage curPage; + TInt spellingNum = iSpellingArray->Count(); + if(spellingNum == 0) + { + iVisibleCount = 0; + return; + } + + TInt index = 0; + TBool beAppend = EFalse; + + while(index < spellingNum) + { + beAppend = EFalse; + curPage.iStartIndex = index; + curPage.iEndIndex = index; + + TInt spellingLeftNum = spellingNum - index > EMaxPhraseCandidate? EMaxPhraseCandidate:spellingNum - index; + for(TInt j = 0; j < spellingLeftNum; j ++) + { + iInputPaneArray[j]->SetText((*iSpellingArray)[index + j]); + } + + TAknWindowLineLayout layoutEntryItem = + CAknFepChineseUIDataConv::AnyToWindowLine( iLafDataMgr->RequestData(ELayoutEntryItem)); + TAknTextLineLayout entryTextLine = + CAknFepChineseUIDataConv::AnyToTextLine( iLafDataMgr->RequestData(EEntryTextLayout)); + TInt layoutLinePrevLeft = 0; + TInt layoutLinePrevWidth = 0; + + TAknLayoutRect layoutRectEntryItem; + layoutRectEntryItem.LayoutRect(Rect(),layoutEntryItem); + TRect rectEntryItem = layoutRectEntryItem.Rect(); + + TAknLayoutText layoutText; + layoutText.LayoutText(rectEntryItem,entryTextLine); + TRect rectText = layoutText.TextRect(); + + TInt rightLimit = iIndiFepArrowRight.Rect().iTl.iX; + // value is 3 for 176*208 resolution + TInt distance = rectText.iTl.iX - rectEntryItem.iTl.iX + rectEntryItem.iBr.iX - rectText.iBr.iX; + + for(TInt i = 0;i < spellingLeftNum;i ++) + { + if(i > 0) + { + rectText.iTl.iX = TInt16(layoutLinePrevLeft + layoutLinePrevWidth); + } + rectText.SetWidth(iInputPaneArray[i]->LabelTextWidthInPixels() + distance); + + // if label's layout out of screen, forms another display page + // > change >= change for phrase creation. + if((rectText.iTl.iX >= rightLimit) || ((rectText.iTl.iX + rectText.Width()) >= rightLimit)) + { + curPage.iEndIndex = index - 1; + iPages.Append(curPage); + beAppend = ETrue; + break; + } + + layoutLinePrevLeft = rectText.iTl.iX; + layoutLinePrevWidth = rectText.Width(); + + index ++; + + if( i == EMaxPhraseCandidate -1 ) + { + curPage.iEndIndex = index - 1; + iPages.Append(curPage); + beAppend = ETrue; + break; + } + + } + } + + if( beAppend == EFalse) + { + curPage.iEndIndex = index - 1; + iPages.Append(curPage); + } + iCurDisplayPage = 0; + SetVisibleSelectionCount(iPages[0].iEndIndex - iPages[0].iStartIndex + 1); + } + +void CAknFepUICtrlPinyinPopup::SplitSpellingIntoPages(TInt aCount) + { + iPages.Reset(); + TPage curPage; + if(aCount == 0) + { + return; + } + TInt index = 0; + TBool beAppend = EFalse; + + while(index < aCount) + { + beAppend = EFalse; + curPage.iStartIndex = index; + curPage.iEndIndex = index; + TInt spellingLeftNum = aCount - index > EMaxCandidates? EMaxCandidates:aCount - index; + + TAknWindowLineLayout layoutEntryItem = + CAknFepChineseUIDataConv::AnyToWindowLine( iLafDataMgr->RequestData(ELayoutEntryItem)); + TAknTextLineLayout entryTextLine = + CAknFepChineseUIDataConv::AnyToTextLine( iLafDataMgr->RequestData(EEntryTextLayout)); + TInt layoutLinePrevLeft = 0; + TInt layoutLinePrevWidth = 0; + + TAknLayoutRect layoutRectEntryItem; + layoutRectEntryItem.LayoutRect(Rect(),layoutEntryItem); + TRect rectEntryItem = layoutRectEntryItem.Rect(); + + TAknLayoutText layoutText; + layoutText.LayoutText(rectEntryItem,entryTextLine); + TRect rectText = layoutText.TextRect(); + + TInt rightLimit = rectEntryItem.iTl.iX + rectEntryItem.Width(); + // value is 3 for 176*208 resolution + TInt distance = rectText.iTl.iX - rectEntryItem.iTl.iX + rectEntryItem.iBr.iX - rectText.iBr.iX; + for(TInt i = 0;i < spellingLeftNum;i ++) + { + if(i > 0) + { + rectText.iTl.iX = TInt16(layoutLinePrevLeft + layoutLinePrevWidth); + } + rectText.SetWidth(iInputPaneArray[i]->LabelTextWidthInPixels() + distance); + + // if label's layout out of screen, forms another display page + if((rectText.iTl.iX >= rightLimit) || ((rectText.iTl.iX + rectText.Width()) >= rightLimit)) + { + curPage.iEndIndex = index - 1; + iPages.Append(curPage); + beAppend = ETrue; + break; + } + layoutLinePrevLeft = rectText.iTl.iX; + layoutLinePrevWidth = rectText.Width(); + index ++; + + if( i == EMaxPhraseCandidate -1 ) + { + curPage.iEndIndex = index - 1; + iPages.Append(curPage); + beAppend = ETrue; + break; + } + + } + } + + if(beAppend == EFalse) + { + curPage.iEndIndex = index - 1; + iPages.Append(curPage); + } + + iCurDisplayPage = 0; + SetVisibleSelectionCount(iPages[0].iEndIndex - iPages[0].iStartIndex + 1); + SelectIndex(0); + } + +void CAknFepUICtrlPinyinPopup::SetDisplayPage(TInt aSelection) + { + if(aSelection >= iVisibleCount) + { + for(TInt i = 0 ; i < iPages.Count(); i ++) + { + if((aSelection >= iPages[i].iStartIndex) && (aSelection <= iPages[i].iEndIndex)) + { + iCurDisplayPage = i; + SetVisibleSelectionCount(iPages[i].iEndIndex - iPages[i].iStartIndex + 1); + SelectIndex(aSelection - iPages[i].iStartIndex); + break; + } + } + } + else + { + SelectIndex(aSelection); + } + UpdateInputPaneVisibility(); + } + +TInt CAknFepUICtrlPinyinPopup::CurrentPageStartIndex(void) + { + return iPages[iCurDisplayPage].iStartIndex; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::KeystrokeArray() + { + return iKeystrokeArray; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::InEffectKeystrokeArray() + { + return iInEffectKeystrokeArray; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::ShowKeystrokeArray() + { + return iShowKeystrokeArray; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::OptimizeSpelling() + { + return iOptimizeSpelling; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::TempSpelling() + { + return iTempSpelling; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::ChooseChineseCharacterArray() + { + return iChooseChineseCharacterArray; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::ChooseChineseCharacterArrayKeystroke() + { + return iChooseChineseCharacterArrayKeystroke; + } + +TBool CAknFepUICtrlPinyinPopup::GetTonemarkState() + { + return iTonemarkState; + } + +void CAknFepUICtrlPinyinPopup::SetTonemarkState( TBool aState ) + { + iTonemarkState = aState; + } + +void CAknFepUICtrlPinyinPopup::UpdateInputPaneVisibility() + { + TInt number = 0; + if(iPages.Count() != 0) + { + number = iPages[iCurDisplayPage].iEndIndex - iPages[iCurDisplayPage].iStartIndex + 1; + } + if(number > iVisibleCount) + { + number = iVisibleCount; + } + for(TInt i = 0; i < EMaxPhraseCandidate; i++) + { + CAknFepUICtrlInputPane* inputPane = iInputPaneArray[i]; + + if(i < number) + { + inputPane->MakeVisible(ETrue); + } + else + { + inputPane->MakeVisible(EFalse); + } + } + } + +TBool CAknFepUICtrlPinyinPopup::SetItemText(TInt aIndex, const TDesC& aText) + { + __ASSERT_DEBUG(aIndex < EMaxPhraseCandidate, AknFepUiInterfacePanic(EAknFepUiInterfacePanicAttemptedSetItemTextOutsideMaxCandidates)); + __ASSERT_DEBUG(aIndex >= 0, AknFepUiInterfacePanic(EAknFepUiInterfacePanicAttemptedSetItemTextOutsideMaxCandidates)); + + if(aIndex > iVisibleCount) + { + return EFalse; + } + + CAknFepUICtrlInputPane* inputPane = iInputPaneArray[aIndex]; + inputPane->SetText(aText); + return ETrue; + } + +TBool CAknFepUICtrlPinyinPopup::SetPhraseItemTexts() + { + for(TInt i = 0; i < iVisibleCount; i ++) + { + TPtrC spelling = (*iSpellingArray)[i + iPages[iCurDisplayPage].iStartIndex]; // our index is zero based, engine index is one based + SetItemText(i, spelling); + } + return ETrue; + } + +TBool CAknFepUICtrlPinyinPopup::GetItemText(TInt aIndex, TDes& aText) const + { + __ASSERT_DEBUG(aIndex < EMaxCandidates, AknFepUiInterfacePanic(EAknFepUiInterfacePanicAttemptedSetItemTextOutsideMaxCandidates)); + __ASSERT_DEBUG(aIndex >= 0, AknFepUiInterfacePanic(EAknFepUiInterfacePanicAttemptedSetItemTextOutsideMaxCandidates)); + + const CAknFepUICtrlInputPane* inputPane = iInputPaneArray[aIndex]; + inputPane->GetText(aText); + + return ETrue; + } + +void CAknFepUICtrlPinyinPopup::SetToneMark(const TDesC& aToneMark) + { + for(TInt i = 0; i < EMaxPhraseCandidate; i++) + { + CAknFepUICtrlInputPane* inputPane = iInputPaneArray[i]; + inputPane->SetToneMark(aToneMark); + } + } + +void CAknFepUICtrlPinyinPopup::SetToneMark(TInt aIndex, const TDesC& aToneMark) + { + CAknFepUICtrlInputPane* inputPane = iInputPaneArray[aIndex]; + inputPane->SetToneMark(aToneMark); + + LayoutInputPane(aIndex); + } + +void CAknFepUICtrlPinyinPopup::GetToneMark(TInt aIndex, TDes& aToneMark) const + { + const CAknFepUICtrlInputPane* inputPane = iInputPaneArray[aIndex]; + inputPane->GetToneMark(aToneMark); + } + +void CAknFepUICtrlPinyinPopup::SetItemToneMarkValidity(TInt aIndex, TBool aValid) + { + CAknFepUICtrlInputPane* inputPane = iInputPaneArray[aIndex]; + inputPane->SetToneMarkValidity(aValid); + } + + + +TBool CAknFepUICtrlPinyinPopup::SelectNextPhrase() + { + TInt maxIndex = iVisibleCount - 1; + TInt newIndex = iSelected; + + if((iSelected == maxIndex) ) + { + // is last page + if(iCurDisplayPage == (iPages.Count() - 1)) + { + iCurDisplayPage = 0; + } + else + { + iCurDisplayPage ++; + } + SetVisibleSelectionCount(iPages[iCurDisplayPage].iEndIndex - iPages[iCurDisplayPage].iStartIndex + 1); + SetFlag(EDispPageChanged); + newIndex = 0; + } + else if(iSelected < maxIndex) + { + newIndex ++; + } + else if(iSelected > maxIndex) + { + return EFalse; + } + return SelectIndex(newIndex); + } + + +TBool CAknFepUICtrlPinyinPopup::SelectPrevPhrase() + { + TInt maxIndex = iVisibleCount - 1; + TInt newIndex = iSelected; + if(iSelected == 0) + { + // first page + if(iCurDisplayPage == 0) + { + iCurDisplayPage = iPages.Count() - 1; + } + else + { + iCurDisplayPage --; + } + // loop to the end + SetVisibleSelectionCount(iPages[iCurDisplayPage].iEndIndex - iPages[iCurDisplayPage].iStartIndex + 1); + SetFlag(EDispPageChanged); + newIndex = iVisibleCount - 1 ; + } + else if(iSelected > 0) + { + newIndex--; + } + else if(iSelected > maxIndex) + { + return EFalse; + } + return SelectIndex(newIndex); + } + +TBool CAknFepUICtrlPinyinPopup::SelectIndex(TInt aIndex) + { + __ASSERT_DEBUG(aIndex < iVisibleCount, AknFepUiInterfacePanic(EAknFepUiInterfacePanicAttemptedSelectionOutsideVisibleCandidates)); + __ASSERT_DEBUG(aIndex >= 0, AknFepUiInterfacePanic(EAknFepUiInterfacePanicAttemptedSelectionOutsideVisibleCandidates)); + // If the value of the index changes, the control is redrawn to show the new position. + if(iSelected != aIndex) + { + // only want to layout the two controls between which the selection is moving + TInt oldSelected = iSelected; + iSelected = aIndex; + + LayoutInputPane(oldSelected); + LayoutInputPane(iSelected); + } + return ETrue; + } + +TInt CAknFepUICtrlPinyinPopup::CurrentSelection() const + { + if(iPages.Count() != 0) + { + return iPages[iCurDisplayPage].iStartIndex + iSelected; + } + else + { + return 0; + } + } + +TInt CAknFepUICtrlPinyinPopup::CurrentVisibleSelection() const + { + return iSelected; + } + +void CAknFepUICtrlPinyinPopup::PopupSizeChanged() + { + SizeChanged(); + } + +void CAknFepUICtrlPinyinPopup::SizeChanged() + { + LayoutRects(); + LayoutContainedControls(); + LayoutFrames(); + } + +TInt CAknFepUICtrlPinyinPopup::CountComponentControls() const + { + TInt count = 0; + count += iInputPaneArray.Count(); + + CCoeControl* controls[] = + { + 0 + } ; + + for (TUint ii = 0 ; ii < (sizeof(controls) / sizeof(CCoeControl*)) ; ii++) + { + if(controls[ii]) + { + count++ ; + } + } + return count ; + } + +CCoeControl* CAknFepUICtrlPinyinPopup::ComponentControl(TInt aIndex) const + { + TInt candidateCount = iInputPaneArray.Count(); + + if(aIndex < candidateCount) + { + // because this method is const, the const [] operator is selected + // which means that the pointer is const, so have to cast away constness + // - a possible alternative is to make the array mutable + return CONST_CAST(CAknFepUICtrlInputPane*, iInputPaneArray[aIndex]); + } + aIndex -= candidateCount; + + CCoeControl* controls[] = + { + 0 + } ; + + for (TUint ii = 0; (ii < sizeof(controls) / sizeof(CCoeControl*)) ; ii++) + { + if (controls[ii] && aIndex-- == 0) + { + return controls[ii] ; + } + } + // shouldn't be called while no components. + return NULL ; + } + +void CAknFepUICtrlPinyinPopup::Draw(const TRect& /*aRect*/) const + { + CWindowGc& gc = SystemGc(); + TBool skinnedDraw = EFalse; + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + TRect outerRect; + TRect innerRect; + CalculateFrameRects(outerRect, innerRect); + + gc.Clear(outerRect); + TRect tmpRect; + tmpRect.iTl.iX = innerRect.iTl.iX; + tmpRect.iTl.iY = outerRect.iTl.iY; + tmpRect.SetWidth(innerRect.Width()); + tmpRect.SetHeight(outerRect.Height()); + skinnedDraw = AknsDrawUtils::DrawFrame(skin, gc, outerRect, tmpRect, + KAknsIIDQsnFrPopupSub, KAknsIIDQsnFrPopupCenterSubmenu); + + // draw the rectangles + if(!skinnedDraw) + { + iRectCoverMainPaneInput.DrawRect(gc); + iRectFirstShadowInput.DrawRect(gc); + iRectOutlineFrameInput.DrawRect(gc); + iRectInsideAreaInput.DrawRect(gc); + } + + if((iVisibleCount >= 1) && (iPages.Count() > 1)) + { + if(iCurDisplayPage != 0) + { + iIndiFepArrowLeft.DrawImage(gc, iNaviArrowBitmapLeft, iNaviArrowBitmapLeftMask); + } + + if (iPages.Count() > iCurDisplayPage + 1) + { + iIndiFepArrowRight.DrawImage(gc, iNaviArrowBitmapRight, iNaviArrowBitmapRightMask); + } + } + } + +TTypeUid::Ptr CAknFepUICtrlPinyinPopup::MopSupplyObject(TTypeUid aId) + { + if (aId.iUid == MAknsControlContext::ETypeId) + return ( MAknsControlContext::SupplyMopObject(aId, iBgContext)); + return CCoeControl::MopSupplyObject(aId); + } + +void CAknFepUICtrlPinyinPopup::ConstructL(RWindow& /*aParent*/) + { + CreateWindowL(); + ConstructBitmapsL(); + RWindow& window = Window(); + + for(TInt i = 0; i < EMaxPhraseCandidate; i++) + { + CAknFepUICtrlInputPane* inputPane = + CAknFepUICtrlInputPane::NewL(window, CAknFepUICtrlInputPane::ELayoutPhrasePinyinPopupPane, iLafDataMgr); + inputPane->SetMopParent(this); + CleanupStack::PushL(inputPane); + // ownership is passed, unless allocation is unsuccessful, in which case we still have it on the stack + User::LeaveIfError(iInputPaneArray.Append(inputPane)); + CleanupStack::Pop(); // inputPane + } + + iSpellingArray = new(ELeave)CDesCArrayFlat(1); + iSpellingIndexArray = new(ELeave)CDesCArrayFlat(1); + iKeystrokeArray = new(ELeave)CDesCArrayFlat(1); + iShowKeystrokeArray = new(ELeave)CDesCArrayFlat(1); + iOptimizeSpelling = new(ELeave)CDesCArrayFlat(1); + iTempSpelling = new(ELeave)CDesCArrayFlat(1); + iInEffectKeystrokeArray = new(ELeave)CDesCArrayFlat(1); + iChooseChineseCharacterArray = new(ELeave)CDesCArrayFlat(1); + iChooseChineseCharacterArrayKeystroke = new(ELeave)CDesCArrayFlat(1); + //For stroke + iKeystrokeArrayForStroke = new(ELeave)CDesCArrayFlat(1); + iInEffectKeystrokeArrayForStroke = new(ELeave)CDesCArrayFlat(1); + iShowKeystrokeArrayForStroke = new(ELeave)CDesCArrayFlat(1); + iChooseChineseCharacterArrayForStroke = new(ELeave)CDesCArrayFlat(1); + iChooseChineseCharacterArrayKeystrokeForStroke = new(ELeave)CDesCArrayFlat(1); + + iZhuyinSymbols = new(ELeave)CDesCArrayFlat(1); + iZhuyinShowSymbols = new(ELeave)CDesCArrayFlat(1); + iFirstValidZhuyinGrp = new(ELeave)CDesCArrayFlat(1); + iChineseCharsDisped = new(ELeave)CDesCArrayFlat(1); + iZhuyinSymbolsForChineseCharsDisped = new(ELeave)CDesCArrayFlat(1); + + SetNonFocusing(); + window.SetOrdinalPosition(0, ECoeWinPriorityFep); // right at the front + window.SetNonFading(ETrue); + + TRect outerRect = TRect(); + TRect innerRect = TRect(); + CalculateFrameRects(outerRect, innerRect); + + iBgContext = CAknsFrameBackgroundControlContext::NewL(KAknsIIDQsnFrPopupSub, outerRect, innerRect, ETrue); + iLastResouce = 0; + MakeVisible(EFalse); + } + +void CAknFepUICtrlPinyinPopup::ConstructBitmapsL() + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + TFileName bmpFile; + bmpFile.Copy(_L("z:")); + bmpFile.Append(KDC_BITMAP_DIR); + bmpFile.Append(KFepUiControlsBitmapFile); + + AknsUtils::CreateColorIconL( skin, + KAknsIIDQgnIndiFepArrowLeft, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG20, + iNaviArrowBitmapLeft, + iNaviArrowBitmapLeftMask, + bmpFile, + EMbmAknfepuictrlsQgn_indi_fep_arrow_left, + EMbmAknfepuictrlsQgn_indi_fep_arrow_left_mask, + AKN_LAF_COLOR( 0 ) + ); + + AknsUtils::CreateColorIconL( skin, + KAknsIIDQgnIndiFepArrowRight, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG20, + iNaviArrowBitmapRight, + iNaviArrowBitmapRightMask, + bmpFile, + EMbmAknfepuictrlsQgn_indi_fep_arrow_right, + EMbmAknfepuictrlsQgn_indi_fep_arrow_right_mask, + AKN_LAF_COLOR( 0 ) + ); + } + +CAknFepUICtrlPinyinPopup::CAknFepUICtrlPinyinPopup( CAknFepUiLayoutDataMgr* aLafDataMgr ) + : + iSelected(0), + iEnabled(EFalse), + iVisibleCount(CAknFepUICtrlPinyinPopup::EMaxPhraseCandidate), + iCurDisplayPage(0), + iTonemarkState(1), + iStrokeState(0), + iHighLightFlag( 0 ), + iFlags(0), + iValidKeystrokeCount( 0 ), + iPhraseCreation(0), + iPhraseCreationEditingState( 0 ), + iState(1), + iChangeStateFromEditToSpelling( 0 ), + iValidKeystrokeChanged( 0 ) + { + iLafDataMgr = aLafDataMgr; + iEEPContent.Zero(); + } + +void CAknFepUICtrlPinyinPopup::LayoutRects() + { + // left arrow + iIndiFepArrowLeft = + CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( EIndiFepArrowLeft )); + AknIconUtils::SetSize( iNaviArrowBitmapLeft, iIndiFepArrowLeft.Rect().Size()); + + // right arrow + iIndiFepArrowRight = + CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( EIndiFepArrowRight )); + AknIconUtils::SetSize( iNaviArrowBitmapRight, iIndiFepArrowRight.Rect().Size()); + + // cover main pane + iRectCoverMainPaneInput = + CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectCoverMainPaneInput )); + // first shadow + iRectFirstShadowInput = + CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectFirstShadowInput )); + // outline frame + iRectOutlineFrameInput = + CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectOutlineFrameInput )); + // inside area + iRectInsideAreaInput = + CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectInsideAreaInput )); + } + +void CAknFepUICtrlPinyinPopup::LayoutContainedControls() + { + LayoutInputPanes(); + } + +void CAknFepUICtrlPinyinPopup::LayoutInputPanes() + { + for(TInt i = 0; i < EMaxPhraseCandidate; i++) + { + LayoutInputPane(i); + } + } + +void CAknFepUICtrlPinyinPopup::LayoutInputPane(TInt aIndex) + { + TRect rect = Rect(); + + CAknFepUICtrlInputPane* inputPane = iInputPaneArray[aIndex]; + TAknWindowLineLayout layoutEntryItem = + CAknFepChineseUIDataConv::AnyToWindowLine( iLafDataMgr->RequestData(ELayoutEntryItem)); + TAknTextLineLayout layoutLineText = + CAknFepChineseUIDataConv::AnyToTextLine( iLafDataMgr->RequestData(EEntryTextLayout)); + TAknLayoutRect layoutRectEntryItem; + layoutRectEntryItem.LayoutRect(rect,layoutEntryItem); + TRect rectEntryItem = layoutRectEntryItem.Rect(); + + TAknLayoutText layoutText; + layoutText.LayoutText(rectEntryItem,layoutLineText); + TRect rectText = layoutText.TextRect(); + + // value is 3 for 176*208 resolution + TInt distance = rectText.iTl.iX - rectEntryItem.iTl.iX + rectEntryItem.iBr.iX - rectText.iBr.iX; + + if( aIndex > 0) + { + CAknFepUICtrlInputPane* inputPanePrev = iInputPaneArray[aIndex - 1]; + rectText.iTl.iX = inputPanePrev->Rect().iBr.iX; + } + rectText.SetWidth(inputPane->LabelTextWidthInPixels() + distance); + rectText.SetHeight(rect.Height()); + + inputPane->SetRect(rectText); + inputPane->SetHighlighted(aIndex == iSelected); + } + +void CAknFepUICtrlPinyinPopup::SetInputPaneVisibility() + { + TInt number = iVisibleCount; + CWindowGc& gc = SystemGc(); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + MAknsControlContext* cc = AknsDrawUtils::ControlContext(this); + TBool skinnedDraw = AknsDrawUtils::Background(skin, cc, this, gc, Rect(),KAknsDrawParamPrepareOnly); + + for(TInt i = 0; i < EMaxPhraseCandidate; i++) + { + CAknFepUICtrlInputPane* inputPane = iInputPaneArray[i]; + + //TBool skinnedDraw = AknsDrawUtils::HasBitmapBackground(skin, cc); + if(skinnedDraw) + { + // show input panes, when skinned, as they must draw background context + // to avoid (the one that is almost off-screen) flickering behind + // however, need to hide the text so that is doesn't show + inputPane->MakeTextVisible(i < number); + } + else + { + // if not skinned, must hide the offscreen input panes otherwise they + // will draw over the border rectangle + inputPane->MakeVisible(i < number); + } + } + } + +void CAknFepUICtrlPinyinPopup::LayoutFrames() + { + TRect outerRect; + TRect innerRect; + CalculateFrameRects(outerRect, innerRect); + iBgContext->SetFrameRects(outerRect, innerRect); + iBgContext->SetParentPos(PositionRelativeToScreen()); + } + +void CAknFepUICtrlPinyinPopup::CalculateFrameRects(TRect& aOuterRect, TRect& aInnerRect) const + { + TRect windowRect = + CAknFepChineseUIDataConv::AnyToRect( iLafDataMgr->RequestData( EPopupRectEntry )); + TInt rectHeight = windowRect.iBr.iY - windowRect.iTl.iY; + TInt rectWidth = windowRect.Width(); + windowRect.iTl.iX = 0; + windowRect.iTl.iY = 0; + windowRect.SetHeight(rectHeight); + windowRect.SetWidth(rectWidth); + + 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); + } + +void CAknFepUICtrlPinyinPopup::SetNoneHighlighted() + { + TInt number = iVisibleCount; + CWindowGc& gc = SystemGc(); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + MAknsControlContext* cc = AknsDrawUtils::ControlContext(this); + TBool skinnedDraw = AknsDrawUtils::Background(skin, cc, this, gc, Rect(),KAknsDrawParamPrepareOnly); + + for(TInt i = 0; i < EMaxPhraseCandidate; i++) + { + CAknFepUICtrlInputPane* inputPane = iInputPaneArray[i]; + + //TBool skinnedDraw = AknsDrawUtils::HasBitmapBackground(skin, cc); + if(skinnedDraw) + { + // show input panes, when skinned, as they must draw background context + // to avoid (the one that is almost off-screen) flickering behind + // however, need to hide the text so that is doesn't show + inputPane->SetHighlighted( !(i < number) ); + } + } + } +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::KeystrokeArrayForStroke() + { + return iKeystrokeArrayForStroke; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::InEffectKeystrokeArrayForStroke() + { + return iInEffectKeystrokeArrayForStroke; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::ShowKeystrokeArrayForStroke() + { + return iShowKeystrokeArrayForStroke; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::ChooseChineseCharacterArrayForStroke() + { + return iChooseChineseCharacterArrayForStroke; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::ChooseChineseCharacterArrayKeystrokeForStroke() + { + return iChooseChineseCharacterArrayKeystrokeForStroke; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::ZhuyinSymbols() + { + return this->iZhuyinSymbols; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::ZhuyinShowSymbols() + { + return this->iZhuyinShowSymbols; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::FirstValidZhuyinGrp() + { + return this->iFirstValidZhuyinGrp; + } + +void CAknFepUICtrlPinyinPopup::SetEEPContent ( const TDes& aDes ) + { + iEEPContent = aDes; + } + +TDes& CAknFepUICtrlPinyinPopup::GetEEPContent ( ) + { + return iEEPContent; + } + +void CAknFepUICtrlPinyinPopup::SetEEPContentValid ( TBool aValid ) + { + iEEPContentValid = aValid; + } + +TBool CAknFepUICtrlPinyinPopup::GetEEPContentValid ( ) + { + return iEEPContentValid; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::ChineseCharsDisped() + { + return this->iChineseCharsDisped; + } + +CDesCArrayFlat* CAknFepUICtrlPinyinPopup::ZhuyinSymbolsForChineseCharsDisped() + { + return this->iZhuyinSymbolsForChineseCharsDisped; + } + +void CAknFepUICtrlPinyinPopup::ResetStrokeArray() + { + //reset pinyin array + iSpellingArray->Reset(); + iSpellingArray->Compress(); + iSpellingIndexArray->Reset(); + iSpellingIndexArray->Compress(); + iKeystrokeArray->Reset(); + iKeystrokeArray->Compress(); + iInEffectKeystrokeArray->Reset(); + iInEffectKeystrokeArray->Compress(); + iShowKeystrokeArray->Reset(); + iShowKeystrokeArray->Compress(); + iChooseChineseCharacterArray->Reset(); + iChooseChineseCharacterArray->Compress(); + iChooseChineseCharacterArrayKeystroke->Reset(); + iChooseChineseCharacterArrayKeystroke->Compress(); + iOptimizeSpelling->Reset(); + iOptimizeSpelling->Compress(); + iTempSpelling->Reset(); + iTempSpelling->Compress(); + + //reset stroke array + iKeystrokeArrayForStroke->Reset(); + iKeystrokeArrayForStroke->Compress(); + iInEffectKeystrokeArrayForStroke->Reset(); + iInEffectKeystrokeArrayForStroke->Compress(); + iShowKeystrokeArrayForStroke->Reset(); + iShowKeystrokeArrayForStroke->Compress(); + iChooseChineseCharacterArrayForStroke->Reset(); + iChooseChineseCharacterArrayForStroke->Compress(); + iChooseChineseCharacterArrayKeystrokeForStroke->Reset(); + iChooseChineseCharacterArrayKeystrokeForStroke->Compress(); + + //reset zhuyin array + iZhuyinSymbols->Reset(); + iFirstValidZhuyinGrp->Reset(); + iChineseCharsDisped->Reset(); + iZhuyinSymbolsForChineseCharsDisped->Reset(); + + iZhuyinSymbols->Compress(); + iFirstValidZhuyinGrp->Compress(); + iChineseCharsDisped->Compress(); + iZhuyinSymbolsForChineseCharsDisped->Compress(); + + iLastResouce = 0; + iValidKeystrokeCount = 0; + iPhraseCreation = 0; + iPhraseCreationEditingState = 0; + iHighLightFlag = 0; + iChangeStateFromEditToSpelling = 0; + iValidKeystrokeChanged = 0; + + } + +void CAknFepUICtrlPinyinPopup::SetChangeState( TBool aChangeState ) + { + iChangeState = aChangeState ; + } + +TBool CAknFepUICtrlPinyinPopup::IsChangeStatet() const + { + return iChangeState; + } + +void CAknFepUICtrlPinyinPopup::SetState( TInt aState ) + { + iState = aState; + } + +TInt CAknFepUICtrlPinyinPopup::GetState() + { + return iState; + } + +void CAknFepUICtrlPinyinPopup::SetPhraseCreationState( TBool aState ) + { + iPhraseCreation = aState; + } + +TBool CAknFepUICtrlPinyinPopup::GetPhraseCreationState() + { + return iPhraseCreation; + } + +void CAknFepUICtrlPinyinPopup::SetPhraseCreationEditingState( TBool aState ) + { + iPhraseCreationEditingState = aState; + } + +TBool CAknFepUICtrlPinyinPopup::GetPhraseCreationEditingState() + { + return iPhraseCreationEditingState; + } + +// --------------------------------------------------------- +// Set flag whether from candidate state change state. +// --------------------------------------------------------- +// +void CAknFepUICtrlPinyinPopup::SetFromCandidateChangeStateFlag( TBool aFlag ) + { + iHighLightFlag = aFlag; + } + +// --------------------------------------------------------- +// Get flag whether from candidate state change state. +// --------------------------------------------------------- +// +TBool CAknFepUICtrlPinyinPopup::GetFromCandidateChangeStateFlag() + { + return iHighLightFlag; + } + +// --------------------------------------------------------- +// Set count of valid keystroke. +// --------------------------------------------------------- +// +void CAknFepUICtrlPinyinPopup::SetValidKeystrokeCount( TInt aCount ) + { + iValidKeystrokeCount = aCount; + } + +// --------------------------------------------------------- +// Set count of valid keystroke. +// --------------------------------------------------------- +// +TInt CAknFepUICtrlPinyinPopup::GetValidKeystrokeCount() + { + return iValidKeystrokeCount; + } + +// --------------------------------------------------------- +// Set last cba resouce id. +// --------------------------------------------------------- +// +void CAknFepUICtrlPinyinPopup::SetLastResouce( TInt aResouceId ) + { + iLastResouce = aResouceId; + } + +// --------------------------------------------------------- +// Get last cba resouce id. +// --------------------------------------------------------- +// +TInt CAknFepUICtrlPinyinPopup::GetLastResouce() + { + return iLastResouce; + } + +// --------------------------------------------------------- +// Set change state from Edit to Spelling flag. +// --------------------------------------------------------- +// +void CAknFepUICtrlPinyinPopup::SetFromEditToSpellingFlag( TBool aFlag ) + { + iChangeStateFromEditToSpelling = aFlag; + } + +// --------------------------------------------------------- +// Get change state from Edit to Spelling flag. +// --------------------------------------------------------- +// +TInt CAknFepUICtrlPinyinPopup::GetFromEditToSpellingFlag() + { + return iChangeStateFromEditToSpelling; + } + +// --------------------------------------------------------- +// Set valid keystroke change flag. +// --------------------------------------------------------- +// +void CAknFepUICtrlPinyinPopup::SetValidKeystrokeChange( TBool aFlag ) + { + iValidKeystrokeChanged = aFlag; + } + +// --------------------------------------------------------- +// Get valid keystroke change flag. +// --------------------------------------------------------- +// +TBool CAknFepUICtrlPinyinPopup::GetValidKeystrokeChange() + { + return iValidKeystrokeChanged; + } + +// --------------------------------------------------------- +// Set PreStateIsPredict flag. +// --------------------------------------------------------- +// +void CAknFepUICtrlPinyinPopup::SetPreStateIsPredictive( TBool aFlag ) + { + iPreStateIsPredictive = aFlag; + } + +// --------------------------------------------------------- +// Set PreStateIsPredict flag. +// --------------------------------------------------------- +// +TBool CAknFepUICtrlPinyinPopup::GetPreStateIsPredictive() + { + return iPreStateIsPredictive; + } + +void CAknFepUICtrlPinyinPopup::SetInputLayoutMiniQwertyZhuyin() + { + for(TInt i = 0; i < EMaxPhraseCandidate; i++) + { + iInputPaneArray[i]->SetLayout( CAknFepUICtrlInputPane::ELayoutPhraseMiniQwertyZhuyin ); + } + } + +void CAknFepUICtrlPinyinPopup::ResetInputLayoutMiniQwertyZhuyin() + { + for(TInt i = 0; i < EMaxPhraseCandidate; i++) + { + iInputPaneArray[i]->SetLayout( CAknFepUICtrlInputPane::ELayoutPhrasePinyinPopupPane ); + } + } +// End of file