diff -r 000000000000 -r eb1f2e154e89 textinput/peninputcommonlayout/src/peninputlayoutwindowext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputcommonlayout/src/peninputlayoutwindowext.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,1829 @@ +/* +* 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: common layout window for UI interface of VKB and HWR +* +*/ + + +// System includes +#include + +#include +#include +#include +#include // Use global signal +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include + +// User includes +#include "peninputdataconverter.h" +#include "peninputrangebarinfo.h" +#include "peninputlayoutwindowext.h" +#include "peninputclientlayoutinfo.h" +#include "peninputdataprovider.h" +#include "peninputlayoutcontext.h" +#include "peninputvkbctrlext.h" +#include "peninputnumerickeymappingmgr.h" + +// Constants +const TInt KIntLengthForByte = 8; +const TInt KPeninputLayoutWindowUnitWidth = 12; +const TInt KInvalidIndex = -1; + +//const TInt32 KInvalidResId = -1; +//const TInt KInvalidImg = -1 ; +const TUint32 KDefaultTextColor = 0x000000; +const TUint32 KDefaultShadowTextColor = 0xffffff; +//const TInt KNotSupportSkin = -1; + +const TInt KIntSizeToInt16 = 2; +const TInt KMaxNumericString = 32; + +// ======== MEMBER FUNCTIONS ======== + +// ------------------------------------------------------------------------ +// CPeninputLayoutWindowExt::CPeninputLayoutWindowExt +// (other items were commented in a header) +// ------------------------------------------------------------------------ +// +EXPORT_C CPeninputLayoutWindowExt::CPeninputLayoutWindowExt( + CFepUiLayout* aUiLayout, MPeninputLayoutContext* aLayoutContext ) + : CAknFepCtrlBaseWindowExt( aUiLayout, EPeninutWindowCtrlIdBaseWindow ), + iConfigInfo( NULL ), iLayoutContext( aLayoutContext ), + iLastUsedTotalColumns( KPeninputLayoutWindowUnitWidth ), + iFirstTimeConstruct( ETrue ), + iSwitchFontSet(EFalse), + iUnitSizeChange(EFalse) + { + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::ConstructL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::ConstructL() + { + BaseConstructL(); + + if( iLayoutContext->LayoutType() == EPluginInputModeVkb || + iLayoutContext->LayoutType() == EPluginInputModeFSQ ) + { + iVkbLayout = CAknFepCtrlVkbLayout::NewL(); + } + else + { + iVkbLayout = NULL; + } + + CCoeEnv* coeEnv = CCoeEnv::Static(); + + // Set up resources + TFileName resFileName = GetWindowResFileName(); + BaflUtils::NearestLanguageFile(coeEnv->FsSession(), resFileName ); + iWinResId = coeEnv->AddResourceFileL( resFileName ); + + //TResourceReader reader; + + //coeEnv->CreateResourceReaderLC( reader, GetWindowResId() ); + SetResourceId( GetWindowResId() ); + ConstructFromResourceL(); + + if (!iKeyMappingMgr) + { + // if key mapping mgr is not constructed in ConstructFromResourceL, need to + // construct it here + TResourceReader resReader; + CCoeEnv::Static()->CreateResourceReaderLC(resReader, GetNumKeymappingResId()); + iKeyMappingMgr = CPeninputNumericKepMappingMgr::NewL(resReader); + CleanupStack::PopAndDestroy(1); + } + + CreateAllControlsL(); + SetControlsFont(); + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::~CPeninputLayoutWindowExt +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C CPeninputLayoutWindowExt::~CPeninputLayoutWindowExt() + { + delete iConfigInfo; + delete iKeyMappingMgr; + delete iVkbLayout; + // Delete resource file from CoeEnv + CCoeEnv::Static()->DeleteResourceFile( iWinResId ); + + CCoeEnv::Static()->DeleteResourceFile( iConfigResId ); + + delete iToneSet; + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::SizeChanged +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::SizeChanged( TBool /*aLandscapeStyle*/ ) + { + iLangOrSizeChanged = ETrue; + ReadLafForShadow(); + ResetLastColRow(); + + if ( iConfigInfo ) + { + ChangeClientSize(); + } + + //ReadLafForShadow( rect ); + + TInt style = EPeninputPositionChangeBrJustify; + TBuf bufStyle; + bufStyle = ( TUint16* )&style; + HandleControlEvent(EPeninputLayoutEventMovePosition, NULL, bufStyle); + + iLangOrSizeChanged = EFalse; + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::ReadLafForShadow +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CPeninputLayoutWindowExt::ReadLafForShadow() + { + TAknWindowLineLayout shadowPane; + TAknWindowLineLayout shadowTl; + TAknWindowLineLayout shadowBr; + TAknLayoutRect shadowRect; + TAknLayoutRect shadowTlRect; + TAknLayoutRect shadowBrRect; + + shadowPane = AknLayoutScalable_Avkon::bg_popup_fep_shadow_pane(1).LayoutLine(); + shadowRect.LayoutRect(TRect(), shadowPane); + + shadowTl = AknLayoutScalable_Avkon::bg_popup_fep_shadow_pane_g1().LayoutLine(); + shadowTlRect.LayoutRect(shadowRect.Rect(), shadowTl); + + shadowBr = AknLayoutScalable_Avkon::bg_popup_fep_shadow_pane_g8().LayoutLine(); + shadowBrRect.LayoutRect(shadowRect.Rect(), shadowBr); + + iShadowTlWidth = shadowTlRect.Rect().Size().iWidth; + iShadowTlHeight = shadowTlRect.Rect().Size().iHeight; + iShadowBrWidth = shadowBrRect.Rect().Size().iWidth; + iShadowBrHeight = shadowBrRect.Rect().Size().iHeight; + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::SizeChanged +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::SizeChangedForBaseWindow( TInt /*aTotalColumns*/ ) + { + } +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::HandleControlEvent +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::HandleControlEvent( TInt aEventType, + CFepUiBaseCtrl* aCtrl, const TDesC& aEventData ) + { + // Call this function in base class + CAknFepCtrlBaseWindowExt::HandleControlEvent( aEventType, + aCtrl, aEventData ); + + TInt* data = ( TInt* ) aEventData.Ptr(); + + switch ( aEventType ) + { + case EEventButtonUp: + { + // check current range + TInt curRange = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) ); + if( aCtrl->ControlId() == EPeninutWindowCtrlIdShiftBtn) + { + if ( ( curRange == ERangeEnglish ) || ( curRange == ERangeAccent ) + || ( ConfigInfo()->CaseSensitive() && ( curRange == ERangeNative ) ) ) + { + CAknFepCtrlMultiModeButton* button = + static_cast( aCtrl ); + TInt realCase = button->GetRealCaseByMode( button->CurrentMode() ); + HandleMergedBtnClicked( realCase ); + } + else + { + HandleShiftAndCapslockBtnClicked(); + TInt shiftStatus = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeShiftDown ) ); + ChangeMergedButtonStatus( shiftStatus, 0 ); + } + } + + } + break; + case EPeninputLayoutEventSwitchLanguage: + { + TRAP_IGNORE( ChangeInputLanguageL( *data ) ); + } + break; + case EPeninputLayoutEventRange: + { + HandleRangeEvent( *data ); + } + break; + case EPeninputLayoutEventRangeLoop: + { + HandleRangeLoopEvent( *data ); + } + break; + case EPeninputLayoutEventShift: + { + HandleShiftAndCapslockBtnClicked(); + } + break; + case EPeninputLayoutEventCapslock: + { + HandleCapslockBtnClicked(); + } + break; + case EPeninputLayoutEventMovePosition: + { + TInt style = *( ( TUint16* ) aEventData.Ptr() ); + ChangeLayoutPosition( style ); + } + break; + case EPeninputLayoutEventSetPermittedRange: + { + if ( *data & ERangeNative ) + { + *data = *data | ERangeAccent | ERangeNativeNumber + | ERangeMixedText | ERangeMixedNumber; + } + else if(*data & ERangeEnglish) + { + *data = *data | ERangeAccent; + } + + iLayoutContext->SetData( EPeninputDataTypePermittedRange, data ); + + // Set range of range bar component + CFepUiBaseCtrl* bar = + Control( EPeninutWindowCtrlIdRangeBar ); + if ( bar ) + { + CAknFepCtrlRangeBar* rangebar = + static_cast( bar ); + rangebar->SetPermittedRanges( *data ); + } + } + break; + case EPeninputLayoutEventSetPermittedCase: + { + // Update data:case + iLayoutContext->SetData( EPeninputDataTypePermittedCase, data ); + + // Set range of case + CFepUiBaseCtrl* bar = + Control( EPeninutWindowCtrlIdRangeBar ); + if ( bar ) + { + CAknFepCtrlRangeBar* rangebar = + static_cast( bar ); + + rangebar->SetPermittedCase( ERangeEnglish, ECaseUpper, + ( *data & ECaseUpper) != 0 ); + rangebar->SetPermittedCase( ERangeEnglish, ECaseLower, + ( *data & ECaseLower) != 0 ); + rangebar->SetPermittedCase( ERangeEnglish, ECaseText, + ( *data & ECaseText) != 0 ); + } + } + break; + case EPeninputLayoutEventSetCase: + { + DoCaseChange( *data ); + } + break; + case EEventSizeChanged: + { + //if icf editor size changed, we need to inform owner + if(aCtrl->ControlId() == EPeninutWindowCtrlIdInputContextField || + aCtrl->ControlId() == EPeninputWindowCtrlIdMultiLineICF) + { + iLayoutContext->Sendkey( ESignalLayoutICFLengthChanged, KNullDesC ); + } + } + break; + default: + break; + } + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::SetEditorTextL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::SetEditorTextL( + const TFepInputContextFieldData& aData ) + { + if (Control(EPeninutWindowCtrlIdInputContextField)) + { + static_cast( Control(EPeninutWindowCtrlIdInputContextField))->SetTextL( aData ); + return; + } + + if (Control(EPeninputWindowCtrlIdMultiLineICF)) + { + CFepLayoutMultiLineIcf* multiIcf = + static_cast( Control(EPeninputWindowCtrlIdMultiLineICF)); + + multiIcf->SetTextL( aData ); + + if ( iLayoutContext->LayoutType() == EPluginInputModeVkb || + iLayoutContext->LayoutType() == EPluginInputModeFSQ ) + { + TInt lang = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeInputLanguage ) ); + TInt curRange = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) ); + + if ( lang == ELangVietnamese && curRange == ERangeEnglish ) + { + TBuf<1> preData; + multiIcf->ExtractText( preData, aData.iCurSel.LowerPos()-1, 1 ); + iVowelChar = EFalse; + + if ( KNullDesC() != preData ) + { + for (TUint i = 0; i < sizeof(VietVowelList) / sizeof(TText); ++i) + { + TBuf<1> buf; + buf.Append( VietVowelList[i] ); + if (preData == buf) + { + iVowelChar = ETrue; + break; + } + } + } + CPeninputVkbCtrlExt* vkbCtrl = static_cast + ( Control( EPeninutWindowCtrlIdVkbCtrl ) ); + vkbCtrl->DimKeySet( iToneSet, !iVowelChar ); + } + } + } + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::SetEditorTextL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::SetTextIsSecret( TBool aData ) + { + if ( Control(EPeninutWindowCtrlIdInputContextField)) + { + static_cast + (Control(EPeninutWindowCtrlIdInputContextField))->SetTextIsSecret( aData ); + } + else if (Control(EPeninputWindowCtrlIdMultiLineICF)) + { + static_cast + (Control(EPeninputWindowCtrlIdMultiLineICF))->SetTextIsSecret( aData ); + } + } + +void CPeninputLayoutWindowExt::SetNumberGrouping( TBool aData ) + { + if (Control(EPeninputWindowCtrlIdMultiLineICF)) + { + static_cast + (Control(EPeninputWindowCtrlIdMultiLineICF))->SetNumberGrouping( aData ); + } + } + + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::DoClose +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CPeninputLayoutWindowExt::DoClose() + { + // Send EVkbEventWindowClose to layout + this->ReportEvent( EPeninputLayoutEventClose, KNullDesC ); + + // Return true which will permit the window close + return EFalse; + } + + +// --------------------------------------------------------------------------- +// Get layout config method. It does a lasy initialization for a instance of +// CPeninputLayoutWindowExt::ConfigInfo +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C CPeninputLayoutConfig* CPeninputLayoutWindowExt::ConfigInfo() const + { + return iConfigInfo; + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::CheckResourceExist +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +TBool CPeninputLayoutWindowExt::CheckResourceExist( const TDesC& aFileName ) + { + RFile file; + + if ( !aFileName.Length() ) + { + return EFalse; + } + + TInt rs = file.Open( CCoeEnv::Static()->FsSession(), aFileName, EFileRead ); + + if ( rs == KErrNotFound ) + { + return EFalse; + } + else + { + file.Close(); + + return ETrue; + } + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::ChangeInputLanguageL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::ChangeInputLanguageL( TInt aLangID ) + { + // Determine whether a new language id is same as existing one, + if ( ConfigInfo() ) + { + // If language not changed, exit this function + if ( ConfigInfo()->Language() == aLangID ) + { + return; + } + } + + // First check file exist or not + TBool found = CheckResourceExist( GetWindowConfigResFileName( aLangID ) ); + if ( !found ) + { + aLangID = ELangEnglish; + found = CheckResourceExist( GetWindowConfigResFileName( aLangID ) ); + } + + if ( found ) + { + // Store language + iLayoutContext->SetData( EPeninputDataTypeInputLanguage, &aLangID ); + + if ( iLayoutContext->LayoutType() == EPluginInputModeVkb || + iLayoutContext->LayoutType() == EPluginInputModeFSQ ) + { + CFepUiBaseCtrl* ctrl = + Control( EPeninutWindowCtrlIdVkbCtrl ); + if ( ctrl ) + { + ( static_cast( ctrl ) )->Reset(); + } + } + + // Re-construct config info + if ( iConfigInfo ) + { + delete iConfigInfo; + iConfigInfo = NULL; + } + + if (iConfigResId) + { + CCoeEnv::Static()->DeleteResourceFile( iConfigResId ); + } + + // construct resource utils + + CCoeEnv* coeEnv = CCoeEnv::Static(); + + // Set up resources + TFileName resFileName = GetWindowConfigResFileName( aLangID ); + BaflUtils::NearestLanguageFile(coeEnv->FsSession(), resFileName ); + iConfigResId = coeEnv->AddResourceFileL( resFileName ); + + TResourceReader reader; + + coeEnv->CreateResourceReaderLC( reader, GetWindowConfigResId() ); + if ( iLayoutContext->LayoutType() == EPluginInputModeVkb || + iLayoutContext->LayoutType() == EPluginInputModeFSQ ) + { + iVkbLayout->Reset(); + } + iConfigInfo = CPeninputLayoutConfig::NewL( *iVkbLayout, reader ); + + // Pop and destroy reader + CleanupStack::PopAndDestroy( 1 ); + + // Re-construct rangebar + ChangeRangeBarL(); + + //Reset range and layoutid + TInt range = -1; + iLayoutContext->SetData( EPeninputDataTypeCurrentRange, &range ); + iLayoutContext->SetData( EPeninputDataTypeClientLayout, &range ); + ResetLastColRow(); + iLangOrSizeChanged = ETrue; + + CFepUiBaseCtrl* icfCtrl = Control( EPeninputWindowCtrlIdMultiLineICF ); + if ( icfCtrl ) + { + static_cast(icfCtrl)->SetLanguageId( aLangID ); + } + + delete iToneSet; + iToneSet = NULL; + + if ( aLangID == ELangVietnamese ) + { + iToneSet = HBufC::NewL( KNumberOfToneMarks ); + + for (TInt index = 0; index < KNumberOfToneMarks; index ++) + { + iToneSet->Des().Append( VietToneMatrix[0][index] ); + } + } + } + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::ChangeRangeBarL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +void CPeninputLayoutWindowExt::ChangeRangeBarL() + { + // Read range bar from config into and reconstruct range button + if ( iConfigInfo ) + { + TInt resid = iConfigInfo->RangebarResId(); + CFepUiBaseCtrl* bar = + Control( EPeninutWindowCtrlIdRangeBar ); + + if ( bar ) + { + CAknFepCtrlRangeBar* rangebar = + static_cast( bar ); + + CAknFepCtrlRangeBar::TRangeBarActionStyle style = + ( CAknFepCtrlRangeBar::TRangeBarActionStyle ) + iConfigInfo->RangeBarInfo()->RangeStyle(); + + rangebar->SetActionStyle( style ); + + TResourceReader reader; + + CCoeEnv::Static()->CreateResourceReaderLC( reader, resid ); + + rangebar->ConstructFromResourceL( reader ); + + // Pop and destroy reader + CleanupStack::PopAndDestroy( 1 ); + } + } + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::ChangeRange +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::ChangeRange( TInt aRange, TInt aVkbLayoutId, + TBool aNotify ) + { + TInt curRange = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) ); + TInt curVkbLayout = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeVkbLayout ) ); + + CFepUiBaseCtrl* bar = + Control( EPeninutWindowCtrlIdRangeBar ); + CAknFepCtrlRangeBar* rangebar = + static_cast( bar ); + + if ( rangebar ) + { + rangebar->ActiveRange( aRange ); + } + + if (curRange != aRange || curVkbLayout != aVkbLayoutId || aRange == ERangeAccent) + { + // Update data:range + if (curRange != aRange) + iLayoutContext->SetData( EPeninputDataTypeCurrentRange, &aRange ); + + // Change client layout + CPeninputRangeBarInfo* rangeBarInfo = iConfigInfo->RangeBarInfo(); + CPeninputRangeInfo* rangeInfo = rangeBarInfo->FindRange(aRange); + + __ASSERT_DEBUG(rangeInfo, User::Panic(_L("Commonlayout-Invalid Range"), aRange)); + + ChangeClientLayout(rangeInfo->ClientLayoutId()); + + // Notify fep the new range + if (aNotify) + { + TBuf buf; + CPeninputDataConverter::IntToDesc( aRange, buf ); + iLayoutContext->Sendkey( ESignalRange, buf ); + + // When change range mannually, make the entire window visible + TInt style = EPeninputPositionChangeBrJustify; + TBuf bufStyle; + bufStyle = ( TUint16* )&style; + HandleControlEvent(EPeninputLayoutEventMovePosition, NULL, bufStyle); + } + + // Change vkb layout + if ( iLayoutContext->LayoutType() == EPluginInputModeVkb || + iLayoutContext->LayoutType() == EPluginInputModeFSQ ) + { + if ( ( aRange == ERangeEnglish ) || ( aRange == ERangeAccent ) + || ( aRange == ERangeNativeNumber ) + || ( ConfigInfo()->CaseSensitive() + && ( aRange == ERangeNative ) ) ) + { + // Change shift and capslock button status according to the current case + TInt curCase = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCase ) ); + TInt shfit; + TInt capslock; + + CPeninputDataConverter::ShiftCapslockByCase( curCase, + shfit, capslock ); + + iLayoutContext->SetData( EPeninputDataTypeShiftDown, &shfit ); + //ChangeButtonStatus( shfit, EPeninutWindowCtrlIdShiftBtn ); + iLayoutContext->SetData( EPeninputDataTypeCapslockDown, &capslock ); + //ChangeButtonStatus( capslock, EPeninutWindowCtrlIdCapslockBtn ); + ChangeMergedButtonStatus( shfit, capslock ); + + TInt caseid = CaseByShiftCapslockStatus(); + TInt vkblayoutid = + ConfigInfo()->ShiftCapsSingleVkbLayoutId( aRange, caseid ); + + if ( aRange == ERangeAccent ) + { + TInt curAccentIndex = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentAccent ) ); + vkblayoutid = vkblayoutid + curAccentIndex * 2; + } + + // Change vkb layout + ChangeVkbLayout( vkblayoutid ); + } + else + { + TInt flag = 0; + + iLayoutContext->SetData( EPeninputDataTypeShiftDown, &flag ); + //ChangeButtonStatus( 0, EPeninutWindowCtrlIdShiftBtn ); + iLayoutContext->SetData( EPeninputDataTypeCapslockDown, &flag ); + //ChangeButtonStatus( 0, EPeninutWindowCtrlIdCapslockBtn ); + ChangeMergedButtonStatus( 0, 0 ); + + // Change vkb layout + if ( aVkbLayoutId ) + { + ChangeVkbLayout( aVkbLayoutId ); + } + else + { + ChangeVkbLayout( rangeInfo->VkbLayoutId() ); + } + } + } + + } + + if ( ( iLayoutContext->LayoutType() == EPluginInputModeVkb || + iLayoutContext->LayoutType() == EPluginInputModeFSQ ) + && ( curRange == ERangeNumber || curRange == ERangeNativeNumber ) + && ( curRange == aRange ) ) + { + // Dimmed some keys if needed + DimKeys(); + } + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::ChangeClientLayout +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::ChangeClientLayout( + TInt aClientLayoutId ) + { + TInt curClientId = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeClientLayout ) ); + + if ( curClientId != aClientLayoutId ) + { + CPeninputClientLayoutInfo* clientLayout = + ConfigInfo()->FindClientLayoutInfo( aClientLayoutId ); + + __ASSERT_DEBUG( clientLayout, User::Panic(_L("Commonlayout-Invalid ClientLayout"), aClientLayoutId)); + + SetLafLayOut( clientLayout->Rows(), clientLayout->Columns() ); + + //SizeChangedForBaseWindow( clientLayout->Columns() ); + + // Re-Orginize all controls according to the configuration + ReorganizeControls( aClientLayoutId, ETrue ); + + // Update data:client layout id + iLayoutContext->SetData( EPeninputDataTypeClientLayout, + &aClientLayoutId ); + } + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::ChangeVkbLayout +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::ChangeVkbLayout( TInt aVkbLayoutId ) + { + TInt latchedFlag = CPeninputDataConverter::AnyToInt( + iLayoutContext->RequestData(EAkninputDataTypeLatchedSet)); + // If the DeadKey is latched, cancel it and then change the VKB layout + if(latchedFlag) + { + RPointerArray vkbListInfo; + RPointerArray keyInfoList; + + vkbListInfo = iVkbLayout->VkbLayoutInfoList(); + TInt vkbListNum = vkbListInfo.Count(); + + CVirtualKey* pKey; + TBool deadKeyChange = EFalse; + // Find the latched DeadKey in all the Vkb layout + for(TInt i = 0; i < vkbListNum; i++) + { + // Get key info list in one VKB layout + keyInfoList = vkbListInfo[i]->KeyInfoList(); + TInt keyListNum = keyInfoList.Count(); + for(TInt j = 0; j < keyListNum; j++) + { + pKey = keyInfoList[j]->Key(); + if(pKey->Latched()) + { + // Unlatch the DeadKey + pKey->SetLatched(EFalse); + + // Set the DeadKey state + iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange); + deadKeyChange = ETrue; + break; + } + } + if(deadKeyChange) + { + break; + } + } + } + + TInt curVkbId = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeVkbLayout ) ); + + if ( ( curVkbId != aVkbLayoutId ) || ( iLangOrSizeChanged ) ) + { + iLangOrSizeChanged = EFalse; + // Update data : vkb layout id + iLayoutContext->SetData( EPeninputDataTypeVkbLayout, &aVkbLayoutId ); + + iVkbLayout->ChangeVkbLayout( aVkbLayoutId ); + SetVkbLayoutSize(); + + TInt curClientId = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeClientLayout ) ); + CPeninputControlInfo* vkbInfo = iConfigInfo->FindClientLayoutInfo + ( curClientId )->FindControlInfo( EPeninutWindowCtrlIdVkbCtrl ); + + TRect rect; + CPeninputVkbCtrlExt* vkbCtrl = static_cast + ( Control(EPeninutWindowCtrlIdVkbCtrl)); + + + CPeninputVkbLayoutInfo* vkblayout = + ConfigInfo()->FindVkbLayoutInfo( aVkbLayoutId ); + + if ( vkbCtrl && vkblayout ) + { + DimKeys(); + + // Make the true draw + UpdateArea( vkbCtrl->Rect(), EFalse ); + } + } + } + +// -------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::HandleRangeEvent +// (other items were commented in a header) +// -------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::HandleRangeEvent( TInt aRange ) + { + TInt curRange = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) ); + + CPeninputRangeBarInfo* rangeBar = iConfigInfo->RangeBarInfo(); + if ( !rangeBar ) + { + return; + } + + CPeninputRangeInfo* rangeInfo = rangeBar->FindRange( aRange ); + + if ( !rangeInfo ) + { + return; + } + + TInt responseStyle = rangeInfo->ResponseStyle(); + if ( responseStyle == EPeninputRangeResponseNoAction ) + { + return; + } + + if (curRange != aRange && responseStyle == EPeninputRangeResponseSwitchRange) + { + TInt index = KInvalidIndex; + + if ( aRange == ERangeAccent ) + { + index = 0; + } + iLayoutContext->SetData( EPeninputDataTypeCurrentAccent, &index ); + + ChangeRange( aRange ); + } + else if ( responseStyle == EPeninputRangeResponsePopupChoiceItem ) + { + PopupChoiceList(); + } + } + +// -------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::HandleRangeLoopEvent +// (other items were commented in a header) +// -------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::HandleRangeLoopEvent( TInt aLoop ) + { + TInt curRange = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) ); + + CFepUiBaseCtrl* ctrl = Control( EPeninutWindowCtrlIdRangeBar ); + CAknFepCtrlRangeBar* rangebar = static_cast( ctrl ); + + if ( rangebar ) + { + TRAP_IGNORE( rangebar->SetCaseL( curRange, aLoop ) ); + + if ( ( curRange == ERangeEnglish ) || ( ConfigInfo()->CaseSensitive() + && ( curRange == ERangeNative ) ) ) + { + TInt curCase = rangebar->GetCase( curRange ); + + // Store case in the data manager, the engine will + // get notice at the same time + iLayoutContext->SetData( EPeninputDataTypeCase, &curCase ); + + // Notify fep the new case + TBuf buf; + CPeninputDataConverter::IntToDesc( curCase, buf ); + iLayoutContext->Sendkey( ESignalCaseMode, buf ); + } + } + } + +// -------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::CaseByShiftCapslockStatus +// (other items were commented in a header) +// -------------------------------------------------------------------------- +// +EXPORT_C TInt CPeninputLayoutWindowExt::CaseByShiftCapslockStatus() + { + TInt shiftStatus = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeShiftDown ) ); + TInt capslockStatus = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCapslockDown ) ); + + return ( capslockStatus * 2 + shiftStatus ); + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindow::HandleShiftBtnClicked +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::HandleMergedBtnClicked( TInt aCase ) + { + switch( aCase ) + { + case ECaseLower: + { + HandleCapslockBtnClicked(); + } + break; + case ECaseUpper: + { + HandleShiftBtnClicked(); + } + break; + case ECaseText: +// case ECaseInverseText: + { + // Current case is Text, equals shift button + //HandleCapslockBtnClicked(); + HandleShiftAndCapslockBtnClicked(); + } + break; + default: + break; + } + + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::HandleShiftBtnClicked +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::HandleShiftBtnClicked() + { + TInt curRange = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) ); + + TInt shiftStatus = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeShiftDown ) ); + TInt capslockStatus = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCapslockDown ) ); + + // Update data + if ( iLayoutContext->IsCapsLockPermitted() ) + { + if ( curRange == ERangeEnglish || curRange == ERangeAccent + || ( ConfigInfo()->CaseSensitive() && curRange == ERangeNative ) ) + { + capslockStatus = !capslockStatus; + ChangeMergedButtonStatus( shiftStatus, capslockStatus ); + iLayoutContext->SetData( EPeninputDataTypeCapslockDown, &capslockStatus ); + } + } + else + { + if ( iLayoutContext->IsShiftPermitted() ) + { + shiftStatus = !shiftStatus; + ChangeMergedButtonStatus( shiftStatus, capslockStatus ); + iLayoutContext->SetData( EPeninputDataTypeShiftDown, &shiftStatus ); + } + } + + // Update vkb layout + TInt caseid = CaseByShiftCapslockStatus(); + + TInt vkbLayout = iConfigInfo->ShiftCapsSingleVkbLayoutId( curRange, + caseid ); + + TInt responseStyle = + iConfigInfo->RangeBarInfo()->FindRange( curRange )->ResponseStyle(); + if ( ( curRange == ERangeAccent ) + && ( responseStyle == EPeninputRangeResponsePopupChoiceItem ) ) + { + TInt curAccentIndex = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentAccent ) ); + vkbLayout = vkbLayout + curAccentIndex * 2; + } + + ChangeVkbLayout( vkbLayout ); + + // Synchronize case if needed + if ( ( curRange == ERangeEnglish ) || ( curRange == ERangeAccent ) + || ( ConfigInfo()->CaseSensitive() && ( curRange == ERangeNative ) ) ) + { + // Notify fep the new case + TBuf buf; + TInt fepcase = CPeninputDataConverter::FepCaseByCaseId( caseid ); + iLayoutContext->SetData( EPeninputDataTypeCase, &fepcase ); + CPeninputDataConverter::IntToDesc( fepcase, buf ); + iLayoutContext->Sendkey( ESignalCaseMode, buf ); + } + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::HandleCapslockBtnClicked +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::HandleCapslockBtnClicked() + { + TInt curRange = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) ); + + TInt capslockStatus = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCapslockDown ) ); + TInt shiftStatus = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeShiftDown ) ); + + if ( iLayoutContext->IsShiftPermitted() ) + { + if ( curRange == ERangeEnglish || curRange == ERangeAccent || + ( ConfigInfo()->CaseSensitive() && curRange == ERangeNative ) ) + { + shiftStatus = !shiftStatus; + ChangeMergedButtonStatus( shiftStatus, capslockStatus ); + iLayoutContext->SetData( EPeninputDataTypeShiftDown, &shiftStatus ); + } + } + else + { + if ( iLayoutContext->IsCapsLockPermitted() ) + { + capslockStatus = !capslockStatus; + ChangeMergedButtonStatus( shiftStatus, capslockStatus ); + iLayoutContext->SetData( EPeninputDataTypeCapslockDown, &capslockStatus ); + } + } + + // Update vkb layout + TInt caseid = CaseByShiftCapslockStatus(); + TInt vkbLayout = iConfigInfo->ShiftCapsSingleVkbLayoutId( curRange, + caseid ); + + TInt responseStyle = + iConfigInfo->RangeBarInfo()->FindRange( curRange )->ResponseStyle(); + if ( ( curRange == ERangeAccent ) + && ( responseStyle == EPeninputRangeResponsePopupChoiceItem ) ) + { + TInt curAccentIndex = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentAccent ) ); + vkbLayout = vkbLayout + curAccentIndex * 2; + } + + ChangeVkbLayout( vkbLayout ); + + // Synchronize case if needed + if ( ( curRange == ERangeEnglish ) || ( curRange == ERangeAccent ) + || ( ConfigInfo()->CaseSensitive() && ( curRange == ERangeNative ) ) ) + { + // Notify fep the new case + TBuf buf; + TInt fepcase = CPeninputDataConverter::FepCaseByCaseId( caseid ); + iLayoutContext->SetData( EPeninputDataTypeCase, &fepcase ); + CPeninputDataConverter::IntToDesc( fepcase, buf ); + iLayoutContext->Sendkey( ESignalCaseMode, buf ); + } + } + +EXPORT_C void CPeninputLayoutWindowExt::HandleShiftAndCapslockBtnClicked() + { + TInt curRange = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) ); + + TInt shiftStatus = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeShiftDown ) ); + TInt capslockStatus = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCapslockDown ) ); + + if ( shiftStatus ) + { + shiftStatus = 0; + } + else + { + shiftStatus = 1; + } + + // Update data + iLayoutContext->SetData( EPeninputDataTypeShiftDown, &shiftStatus ); + + if ( iLayoutContext->IsCapsLockPermitted() ) + { + if ( curRange == ERangeEnglish || curRange == ERangeAccent + || ( ConfigInfo()->CaseSensitive() && curRange == ERangeNative ) ) + { + capslockStatus = !capslockStatus; + ChangeMergedButtonStatus( shiftStatus, capslockStatus ); + iLayoutContext->SetData( EPeninputDataTypeCapslockDown, &capslockStatus ); + } + } + else + { + if ( iLayoutContext->IsShiftPermitted() ) + { + shiftStatus = !shiftStatus; + ChangeMergedButtonStatus( shiftStatus, capslockStatus ); + iLayoutContext->SetData( EPeninputDataTypeShiftDown, &shiftStatus ); + } + } + + // Update vkb layout + TInt caseid = CaseByShiftCapslockStatus(); + + TInt vkbLayout = iConfigInfo->ShiftCapsSingleVkbLayoutId( curRange, + caseid ); + + TInt responseStyle = + iConfigInfo->RangeBarInfo()->FindRange( curRange )->ResponseStyle(); + if ( ( curRange == ERangeAccent ) + && ( responseStyle == EPeninputRangeResponsePopupChoiceItem ) ) + { + TInt curAccentIndex = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentAccent ) ); + vkbLayout = vkbLayout + curAccentIndex * 2; + } + + ChangeVkbLayout( vkbLayout ); + + // Synchronize case if needed + if ( ( curRange == ERangeEnglish ) || ( curRange == ERangeAccent ) + || ( ConfigInfo()->CaseSensitive() && ( curRange == ERangeNative ) ) ) + { + // Notify fep the new case + TBuf buf; + TInt fepcase = CPeninputDataConverter::FepCaseByCaseId( caseid ); + iLayoutContext->SetData( EPeninputDataTypeCase, &fepcase ); + CPeninputDataConverter::IntToDesc( fepcase, buf ); + iLayoutContext->Sendkey( ESignalCaseMode, buf ); + } + + + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::DimKeys +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +void CPeninputLayoutWindowExt::DimKeys() + { + TRAP_IGNORE(DimKeysL()); + } +void CPeninputLayoutWindowExt::DimKeysL() + { + CPeninputVkbCtrlExt* vkbCtrl = static_cast + ( Control( EPeninutWindowCtrlIdVkbCtrl ) ); + vkbCtrl->CancelDims(); + TInt currentRange = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) ); + TInt permitRange = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypePermittedRange ) ); + TInt keyMapping = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeNumericKeymap ) ); + TInt inputLang = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeInputLanguage ) ); + + if ( currentRange == ERangeNumber && + (permitRange == ERangeNumber || + permitRange == ERangeNativeNumber || + permitRange == (ERangeNumber | ERangeNativeNumber)) ) + { + HBufC* rs = NULL; + if ( keyMapping == EKeymapFromResource ) + { + HBufC* customRes = + (HBufC*) iLayoutContext->RequestData(EAknFepDataTypeUseDefinedResource); + _LIT(KTenNumbers,"0123456789"); + rs = HBufC::NewL(KTenNumbers().Length() + customRes->Length()); + rs->Des().Copy(*customRes); + rs->Des().Append(KTenNumbers); + } + else + { + TRAP_IGNORE( rs = iKeyMappingMgr->KeyMappingStringL( keyMapping ); ); + } + + if( rs ) + { + vkbCtrl->DimKeys( rs ); + delete rs; + } + } + else if ( currentRange == ERangeNativeNumber && + (permitRange == ERangeNumber || + permitRange == ERangeNativeNumber || + permitRange == (ERangeNumber | ERangeNativeNumber)) ) + { + HBufC* rs = NULL; + TRAP_IGNORE( rs = GetKeyMappingStringL( keyMapping, inputLang ) ); + if( rs ) + { + vkbCtrl->DimKeys( rs ); + delete rs; + } + } + + else if ( (currentRange == ERangeNative || currentRange == ERangeEnglish) && CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeInputLanguage ) ) == ELangVietnamese ) + { + vkbCtrl->DimKeySet( iToneSet, !iVowelChar ); + } + + vkbCtrl->Draw(); + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::AddControlL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::AddNotOwnedControl( + CFepUiBaseCtrl* aControl ) + { + //do nothing if we already has the control. + if ( KErrNotFound != ControlList().Find( aControl ) ) + { + return; + } + + if ( aControl ) + { + ( const_cast&> + ( ControlList() ) ).Append( aControl ); + } + } +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::ChangeButtonStatus +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::ChangeButtonStatus( const TInt aIsDown, + const TInt aControlId ) + { + CAknFepCtrlEventButton* button = + static_cast + (ControlById( aControlId ) ); + + if ( button ) + { + button->SetHighlight( aIsDown == 0 ? EFalse : ETrue ); + } + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindow::ChangeButtonStatus +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::ChangeMergedButtonStatus( + const TInt aIsShiftCase, + const TInt aIsCapslockCase ) + { + CAknFepCtrlMultiModeButton* button = + static_cast + (ControlById( EPeninutWindowCtrlIdShiftBtn ) ); + + 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; + } + } +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::ChangeLayoutPosition +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::ChangeLayoutPosition( TInt aJustifyStyle ) + { + if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ ) + { + TopLeftJustify(); + return; + } + switch ( aJustifyStyle ) + { + case EPeninputPositionChangeBrJustify: + { + BottomRightJustify(); + } + break; + case EPeninputPositionChangeDataQuery: + { + //BottomRightJustify(); + DataQueryJustify(); + } + break; + default: + { + TopLeftJustify(); + } + break; + } + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::SetWindowRect +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::SetWindowRect( const TRect& aRect ) + { + //we should know the layout size now + if(iLayoutContext->LayoutType() == EPluginInputModeFSQ) + { + SetRect( aRect ); + UiLayout()->SetRect(aRect); + } + else + { + TRect rect = aRect; + + + TRect shadowRect = TRect( TPoint(), + TSize( aRect.Width() + iShadowBrWidth + iShadowTlWidth, + aRect.Height() + iShadowTlHeight + iShadowBrHeight) + ); + + rect.Move( TPoint(iShadowTlWidth, iShadowTlHeight) - rect.iTl ); + + SetRect( rect ); + RootControl()->SetRect( rect ); + UiLayout()->SetShadowRect( shadowRect ); + } + } + + +// ----------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::SetSwitchBtnFont +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::SetSwitchBtnFont(CAknFepCtrlEventButton& aSwitchBtn) + { + // read switch font laf info only when need + if (CPeninputDataConverter::AnyToInt( + iLayoutContext->RequestData(EAkninputDataTypeSizeChanging)) ||(!iSwitchFontSet)) + { + TAknTextLineLayout langSwitch; + TAknTextLineLayout langSwitchShadow; + + switch( iLayoutContext->LayoutType() ) + { + case EPluginInputModeVkb: + case EPluginInputModeFSQ: + { + langSwitch = + AknLayoutScalable_Avkon::cell_vkb_side_pane_t1().LayoutLine(); + langSwitchShadow = + AknLayoutScalable_Avkon::cell_vkb_side_pane_t1_copy1().LayoutLine(); + } + break; + case EPluginInputModeHwr: + { + langSwitch = + AknLayoutScalable_Avkon::cell_hwr_side_pane_t1().LayoutLine(); + langSwitchShadow = + AknLayoutScalable_Avkon::cell_hwr_side_pane_t1_copy1().LayoutLine(); + } + break; + default: + { + return; + } + } + + iSwitchFont = langSwitch.iFont; + iSwitchShadowFont = langSwitchShadow.iFont; + } + + aSwitchBtn.SetFont(AknLayoutUtils::FontFromId(iSwitchFont, NULL)); + aSwitchBtn.SetShadowFont(AknLayoutUtils::FontFromId(iSwitchShadowFont, NULL)); + iSwitchFontSet = ETrue; + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::TopLeftJustify +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::SetSwitchBtnTextColor(CAknFepCtrlEventButton& aSwitchBtn) + { + TRgb textColor; + TInt error = AknsUtils::GetCachedColor(AknsUtils::SkinInstance(), + textColor, + KAknsIIDQsnTextColors, + EAknsCIQsnTextColorsCG59); + + if (error != KErrNone) + { + textColor = TRgb(KDefaultTextColor); + } + + aSwitchBtn.SetFontColor( textColor ); + + TRgb shadowTextColor; + error = AknsUtils::GetCachedColor(AknsUtils::SkinInstance(), + shadowTextColor, + KAknsIIDQsnTextColors, + EAknsCIQsnTextColorsCG62); + + if (error != KErrNone) + { + shadowTextColor = TRgb(KDefaultShadowTextColor); + } + + aSwitchBtn.SetShadowFontColor( shadowTextColor ); + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::TopLeftJustify +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +void CPeninputLayoutWindowExt::TopLeftJustify() + { + // Read position from datamgr + TSize layoutSize = UiLayout()->Rect().Size(); + + TPoint tl = UiLayout()->Position(); + + TPoint oldBr = tl + layoutSize; + + if ( tl.iX < 0 ) + { + tl.iX = 0; + } + + if ( tl.iY < 0 ) + { + tl.iY = 0; + } + + TPoint br = tl + layoutSize; + + if ( br != oldBr ) + { + //Write the new position into CenRep + TInt x = 0; + TInt y = 0; + x = 0x0000FFFF & br.iX; + y = 0xFFFF0000 & ( br.iY << 16 ); + TInt pos = x | y; + iLayoutContext->SetData( EPeninputDataTypeWindowPosition, &pos ); + } + + UiLayout()->LayoutOwner()->SetPosition( tl ); + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::BottomRightJustify +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CPeninputLayoutWindowExt::BottomRightJustify() + { + // Read position from datamgr + TSize layoutSize( UiLayout()->Rect().Size() ); + + TPoint oldbr; + TPoint br; + TPoint tl; + + TSize screenSize = *( ( TSize* ) iLayoutContext->RequestData + ( EPeninputDataTypeScreenSize ) ); + + TInt windowPosition = CPeninputDataConverter::AnyToInt + ( iLayoutContext->RequestData( EPeninputDataTypeWindowPosition ) ); + + oldbr.iX = windowPosition & 0x0000FFFF; + oldbr.iY = ( windowPosition & 0xFFFF0000 ) >> 16; + + br = oldbr; + + // Check the top left point is in screen + if (br.iX > screenSize.iWidth) + { + br.iX = screenSize.iWidth; + } + if( br.iY > screenSize.iHeight ) + { + br.iY = screenSize.iHeight; + } + + tl.iX = br.iX - layoutSize.iWidth; + tl.iY = br.iY - layoutSize.iHeight; + + if ( tl.iX < 0 ) + { + tl.iX = 0; + br.iX = layoutSize.iWidth; + } + + if ( tl.iY < 0 ) + { + tl.iY = 0; + br.iY = layoutSize.iHeight; + } + + if ( oldbr != br ) + { + //Write the new position into CenRep + TInt x = 0; + TInt y = 0; + x = 0x0000FFFF & br.iX; + y = 0xFFFF0000 & ( br.iY << 16 ); + TInt pos = x | y; + iLayoutContext->SetData( EPeninputDataTypeWindowPosition, &pos ); + } + + UiLayout()->LayoutOwner()->SetPosition( tl ); + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::DataQueryJustify +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +void CPeninputLayoutWindowExt::DataQueryJustify() + { + TRect* dataQueryRect = ( TRect* )( iLayoutContext->RequestData + ( EPeninputDataTypeDataQueryDlgRect) ); + + 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 ); + TInt pos = x | y; + iLayoutContext->SetData( EPeninputDataTypeWindowPosition, &pos ); + + //Set the layout position + UiLayout()->LayoutOwner()->SetPosition( rect.iTl ); + } + +TBool CPeninputLayoutWindowExt::CreateCustomControlL( TInt16 /*aControlId*/, TInt32 /*aImageId*/ ) + { + return EFalse; + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::Draw +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::Draw() + { + // Draw shadow + CAknFepCtrlBaseWindowExt::Draw(); + UpdateArea(UiLayout()->Rect(), EFalse); + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::GetKeyMappingStringL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +HBufC* CPeninputLayoutWindowExt::GetKeyMappingStringL(TInt aKeyMapping, + const TInt aLang ) + { + HBufC* rs = NULL; + if ( aKeyMapping == EKeymapFromResource ) + { + HBufC* customRes = (HBufC*) iLayoutContext->RequestData(EAknFepDataTypeUseDefinedResource); + _LIT(KTenNumbers,"0123456789"); + TBuf numbers; + if( aLang == ELangArabic ) + { + numbers.Format( _L("%c%c%c%c%c%c%c%c%c%c"), + 0x0660, 0x0661, 0x0662, + 0x0663, 0x0664, 0x0665, + 0x0666, 0x0667, 0x0668, 0x0669 ); + } + else if( aLang == ELangUrdu || aLang == ELangFarsi ) + { + numbers.Format( _L("%c%c%c%c%c%c%c%c%c%c"), + 0x06F0, 0x06F1, 0x06F2, + 0x06F3, 0x06F4, 0x06F5, + 0x06F6, 0x06F7, 0x06F8, 0x06F9 ); + } + else if( aLang == ELangHindi ) + { + numbers.Format( _L("%c%c%c%c%c%c%c%c%c%c"), + 0x0966, 0x0967, 0x0968, + 0x0969, 0x096a, 0x096b, + 0x096c, 0x096d, 0x096e, 0x096f ); + } + else if( aLang == ELangThai ) + { + numbers.Format( _L("%c%c%c%c%c%c%c%c%c%c"), + 0x0E50, 0x0E51, 0x0E52, + 0x0E53, 0x0E54, 0x0E55, + 0x0E56, 0x0E57, 0x0E58, 0x0E59 ); + } + else + { + numbers = KTenNumbers; + } + + rs = HBufC::NewL(numbers.Length() + customRes->Length()); + rs->Des().Copy(*customRes); + rs->Des().Append(numbers); + } + else + { + rs = iKeyMappingMgr->KeyMappingStringL( aKeyMapping, aLang ); + } + + return rs; + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::SetEnableSwitchToHwr +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::SetEnableSwitchToHwr(TBool aEnable) + { + CAknFepCtrlEventButton* switchToHwrBtn = static_cast + ( Control( EPeninutWindowCtrlIdSwitchToHwrBtn ) ); + + if ( aEnable ) + { + switchToHwrBtn->SetDimmed(EFalse); + } + else + { + switchToHwrBtn->SetDimmed(ETrue); + switchToHwrBtn->SetActive(EFalse); + } + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::SetEnableSettingBtn +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C void CPeninputLayoutWindowExt::SetEnableSettingBtn(TBool aEnable) + { + CAknFepCtrlEventButton* optionBtn = static_cast + (Control( EPeninutWindowCtrlIdOptionBtn ) ); + + if ( aEnable ) + { + optionBtn->SetDimmed(EFalse); + } + else + { + optionBtn->SetDimmed(ETrue); + optionBtn->SetActive(EFalse); + } + } + +// --------------------------------------------------------------------------- +// CPeninputLayoutWindowExt::ReconfigUnitSize +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CPeninputLayoutWindowExt::ReconfigUnitSize(TInt /*aClientLayoutId*/) + { + return EFalse; + } + +EXPORT_C void CPeninputLayoutWindowExt::SetLafLayOut(TInt /*aRows*/, TInt /*aColumns*/) + { + + } + +EXPORT_C void CPeninputLayoutWindowExt::SetVkbLayoutSize() + { + + } +EXPORT_C void CPeninputLayoutWindowExt::OnInputLanguageChange() + { + if ( iLayoutContext->LayoutType() == EPluginInputModeVkb ) + { + CFepUiBaseCtrl* ctrl = + Control( EPeninutWindowCtrlIdVkbCtrl ); + if ( ctrl ) + { + ( static_cast( ctrl ) )->Reset(); + } + } + } + +void CPeninputLayoutWindowExt::AddCustomControlGroupL(CFepUiBaseCtrl* aCtrl) + { + AddControlL(aCtrl); + } + +void CPeninputLayoutWindowExt::ResetLastColRow() + { + iLastUsedTotalColumns = 0; + iLastUsedTotalRows = 0; + } + + +EXPORT_C void CPeninputLayoutWindowExt::SetTextAlignmentL( TInt aAlignment ) + { + CFepLayoutMultiLineIcf* icf = + static_cast( Control(EPeninputWindowCtrlIdMultiLineICF)); + + if ( icf && ConfigInfo()->Language() != ELangNone ) + { + icf->SetTextAlignmentL( aAlignment, ConfigInfo()->Language() ); + } + } + +//End Of File