diff -r ebd48d2de13c -r ecbabf52600f textinput/peninputgenericvkb/src/peninputgenericvkblayout.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputgenericvkb/src/peninputgenericvkblayout.cpp Wed Sep 01 12:23:33 2010 +0100 @@ -0,0 +1,703 @@ +/* +* 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: generic VKB layout +* +*/ + + +// System includes +#include // Command from fep or IME to plugin +#include // Define EPluginInputModeHwr +#include // Use global signal +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// User includes +#include "peninputgenericvkb.hrh" +#include "peninputuistatemgrinterface.h" +#include "peninputgenericvkblayout.h" +#include "peninputgenericvkbwindow.h" +#include "peninputgenericvkbdatamgr.h" +#include "peninputgenericvkbuistatestandby.h" +#include "peninputgenericvkbuistatepopup.h" +#include "peninputdataconverter.h" + +const TInt KPeriodicTimerIntervalSec(2500000); +// ======== MEMBER FUNCTIONS ======== +const TInt KNumberOfDottedChar = 16; +const TUint16 thaiUnicodeOri[KNumberOfDottedChar] = {0x0E31,0x0E33,0x0E34,0x0E35,0x0E36,0x0E37,0x0E38,0x0E39, + 0x0E3A,0x0E47,0x0E48,0x0E49,0x0E4A,0x0E4B,0x0E4C,0x0E4D}; +const TUint16 thaiUnicodeNew[KNumberOfDottedChar] = {0xF731,0xF733,0xF734,0xF735,0xF736,0xF737,0xF738,0xF739, + 0xF73A,0xF747,0xF748,0xF749,0xF74A,0xF74B,0xF74C,0xF74D}; + +const TInt KNumberOfMirrorChar = 6; +const TUint16 mirrorUnicode[KNumberOfMirrorChar] = {0x0029,0x005D,0x003E,0x003C,0x005B,0x0028}; + +_LIT(KDisplaySpace, "\x0020"); +_LIT(KEmptyString, ""); + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayoutImp::NewL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +CPeninputGenericVkbLayoutImp* CPeninputGenericVkbLayoutImp::NewL( + TAny* /*aInitParams*/ ) + { + CPeninputGenericVkbLayoutImp* self = new ( ELeave ) + CPeninputGenericVkbLayoutImp(); + CleanupStack::PushL( self ); + self->Construct( EFalse ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayoutImp::NewFsqL +// Entry point for landscape FSQ. +// --------------------------------------------------------------------------- +// +CPeninputGenericVkbLayoutImp* CPeninputGenericVkbLayoutImp::NewFsqL( + TAny* /*aInitParams*/ ) + { + CPeninputGenericVkbLayoutImp* self = new ( ELeave ) + CPeninputGenericVkbLayoutImp(); + CleanupStack::PushL( self ); + self->Construct( ETrue ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayoutImp::NewPrtFsqL +// Entry point for portrait FSQ. +// --------------------------------------------------------------------------- +// +CPeninputGenericVkbLayoutImp* CPeninputGenericVkbLayoutImp::NewPrtFsqL( + TAny* /*aInitParams*/ ) + { + CPeninputGenericVkbLayoutImp* self = new ( ELeave ) + CPeninputGenericVkbLayoutImp(); + CleanupStack::PushL( self ); + self->Construct( ETrue ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayoutImp::~CPeninputGenericVkbLayoutImp +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +CPeninputGenericVkbLayoutImp::~CPeninputGenericVkbLayoutImp() + { + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayoutImp::CPeninputGenericVkbLayoutImp +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +CPeninputGenericVkbLayoutImp::CPeninputGenericVkbLayoutImp() + { + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayoutImp::ConstructL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +void CPeninputGenericVkbLayoutImp::Construct( TBool aIsFsq ) + { + iIsFsq = aIsFsq; + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayoutImp::CreateFepUiLayoutL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +CFepUiLayout* CPeninputGenericVkbLayoutImp::CreateFepUiLayoutL( + MLayoutOwner* aLayoutOwner, const TAny* aData ) + { + CPeninputGenericVkbLayout* uiLayout = + CPeninputGenericVkbLayout::NewL( aLayoutOwner, aData, iIsFsq ); + + return uiLayout; + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayout::NewL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +CPeninputGenericVkbLayout* CPeninputGenericVkbLayout::NewL( + MLayoutOwner* aLayoutOwner, const TAny* aInitData, TBool aIsFsq ) + { + CPeninputGenericVkbLayout* self = + new (ELeave) CPeninputGenericVkbLayout( aLayoutOwner ); + CleanupStack::PushL( self ); + self->ConstructL( aInitData, aIsFsq ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayout::CPeninputGenericVkbLayout +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +CPeninputGenericVkbLayout::CPeninputGenericVkbLayout( MLayoutOwner* aLayoutOwner ) + : CPeninputCommonLayoutExt( aLayoutOwner ), iLayoutType( EPluginInputModeVkb ) + { + iInEditWordQueryDlg = EFalse; + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayout::~CPeninputGenericVkbLayout +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +CPeninputGenericVkbLayout::~CPeninputGenericVkbLayout() + { + if (iInfoTimer) + { + iInfoTimer->Cancel(); + } + delete iInfoTimer; + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayout::ConstructL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +void CPeninputGenericVkbLayout::ConstructL( const TAny* aInitData, TBool aIsFsq ) + { + // must set layout type first + iLayoutType = aIsFsq ? EPluginInputModeFSQ : EPluginInputModeVkb; + + CPeninputCommonLayoutExt::ConstructL( aInitData ); + + CPeninputUiStateBase* initialState = + CPeninputUiStateBase::NewL( UiStateMgr(), this ); + CPeninputUiStateVkbStandby* standbyState = + CPeninputUiStateVkbStandby::NewL( UiStateMgr(), this ); + CPeninputUiStateVkbPopup* popupState = + CPeninputUiStateVkbPopup::NewL( UiStateMgr(), this ); + + UiStateMgr()->AddUiState( initialState, EPeninputVkbUiStateNone ); + UiStateMgr()->AddUiState( standbyState, EPeninputVkbUiStateStandby ); + UiStateMgr()->AddUiState( popupState, EPeninputVkbUiStatePopup ); + UiStateMgr()->SetCurrentUiState( initialState ); + iInfoTimer = CPeriodic::NewL(CActive::EPriorityStandard); + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayout::HandleCommand +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +TInt CPeninputGenericVkbLayout::HandleCommand( TInt aCmd, TUint8* aData ) + { + CPeninputCommonLayoutExt::HandleCommand( aCmd, aData ); + CPeninputGenericVkbWindow* vkbWindow = + static_cast(iLayoutWindow); + switch ( aCmd ) + { + case ECmdPenInputWindowOpen: + { + UiStateMgr()->SetCurrentUiState( EPeninputVkbUiStateStandby ); + } + break; + case ECmdPenInputWindowClose: + { + vkbWindow->UnLatchDeadKey(); + UiStateMgr()->SetCurrentUiState( EPeninputVkbUiStateNone ); + + // For Addition of ITI features on FSQ + // Close tooltip and candidate list + vkbWindow->HideTooltip(); + vkbWindow->HideCandidateList(); + } + break; + case ECmdPenInputLanguage: + { + iDataMgr->SetData( EPeninputDataTypeInputLanguage, aData ); + vkbWindow->SetSwitchlistLanguage(*aData); + vkbWindow->SetDeadKey(); + if ( iLayoutType == EPluginInputModeFSQ ) + { + TRAP_IGNORE(vkbWindow->ConstructFSQAccentListL( *aData )); + TRAP_IGNORE(vkbWindow->ConstructRangeLabelListL( *aData )); + } + else + { + TRAP_IGNORE(vkbWindow->ConstructAccentListL(*aData)); + } + } + break; + case ECmdPenInputRange: + { + if ( iLayoutType == EPluginInputModeFSQ ) + { + TRAP_IGNORE( vkbWindow->UpdateRangeCtrlsL()); + } + } + break; + case ECmdPenInputIsSecretText: + { + vkbWindow->SetSwitchlistSecretFlag(*aData); + } + break; + case ECmdPenInputDimArrowKeys: + { + TBool IsDimArrowKeys = *aData; + vkbWindow->DimArrowKeys( IsDimArrowKeys ); + } + break; + case ECmdPenInputDimEnterKey: + { + TBool isDimEnterKey = *((TUint16*)( aData )); + vkbWindow->DimEnterKey( isDimEnterKey ); + } + break; + case ECmdPenInputSetPromptText: + { + if ( iLayoutType == EPluginInputModeFSQ ) + TRAP_IGNORE(vkbWindow->SetPromptTextL(aData)); + } + break; + case ECmdPenInputCharacterPreview: + { + vkbWindow->ShowBubble(*aData); + } + break; + case ECmdPenInputInEditWordQueryDlg: + { + iInEditWordQueryDlg = *aData; + } + break; + case ECmdPenInputPopupTooltip: + { + TRAP_IGNORE( HandleShowTooltipCmdL( aData ) ); + } + break; + case ECmdPenInputHideTooltip: + { + vkbWindow->HideTooltip(); + } + break; + case ECmdPenInputPopupCandidateList: + { + TRAP_IGNORE( HandleShowCandidateListCmdL( aData ) ); + } + break; + case ECmdPenInputHideCandidateList: + { + vkbWindow->HideCandidateList(); + } + break; + case ECmdPeninputITIStatus: + { + // Set the flag to indicate if FSQ with ITI feature is opened + iITIEnabled = CPeninputDataConverter::AnyToInt( aData ); + } + break; + case ECmdPenInputFingerMatchIndicator: + { + if ( iLayoutType == EPluginInputModeFSQ ) + { + TRAP_IGNORE( vkbWindow->UpdateIndiBubbleL( aData )); + } + } + break; + default: + { + } + break; + } + + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayout::HandleControlEvent +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +void CPeninputGenericVkbLayout::HandleControlEvent( + TInt aEventType, CFepUiBaseCtrl* aCtrl, const TDesC& aEventData ) + { + switch ( aEventType ) + { + case EEventVirtualKeyUp: + { + TRAP_IGNORE(HandleVirtualKeyUpL(aEventType, aCtrl, aEventData)); + } + break; + case EEventTooltipPointerUp: + { + // Signal to FEP to accept tooltip data + SignalOwner( ESignalAcceptTooltip ); + } + break; + case EEventPointerDownOnInline: + { + // add by jiawenjuan + // show candidate list when tap on active words + SignalOwner(ESignalShowCandidate ); + } + break; + case EEventInsertSpace: + { + SignalOwner(ESignalKeyEvent, KDisplaySpace); + } + break; + default: + { + CPeninputCommonLayoutExt::HandleControlEvent(aEventType, aCtrl, aEventData); + } + break; + } + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayout::CreateLayoutWindowL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +void CPeninputGenericVkbLayout::CreateLayoutWindowL() + { + iLayoutWindow = CPeninputGenericVkbWindow::NewL( this, this, UiStateMgr() ); + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayout::CreateDataMgrL +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +void CPeninputGenericVkbLayout::CreateDataMgrL( const TAny* /*aInitData*/ ) + { + iDataMgr = CPeninputGenericVkbDataMgr::NewL( this ); + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayout::LayoutType +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +TInt CPeninputGenericVkbLayout::LayoutType() + { + return iLayoutType; + } +TInt CPeninputGenericVkbLayout::SizeChanged( const TAny* aData ) + { + //(( CPeninputGenericVkbWindow*)iLayoutWindow)->UpdateLafData(); + return CPeninputCommonLayoutExt::SizeChanged( aData ); + } +void CPeninputGenericVkbLayout::HandleAppInfoChange(const TDesC& aInfo, + TPeninputAppInfo aType) + { + if ( LayoutWindow() ) + { + CFepLayoutMultiLineIcf* icf = static_cast + (LayoutWindow()->Control(EPeninputWindowCtrlIdMultiLineICF)) ; + + if ( icf && ( aType == EAppIndicatorMsg ) && (iLayoutType == EPluginInputModeFSQ) ) + { + if ( aInfo.Length() > 0 && !iInEditWordQueryDlg) + { + //icf->HideBubble(); + CPeninputGenericVkbWindow* vkbWindow = + static_cast(iLayoutWindow); + vkbWindow->SetIndiWithTextFlag( ETrue ); + vkbWindow->IndiBubbleWithText(); + icf->ShowBubble(aInfo,icf->MsgBubbleCtrl()->Rect()); + } + else + { + //icf->HideBubble(); + CPeninputGenericVkbWindow* vkbWindow = + static_cast(iLayoutWindow); + vkbWindow->SetIndiWithTextFlag( EFalse ); + vkbWindow->IndiBubbleWithoutText(); + icf->ShowBubble(KEmptyString, icf->MsgBubbleCtrl()->Rect()); + } + } + else + { + if ( icf && ( aType == EAppByteWarningMsg ) && (iLayoutType == EPluginInputModeFSQ) ) + { + if (!iInfoTimer->IsActive()) + { + iInfoTimer->Start(KPeriodicTimerIntervalSec, + KPeriodicTimerIntervalSec, + TCallBack(CPeninputGenericVkbLayout::HideByteWarningBubble, this)); + } + icf->ShowByteWarningBubble(aInfo); + } + else + { + if ( icf && ( aType == EAppMessageTypeChangeMsg ) && (iLayoutType == EPluginInputModeFSQ) ) + { + if (!iInfoTimer->IsActive()) + { + if ( aInfo.Length() > 0 && !iInEditWordQueryDlg) + { + icf->ShowBubble(aInfo,icf->MsgBubbleCtrl()->Rect()); + } + iInfoTimer->Start(KPeriodicTimerIntervalSec, + KPeriodicTimerIntervalSec, + TCallBack(CPeninputGenericVkbLayout::HideByteWarningBubble, this)); + } + icf->ShowByteWarningBubble(aInfo); + } + } + } + } + } + +// --------------------------------------------------------------------------- +// CPeninputGenericVkbLayout::SemiTransparencyRequired +// . +// --------------------------------------------------------------------------- +// +TBool CPeninputGenericVkbLayout::SemiTransparencyRequired() + { + return ETrue; + } + +void CPeninputGenericVkbLayout::HandleVirtualKeyUpL(TInt aEventType, + CFepUiBaseCtrl* aCtrl, + const TDesC& aEventData) + { + TBool flag; + flag = static_cast + (iLayoutWindow)->HandleVirtualKeyUpEvent( aEventType, aCtrl, aEventData ); + if(!flag) + { + HBufC* number = HBufC::NewL( 1 ); + TPtrC eventDataPtr = aEventData; + TInt len = aEventData.Length(); + if ( len > 1) + { + TVirtualKeyEventData* data = (TVirtualKeyEventData* ) aEventData.Ptr(); + TUint16 inputCode = data->iKeyEvent.iCode; + TUint16 outputCode = inputCode; + TBool isDottedChar = EFalse; + for (TInt i = 0; i < KNumberOfDottedChar; i++) + { + if (thaiUnicodeNew[i] == inputCode) + { + outputCode = thaiUnicodeOri[i]; + isDottedChar = ETrue; + break; + } + } + TBool bIsMirror = EFalse; + bIsMirror = TranslateMirrorUnicode( inputCode, outputCode ); + + if ( isDottedChar || bIsMirror ) + { + number->Des().Append( outputCode ); + data->iKeyData.Set(*number); + eventDataPtr.Set(reinterpret_cast(data),sizeof(*data)/sizeof(TUint16)); + } + } + CPeninputCommonLayoutExt::HandleControlEvent(aEventType, aCtrl, eventDataPtr); + delete number; + } + } + +TBool CPeninputGenericVkbLayout::TranslateMirrorUnicode( TUint16 aInputCode, TUint16& aOutputCode ) + { + TBool isMirrorChar = EFalse; + TInt langCode = *( ( TInt* )(iDataMgr->RequestData( EPeninputDataTypeInputLanguage ))); + if (( langCode != ELangArabic ) && + ( langCode != ELangHebrew ) && + ( langCode != ELangFarsi ) && + ( langCode != ELangUrdu )) + { + return isMirrorChar; + } + for (TInt i = 0; i < KNumberOfMirrorChar; i++) + { + if (mirrorUnicode[i] == aInputCode) + { + aOutputCode = mirrorUnicode[KNumberOfMirrorChar - i - 1]; + isMirrorChar = ETrue; + break; + } + } + return isMirrorChar; + } + +// --------------------------------------------------------------------------- +// Handle show tooltip command. +// --------------------------------------------------------------------------- +// +void CPeninputGenericVkbLayout::HandleShowTooltipCmdL( TUint8* aData ) + { + CPeninputGenericVkbWindow* vkbWindow = + static_cast(iLayoutWindow); + if (!vkbWindow) + { + return; + } + + TPtr8 buf8(aData, sizeof(TInt32), sizeof(TInt32)); + RDesReadStream readStream; + readStream.Open(buf8); + CleanupClosePushL(readStream); + TInt dataSize = readStream.ReadInt32L(); + CleanupStack::PopAndDestroy(&readStream); + if (dataSize > 0) + { + TUint16* dataAddress = (TUint16*)( aData + sizeof(TInt32)); + HBufC* tooltipText = ReadTextInfoHBufCL(dataAddress, (dataSize + 1) / 2); + if (tooltipText) + { + CleanupStack::PushL(tooltipText); + vkbWindow->ShowTooltipL(*tooltipText, *( ( TInt* )(iDataMgr->RequestData( EPeninputDataTypeInputLanguage )))); + CleanupStack::PopAndDestroy(tooltipText); + } + } + } + +// --------------------------------------------------------------------------- +// Handle show candidate list command. +// --------------------------------------------------------------------------- +// +void CPeninputGenericVkbLayout::HandleShowCandidateListCmdL( TUint8* aData ) + { + CPeninputGenericVkbWindow* vkbWindow + = static_cast(iLayoutWindow); + if ( !vkbWindow || !IsEnableITIOnFSQ() ) + { + return; + } + + // Read candidate data from a block of memory staring from aData + // The format is activeIndex | count of candiates | + // length 1 | text 1 | length 2 | text 2 |... + TPtr8 buf8( aData, sizeof( TInt32 )* 3, sizeof( TInt32 )* 3 ); + RDesReadStream readStream; + readStream.Open( buf8 ); + CleanupClosePushL( readStream ); + // Get activeIndex + TInt activeIndex = readStream.ReadInt32L(); + // Get coutn of candidates + TInt count = readStream.ReadInt32L(); + TInt langCode = readStream.ReadInt32L(); + TInt align = TBidiText::ScriptDirectionality((TLanguage)langCode); + if(align != TBidiText::ELeftToRight) + align = CGraphicsContext::ERight; + else + align = CGraphicsContext::ELeft; + CleanupStack::PopAndDestroy( &readStream ); + + CDesCArray* itemArray = NULL; + if ( count > 0 ) + { + TUint8* curPointer = aData + sizeof(TInt) * 3; + itemArray = new (ELeave) CDesCArrayFlat( count ); + CleanupStack::PushL( itemArray ); + for ( TInt i = 0; i < count; i++ ) + { + // Get length + buf8.Set( curPointer, sizeof( TInt32 ), sizeof( TInt32 ) ); + readStream.Open( buf8 ); + CleanupClosePushL( readStream ); + TInt32 textSize = 0; + textSize = readStream.ReadInt32L(); + CleanupStack::PopAndDestroy( &readStream ); + if ( textSize > 0 ) + { + // Get text + curPointer += sizeof( TInt32 ); + HBufC* itemText = ReadTextInfoHBufCL + ( (TUint16*)curPointer, + ( textSize + 1 )/ 2 ); + if ( itemText ) + { + CleanupStack::PushL( itemText ); + itemArray->AppendL( *itemText ); + CleanupStack::PopAndDestroy( itemText ); + } + curPointer += textSize; + } + } + vkbWindow->ShowCandidateListL( align, itemArray, activeIndex ); + CleanupStack::PopAndDestroy( itemArray ); + } + else + { + // Open empty candidate list. + vkbWindow->ShowCandidateListL( align, NULL, activeIndex ); + } + } + + +// --------------------------------------------------------------------------- +// Handle show candidate list command. +// --------------------------------------------------------------------------- +// +HBufC* CPeninputGenericVkbLayout::ReadTextInfoHBufCL( TUint16* aStartPtr, + TInt aLength ) + { + HBufC* itemText = NULL; + if ( aLength > 0 ) + { + itemText = HBufC::NewLC( aLength ); + TPtr itemTextPtr = itemText->Des(); + itemTextPtr.Copy( aStartPtr, aLength ); + CleanupStack::Pop( itemText ); + } + return itemText; + } + +TInt CPeninputGenericVkbLayout::HideByteWarningBubble(TAny* aPointer) + { + CPeninputGenericVkbLayout* layout = static_cast(aPointer); + layout->HideByteWarningBubble(); + return KErrNone; + } +void CPeninputGenericVkbLayout::HideByteWarningBubble() + { + if (!iInfoTimer) + { + return; + } + CFepLayoutMultiLineIcf* icf = static_cast + (LayoutWindow()->Control(EPeninputWindowCtrlIdMultiLineICF)); + if (iInfoTimer->IsActive()) + { + iInfoTimer->Cancel(); + icf->HideInfoBubble(); + } + } +// End Of File