# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1284490746 -10800 # Node ID bd83ceabce89c8f9db1250755bd1858a9efb2302 # Parent ecbabf52600f92a90ef7558b1e2320249a5c11b9 Revision: 201033 Kit: 201035 diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/conf/aknfep.confml Binary file fep/aknfep/conf/aknfep.confml has changed diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/conf/aknfep_101F876D.crml Binary file fep/aknfep/conf/aknfep_101F876D.crml has changed diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/inc/AknFepUiInputStateEntryQwertyWesternPredictive.h --- a/fep/aknfep/inc/AknFepUiInputStateEntryQwertyWesternPredictive.h Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/inc/AknFepUiInputStateEntryQwertyWesternPredictive.h Tue Sep 14 21:59:06 2010 +0300 @@ -93,6 +93,24 @@ * @param aLength The key press length. */ TBool HandleNaviKeysL(TInt aKey, TKeyPressLength aLength); +private: + + /** + * Get scancode from given character and textcase + * @param aChar The character to be checked against to gain the scancode + * @param aCase The textcase info + */ + TInt ScanCodeForCharacter( TUint aChar, TPtiTextCase& aCase ); + + /** + * Check whether the character mapped on given key + * @param aKey The scancode of the key to be checked. + * @param aMode The InputMode regarding ptiengine + * @param aAgainst The character to be checked. + * @param aCase Text case. + * @Return ETrue : yes it is on the key; EFalse : No it is not on the Key + */ + TBool MapAgainst(TInt aKey, TInt aMode, TInt16 aAgainst, TInt aCase) const; }; #endif //__AKN_FEP_UI_INPUT_STATE_ENTRY_QWERTY_WESTERN_PREDICTIVE_H__ diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/inc/AknFepUiInputStateInitialChineseGenericQwerty.h --- a/fep/aknfep/inc/AknFepUiInputStateInitialChineseGenericQwerty.h Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/inc/AknFepUiInputStateInitialChineseGenericQwerty.h Tue Sep 14 21:59:06 2010 +0300 @@ -43,6 +43,7 @@ TBool IsSCTKey(TInt aKey); TBool IsCharacter(TInt aKey); TBool HandleKeyByShiftOrCharPressed(TInt aKey, TKeyPressLength aLength); + TInt ToneMark(TInt aKey, TDes& aResult); }; #endif //__AKN_FEP_UI_INPUT_STATE_INIT_CHIN_GEN_QWERTY_H__ diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/inc/AknFepUiManagerBase.h --- a/fep/aknfep/inc/AknFepUiManagerBase.h Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/inc/AknFepUiManagerBase.h Tue Sep 14 21:59:06 2010 +0300 @@ -442,6 +442,16 @@ * @since 3.2 */ virtual TBool RollbackPreviousCharL(); + + /** + * Check whether the character mapped on given key + * @param aKey The scancode of the key to be checked. + * @param aMode The InputMode regarding ptiengine + * @param aAgainst The character to be checked. + * @param aCase Text case. + * @Return ETrue : yes it is on the key; EFalse : No it is not on the Key + */ + TBool MapAgainst(TInt aKey, TInt aMode, TInt16 aAgainst, TInt aCase) const; #endif //RD_INTELLIGENT_TEXT_INPUT #endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/inc/AknFepUiManagerChinese.h --- a/fep/aknfep/inc/AknFepUiManagerChinese.h Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/inc/AknFepUiManagerChinese.h Tue Sep 14 21:59:06 2010 +0300 @@ -275,6 +275,16 @@ */ void ConstructL(TLanguage aLanguage); + /** + * Tell whether this key mapped valid zhuyin, pinyin, or cangjie symbol + */ + TBool IsValidChineseInputSymbol(TInt aKey, TPtiEngineInputMode aMode) const; + + /** + * Tell whether this key mapped valid chinese tone mark + */ + TBool IsValidChineseToneMarkKey(TInt aKey, TPtiEngineInputMode aMode) const; + private: // Data TAknFepInputStateChineseBase iFepUiState; MAknFepUICtrlContainerChinese* iContainerPane; diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/inc/aknfepuiinputminiqwertypinyinphrasebase.h --- a/fep/aknfep/inc/aknfepuiinputminiqwertypinyinphrasebase.h Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/inc/aknfepuiinputminiqwertypinyinphrasebase.h Tue Sep 14 21:59:06 2010 +0300 @@ -534,7 +534,15 @@ * @return None. */ void DoActionAfterCommitL(); + /** + * Get real pinyin symbol from scancode. + * + * @since S60 v3.2.3 + * @param aKey + * @return None. + */ + void MapKey(TInt& aKey); }; #endif //T_AKNFEPUIINPUTMINIQWERTYPINYINPHRASEBASE_H diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/src/AknFepManager.cpp --- a/fep/aknfep/src/AknFepManager.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/src/AknFepManager.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -6305,7 +6305,8 @@ TBool isCangJieSupported = EFalse; #ifdef RD_INTELLIGENT_TEXT_INPUT - if ( EPtiKeyboardQwerty3x11 == KeyboardLayout() ) + if ( EPtiKeyboardQwerty3x11 == KeyboardLayout() || + EPtiKeyboardQwerty4x10 == KeyboardLayout()) { isCangJieSupported = ETrue; } @@ -12295,31 +12296,30 @@ } if (!iLanguageCapabilities.iLocalInputLanguageInUse) - { - switch (iSharedDataInterface->InputTextLanguage()) - { - case ELangPrcChinese: - { - iSharedDataInterface->SetInputMode(EPinyin); - SetFlag(EFlagNewSharedDataInputMode); - break; - } + { + switch (iSharedDataInterface->InputTextLanguage()) + { + case ELangPrcChinese: + { + iSharedDataInterface->SetInputMode(EPinyin); + SetFlag(EFlagNewSharedDataInputMode); + break; + } case ELangTaiwanChinese: - { - iSharedDataInterface->SetInputMode(EZhuyin); - SetFlag(EFlagNewSharedDataInputMode); - break; - } - case ELangHongKongChinese: - { - iSharedDataInterface->SetInputMode(EStroke); - iSharedDataInterface->SetCangJieMode(ECangJieNormal); - SetFlag(EFlagNewSharedDataInputMode); - break; - } - default: - break; - } + { + iSharedDataInterface->SetInputMode(EZhuyin); + SetFlag(EFlagNewSharedDataInputMode); + break; + } + case ELangHongKongChinese: + { + iSharedDataInterface->SetInputMode(EStroke); + SetFlag(EFlagNewSharedDataInputMode); + break; + } + default: + break; + } } SetHashKeyStyle(); diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/src/AknFepPluginManager.cpp --- a/fep/aknfep/src/AknFepPluginManager.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/src/AknFepPluginManager.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -153,6 +153,17 @@ return ETrue; return EFalse; } + +// ----------------------------------------------------------------------------- +// Check if the app specified by aUid is avkon notify server +// ----------------------------------------------------------------------------- +// +TBool IsAknNotifyServerApp( const TUid& aUid ) + { + const TInt KAknNotifySrvUid = 0x10281EF2; + return aUid.iUid == KAknNotifySrvUid; + } + #ifdef RD_SCALABLE_UI_V2 inline TBool IsAbleTouseCallBubble() { @@ -305,7 +316,10 @@ if( !iPenInputSvrConnected || !iPenInputServer.IsVisible() || iPenInputServer.IsDimmed() ) { if( iFepMan.FepAwareTextEditor() ) - { + { + // Enable transition effect when close pen ui + // by pressing close button. + iPenInputServer.EnableGfxTransEffect( ETrue ); iPreferredUiMode = ETrue; TryChangePluginInputModeByModeL((TPluginInputMode)(iSharedData.PluginInputMode()), EPenInputOpenManually, @@ -563,6 +577,8 @@ } break; case ESignalLayoutClosed: + // Enable transition effect when close pen ui by pressing close button. + iPenInputServer.EnableGfxTransEffect( ETrue ); if(iPluginInputMode == EPluginInputModeItut) { iFepMan.PtiEngine()->CancelTimerActivity(); @@ -1013,9 +1029,24 @@ break; case EPluginResourceChanged: { - iOrientationChangedfromUI = ETrue; - OnResourceChangedL( aEventData ); - iOrientationChangedfromUI = EFalse; + iOrientationChangedfromUI = ETrue; + + TUid uid = GetCurAppUid(); + if ( IsAknNotifyServerApp( uid ) ) + { + //turn off AutoForeground feature of global query temporarily during layout switching + //if not, global query may be shown on top of virtual input by unexpected tap events. + CCoeEnv::Static()->RootWin().AutoForeground( EFalse ); + TRAPD( err, OnResourceChangedL( aEventData ) ); + CCoeEnv::Static()->RootWin().AutoForeground( ETrue ); + User::LeaveIfError( err ); + } + else + { + OnResourceChangedL( aEventData ); + } + + iOrientationChangedfromUI = EFalse; } break; case EPluginFaseSwap: @@ -2824,7 +2855,11 @@ { iCurrentPluginInputFepUI->HandleCommandL (ECmdPenInputSendEditorTextAndCurPos, reinterpret_cast(&icfData)); - iFepMan.TryPopExactWordInICFL(); + if ( icfData.iMidPos >= 0 ) + { + // icfData.iMidPos >= 0 means the text which will be sent to ICF is inline text. + iFepMan.TryPopExactWordInICFL(); + } } if ( secretEditor ) @@ -5949,7 +5984,8 @@ } TInt flags = editorState->Flags(); - return ( flags & EEikEdwinAvkonDisableCursor ) == EEikEdwinAvkonDisableCursor; + return ( flags & EAknEditorFlagAvkonSecretEditor ) == EAknEditorFlagAvkonSecretEditor; + } // --------------------------------------------------------------------------- @@ -6102,6 +6138,16 @@ TPtiTextCase caseCalculated = EPtiCaseLower; TBuf mappedCharacters; TBool isMappingFound = EFalse; + TPtiEngineInputMode oldInputMode = iFepMan.PtiEngine()->InputMode(); + if ( oldInputMode != EPtiEngineQwertyPredictive ) + { + // if current input mode isn't EPtiEngineQwertyPredictive, + // change it to EPtiEngineQwertyPredictive temporarily, + // so that during the process of searching in qwerty keymapping afterward, + // qwerty keymapping can be gained. + iFepMan.PtiEngine()->SetInputMode( EPtiEngineQwertyPredictive ); + } + TPtiKey key = iFepMan.PtiEngine()->CharacterToKey( aCharacter ); //It loops through all the key mappings to find the character in the key mappings and @@ -6124,6 +6170,15 @@ break; } } + + if ( oldInputMode != EPtiEngineQwertyPredictive ) + { + // if current input mode isn't EPtiEngineQwertyPredictive, + // current input mode has been set to EPtiEngineQwertyPredictive temporarily before, + // now we need to restore it, + // because state machine is responsible for changing it practically. + iFepMan.PtiEngine()->SetInputMode( oldInputMode ); + } //Now if there is no key mapping found for the character, then use the default TChar //APIs to find the case of the character. if( !isMappingFound ) diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/src/AknFepUiInputStateEntryMiniQwertyZhuyinPhrase.cpp --- a/fep/aknfep/src/AknFepUiInputStateEntryMiniQwertyZhuyinPhrase.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/src/AknFepUiInputStateEntryMiniQwertyZhuyinPhrase.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -515,8 +515,7 @@ TBool ret = ETrue; - if ( (aKey == EPtiKeyQwertyE || aKey == EPtiKeyQwertyR || - aKey == EPtiKeyQwertyY || aKey == EPtiKeyQwertyU || aKey == EStdKeySpace) + if ( (iOwner->IsQwertyZhuyinToneMarkKey(aKey)|| aKey == EStdKeySpace) && (aLength == EShortKeyPress) ) { if ( keystrokeLength == 0 ) diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/src/AknFepUiInputStateEntryQwertyWesternPredictive.cpp --- a/fep/aknfep/src/AknFepUiInputStateEntryQwertyWesternPredictive.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/src/AknFepUiInputStateEntryQwertyWesternPredictive.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -42,10 +42,12 @@ #include //FeatureManager #include #include +#include static const TInt KKeyMappingsLength = 63; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // TAknFepInputStateEntryQwertyWesternPredictive:: @@ -604,6 +606,72 @@ // Framework will handle the key event. return EFalse; } + + +// use ptiengine's api to tell whether a character mapped on a given key. +TBool TAknFepInputStateEntryQwertyWesternPredictive::MapAgainst(TInt aKey, TInt aMode, TInt16 aAgainst, TInt aCase) const + { + CPtiEngine* ptiengine = iOwner->PtiEngine(); + if(ptiengine) + { + ptiengine->SetInputMode((TPtiEngineInputMode)aMode); + TBuf data; + ptiengine->MappingDataForKey((TPtiKey)aKey, data, (TPtiTextCase)aCase); + if(data.Length() > 0) + { + return (data[0] == aAgainst); + } + } + return EFalse; + } + + +// Get Scancode from a given character and tell the case at the same time. +TInt TAknFepInputStateEntryQwertyWesternPredictive::ScanCodeForCharacter( TUint aChar, TPtiTextCase& aCase ) + { + MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); + CPtiEngine* ptiengine = iOwner->PtiEngine(); +#ifdef RD_INTELLIGENT_TEXT_INPUT + CPtiCoreLanguage *lang = static_cast( ptiengine->CurrentLanguage() ); + MPtiKeyMappings* keymapping = lang->GetQwertyKeymappings(); + if ( keymapping ) + { + TPtiEngineInputMode oldInputMode = ptiengine->InputMode(); + ptiengine->SetInputMode( EPtiEngineQwertyPredictive ); + TInt retKey = keymapping->KeyForCharacter( (TUint16)aChar ); + if(MapAgainst(retKey, EPtiEngineQwertyPredictive, aChar, EPtiCaseLower)) + { + aCase = EPtiCaseLower; + } + else if(MapAgainst(retKey, EPtiEngineQwertyPredictive, aChar, EPtiCaseUpper)) + { + aCase = EPtiCaseUpper; + } + else if(MapAgainst(retKey, EPtiEngineQwertyPredictive, aChar, EPtiCaseFnLower)) + { + aCase = EPtiCaseFnLower; + } + else if(MapAgainst(retKey, EPtiEngineQwertyPredictive, aChar, EPtiCaseFnUpper)) + { + aCase = EPtiCaseFnUpper; + } + else + { + } + ptiengine->SetInputMode( oldInputMode ); +#if defined(__WINS__) + if (retKey == EPtiKeyQwertyPlus) + { + retKey = EStdKeyNkpPlus; + } +#endif + return retKey; + } + return EPtiKeyNone; +#else + return EPtiKeyNone; +#endif // RD_INTELLIGENT_TEXT_INPUT + } //////////////////////////////////////////////////////////////////////////////////////////////////////////// diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/src/AknFepUiInputStateInitialChineseGenericQwerty.cpp --- a/fep/aknfep/src/AknFepUiInputStateInitialChineseGenericQwerty.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/src/AknFepUiInputStateInitialChineseGenericQwerty.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -91,6 +91,33 @@ #endif } +TInt TAknFepInputStateInitialChineseGenericQwerty::ToneMark(TInt aKey, TDes& aResult) + { + CPtiEngine* ptiengine = iOwner->PtiEngine(); + TInt number = 0; + aResult.Zero(); + if(ptiengine) + { + TBuf data; + ptiengine->MappingDataForKey((TPtiKey)aKey, data, EPtiCaseLower); + if(data.Length() > 0) + { + for(TInt i = 0; i < data.Length(); i++) + { + if(data[i] == KZhuyinTone2 || data[i] == KZhuyinTone3 || data[i] == KZhuyinTone4 || data[i] == KZhuyinTone5) + { + if(aResult.MaxLength() > i) + { + aResult.Append(data[i]); + number++; + } + } + } + } + } + return number; + } + TBool TAknFepInputStateInitialChineseGenericQwerty::HandleKeyL(TInt aKey, TKeyPressLength aLength) { CPtiEngine* ptiengine = iOwner->PtiEngine(); @@ -124,58 +151,14 @@ && !fepMan->IsFlagSet(CAknFepManager::EFlagQwertyChrKeyDepressed)) { TBuf<1> ToneMarkBuf; -#ifdef RD_INTELLIGENT_TEXT_INPUT - if( keyboardType == EPtiKeyboardQwerty4x12) - { -#endif - switch(aKey) - { - case EPtiKeyQwerty3: - ToneMarkBuf.Append(KZhuyinTone3); - break; + if(ToneMark(aKey, ToneMarkBuf) > 0) - case EPtiKeyQwerty4: - ToneMarkBuf.Append(KZhuyinTone4); - break; - case EPtiKeyQwerty6: - ToneMarkBuf.Append(KZhuyinTone2); - break; - case EPtiKeyQwerty7: - ToneMarkBuf.Append(KZhuyinTone5); - break; - default: - break; - } -#ifdef RD_INTELLIGENT_TEXT_INPUT - } - else - if (keyboardType == EPtiKeyboardQwerty4x10 || keyboardType - == EPtiKeyboardQwerty3x11) { - switch (aKey) - { - case EPtiKeyQwertyE: - ToneMarkBuf.Append(KZhuyinTone3); - break; - case EPtiKeyQwertyR: - ToneMarkBuf.Append(KZhuyinTone4); - break; - case EPtiKeyQwertyY: - ToneMarkBuf.Append(KZhuyinTone2); - break; - case EPtiKeyQwertyU: - ToneMarkBuf.Append(KZhuyinTone5); - break; - default: - break; - } - } -#endif MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); fepMan->NewCharacterL(ToneMarkBuf); @@ -186,6 +169,7 @@ iOwner->FepMan()->TryCloseUiL(); } ret = ETrue; + } } else if(iOwner->IsValidChineseInputKeyQwerty(aKey) && !fepMan->IsFlagSet(CAknFepManager::EFlagQwertyChrKeyDepressed) && @@ -336,10 +320,29 @@ return response; } +//-------------------------------------------------------------------------- +// The gate to decide whether it is a character is whether it has valid mapping +// If return ETrue, the key will pass to ptiengine. +//-------------------------------------------------------------------------- +// TBool TAknFepInputStateInitialChineseGenericQwerty::IsCharacter(TInt aKey) { TBool response = EFalse; - if (aKey >= EPtiKeyQwertyA && aKey <= EPtiKeyQwertyZ) + CPtiEngine* ptiengine = iOwner->PtiEngine(); + MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); + TPtiTextCase textCase = EPtiCaseLower; + if (ptiengine && fepMan) + { + TBuf data; + ptiengine->MappingDataForKey((TPtiKey)aKey, data, textCase); + if (data.Length() > 0) + { + response = ETrue; + } + } + + // exception Z might has no mapping but need to put into ptiengine. + if(!response && aKey == EPtiKeyQwertyZ) { response = ETrue; } diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/src/AknFepUiManagerBase.cpp --- a/fep/aknfep/src/AknFepUiManagerBase.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/src/AknFepUiManagerBase.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -1023,4 +1023,18 @@ return iFepMan->ZhuyinAnalyser(); } +TBool CAknFepUIManagerBase::MapAgainst(TInt aKey, TInt aMode, TInt16 aAgainst, TInt aCase) const + { + if(iPtiEngine) + { + iPtiEngine->SetInputMode((TPtiEngineInputMode)aMode); + TBuf data; + iPtiEngine->MappingDataForKey((TPtiKey)aKey, data, (TPtiTextCase)aCase); + if(data.Length() > 0) + { + return (data[0] == aAgainst); + } + } + return EFalse; + } // End of file diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/src/AknFepUiManagerChinese.cpp --- a/fep/aknfep/src/AknFepUiManagerChinese.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/src/AknFepUiManagerChinese.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -132,6 +132,14 @@ const TInt16 KStrokeQuestionValue = 0x003f; const TInt16 KStrokeUnicode = 0x2461; const TInt16 KZhuyinIndicator = 0x2462; +const TInt16 KPinyinIndicator = 0x2460; +//const TInt16 KStrokeIndicator = 0x2461; +const TInt16 KCanjieIndicator = 0x2463; +const TInt16 KChineseTone1 = 0x02c9; +const TInt16 KChineseTone2 = 0x02ca; +const TInt16 KChineseTone3 = 0x02c7; +const TInt16 KChineseTone4 = 0x02cb; +const TInt16 KChineseTone0 = 0x02d9; /** * CAknFepUIManagerChinese class. * @@ -475,6 +483,48 @@ return EFalse; } #endif +TBool CAknFepUIManagerChinese::IsValidChineseInputSymbol(TInt aKey, TPtiEngineInputMode aMode) const + { + if( aMode == EPtiEnginePinyinPhraseQwerty) + { + return MapAgainst(aKey, aMode, KPinyinIndicator, EPtiCaseLower); + } + else if( aMode == EPtiEngineZhuyinPhraseQwerty) + { + return MapAgainst(aKey, aMode, KZhuyinIndicator, EPtiCaseLower); + } + else if( aMode == EPtiEngineNormalCangjieQwerty || + aMode == EPtiEngineEasyCangjieQwerty || + aMode == EPtiEngineAdvCangjieQwerty) + { + return MapAgainst(aKey, aMode, KCanjieIndicator, EPtiCaseLower); + } + return EFalse; + } +TBool CAknFepUIManagerChinese::IsValidChineseToneMarkKey(TInt aKey, TPtiEngineInputMode aMode) const + { + if( MapAgainst(aKey, aMode, KChineseTone1, EPtiCaseLower)) + { + return ETrue; + } + else if( MapAgainst(aKey, aMode, KChineseTone2, EPtiCaseLower)) + { + return ETrue; + } + else if( MapAgainst(aKey, aMode, KChineseTone3, EPtiCaseLower)) + { + return ETrue; + } + else if( MapAgainst(aKey, aMode, KChineseTone4, EPtiCaseLower)) + { + return ETrue; + } + else if( MapAgainst(aKey, aMode, KChineseTone0, EPtiCaseLower)) + { + return ETrue; + } + return EFalse; + } // --------------------------------------------------------------------------- // CAknFepUIManagerChinese::IsValidChineseInputKeyQwerty // @@ -495,8 +545,7 @@ if(iMode == EPinyin) { - if( (aKey >= EPtiKeyQwertyA && aKey <= EPtiKeyQwertyZ) || - (aKey >= EPtiKeyQwerty1 && aKey <= EPtiKeyQwerty9) || + if( IsValidChineseInputSymbol(aKey, EPtiEnginePinyinPhraseQwerty) || (IsFlagSet(ESupportPinyinPhrase) && aKey == EPtiKeyQwertyApostrophe && State() != EInitial)) { @@ -602,37 +651,14 @@ if(iMode == ECangJie) { - if (aKey >= EPtiKeyQwertyA && aKey <= EPtiKeyQwertyZ) - { - response = ETrue; - } + response = IsValidChineseInputSymbol(aKey, (TPtiEngineInputMode)iFepMan->CangJieMode()); } if(iMode == EZhuyin || iMode == EZhuyinFind) { #ifdef RD_INTELLIGENT_TEXT_INPUT - if(EPtiKeyboardQwerty4x10 == keyboardType || - EPtiKeyboardQwerty3x11 == keyboardType ) - { - TBuf lowerdata; - iPtiEngine->MappingDataForKey((TPtiKey)aKey, lowerdata, EPtiCaseLower); // TInt ZhuyinUnicodeCur =0; - for(TInt i=0;i= EPtiKeyQwertyA && aKey <= EPtiKeyQwertyZ)) - { - response = ETrue; - } - } - else if ( EPtiKeyboardHalfQwerty == keyboardType ) + if ( EPtiKeyboardHalfQwerty == keyboardType ) { if((aKey >= EPtiKeyQwertyA && aKey <= EPtiKeyQwertyZ) || (aKey >= EPtiKey0 && aKey <= EPtiKey9) || @@ -644,13 +670,7 @@ else { #endif - if((aKey >= EPtiKeyQwertyA && aKey <= EPtiKeyQwertyZ) || - (aKey >= EPtiKeyQwerty0 && aKey <= EPtiKeyQwerty9)|| - (aKey == EPtiKeyQwertySemicolon) || - (aKey == EPtiKeyQwertyApostrophe) || - (aKey == EPtiKeyQwertyComma) || - (aKey == EPtiKeyQwertyFullstop) || - (aKey == EPtiKeyQwertySlash)) + if(IsValidChineseInputSymbol(aKey, (TPtiEngineInputMode)EPtiEngineZhuyinPhraseQwerty)) { response = ETrue; } @@ -697,37 +717,13 @@ if(iQwertyMode && (iMode == EZhuyin) && supportSCTToneMarks) { #ifdef RD_INTELLIGENT_TEXT_INPUT - if( keyboardType == EPtiKeyboardQwerty4x12) - { -#endif - if(aKey == EPtiKeyQwerty3 || aKey == EPtiKeyQwerty4 || aKey == EPtiKeyQwerty6 || aKey == EPtiKeyQwerty7) - { - return ETrue; - } - else - { - return EFalse; - } -#ifdef RD_INTELLIGENT_TEXT_INPUT - } - else if( keyboardType == EPtiKeyboardQwerty4x10 || keyboardType == EPtiKeyboardQwerty3x11) - { - if(aKey == EPtiKeyQwertyE || aKey == EPtiKeyQwertyR || aKey == EPtiKeyQwertyY || aKey == EPtiKeyQwertyU) - { - return ETrue; - } - else - { - return EFalse; - } - } + return IsValidChineseToneMarkKey(aKey, EPtiEngineZhuyinPhraseQwerty); #endif } else { return EFalse; } - return EFalse; } // --------------------------------------------------------------------------- diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/src/aknfepuiinputminiqwertypinyinphrasebase.cpp --- a/fep/aknfep/src/aknfepuiinputminiqwertypinyinphrasebase.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/src/aknfepuiinputminiqwertypinyinphrasebase.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -1307,6 +1307,26 @@ } } +//------------------------------------------------------------------------------- +// Purpose: to adjust the scancode to make pinyin works +// Pinyin symbol inheritantly accepts A-Z, any input out of this range will make it crash. +// Add this function to turn some alienated scancode to A-Z. +// +//--------------------------------------------------------------------------- +// +void TAknFepInputMiniQwertyPinyinPhraseBase::MapKey(TInt& aKey) + { + if(iOwner && iOwner->PtiEngine()) + { + iOwner->PtiEngine()->SetInputMode(EPtiEnginePinyinPhraseQwerty); + TBuf upperdata; + iOwner->PtiEngine()->MappingDataForKey((TPtiKey)aKey, upperdata, EPtiCaseUpper); + if(upperdata.Length() > 0) + { + aKey = upperdata[0]; + } + } + } // --------------------------------------------------------------------------- // TAknFepInputMiniQwertyPinyinPhraseBase::GetShowKeystroke //Handle horizontal navigation. @@ -1315,10 +1335,12 @@ void TAknFepInputMiniQwertyPinyinPhraseBase::GetShowKeystroke(TInt aKey, TDes& aKeystroke) { + TInt key = aKey; + MapKey(key); TInt count = sizeof(StrokeMap )/sizeof(StrokeMap[0] ); for (TInt i = 0; i < count; i++) { - if (aKey == StrokeMap[i].iKeyCode) + if (key == StrokeMap[i].iKeyCode) { aKeystroke.Append(StrokeMap[i].iValue); break; @@ -1679,6 +1701,12 @@ } GetShowKeystroke(aKey, keystroke); + + //Add this condition to avoid crash in case keystroke is empty. + if(keystroke.Length() == 0) + { + return EFalse; + } if ( index >= keystrokeArray->Count() ) { keystrokeArray->AppendL(keystroke); diff -r ecbabf52600f -r bd83ceabce89 fep/aknfep/src/aknfepuiinputstateminiqwertyzhuyinphrase.cpp --- a/fep/aknfep/src/aknfepuiinputstateminiqwertyzhuyinphrase.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/fep/aknfep/src/aknfepuiinputstateminiqwertyzhuyinphrase.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -513,8 +513,7 @@ fepMan->NewTextL( currentText ); fepMan->CommitInlineEditL(); } - UIContainer()->EditPaneWindow()->ResetAllArray(); - UIContainer()->EditPaneWindow()->SetPhraseCreationFlag( EFalse ); + if ( fepMan->IsFlagSet( CAknFepManager::EFlagEditorFull ) ) { fepMan->ClearFlag( CAknFepManager::EFlagEditorFull ); @@ -539,6 +538,8 @@ } AddPhraseToDB( phraseCreatedWithZhuYin ); } + UIContainer()->EditPaneWindow()->ResetAllArray(); + UIContainer()->EditPaneWindow()->SetPhraseCreationFlag( EFalse ); fepMan->TryCloseUiL(); } diff -r ecbabf52600f -r bd83ceabce89 inputmethods_plat/aknfep_settings_api/inc/AknFepInternalCRKeys.h --- a/inputmethods_plat/aknfep_settings_api/inc/AknFepInternalCRKeys.h Wed Sep 01 12:23:33 2010 +0100 +++ b/inputmethods_plat/aknfep_settings_api/inc/AknFepInternalCRKeys.h Tue Sep 14 21:59:06 2010 +0300 @@ -381,6 +381,46 @@ */ const TUint32 KAknFepLastUsedPortraitInput = 0x00000026; +/** + * following keys are used for tap accuracy enhancement, default input mode + */ +const TUint32 KAknFepTapAccuracyDefaultButtonExtMargins = 0x27; +const TUint32 KAknFepTapAccuracyDefaultKeyCtrlExtMargins = 0x28; +const TUint32 KAknFepTapAccuracyDefaultPointerMoveMaxMovement = 0x29; +const TUint32 KAknFepTapAccuracyDefaultPointerMoveTimeout = 0x2a; +const TUint32 KAknFepTapAccuracyDefaultPointerUpMaxMovement = 0x2b; +const TUint32 KAknFepTapAccuracyDefaultPointerUpTimeout = 0x2c; + +/** + * following keys are used for tap accuracy enhancement, FSQ + */ +const TUint32 KAknFepTapAccuracyFsqButtonExtMargins = 0x2d; +const TUint32 KAknFepTapAccuracyFsqKeyCtrlExtMargins = 0x2e; +const TUint32 KAknFepTapAccuracyFsqPointerMoveMaxMovement = 0x2f; +const TUint32 KAknFepTapAccuracyFsqPointerMoveTimeout = 0x30; +const TUint32 KAknFepTapAccuracyFsqPointerUpMaxMovement = 0x31; +const TUint32 KAknFepTapAccuracyFsqPointerUpTimeout = 0x32; + +/** + * following keys are used for tap accuracy enhancement, Portrait FSQ + */ +const TUint32 KAknFepTapAccuracyPFsqButtonExtMargins = 0x33; +const TUint32 KAknFepTapAccuracyPFsqKeyCtrlExtMargins = 0x34; +const TUint32 KAknFepTapAccuracyPFsqPointerMoveMaxMovement = 0x35; +const TUint32 KAknFepTapAccuracyPFsqPointerMoveTimeout = 0x36; +const TUint32 KAknFepTapAccuracyPFsqPointerUpMaxMovement = 0x37; +const TUint32 KAknFepTapAccuracyPFsqPointerUpTimeout = 0x38; + +/** + * following keys are used for tap accuracy enhancement, Finger HWR + */ +const TUint32 KAknFepTapAccuracyFhwrButtonExtMargins = 0x39; +const TUint32 KAknFepTapAccuracyFhwrKeyCtrlExtMargins = 0x3a; +const TUint32 KAknFepTapAccuracyFhwrPointerMoveMaxMovement = 0x3b; +const TUint32 KAknFepTapAccuracyFhwrPointerMoveTimeout = 0x3c; +const TUint32 KAknFepTapAccuracyFhwrPointerUpMaxMovement = 0x3d; +const TUint32 KAknFepTapAccuracyFhwrPointerUpTimeout = 0x3e; + #endif // End of file diff -r ecbabf52600f -r bd83ceabce89 inputmethods_plat/pen_input_server_api/inc/peninputclient.h --- a/inputmethods_plat/pen_input_server_api/inc/peninputclient.h Wed Sep 01 12:23:33 2010 +0100 +++ b/inputmethods_plat/pen_input_server_api/inc/peninputclient.h Tue Sep 14 21:59:06 2010 +0300 @@ -428,6 +428,7 @@ IMPORT_C TInt ConnectAsyc(TRequestStatus& aStatus); IMPORT_C void SetDataQueryPopped(TBool aFlag); IMPORT_C void EnablePriorityChangeOnOriChange(TBool aEnabled); + IMPORT_C void EnableGfxTransEffect( TBool aEnable ); private: // Data /** * The singleton client to the input server diff -r ecbabf52600f -r bd83ceabce89 inputmethods_plat/pen_input_server_api/inc/peninputcmd.h --- a/inputmethods_plat/pen_input_server_api/inc/peninputcmd.h Wed Sep 01 12:23:33 2010 +0100 +++ b/inputmethods_plat/pen_input_server_api/inc/peninputcmd.h Tue Sep 14 21:59:06 2010 +0300 @@ -75,6 +75,7 @@ EPeninputOpLastCommand , EPeninputOpRequestDSAState, EPeninputOpChangeFeedbackType, + EPeninputOpUpdatePointerSuppressor, EPeninputUserCmdBase = 1000 }; @@ -112,6 +113,7 @@ ESignalDisableUpdating, ESignalDrawBackground, ESignalEnableLayoutRedrawWhenActive, + ESignalUpdatePointerSuppressor, ESignalFepEventBase = 1500, //Event base for Fep. All fep event //is re-directed to Fep. ESignalKeyEvent = 1501, //hwr recongition selection event. diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/bwins/peninputClientU.DEF --- a/textinput/peninputarc/bwins/peninputClientU.DEF Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/bwins/peninputClientU.DEF Tue Sep 14 21:59:06 2010 +0300 @@ -64,4 +64,5 @@ ?ConnectAsyc@RPeninputServer@@QAEHAAVTRequestStatus@@@Z @ 63 NONAME ; int RPeninputServer::ConnectAsyc(class TRequestStatus &) ?SetDataQueryPopped@RPeninputServer@@QAEXH@Z @ 64 NONAME ; void RPeninputServer::SetDataQueryPopped(int) ?EnablePriorityChangeOnOriChange@RPeninputServer@@QAEXH@Z @ 65 NONAME ; void RPeninputServer::EnablePriorityChangeOnOriChange(int) + ?EnableGfxTransEffect@RPeninputServer@@QAEXH@Z @ 66 NONAME ; void RPeninputServer::EnableGfxTransEffect(int) diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/eabi/peninputClientU.DEF --- a/textinput/peninputarc/eabi/peninputClientU.DEF Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/eabi/peninputClientU.DEF Tue Sep 14 21:59:06 2010 +0300 @@ -73,4 +73,5 @@ _ZN15RPeninputServer11ConnectAsycER14TRequestStatus @ 72 NONAME _ZN15RPeninputServer18SetDataQueryPoppedEi @ 73 NONAME _ZN15RPeninputServer31EnablePriorityChangeOnOriChangeEi @ 74 NONAME + _ZN15RPeninputServer20EnableGfxTransEffectEi @ 75 NONAME diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/inc/peninputlayoutcontrolinc/peninputlayout.h --- a/textinput/peninputarc/inc/peninputlayoutcontrolinc/peninputlayout.h Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/inc/peninputlayoutcontrolinc/peninputlayout.h Tue Sep 14 21:59:06 2010 +0300 @@ -564,6 +564,22 @@ */ inline MTouchFeedback* TouchFeedbackInstance(); + /** + * Get extra response area of virtual key controls. + * + * @since Symbian^3 + * @param aMargins output the margins around the original response area. + */ + void GetKeyExtResponseArea( TMargins& aMargins ); + + /** + * Get extra response area of button controls. + * + * @since Symbian^3 + * @param aMargins output the margins around the original response area. + */ + void GetButtonExtResponseArea( TMargins& aMargins ); + protected: /** * Constructor @@ -631,6 +647,14 @@ void SendEditorTextAndCursorPosL(TUint8* aData); void SetSelfBmpDeviceFlag(TBool aFlag); + /** + * Load tap accuracy enhancement settings according to the specified input mode. + * + * @since Symbian^3 + * @param alayoutType specifies the input mode(refer to TPluginInputMode) of this layout. + */ + void LoadTapAccuracySettingsL( TInt alayoutType ); + private: NONSHARABLE_CLASS( CFepUiLayoutExt) : public CBase { @@ -648,7 +672,39 @@ MTouchFeedback* iTouchFeedbackInstance; TBool iSelfBmpDeviceFlag; - TBool iDisableDrawing; + TBool iDisableDrawing; + + /** + * PointerMove event suppressor parameter: max movement(in pixel) + */ + TSize iPointerMoveSuppressMaxMovement; + + /** + * PointerMove event suppressor parameter: timeout(in microsecond) + */ + TInt iPointerMoveSuppressTimeout; + + /** + * PointerUp event suppressor parameter: max movement(in pixel) + */ + TSize iPointerUpSuppressMaxMovement; + + /** + * PointerUp event suppressor parameter: timeout(in microsecond) + */ + TInt iPointerUpSuppressTimeout; + + /** + * extra response area of virtual key controls + */ + TMargins iKeyExtResponseMargins; + + /** + * extra response area of virtual button controls + */ + TMargins iButtonExtResponseMargins; + + }; private: diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/inc/peninputlayoutcontrolinc/peninputtapsettingmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputarc/inc/peninputlayoutcontrolinc/peninputtapsettingmanager.h Tue Sep 14 21:59:06 2010 +0300 @@ -0,0 +1,203 @@ +/* +* Copyright (c) 2010 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: header file of peninput ui layout +* +*/ + + +#ifndef PENINPUTTAPSETTINGMANAGER_H +#define PENINPUTTAPSETTINGMANAGER_H + +#include +#include +#include + +NONSHARABLE_CLASS(CPeninputTapSettingManager) : public CBase + { +public: //constructors + /** + * Symbian constructor. + * + * @since Symbian^3 + * @return Pointer to created object + */ + static CPeninputTapSettingManager* NewL(); + + /** + * Symbian constructor. + * + * @since Symbian^3 + * @return Pointer to created object + */ + static CPeninputTapSettingManager* NewLC(); + + /* + * Standard c++ destructor. + * @since Symbian^3 + */ + virtual ~CPeninputTapSettingManager(); + +public: + /** + * Load all parameters of tap accuracy enhancement for specified layout. + * + * @since Symbian^3 + * @param aLayoutType layout type, refer to TPluginInputMode + * @return none + */ + void Load( TInt aLayoutType ); + + /** + * Load all parameters of tap accuracy enhancement for specified layout. + * + * @since Symbian^3 + * @param aLayoutType layout type, refer to TPluginInputMode + * @param aFileName path name of configuration file + * @return none + */ + void Load( TInt aLayoutType, const TDesC& aFileName ); + + /** + * Get configuration of PointerMove event suppressor. + * + * @since Symbian^3 + * @param aMaxMovement output max movement of PointerMove event + * @param aTimeout output timeout(in microsecond) of PointerMove event + * @return none + */ + void GetPointerMoveSuppressor( TSize& aMaxMovement, TInt& aTimeout ); + + /** + * Get configuration of PointerUp event suppressor. + * + * @since Symbian^3 + * @param aMaxMovement output max movement of PointerUp event + * @param aTimeout output timeout(in microsecond) of PointerUp event + * @return none + */ + void GetPointerUpSuppressor( TSize& aMaxMovement, TInt& aTimeout ); + + /** + * Get extra response area of virtual key controls. + * + * @since Symbian^3 + * @param aMargins output the margins around the original response area. + * @return none + */ + void GetKeyExtResponseArea( TMargins& aMargins ); + + /** + * Get extra response area of button controls. + * + * @since Symbian^3 + * @param aMargins output the margins around the original response area. + * @return none + */ + void GetButtonExtResponseArea( TMargins& aMargins ); + +private: + /** + * C++ constructor + * + * @since Symbian^3 + * @return None + */ + CPeninputTapSettingManager(); + + /** + * Symbian second-phase constructor + * + * @since Symbian^3 + * @return None + */ + void ConstructL(); +private: + /** + * Load all parameters of tap accuracy enhancement for specified layout. + * + * @since Symbian^3 + * @param aLayoutType layout type, refer to TPluginInputMode + * @return none + */ + void LoadFromRepositoryL( TInt aLayoutType ); + + /** + * Load all parameters of tap accuracy enhancement for specified layout + * + * @since Symbian^3 + * @param aLayoutType layout type, refer to TPluginInputMode + * @param aFileName path name of configuration file + * @return none + */ + void LoadFromFileL( TInt aLayoutType, const TDesC& aFileName ); + + /** + * Load default parameters + * + * @since Symbian^3 + * @return none + */ + void LoadDefault(); + + /** + * parse a TPoint from a comma separated values string. + * + * @since Symbian^3 + * @return number of values in aText + */ + TInt ParsePoints( TPoint& aPoint, const TDesC& aText ); + + /** + * parse a TMargins from a comma separated values string. + * + * @since Symbian^3 + * @param aMargins output parse result + * @param aText source string + * @return number of values in aText + */ + TInt ParseMargins( TMargins& aMargins, const TDesC& aText ); + +private: + /** + * max movement of PointerMove event + */ + TSize iPointerMoveMaxMovement; + + /** + * timeout of PointerMove event, microsecond + */ + TInt iPointerMoveTimeout; + + /** + * max movement of PointerUp event + */ + TSize iPointerUpMaxMovement; + + /** + * timeout of PointerUp event, microsecond + */ + TInt iPointerUpTimeout; + + /** + * extra response area of virtual key controls + */ + TMargins iKeyMargins; + + /** + * extra response area of button controls + */ + TMargins iButtonMargins; + }; + +#endif // PENINPUTTAPSETTINGMANAGER_H diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/inc/pensrvcliinc/peninputanimclientobj.h --- a/textinput/peninputarc/inc/pensrvcliinc/peninputanimclientobj.h Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/inc/pensrvcliinc/peninputanimclientobj.h Tue Sep 14 21:59:06 2010 +0300 @@ -231,6 +231,16 @@ * @return ETrue if command added successfully. */ TBool SetDiscreetPopArea(const TRect& aArea); + + /** + * Update parameters of pointer event suppressor. + * + * @since Symbian^3 + * @param aParameters parameters of pointer event suppressor + * @return none + */ + void UpdatePointerEventSuppressor( const TPointerEventSuppressorParameters& aParameters ); + private: /** * Default constructor. diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/inc/pensrvcliinc/peninputanimcommand.h --- a/textinput/peninputarc/inc/pensrvcliinc/peninputanimcommand.h Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/inc/pensrvcliinc/peninputanimcommand.h Tue Sep 14 21:59:06 2010 +0300 @@ -494,6 +494,37 @@ private: TRect iArea; }; + +//class TAnimUpdatePointerEventSuppressorCmd +/** + * Class for handling pointer event suppressor command + * + * + * @since Symbian^3 + */ +class TAnimUpdatePointerEventSuppressorCmd : public TAnimCmd + { +public: + /** + * Default constructor + * @param aAnim The animation cliet which executes the command + * @param aParameters parameters of pointer event suppressor + */ + TAnimUpdatePointerEventSuppressorCmd( RPeninputAnim& aAnim, + const TPointerEventSuppressorParameters& aParameters ); + + /** + * Execute the command + * + * @since Symbian^3 + * @return ETrue if command has been executed successfully. + */ + virtual TBool ExecuteAnimCommand() const; + +private: + TPointerEventSuppressorParameters iParameters; + }; + #include "peninputanimcommand.inl" #endif //C_CPENINPUTANIM_CMD_H diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/inc/pensrvcliinc/peninputclientimpl.h --- a/textinput/peninputarc/inc/pensrvcliinc/peninputclientimpl.h Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/inc/pensrvcliinc/peninputclientimpl.h Tue Sep 14 21:59:06 2010 +0300 @@ -468,6 +468,15 @@ TBool ServerReady(); void OnServerStarted(TInt aErr); + /** + * Enable or disable transition effect. + * + * @since Symbian^3 + * @param aEnable, ETrue: enable transition effect + * EFalse: disable transition effect. + */ + void EnableGfxTransEffect( TBool aEnable ); + private: /** * Constructor diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/inc/pensrvcliinc/peninputclientserver.h --- a/textinput/peninputarc/inc/pensrvcliinc/peninputclientserver.h Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/inc/pensrvcliinc/peninputclientserver.h Tue Sep 14 21:59:06 2010 +0300 @@ -89,7 +89,8 @@ EPeninputRequestDimResChangeLayout, EPeninputRequestSupportInputMode, EPeninputRequestSetInputLanguage, - EPeninputEnablePriorityChangeOnOriChange + EPeninputEnablePriorityChangeOnOriChange, + EPeninputRequestEnableGfxTransEffect }; //server error code diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/inc/pensrvcliinc/peninputcmdparamext.h --- a/textinput/peninputarc/inc/pensrvcliinc/peninputcmdparamext.h Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/inc/pensrvcliinc/peninputcmdparamext.h Tue Sep 14 21:59:06 2010 +0300 @@ -45,4 +45,19 @@ // see MAnimSpriteFunctions::UpdateMember TBool iFullUpdateFlag; }; + +/** + * parameters for pointer event suppressor + */ +struct TPointerEventSuppressorParameters + { + TBool iMoveEventSuppressEnabled; + TSize iMoveEventMaxMovement; + TInt iMoveEventTimeout; + + TBool iUpEventSuppressEnabled; + TSize iUpEventMaxMovement; + TInt iUpEventTimeout; + }; + #endif //_PENINPUTPARAM_EXT_H diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/inc/pensrvcliinc/peninputserver.h --- a/textinput/peninputarc/inc/pensrvcliinc/peninputserver.h Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/inc/pensrvcliinc/peninputserver.h Tue Sep 14 21:59:06 2010 +0300 @@ -693,6 +693,15 @@ void CheckSessionValidL(CPeninputServerSession* aSession1, CPeninputServerSession* aSession2) const; + /** + * Update parameters of pointer event suppressor. + * + * @since Symbian^3 + * @param aData parameters of pointer event suppressor + * @return none + */ + void UpdatePointerEventSuppressor( const TDesC& aData ); + public: TInt DisabledByDSA(); TInt DisabledByDSAFromAnim(); diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/inc/pensrvcliinc/penpointereventsuppressor.h --- a/textinput/peninputarc/inc/pensrvcliinc/penpointereventsuppressor.h Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/inc/pensrvcliinc/penpointereventsuppressor.h Tue Sep 14 21:59:06 2010 +0300 @@ -85,7 +85,9 @@ * @param aPointerEvent the pointer event which may need to be suppressed. * @return ETrue if the pointer event should be suppressed, or EFalse if it should be handled. */ - TBool SuppressPointerEvent(const TPointerEvent& aPointerEvent); + + TBool SuppressPointerEvent( TPointerEvent& aPointerEvent ); + /** * Set the maximum time period that drag events should be * ignored during a pointer interaction. @@ -109,6 +111,24 @@ */ void SetMinInterDragInterval(TTimeIntervalMicroSeconds aInterval); + /** + * Set the maximum pointer movement for up events. + * All up events within maximum movement and timeout are moved to the down position. + * + * @since Symbian^3 + * @param aMaxDownUpMove maximum movement(in pixel) of up event + */ + void SetMaxDownUpMove( TSize aMaxDownUpMove ); + + /** + * Set the maximum time between up and down events. + * All up events within maximum movement and timeout are moved to the down position. + * + * @since Symbian^3 + * @param aDuration time between down and up events. + */ + void SetMaxDownUpDuration( TTimeIntervalMicroSeconds aDuration ); + private: CPenPointerEventSuppressor(); @@ -120,6 +140,19 @@ TPoint iDownPos; TBool iTap; TTime iLastEventTime; - }; + + + /** + * The maximum pointer movement for up events. + * All up events within maximum movement and timeout are moved to the down position. + */ + TSize iMaxDownUpMove; + + /** + * The maximum time between up and down events. + * All up events within maximum movement and timeout are moved to the down position. + */ + TTimeIntervalMicroSeconds iMaxDownUpDuration; + }; #endif diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/inc/pensrvcliinc/penuiwndctrl.h --- a/textinput/peninputarc/inc/pensrvcliinc/penuiwndctrl.h Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/inc/pensrvcliinc/penuiwndctrl.h Tue Sep 14 21:59:06 2010 +0300 @@ -241,6 +241,18 @@ */ void SetCursorColor(); + /** + * Enable or disable transition effect. + * + * @since Symbian^3 + * @param aEnableGfxTransEffect, ETrue: enable transition effect + * EFalse: disable transition effect. + */ + inline void EnableGfxTransEffect( TBool aEnableGfxTransEffect ) + { + iEnableGfxTransEffect = aEnableGfxTransEffect; + }; + public: // Functions from base classes. /** @@ -385,6 +397,12 @@ */ TRgb iCursorColor; + + /** + * If transition effect is enabled. + */ + TBool iEnableGfxTransEffect; + friend class CCursorWindow; }; class CInternalBkCtrl : public CCoeControl diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/inc/pensrvcliinc/rpeninputanim.h --- a/textinput/peninputarc/inc/pensrvcliinc/rpeninputanim.h Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/inc/pensrvcliinc/rpeninputanim.h Tue Sep 14 21:59:06 2010 +0300 @@ -186,6 +186,16 @@ void GetDSAState(TBool& aState); void SetDiscreeptPop(const TRect& aArea); + + /** + * Update parameters of pointer event suppressor. + * + * @since Symbian^3 + * @param aParameters parameters of pointer event suppressor + * @return none + */ + void UpdatePointerEventSuppressor( const TPointerEventSuppressorParameters& aParameters ); + private: /** diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputanim/peninputanim.cpp --- a/textinput/peninputarc/src/peninputanim/peninputanim.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputanim/peninputanim.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -241,6 +241,7 @@ case TRawEvent::EButton1Up: { pointerEvent.iType = TPointerEvent::EButton1Up; + pointerEvent.iPosition = aRawEvent.Pos(); break; } case TRawEvent::EPointerMove: @@ -259,17 +260,25 @@ return ETrue; } + TRawEvent rawEvent = aRawEvent; + if ( aRawEvent.Type() == TRawEvent::EButton1Up + && aRawEvent.Pos() != pointerEvent.iPosition ) + { + rawEvent.Set( TRawEvent::EButton1Up, + pointerEvent.iPosition.iX, + pointerEvent.iPosition.iY ); + } switch(aRawEvent.Type()) { case TRawEvent::EKeyUp: case TRawEvent::EKeyDown: { - return OnRawKeyEvent(aRawEvent); + return OnRawKeyEvent( rawEvent ); } case TRawEvent::EButton1Down: { - TBool used = OnRawButton1Down(aRawEvent); + TBool used = OnRawButton1Down( rawEvent ); if ( used ) { @@ -280,19 +289,19 @@ } case TRawEvent::EButton1Up: { - TBool used = OnRawButton1Up(aRawEvent); + TBool used = OnRawButton1Up( rawEvent ); StopTimer(); return used; } case TRawEvent::EPointerMove: { - return OnRawPointerMove(aRawEvent); + return OnRawPointerMove( rawEvent ); } default: { return EFalse; - } - } + } + } } // --------------------------------------------------------------------------- @@ -695,6 +704,18 @@ SetDiscreeptPop(area); } break; + case EPeninputOpUpdatePointerSuppressor: + { + TPointerEventSuppressorParameters parameters; + TPckg msgData( parameters ); + msg->ReadL( KMsgSlot1, msgData ); + + iPointerEventSuppressor->SetMaxTapMove( parameters.iMoveEventMaxMovement ); + iPointerEventSuppressor->SetMaxTapDuration( parameters.iMoveEventTimeout ); + iPointerEventSuppressor->SetMaxDownUpMove( parameters.iUpEventMaxMovement ); + iPointerEventSuppressor->SetMaxDownUpDuration( parameters.iUpEventTimeout ); + } + break; default: // unsupported opcode, panic the client { diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputanim/penpointereventsuppressor.cpp --- a/textinput/peninputarc/src/peninputanim/penpointereventsuppressor.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputanim/penpointereventsuppressor.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -21,6 +21,9 @@ const TInt KPenPointerEventSuppressorDefaultMinInterDragInterval = 0; const TInt KPenPointerEventSuppressorDefaultMovement = 6; +const TInt KPenPointerEventSuppressorDefaultMaxDownUpDuration = 400000; // 0.4 seconds +const TInt KPenPointerEventSuppressorDefaultDownUpMovement = 7; + CPenPointerEventSuppressor* CPenPointerEventSuppressor::NewL() { return new (ELeave) CPenPointerEventSuppressor; @@ -32,17 +35,20 @@ } CPenPointerEventSuppressor::CPenPointerEventSuppressor() -: iMaxTapDuration(KPenPointerEventSuppressorDefaultMaxTapDuration), - iMinInterDragInterval(KPenPointerEventSuppressorDefaultMinInterDragInterval), - iTap(EFalse) +: iMaxTapDuration( KPenPointerEventSuppressorDefaultMaxTapDuration ), + iMinInterDragInterval( KPenPointerEventSuppressorDefaultMinInterDragInterval ), + iTap( EFalse ), + iMaxDownUpDuration( KPenPointerEventSuppressorDefaultMaxDownUpDuration ) { // default move limit is 6 units, which seems to be a forgiving value for finger touch iMaxTapMove.iWidth = KPenPointerEventSuppressorDefaultMovement; iMaxTapMove.iHeight = KPenPointerEventSuppressorDefaultMovement; + + iMaxDownUpMove.iWidth = KPenPointerEventSuppressorDefaultDownUpMovement; + iMaxDownUpMove.iHeight = KPenPointerEventSuppressorDefaultDownUpMovement; } -TBool CPenPointerEventSuppressor::SuppressPointerEvent( - const TPointerEvent& aPointerEvent) +TBool CPenPointerEventSuppressor::SuppressPointerEvent( TPointerEvent& aPointerEvent ) { switch ( aPointerEvent.iType ) { @@ -88,7 +94,17 @@ break; } case TPointerEvent::EButton1Up: - { + { + TTime now; + now.HomeTime(); + TPoint delta = aPointerEvent.iPosition - iDownPos; + if ( now.MicroSecondsFrom( iDownTime ) < iMaxDownUpDuration + && Abs( delta.iX ) < iMaxDownUpMove.iWidth + && Abs( delta.iY ) < iMaxDownUpMove.iHeight ) + { + //within maximum movement and timeout, so move to position of down + aPointerEvent.iPosition = iDownPos; + } iTap = EFalse; break; } @@ -118,3 +134,13 @@ { iMinInterDragInterval = aInterval; } + +void CPenPointerEventSuppressor::SetMaxDownUpMove( TSize aMaxDownUpMove ) + { + iMaxDownUpMove = aMaxDownUpMove; + } + +void CPenPointerEventSuppressor::SetMaxDownUpDuration( TTimeIntervalMicroSeconds aDuration ) + { + iMaxDownUpDuration = aDuration; + } diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputclient/penclientimpl.cpp --- a/textinput/peninputarc/src/peninputclient/penclientimpl.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputclient/penclientimpl.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -1542,6 +1542,18 @@ User::RequestComplete(iPendingRequest, aErr); } +// --------------------------------------------------------------------------- +// Enable or disable transition effect. +// --------------------------------------------------------------------------- +// +void RPeninputServerImpl::EnableGfxTransEffect( TBool aEnable) + { + TPckg msg( aEnable ); + TIpcArgs arg; + arg.Set( KMsgSlot0, &msg ); + SendReceive(EPeninputRequestEnableGfxTransEffect, arg ); + } + CWaitingServerAo::CWaitingServerAo(RPeninputServerImpl* aClient) : CActive(CActive::EPriorityStandard), iClient(aClient) diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputclient/peninputclient.cpp --- a/textinput/peninputarc/src/peninputclient/peninputclient.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputclient/peninputclient.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -509,5 +509,18 @@ { iSingletonServer->EnablePriorityChangeOnOriChange(aEnabled); } + +// --------------------------------------------------------------------------- +// Enable or disable transition effect. +// --------------------------------------------------------------------------- +// +EXPORT_C void RPeninputServer::EnableGfxTransEffect( TBool aEnable ) + { + if ( iSingletonServer ) + { + iSingletonServer->EnableGfxTransEffect( aEnable ); + } + } + //end of class RPeninputServer // End of File diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutbutton.cpp --- a/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutbutton.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutbutton.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -59,9 +59,13 @@ CFepUiBaseCtrl::BaseConstructL(); //tap accuracy enhancement - if( FeatureManager::FeatureSupported( KFeatureIdFfCapacitiveDisplay )) + if ( FeatureManager::FeatureSupported( KFeatureIdFfCapacitiveDisplay ) ) { - EnableExtResponseArea( ETrue, TRect(TPoint(10,10),TSize(10,10)) ); + TMargins margins; + UiLayout()->GetButtonExtResponseArea( margins ); + TPoint topLeftMargin( margins.iLeft, margins.iTop ); + TSize bottomRightMargin( margins.iRight, margins.iBottom ); + EnableExtResponseArea( ETrue, TRect( topLeftMargin,bottomRightMargin ) ); } } diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutcontrol.mmp --- a/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutcontrol.mmp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutcontrol.mmp Tue Sep 14 21:59:06 2010 +0300 @@ -58,6 +58,7 @@ SOURCE peninputfloatctrl.cpp SOURCE peninputfloatbubble.cpp SOURCE peninputaknvkbpreviewbubblerenderer.cpp +SOURCE peninputtapsettingmanager.cpp userinclude ../../inc/peninputlayoutcontrolinc diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutvkbkeyctrl.cpp --- a/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutvkbkeyctrl.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutvkbkeyctrl.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -106,9 +106,13 @@ BaseConstructL(); //tap accuracy enhancement - if( FeatureManager::FeatureSupported( KFeatureIdFfCapacitiveDisplay )) + if ( FeatureManager::FeatureSupported( KFeatureIdFfCapacitiveDisplay )) { - EnableExtResponseArea( ETrue, TRect(TPoint(10,10),TSize(10,10)) ); + TMargins margins; + UiLayout()->GetKeyExtResponseArea( margins ); + TPoint topLeftMargin( margins.iLeft, margins.iTop ); + TSize bottomRightMargin( margins.iRight, margins.iBottom ); + EnableExtResponseArea( ETrue, TRect( topLeftMargin,bottomRightMargin ) ); } } @@ -155,10 +159,29 @@ else if(iKeyboard->StarIcon() && iKeyInfo->KeyUnicodes(TVirtualKeyTextPos(i)) == KKeyStarCharacter ) { - //CFbsBitGc* gc = static_cast(BitGc()); + // Get the size of the icon + TSize starIconSize = iKeyboard->StarIcon()->Bitmap()->SizeInPixels(); + // Get the rect of draw icon area + TRect drawIconRect = textLayout.TextRect(); + // When the size of icon is different with the size of draw icon area, + // because the icon is drew from the left top coordinate of the draw + // icon area, so the icon will not be drew in the center. In this case, + // we need to adjust the top left coordinate of draw icon rect to + // make sure that the icon will be drew in the center of the key + if ( starIconSize != drawIconRect.Size()) + { + // Adjust the top left coordinate of draw icon rect to make sure + // that the icon will be drew in the center of the key + drawIconRect.iTl.iX += + ( drawIconRect.Width() - starIconSize.iWidth ) / 2; + drawIconRect.iTl.iY += + ( drawIconRect.Height() - starIconSize.iHeight ) / 2; + } + + // Draw the icon AknPenInputDrawUtils::DrawColorIcon( iKeyboard->StarIcon(), *aGc, - textLayout.TextRect() ); + drawIconRect ); } else { diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputlayoutcontrol/peninputtapsettingmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputtapsettingmanager.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -0,0 +1,385 @@ +/* +* Copyright (c) 2010 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: Implementation for CFepUiLayout +* +*/ + + +#include "peninputtapsettingmanager.h" + +#include +#include +#include + +_LIT( KSeparatorComma, "," ); + +const TInt KTextBufferLength = 128; + +const TInt KDefaultMovement = 5; +const TInt KDefaultTimeout = 200000; +const TInt KDefaultMargin = 9; + +// --------------------------------------------------------------------------- +// Symbian Constructor +// --------------------------------------------------------------------------- +// +CPeninputTapSettingManager* CPeninputTapSettingManager::NewL() + { + CPeninputTapSettingManager* self = CPeninputTapSettingManager::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Symbian Constructor +// --------------------------------------------------------------------------- +// +CPeninputTapSettingManager* CPeninputTapSettingManager::NewLC() + { + CPeninputTapSettingManager* self = new ( ELeave ) CPeninputTapSettingManager(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// c++ destructor +// --------------------------------------------------------------------------- +// +CPeninputTapSettingManager::~CPeninputTapSettingManager() + { + + } + +// --------------------------------------------------------------------------- +// Load all parameters of tap accuracy enhancement for specified layout +// --------------------------------------------------------------------------- +// +void CPeninputTapSettingManager::Load( TInt aLayoutType ) + { + TRAPD( err, LoadFromRepositoryL( aLayoutType ) ); + if ( err != KErrNone ) + { + LoadDefault(); + } + } + +// --------------------------------------------------------------------------- +// Load all parameters of tap accuracy enhancement for specified layout +// --------------------------------------------------------------------------- +// +void CPeninputTapSettingManager::Load( TInt aLayoutType, const TDesC& aFileName ) + { + TRAPD( err, LoadFromFileL( aLayoutType, aFileName ) ); + if ( err != KErrNone ) + { + LoadDefault(); + } + } + +// --------------------------------------------------------------------------- +// Get configuration of PointerMove event suppressor +// --------------------------------------------------------------------------- +// +void CPeninputTapSettingManager::GetPointerMoveSuppressor( TSize& aMaxMovement, + TInt& aTimeout ) + { + aMaxMovement = iPointerMoveMaxMovement; + aTimeout = iPointerMoveTimeout; + } + +// --------------------------------------------------------------------------- +// Get configuration of PointerUp event suppressor +// --------------------------------------------------------------------------- +// +void CPeninputTapSettingManager::GetPointerUpSuppressor( TSize& aMaxMovement, + TInt& aTimeout ) + { + aMaxMovement = iPointerUpMaxMovement; + aTimeout = iPointerUpTimeout; + } + +// --------------------------------------------------------------------------- +// Get extra response area of virtual key controls. +// --------------------------------------------------------------------------- +// +void CPeninputTapSettingManager::GetKeyExtResponseArea( TMargins& aMargins ) + { + aMargins = iKeyMargins; + } + +// --------------------------------------------------------------------------- +// Get extra response area of button controls. +// --------------------------------------------------------------------------- +// +void CPeninputTapSettingManager::GetButtonExtResponseArea( TMargins& aMargins ) + { + aMargins = iButtonMargins; + } + +// --------------------------------------------------------------------------- +// C++ constructor. +// --------------------------------------------------------------------------- +// +CPeninputTapSettingManager::CPeninputTapSettingManager() + { + + } + +// --------------------------------------------------------------------------- +// Symbian second-phase constructor. +// --------------------------------------------------------------------------- +// +void CPeninputTapSettingManager::ConstructL() + { + } + +// --------------------------------------------------------------------------- +// Load all parameters of tap accuracy enhancement for specified layout. +// From Repository. +// --------------------------------------------------------------------------- +// +void CPeninputTapSettingManager::LoadFromRepositoryL( TInt aLayoutType ) + { + TUint32 uidButtonExtMargins = 0; + TUint32 uidKeyCtrlExtMargins = 0; + TUint32 uidPointerMoveMaxMove = 0; + TUint32 uidPointerMoveTimeout = 0; + TUint32 uidPointerUpMaxMove = 0; + TUint32 uidPointerUpTimeout = 0; + + switch( aLayoutType ) + { + case EPluginInputModeFSQ: + { + uidButtonExtMargins = KAknFepTapAccuracyFsqButtonExtMargins; + uidKeyCtrlExtMargins = KAknFepTapAccuracyFsqKeyCtrlExtMargins; + uidPointerMoveMaxMove = KAknFepTapAccuracyFsqPointerMoveMaxMovement; + uidPointerMoveTimeout = KAknFepTapAccuracyFsqPointerMoveTimeout; + uidPointerUpMaxMove = KAknFepTapAccuracyFsqPointerUpMaxMovement; + uidPointerUpTimeout = KAknFepTapAccuracyFsqPointerUpTimeout; + } + break; + case EPluginInputModePortraitFSQ: + { + uidButtonExtMargins = KAknFepTapAccuracyPFsqButtonExtMargins; + uidKeyCtrlExtMargins = KAknFepTapAccuracyPFsqKeyCtrlExtMargins; + uidPointerMoveMaxMove = KAknFepTapAccuracyPFsqPointerMoveMaxMovement; + uidPointerMoveTimeout = KAknFepTapAccuracyPFsqPointerMoveTimeout; + uidPointerUpMaxMove = KAknFepTapAccuracyPFsqPointerUpMaxMovement; + uidPointerUpTimeout = KAknFepTapAccuracyPFsqPointerUpTimeout; + } + break; + case EPluginInputModeFingerHwr: + { + uidButtonExtMargins = KAknFepTapAccuracyFhwrButtonExtMargins; + uidKeyCtrlExtMargins = KAknFepTapAccuracyFhwrKeyCtrlExtMargins; + uidPointerMoveMaxMove = KAknFepTapAccuracyFhwrPointerMoveMaxMovement; + uidPointerMoveTimeout = KAknFepTapAccuracyFhwrPointerMoveTimeout; + uidPointerUpMaxMove = KAknFepTapAccuracyFhwrPointerUpMaxMovement; + uidPointerUpTimeout = KAknFepTapAccuracyFhwrPointerUpTimeout; + } + break; + default: + { + uidButtonExtMargins = KAknFepTapAccuracyDefaultButtonExtMargins; + uidKeyCtrlExtMargins = KAknFepTapAccuracyDefaultKeyCtrlExtMargins; + uidPointerMoveMaxMove = KAknFepTapAccuracyDefaultPointerMoveMaxMovement; + uidPointerMoveTimeout = KAknFepTapAccuracyDefaultPointerMoveTimeout; + uidPointerUpMaxMove = KAknFepTapAccuracyDefaultPointerUpMaxMovement; + uidPointerUpTimeout = KAknFepTapAccuracyDefaultPointerUpTimeout; + } + } + + CRepository* repository = CRepository::NewL( KCRUidAknFep ); + TBuf str; + TInt num = 0; + TPoint point; + TMargins margins; + + //pointer move event + repository->Get( uidPointerMoveTimeout, num ); + repository->Get( uidPointerMoveMaxMove, str ); + ParsePoints( point, str ); + + iPointerMoveTimeout = num; + iPointerMoveMaxMovement.iWidth = point.iX; + iPointerMoveMaxMovement.iHeight = point.iY; + + //pointer up event + repository->Get( uidPointerUpTimeout, num ); + repository->Get( uidPointerUpMaxMove, str ); + ParsePoints( point, str ); + + iPointerUpTimeout = num; + iPointerUpMaxMovement.iWidth = point.iX; + iPointerUpMaxMovement.iHeight = point.iY; + + //key control + repository->Get( uidKeyCtrlExtMargins, str ); + ParseMargins( margins, str ); + iKeyMargins = margins; + + //button control + repository->Get( uidButtonExtMargins, str ); + ParseMargins( margins, str ); + iButtonMargins = margins; + + delete repository; + } + +// --------------------------------------------------------------------------- +// Load all parameters of tap accuracy enhancement for specified layout. +// From file. +// --------------------------------------------------------------------------- +// +void CPeninputTapSettingManager::LoadFromFileL( TInt /*aLayoutType*/, + const TDesC& /*aFileName*/ ) + { + //reserved + } + +// --------------------------------------------------------------------------- +// Load default parameters. +// --------------------------------------------------------------------------- +// +void CPeninputTapSettingManager::LoadDefault() + { + iPointerMoveMaxMovement = TSize( KDefaultMovement, KDefaultMovement ); + iPointerMoveTimeout = KDefaultTimeout; + + iPointerUpMaxMovement = TSize( KDefaultMovement, KDefaultMovement ); + iPointerUpTimeout = KDefaultTimeout; + + iKeyMargins.iTop = KDefaultMargin; + iKeyMargins.iLeft = KDefaultMargin; + iKeyMargins.iBottom = KDefaultMargin; + iKeyMargins.iRight = KDefaultMargin; + + iButtonMargins.iTop = KDefaultMargin; + iButtonMargins.iLeft = KDefaultMargin; + iButtonMargins.iBottom = KDefaultMargin; + iButtonMargins.iRight = KDefaultMargin; + } + +// --------------------------------------------------------------------------- +// parse a TPoint from a comma separated values string. +// --------------------------------------------------------------------------- +// +TInt CPeninputTapSettingManager::ParsePoints( TPoint& aPoint, const TDesC& aText ) + { + TPtrC tokenizer( aText ); + TInt pos = tokenizer.Find( KSeparatorComma ); + if ( pos == KErrNotFound ) + { + TInt value = 0; + TLex converter( tokenizer ); + TInt error = converter.Val( value ); + aPoint.iX = ( KErrNone == error ? value : 0 ); + aPoint.iY = aPoint.iX; + return 0; + } + + TInt value = 0; + + TLex converter( tokenizer.Left( pos ) ); + TInt error = converter.Val( value ); + aPoint.iX = ( KErrNone == error ? value : 0 ); + + converter = TLex( tokenizer.Mid( pos + 1 ) ); + error = converter.Val( value ); + aPoint.iY = ( KErrNone == error ? value : 0 ); + + return 0; + } + +// --------------------------------------------------------------------------- +// parse a TMargins from a comma separated values string. +// --------------------------------------------------------------------------- +// +TInt CPeninputTapSettingManager::ParseMargins( TMargins& aMargins, const TDesC& aText ) + { + RArray values; + + TPtrC tokenizer( aText ); + TInt pos = 0; + while ( pos != KErrNotFound ) + { + pos = tokenizer.Find( KSeparatorComma ); + + TPtrC substr = ( pos == KErrNotFound ) ? tokenizer : tokenizer.Left( pos ); + TInt value = 0; + TLex converter( substr ); + TInt error = converter.Val( value ); + values.Append( KErrNone == error ? value : 0 ); + + if ( pos != KErrNotFound ) + { + TPtrC right = tokenizer.Mid( pos + 1 ); + tokenizer.Set( right ); + } + } + + TInt count = values.Count(); + + //one value, applies to all sides + if( count == 1 ) + { + aMargins.iTop = values[0]; + aMargins.iLeft = values[0]; + aMargins.iBottom = values[0]; + aMargins.iRight = values[0]; + } + + //two values, first one specifies margins of top and bottom, + //the second specifies left and right. + else if( count == 2 ) + { + aMargins.iTop = values[0]; + aMargins.iLeft = values[1]; + aMargins.iBottom = values[0]; + aMargins.iRight = values[1]; + } + + //three values, first is top, second is the left and right, last is bottom. + else if( count == 3 ) + { + aMargins.iTop = values[0]; + aMargins.iLeft = values[1]; + aMargins.iBottom = values[1]; + aMargins.iRight = values[2]; + } + + //four values, specify top,left,bottom and right respectively + else if ( count >= 4 ) + { + aMargins.iTop = values[0]; + aMargins.iLeft = values[1]; + aMargins.iBottom = values[2]; + aMargins.iRight = values[3]; + } + + else + { + aMargins.iTop = 0; + aMargins.iLeft = 0; + aMargins.iBottom = 0; + aMargins.iRight = 0; + } + + values.Close(); + return count; + } + +//end of file diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputlayoutcontrol/peninputuilayout.cpp --- a/textinput/peninputarc/src/peninputlayoutcontrol/peninputuilayout.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputuilayout.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -35,6 +35,11 @@ #include #include #endif //RD_TACTILE_FEEDBACK + +#include +#include +#include "peninputtapsettingmanager.h" + // ======== MEMBER FUNCTIONS ======== // --------------------------------------------------------------------------- @@ -85,6 +90,20 @@ iExtension->iSkinInstance = AknsUtils::SkinInstance(); iExtension->iTouchFeedbackInstance = MTouchFeedback::Instance(); iExtension->iDisableDrawing = EFalse; + + TInt inputMode = PenInputType(); + TBool isPortraitFSQEnabled = FeatureManager::FeatureSupported( + KFeatureIdFfVirtualFullscrPortraitQwertyInput ); + + //detect real type of two qwerty layout + if ( inputMode == EPluginInputModeFSQ && isPortraitFSQEnabled + && !Layout_Meta_Data::IsLandscapeOrientation() ) + { + inputMode = EPluginInputModePortraitFSQ; + } + + //load settings of tap accuracy enhancement + LoadTapAccuracySettingsL( inputMode ); } // --------------------------------------------------------------------------- @@ -474,7 +493,22 @@ iRootCtrl->OnActivate(); #ifdef RD_TACTILE_FEEDBACK iExtension->iTactileSupported = FeatureManager::FeatureSupported( KFeatureIdTactileFeedback ); -#endif // RD_TACTILE_FEEDBACK +#endif // RD_TACTILE_FEEDBACK + + //update pointer event suppressor + if ( FeatureManager::FeatureSupported( KFeatureIdFfCapacitiveDisplay ) ) + { + TPointerEventSuppressorParameters parameters; + parameters.iMoveEventMaxMovement = iExtension->iPointerMoveSuppressMaxMovement; + parameters.iMoveEventTimeout = iExtension->iPointerMoveSuppressTimeout; + parameters.iUpEventMaxMovement = iExtension->iPointerUpSuppressMaxMovement; + parameters.iUpEventTimeout = iExtension->iPointerUpSuppressTimeout; + + TPtrC data( reinterpret_cast(¶meters), + sizeof(TPointerEventSuppressorParameters) / 2 ); + + SignalOwner( ESignalUpdatePointerSuppressor, data ); + } } // --------------------------------------------------------------------------- @@ -923,4 +957,43 @@ SignalOwner(ESignalDisableUpdating,ptr); } +// --------------------------------------------------------------------------- +// Get extra response area of key controls. +// --------------------------------------------------------------------------- +// +void CFepUiLayout::GetKeyExtResponseArea( TMargins& aMargins ) + { + aMargins = iExtension->iKeyExtResponseMargins; + } + +// --------------------------------------------------------------------------- +// Get extra response area of button controls. +// --------------------------------------------------------------------------- +// +void CFepUiLayout::GetButtonExtResponseArea( TMargins& aMargins ) + { + aMargins = iExtension->iButtonExtResponseMargins; + } + +// --------------------------------------------------------------------------- +// Load tap accuracy enhancement settings according to the specified input mode. +// --------------------------------------------------------------------------- +// +void CFepUiLayout::LoadTapAccuracySettingsL( TInt alayoutType ) + { + CPeninputTapSettingManager* manager = CPeninputTapSettingManager::NewL(); + + manager->Load( alayoutType ); + manager->GetPointerMoveSuppressor( iExtension->iPointerMoveSuppressMaxMovement, + iExtension->iPointerMoveSuppressTimeout ); + + manager->GetPointerUpSuppressor( iExtension->iPointerUpSuppressMaxMovement, + iExtension->iPointerUpSuppressTimeout ); + + manager->GetKeyExtResponseArea( iExtension->iKeyExtResponseMargins ); + manager->GetButtonExtResponseArea( iExtension->iButtonExtResponseMargins ); + + delete manager; + } + //end of file diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputserverapp/peninputanimclientobj.cpp --- a/textinput/peninputarc/src/peninputserverapp/peninputanimclientobj.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputserverapp/peninputanimclientobj.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -503,4 +503,21 @@ AddAnimCommand(cmd); return ETrue; } + +// --------------------------------------------------------------------------- +// CPeninputAnimObj::UpdatePointerEventSuppressor() +// Update parameters of pointer event suppressor. +// --------------------------------------------------------------------------- +// +void CPeninputAnimObj::UpdatePointerEventSuppressor( + const TPointerEventSuppressorParameters& aParameters ) + { + TAnimUpdatePointerEventSuppressorCmd* cmd = + new TAnimUpdatePointerEventSuppressorCmd( iAnim, aParameters ); + + if ( cmd != NULL ) + { + AddAnimCommand( cmd ); + } + } //end of file diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputserverapp/peninputanimcommand.cpp --- a/textinput/peninputarc/src/peninputserverapp/peninputanimcommand.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputserverapp/peninputanimcommand.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -362,3 +362,17 @@ iAnim.SetDiscreeptPop(iArea); return ETrue; } + +TAnimUpdatePointerEventSuppressorCmd::TAnimUpdatePointerEventSuppressorCmd( + RPeninputAnim& aAnim, const TPointerEventSuppressorParameters& aParameters ) + : TAnimCmd( aAnim ), iParameters( aParameters ) + { + + } + +TBool TAnimUpdatePointerEventSuppressorCmd::ExecuteAnimCommand() const + { + iAnim.UpdatePointerEventSuppressor( iParameters ); + return ETrue; + } + diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputserverapp/peninputserver.cpp --- a/textinput/peninputarc/src/peninputserverapp/peninputserver.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputserverapp/peninputserver.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -863,7 +863,17 @@ //message requests UI attribute is always handled. switch(aMessage.Function()) { - + case EPeninputRequestEnableGfxTransEffect: + { + if( iUseWindowCtrl && iPenUiCtrl ) + { + TBool enable = EFalse; + TPckg msg( enable ); + aMessage.ReadL( 0,msg ); + iPenUiCtrl->EnableGfxTransEffect( enable ); + } + } + break; case EPeninputRequestUiIsVisible: { TPckg msg(iActive); @@ -2015,7 +2025,11 @@ iIsLayoutReDrawAllowWhenActive = *retVal; } break; - + case ESignalUpdatePointerSuppressor: + { + UpdatePointerEventSuppressor( aEventData ); + } + break; default: if(iUseWindowCtrl) { @@ -3031,6 +3045,21 @@ iDiscreetPopArea = iAknUiSrv.GetInUseGlobalDiscreetPopupRect(); iAnimObj->SetDiscreetPopArea(iDiscreetPopArea); } + +// --------------------------------------------------------------------------- +// CPeninputServer::UpdatePointerEventSuppressor() +// Update parameters of pointer event suppressor. +// --------------------------------------------------------------------------- +// +void CPeninputServer::UpdatePointerEventSuppressor( const TDesC& aData ) + { + TUint16* buf = const_cast( aData.Ptr() ); + TPointerEventSuppressorParameters* parameters = + reinterpret_cast ( buf ); + + iAnimObj->UpdatePointerEventSuppressor( *parameters ); + } + // ======== class CEventQueue======== // // --------------------------------------------------------------------------- diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputserverapp/peninputserversession.cpp --- a/textinput/peninputarc/src/peninputserverapp/peninputserversession.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputserverapp/peninputserversession.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -320,6 +320,7 @@ case EPeninputRequestSupportInputMode: case EPeninputRequestSetInputLanguage: case EPeninputEnablePriorityChangeOnOriChange: + case EPeninputRequestEnableGfxTransEffect: ret = iPenInputSvr.HandleMessageL(aMessage); break; case EPeninputRequestUpdateAppInfo: diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputserverapp/penuiwndctrl.cpp --- a/textinput/peninputarc/src/peninputserverapp/penuiwndctrl.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputserverapp/penuiwndctrl.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -419,8 +419,9 @@ #ifdef RD_UI_TRANSITION_EFFECTS_POPUPS - if ( GfxTransEffect::IsRegistered( this ) && !IsVisible()) + if ( iEnableGfxTransEffect && GfxTransEffect::IsRegistered( this ) && !IsVisible()) { + iEnableGfxTransEffect = EFalse; this->MakeVisible(EFalse); GfxTransEffect::NotifyExternalState( ENotifyGlobalAbort ); @@ -463,9 +464,9 @@ return; } #ifdef RD_UI_TRANSITION_EFFECTS_POPUPS - if ( GfxTransEffect::IsRegistered( this )) + if ( iEnableGfxTransEffect && GfxTransEffect::IsRegistered( this ) ) { - + iEnableGfxTransEffect = EFalse; GfxTransEffect::NotifyExternalState( ENotifyGlobalAbort ); //If still visible, do a transition to invisible state. diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputarc/src/peninputserverapp/rpeninputanim.cpp --- a/textinput/peninputarc/src/peninputserverapp/rpeninputanim.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputarc/src/peninputserverapp/rpeninputanim.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -336,4 +336,19 @@ args.Set(KMsgSlot1,&msgData); CommandReply(EPeninputOpSetDiscreeptPop,KNullDesC8,args); } + +// --------------------------------------------------------------------------- +// RPeniputAnim::UpdatePointerEventSuppressor() +// Update parameters of pointer event suppressor. +// --------------------------------------------------------------------------- +// +void RPeninputAnim::UpdatePointerEventSuppressor( + const TPointerEventSuppressorParameters& aParameters ) + { + TIpcArgs args( TIpcArgs::ENothing ); + TPckg msgData( aParameters ); + args.Set(KMsgSlot1, &msgData ); + CommandReply( EPeninputOpUpdatePointerSuppressor, KNullDesC8, args ); + } + // End of File diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputfingerhwr/src/peninputfingerhwrwnd.cpp --- a/textinput/peninputfingerhwr/src/peninputfingerhwrwnd.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputfingerhwr/src/peninputfingerhwrwnd.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -1223,7 +1223,13 @@ // hide the predictive list iPredictList->Hide( ETrue ); iPredictList->SetDropdownListImgID( predicDrawInfo ); - + + iPredictList->SizeChanged( iLafManager->CandidateUnitWidth(), + iLafManager->CandidateUnitHeight(), + iLafManager->CandidateUnitWidth(), + iLafManager->PredictiveLTPos(), + KPredictiveCountPerRow, + KPredictiveRowCount ); #ifndef RD_INTELLIGENT_TEXT_INPUT TDropdownListDrawInfo candiDrawInfo( diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputgenericitut/src/peninputgenericitutdatamgr.cpp --- a/textinput/peninputgenericitut/src/peninputgenericitutdatamgr.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputgenericitut/src/peninputgenericitutdatamgr.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -494,7 +494,7 @@ TRect cellSpellRect; cellSpellRect.iTl.iX = middleButtonPaneRect.iTl.iX; cellSpellRect.iTl.iY = middleButtonPaneRect.iTl.iY + - itucellrect.Rect().Height() * 5 + 7; + itucellrect.Rect().Height() * 5; cellSpellRect.SetHeight( itucellrect.Rect().Height()); cellSpellRect.SetWidth( itucellrect.Rect().Width()); @@ -907,8 +907,18 @@ iCandsUnitHeight = charpanerect1.Rect().Height() ; iCandsSpinBtnHeight = listctrlrect.Rect().Height(); + + TInt gapValue = ( iScreenSize.iWidth - ( + iCandsUnitWidth + iCandsHorizontalMargin + KCandsAdjustment ) * 6 ) / 2; + if ( gapValue < 0 ) + { + gapValue = 0; + } + iCandsSpellLTPos = charpanerect1.Rect().iTl; + iCandsSpellLTPos.iX = gapValue; iCandsLTPos = charpanerect3.Rect().iTl; + iCandsLTPos.iX = gapValue; iCandsPuncLTPos = iCandsSpellLTPos; TAknTextLineLayout candstxtlayout = diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputgenericvkb/src/peninputgenericlafdatamgr.cpp --- a/textinput/peninputgenericvkb/src/peninputgenericlafdatamgr.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputgenericvkb/src/peninputgenericlafdatamgr.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -1038,12 +1038,17 @@ aDataInfo.iQwtRect = aParentWndRect; TInt v1, v2, gridLayoutVariant; + + // Get the variant for Portrait QWERTY + TInt cellVariantForPortraitQWERTY; + switch ( aLayoutType ) { case ELayout10x3: { v1 = 0; v2 = 0; + cellVariantForPortraitQWERTY = 0; gridLayoutVariant = 1; break; } @@ -1051,6 +1056,7 @@ { v1 = 1; v2 = 2; + cellVariantForPortraitQWERTY = 2; gridLayoutVariant = 1; break; } @@ -1058,6 +1064,7 @@ { v1 = 1; v2 = 3; + cellVariantForPortraitQWERTY = 3; gridLayoutVariant = 2; break; } @@ -1065,7 +1072,9 @@ { v1 = 0; v2 = 0; + cellVariantForPortraitQWERTY = 0; gridLayoutVariant = 1; + break; } } @@ -1164,6 +1173,32 @@ linelayout = AknLayoutScalable_Avkon::grid_vkbss_keypad_pane(v1).LayoutLine(); keypadRect.LayoutRect( rectBottomWin, linelayout ); + TInt rowNumberOfKeyboard; + TInt gapValue; + switch ( aLayoutType ) + { + case ELayout10x3: + { + rowNumberOfKeyboard = 3; + break; + } + case ELayout11x3: + { + rowNumberOfKeyboard = 3; + break; + } + case ELayout11x4: + { + rowNumberOfKeyboard = 4; + break; + } + default: + { + rowNumberOfKeyboard = 3; + break; + } + } + if ( !isPortraitFSQEnabled || ( isPortraitFSQEnabled && Layout_Meta_Data::IsLandscapeOrientation() ) ) { @@ -1192,7 +1227,10 @@ pic3pRightWidth = layoutrect.Rect().Width(); TRect rectXPane = keypaneRect.Rect(); - rect = keycellRect.Rect(); + + // the key rect without gap + rect = keypaneRect.Rect(); + rect.Move( - rectXPane.iTl.iX, - rectXPane.iTl.iY ); TRect rectXBorder = rect; rect = keylabelRect.Rect(); @@ -1205,11 +1243,14 @@ rect = keypadRect.Rect(); rect.Move( - base.iX, - base.iY ); - TRect rectOfKeypad = rect; - TRect rectOfButtons = rectOfKeypad; - rectOfKeypad.iBr.iY -= keypaneRect.Rect().Height(); - rectOfButtons.iTl.iY += rectOfKeypad.Height(); - + + TRect rectOfButtons = rect; + // The gap between the top of the first row key and the top of the keyboard + gapValue = keypaneRect.Rect().iTl.iY - keypadRect.Rect().iTl.iY; + // compute the top left Y coordinate of the function buttons + rectOfButtons.iTl.iY = rectOfButtons.iTl.iY + + keypaneRect.Rect().Height() * rowNumberOfKeyboard + gapValue; + TInt spaceBtnWidth = rectOfButtons.Width() - rectXPane.Width() * 8; TInt dx = rectOfButtons.iTl.iX; TInt dy = rectOfButtons.iTl.iY; @@ -1270,8 +1311,8 @@ linelayout = AknLayoutScalable_Avkon::cell_vkbss_key_pane(15).LayoutLine(); bottomRowRect.LayoutRect( keypadRect.Rect(), linelayout ); - // key cell rect - linelayout = AknLayoutScalable_Avkon::bg_cell_vkbss_key_g1(8).LayoutLine(); + // key cell rect with out gap + linelayout = AknLayoutScalable_Avkon::cell_vkbss_key_pane(15).LayoutLine(); keycellRect.LayoutRect( bottomRowRect.Rect(), linelayout ); // key label rect @@ -1289,10 +1330,23 @@ rect = keypadRect.Rect(); rect.Move( - base.iX, - base.iY ); - TRect rectOfKeypad = rect; - TRect rectOfButtons = rectOfKeypad; - rectOfKeypad.iBr.iY -= ( bottomRowRect.Rect().Height() ); - rectOfButtons.iTl.iY += rectOfKeypad.Height(); + + // Get the height of one key + linelayout = AknLayoutScalable_Avkon::cell_vkbss_key_pane( + cellVariantForPortraitQWERTY ).LayoutLine(); + keycellRect.LayoutRect( keypadRect.Rect(), linelayout ); + TInt theHeightOfTheKey = keycellRect.Rect().Height(); + // Compute the gap between the top of the first row key and + // the top of the keyboard + gapValue = keycellRect.Rect().iTl.iY - keypadRect.Rect().iTl.iY; + // Get the second row function button's height + linelayout = AknLayoutScalable_Avkon::cell_vkbss_key_pane(4).LayoutLine(); + keycellRect.LayoutRect( keypadRect.Rect(), linelayout ); + + TRect rectOfButtons = rect; + // compute the top left Y coordinate of the first row function buttons + rectOfButtons.iTl.iY += keycellRect.Rect().Height() + + theHeightOfTheKey * rowNumberOfKeyboard + gapValue + 1; TInt dx = rectOfButtons.iTl.iX; TInt dy = rectOfButtons.iTl.iY; @@ -1332,8 +1386,8 @@ linelayout = AknLayoutScalable_Avkon::cell_vkbss_key_pane(4).LayoutLine(); shiftRect.LayoutRect( keypadRect.Rect(), linelayout ); - // key cell rect - linelayout = AknLayoutScalable_Avkon::bg_cell_vkbss_key_g1(4).LayoutLine(); + // key cell rect without gap + linelayout = AknLayoutScalable_Avkon::cell_vkbss_key_pane(4).LayoutLine(); keycellRect.LayoutRect( shiftRect.Rect(), linelayout ); // key label rect @@ -1351,6 +1405,8 @@ // Update the height to account for the second row rectOfButtons.iTl.iY -= shiftRect.Rect().Height(); + // adjust the Y coordinate + rectOfButtons.iTl.iY -= 1; dx = rectOfButtons.iTl.iX; dy = rectOfButtons.iTl.iY; @@ -1363,8 +1419,8 @@ linelayout = AknLayoutScalable_Avkon::cell_vkbss_key_pane(8).LayoutLine(); spaceRect.LayoutRect( keypadRect.Rect(), linelayout ); - // key cell rect - linelayout = AknLayoutScalable_Avkon::bg_cell_vkbss_key_g1(5).LayoutLine(); + // key cell rect without gap + linelayout = AknLayoutScalable_Avkon::cell_vkbss_key_pane(8).LayoutLine(); keycellRect.LayoutRect( spaceRect.Rect(), linelayout ); // key label rect @@ -1660,6 +1716,8 @@ TAknLayoutText keyTextLayout; TAknTextLineLayout keyText; TRect keyRect; + // The gap value of keyboard + TInt gapValue; TBool isLandscape = Layout_Meta_Data::IsLandscapeOrientation(); @@ -1733,7 +1791,12 @@ } rectVkbCtrl = keypadRect.Rect(); - rectVkbCtrl.iBr.iY -= functionKeyRowsHeight; + // Compute the gap between first row key's top line and keyboard's top line + gapValue = keypaneRect.Rect().iTl.iY - rectVkbCtrl.iTl.iY; + // Compute keyboard position + rectVkbCtrl.iBr.iY = rectVkbCtrl.iTl.iY + keypaneRect.Rect().Height() * 3 + gapValue; + rectVkbCtrl.iTl.iY += gapValue; + dataInfo->iKeypad.iKaypadRect = rectVkbCtrl; linelayout = AknLayoutScalable_Avkon::bg_cell_vkbss_key_g1(0).LayoutLine(); @@ -1742,10 +1805,6 @@ linelayout = AknLayoutScalable_Avkon::cell_vkbss_key_g1(0).LayoutLine(); keylabelRect.LayoutRect( keypaneRect.Rect(), linelayout ); - linelayout = AknLayoutScalable_Avkon::aid_vkbss_key_offset(0).LayoutLine(); - layoutrect.LayoutRect( keypadRect.Rect(), linelayout ); - TInt rowIndentWidth = layoutrect.Rect().Width(); - TRect rectOfKeypad = RelativeRect( keypadRect.Rect(), base ); rectOfKeypad.iBr.iY -= keypaneRect.Rect().Height(); @@ -1759,18 +1818,15 @@ for( TInt i = 0; i < KKeypadLayout[0][1]; i++) { - TInt indent = ( i % 2 == 1 ) ? rowIndentWidth : 0; for( TInt j = 0; j < KKeypadLayout[0][0]; j++) { TRect bound = rectXPane; bound.Move( j * rectXPane.Width(), i * rectXPane.Height() ); - bound.Move( indent, 0 ); dataInfo->iKeypad.iRects.AppendL( bound ); TRect inner = rectXPane; inner.Move( j * rectXPane.Width(), i * rectXPane.Height() ); - inner.Move( indent, 0 ); TAknLayoutText keyTextLayout; keyTextLayout.LayoutText( inner, keyText ); @@ -1888,7 +1944,13 @@ } rectVkbCtrl = keypadRect.Rect(); - rectVkbCtrl.iBr.iY -= functionKeyRowsHeight; + + // Compute the gap between first row key's top line and keyboard's top line + gapValue = keypaneRect.Rect().iTl.iY - rectVkbCtrl.iTl.iY; + // Compute keyboard position + rectVkbCtrl.iBr.iY = rectVkbCtrl.iTl.iY + keypaneRect.Rect().Height() * 3 + gapValue; + rectVkbCtrl.iTl.iY += gapValue; + dataInfo->iKeypad.iKaypadRect = rectVkbCtrl; linelayout = AknLayoutScalable_Avkon::bg_cell_vkbss_key_g1(2).LayoutLine(); @@ -1897,10 +1959,6 @@ linelayout = AknLayoutScalable_Avkon::cell_vkbss_key_g1(2).LayoutLine(); keylabelRect.LayoutRect( keypaneRect.Rect(), linelayout ); - linelayout = AknLayoutScalable_Avkon::aid_vkbss_key_offset(1).LayoutLine(); - layoutrect.LayoutRect( keypadRect.Rect(), linelayout ); - rowIndentWidth = layoutrect.Rect().Width(); - rectOfKeypad = RelativeRect( keypadRect.Rect(), base ); rectOfKeypad.iBr.iY -= keypaneRect.Rect().Height(); @@ -1914,18 +1972,15 @@ for( TInt i = 0; i < KKeypadLayout[1][1]; i++) { - TInt indent = ( i % 2 == 1 ) ? rowIndentWidth : 0; for( TInt j = 0; j < KKeypadLayout[1][0]; j++) { TRect bound = rectXPane; bound.Move( j * rectXPane.Width(), i * rectXPane.Height() ); - bound.Move( indent, 0 ); dataInfo->iKeypad.iRects.AppendL( bound ); TRect inner = rectXPane; inner.Move( j * rectXPane.Width(), i * rectXPane.Height() ); - inner.Move( indent, 0 ); TAknLayoutText keyTextLayout; keyTextLayout.LayoutText( inner, keyText ); @@ -2031,8 +2086,14 @@ keypaneRect.LayoutRect( keypadRect.Rect(), linelayout ); } - rectVkbCtrl = keypadRect.Rect(); - rectVkbCtrl.iBr.iY -= functionKeyRowsHeight; + rectVkbCtrl = keypadRect.Rect(); + + // Compute the gap between first row key's top line and keyboard's top line + gapValue = keypaneRect.Rect().iTl.iY - rectVkbCtrl.iTl.iY; + // Compute keyboard position + rectVkbCtrl.iBr.iY = rectVkbCtrl.iTl.iY + keypaneRect.Rect().Height() * 4 + gapValue; + rectVkbCtrl.iTl.iY += gapValue; + dataInfo->iKeypad.iKaypadRect = rectVkbCtrl; linelayout = AknLayoutScalable_Avkon::bg_cell_vkbss_key_g1(3).LayoutLine(); @@ -2041,10 +2102,6 @@ linelayout = AknLayoutScalable_Avkon::cell_vkbss_key_g1(3).LayoutLine(); keylabelRect.LayoutRect( keypaneRect.Rect(), linelayout ); - linelayout = AknLayoutScalable_Avkon::aid_vkbss_key_offset(1).LayoutLine(); - layoutrect.LayoutRect( keypadRect.Rect(), linelayout ); - rowIndentWidth = layoutrect.Rect().Width(); - rectOfKeypad = RelativeRect( keypadRect.Rect(), base ); rectOfKeypad.iBr.iY -= keypaneRect.Rect().Height(); @@ -2058,18 +2115,15 @@ for( TInt i = 0; i < KKeypadLayout[2][1]; i++) { - TInt indent = ( i % 2 == 1 ) ? rowIndentWidth : 0; for( TInt j = 0; j < KKeypadLayout[2][0]; j++) { TRect bound = rectXPane; bound.Move( j * rectXPane.Width(), i * rectXPane.Height() ); - bound.Move( indent, 0 ); dataInfo->iKeypad.iRects.AppendL( bound ); TRect inner = rectXPane; inner.Move( j * rectXPane.Width(), i * rectXPane.Height() ); - inner.Move( indent, 0 ); TAknLayoutText keyTextLayout; keyTextLayout.LayoutText( inner, keyText ); diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputsplititut/src/peninputsplititutdatamgr.cpp --- a/textinput/peninputsplititut/src/peninputsplititutdatamgr.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputsplititut/src/peninputsplititutdatamgr.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -359,7 +359,7 @@ TRect cellSpellRect; cellSpellRect.iTl.iX = middleButtonPaneRect.iTl.iX; cellSpellRect.iTl.iY = middleButtonPaneRect.iTl.iY + - itucellrect.Rect().Height() * 5 + 7; + itucellrect.Rect().Height() * 5; cellSpellRect.SetHeight( itucellrect.Rect().Height()); cellSpellRect.SetWidth( itucellrect.Rect().Width()); diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputsplitqwerty/src/peninputsplitqwertylafdatamgr.cpp --- a/textinput/peninputsplitqwerty/src/peninputsplitqwertylafdatamgr.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputsplitqwerty/src/peninputsplitqwertylafdatamgr.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -345,10 +345,6 @@ layoutrect.LayoutRect( pic3paneRect.Rect(), linelayout ); pic3pRightWidth = layoutrect.Rect().Width(); - linelayout = AknLayoutScalable_Avkon::aid_vkbss_key_offset(v1).LayoutLine(); - layoutrect.LayoutRect( keypadRect.Rect(), linelayout ); - TInt rowIndentWidth = layoutrect.Rect().Width(); - base = rectMainWin.iTl; data->iClientRect = RelativeRect( rectMainWin, base ); @@ -356,8 +352,43 @@ TRect rectOfKeypad = RelativeRect( keypadRect.Rect(), base ); TRect rectOfButtons = rectOfKeypad; - rectOfKeypad.iBr.iY -= keypaneRect.Rect().Height(); - rectOfButtons.iTl.iY += rectOfKeypad.Height(); + + TInt rowNumberOfKeyboard; + TInt gapValue; + switch ( aLayoutType ) + { + case ELayout10x3: + { + rowNumberOfKeyboard = 3; + break; + } + case ELayout11x3: + { + rowNumberOfKeyboard = 3; + break; + } + case ELayout11x4: + { + rowNumberOfKeyboard = 4; + break; + } + default: + { + rowNumberOfKeyboard = 3; + break; + } + } + + // Compute the gap between first row key's top line and keyboard's top line + gapValue = keypaneRect.Rect().iTl.iY - keypadRect.Rect().iTl.iY; + // Compute function button's top left Y coordinate + rectOfButtons.iTl.iY = rectOfButtons.iTl.iY + + keypaneRect.Rect().Height() * rowNumberOfKeyboard + gapValue; + + // Compute keyboard position + rectOfKeypad.iBr.iY = rectOfKeypad.iTl.iY + + keypaneRect.Rect().Height() * rowNumberOfKeyboard + gapValue; + rectOfKeypad.iTl.iY += gapValue; //keypad data->iKeypad.iKaypadRect = rectOfKeypad; @@ -375,18 +406,15 @@ for ( TInt i = 0; i < aRows; i++ ) { - TInt indent = ( i % 2 == 1 ) ? rowIndentWidth : 0; for ( TInt j = 0; j < aCols; j++ ) { TRect bound = rectXPane; bound.Move( j * rectXPane.Width(), i * rectXPane.Height() ); - bound.Move( indent, 0 ); data->iKeypad.iRects.AppendL( bound ); TRect inner = rectXPane; inner.Move( j * rectXPane.Width(), i * rectXPane.Height() ); - inner.Move( indent, 0 ); TAknLayoutText keyTextLayout; keyTextLayout.LayoutText( inner, keyText ); @@ -398,7 +426,10 @@ //all template rects are relative to TL of buttons row rectXPane = keypaneRect.Rect(); - rectXBorder = RelativeRect( keycellRect.Rect(), rectXPane.iTl ); + + // The key rect without gap + rectXBorder = RelativeRect( keypaneRect.Rect(), rectXPane.iTl ); + rectXInner = RelativeRect( keylabelRect.Rect(), rectXPane.iTl ); TRect rect3PicPane = RelativeRect( pic3paneRect.Rect(), rectXPane.iTl ); rectXPane.Move( - rectXPane.iTl ); diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputvkbcn/ctrlsrc/peninputvkbclientarea.cpp --- a/textinput/peninputvkbcn/ctrlsrc/peninputvkbclientarea.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputvkbcn/ctrlsrc/peninputvkbclientarea.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -952,6 +952,10 @@ TRect compositionRect; TRect innerRect; + // Get composition area rect from laf + TRect compositionAreaFromLaf = iLafMgr->compositionLayoutData(); + TInt GapValue = compositionAreaFromLaf.iTl.iX; + if (range == ERangeNative) { if ( layoutType == EAknFepVkbImCnZhuyin ) @@ -1004,13 +1008,17 @@ } compositionRect.iTl = TPoint(optionRect.iBr.iX, optionRect.iTl.iY); - compositionRect.SetSize(TSize(btnWidth * 3 + iCellAidGap, candidateHeight)); + compositionRect.SetSize(TSize(btnWidth * 3 + iCellAidGap - GapValue, + candidateHeight)); } - else - { - compositionRect.iTl = Rect().iTl; - compositionRect.SetSize(TSize(btnWidth * 3 + iCellAidGap, candidateHeight)); - } + else + { + compositionRect.iTl = Rect().iTl; + // move the composition area rect with gap + compositionRect.iTl.iX += GapValue; + compositionRect.SetSize( + TSize( btnWidth * 3 + iCellAidGap - GapValue * 2, candidateHeight )); + } iCompositionField->SetReady(ETrue); iCompositionField->Hide(EFalse); iCompositionField->SizeChanged(compositionRect); @@ -1049,6 +1057,8 @@ } else { + // move the gap + compositionRect.iTl.iX -= GapValue; iVkbBoardLeftTop = TPoint(compositionRect.iTl.iX, compositionRect.iBr.iY); } } @@ -1070,19 +1080,22 @@ vkbCtrl->SetTextFormat( iLafMgr->KeyTextLayout() ); //Read laf TInt tempHeightForFSQ = btnHeight; - if (UiLayout()->PenInputType() == EPluginInputModeFSQ ) - { - tempHeightForFSQ = btnHeight + 3; - } + // Modify begin + //if (UiLayout()->PenInputType() == EPluginInputModeFSQ ) + // { + // tempHeightForFSQ = btnHeight + 3; + // } TPoint rangeBarRefPoint = TPoint(vkbRect.iTl.iX, vkbRect.iBr.iY); - rangeBarRefPoint.iY += yAxisOffset; + // Modify begin + //rangeBarRefPoint.iY += yAxisOffset; if (range != ERangeNative) { TRect shiftRect; shiftRect.iTl = TPoint(Rect().iTl.iX, vkbRect.iBr.iY); - shiftRect.iTl.iY += yAxisOffset; + // Modify begin + //shiftRect.iTl.iY += yAxisOffset; shiftRect.SetSize(TSize(btnWidth, tempHeightForFSQ)); AknPenImageUtils::CalculateGraphicRect( shiftRect, innerRect ); ControlById( EAknFepVkbCtrlIdShiftBtn)->SetReady(ETrue); diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputvkbcn/inc/peninputvkbcnlafdatamgr.h --- a/textinput/peninputvkbcn/inc/peninputvkbcnlafdatamgr.h Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputvkbcn/inc/peninputvkbcnlafdatamgr.h Tue Sep 14 21:59:06 2010 +0300 @@ -171,6 +171,11 @@ * LAF data for tooltip box */ TPeninputCnTooltipBoxLayoutData iTooltipBox; + + /* + * LAF data for composition area + */ + TRect iCompositionRect; }; class MPeninputCnLafDataBase @@ -198,6 +203,14 @@ const CPeninputCnQwtLayoutDataInfo& QwtLayoutData() const; /* + * Get layout rect for composition area + * + * @param none + * @return rect of composition area + */ + const TRect& compositionLayoutData() const; + + /* * Return layout data for candidate list; * * @return The layout data for candidate list @@ -432,6 +445,15 @@ * @return The layout data for tooltip box */ const TPeninputCnTooltipBoxLayoutData& TooltipBoxLayoutData() const; + + /* + * Get layout rect for composition area + * + * @param none + * @return rect of composition area + */ + const TRect& compositionLayoutData() const; + protected: /** diff -r ecbabf52600f -r bd83ceabce89 textinput/peninputvkbcn/src/peninputvkbcnlafdatamgr.cpp --- a/textinput/peninputvkbcn/src/peninputvkbcnlafdatamgr.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/peninputvkbcn/src/peninputvkbcnlafdatamgr.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -235,6 +235,17 @@ } // --------------------------------------------------------------------------- +// CPeninputCnGenericVkbLafMgr::compositionLayoutData +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +const TRect& CPeninputCnGenericVkbLafMgr::compositionLayoutData() const + { + ASSERT(iLafData); + return iLafData->compositionLayoutData(); + } + +// --------------------------------------------------------------------------- // CPeninputCnGenericVkbLafMgr::ICFRect // (other items were commented in a header) // --------------------------------------------------------------------------- @@ -676,7 +687,18 @@ ASSERT( IsValid() ); return iLayoutDataInfo[iLayoutType]->iKeypad; } - + +// --------------------------------------------------------------------------- +// MPeninputCnLafDataCommon::compositionLayoutData() +// (other items were commented in a header) +// --------------------------------------------------------------------------- +// +const TRect& MPeninputCnLafDataCommon::compositionLayoutData() const + { + ASSERT( IsValid()); + return iLayoutDataInfo[iLayoutType]->iCompositionRect; + } + // --------------------------------------------------------------------------- // CPeninputLafDataCommon::RangbarLayoutData(TInt aRangbarID) // (other items were commented in a header) @@ -855,6 +877,13 @@ aDataInfo.iRightButton.iInnerRect = cellBtnRect.Rect(); } + // Read composition area laf data + TAknWindowLineLayout compositionWindowLineLayout = + AknLayoutScalable_Avkon::vkb2_top_candi_pane(0).LayoutLine(); + TAknLayoutRect compositionLayoutRect; + compositionLayoutRect.LayoutRect( toppaneRect.Rect(), compositionWindowLineLayout ); + aDataInfo.iCompositionRect = compositionLayoutRect.Rect(); + // bottom pane const TInt VKBParamBottom2Range[] = { 6, 8, 8 }; const TInt FSQParamBottom2Range[] = { 0, 2, 4 }; diff -r ecbabf52600f -r bd83ceabce89 textinput/ptienginev2/inc/PtiEngineImpl.h --- a/textinput/ptienginev2/inc/PtiEngineImpl.h Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/ptienginev2/inc/PtiEngineImpl.h Tue Sep 14 21:59:06 2010 +0300 @@ -233,6 +233,9 @@ void SearchKeySequenceInSecLang(TPtrC aIn, TDes8& aOut); #endif // FF_DUAL_LANGUAGE_SUPPORT TBool IsCurrentCoreSupportCaseInfo(); + void IsGroupUnicodeExist(TPtiKey aKey, TDes& aResult, TInt aPosition); + TBool MapAgainst(TInt aKey, TInt aMode, TInt16 aAgainst, TInt aCase); + TInt ScanCodeForCharacter( TUint aChar, TPtiTextCase& aCase ); private: /* * Pointer to PtiEngine front end. diff -r ecbabf52600f -r bd83ceabce89 textinput/ptienginev2/src/PtiEngineImpl.cpp --- a/textinput/ptienginev2/src/PtiEngineImpl.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/ptienginev2/src/PtiEngineImpl.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -131,6 +131,12 @@ const TInt16 KStrokeQuestionValue = 0x003f; const TInt16 KStrokeUnicode = 0x2461; const TInt16 KZhuyinIndicator = 0x2462; +const TText KZhuyinTone2 = 0x02CA; // qwerty key6 +const TText KZhuyinTone3 = 0x02C7; // qwerty key3 +const TText KZhuyinTone4 = 0x02CB; // qwerty key4 +const TText KZhuyinTone5 = 0x02D9; // qwerty key7 +static const TUint KShortCombine = 0xF010; +const TInt KMaxMapping = 10; // Local method declarations. LOCAL_C TInt RemapVietnameseAccentedCharacter(TUint16 aChr); @@ -763,6 +769,29 @@ return KErrNoSuitableCore; } +// --------------------------------------------------------------------------- +// Group Unicode is that kind of mapping which one visible character with more +// than one unicode submitted. +// +// --------------------------------------------------------------------------- +// +void CPtiEngineImpl::IsGroupUnicodeExist(TPtiKey aKey, TDes& aResult, TInt aPosition) + { + TBuf<5> keyMappings; + MappingDataForKey( (TPtiKey)aKey, keyMappings, Case()); + if(keyMappings.Length() > 0 && keyMappings.Locate(KShortCombine) == aPosition ) + { + for(TInt i = 0; i < keyMappings.Length(); i++) + { + aResult.Append(keyMappings[i]); + } + } + else + { + aResult.Append(aKey); + } + } + // --------------------------------------------------------------------------- // CPtiEngineImpl::AppendKeyPress @@ -849,7 +878,24 @@ } // Forward to core object - Core()->AppendKeyPress(aKey); + TBuf mappings; + IsGroupUnicodeExist(aKey, mappings, 0); + if(mappings.Length() == 1) + { + Core()->AppendKeyPress(aKey); + } + else + { + for(TInt i = 0; i < mappings.Length(); i++) + { + TPtiTextCase retCase, oriCase; + retCase = oriCase = Case(); + TPtiKey key = (TPtiKey)ScanCodeForCharacter(mappings[i], retCase); + SetCase(retCase); + Core()->AppendKeyPress(key); + SetCase(oriCase); + } + } if(KeyboardType() == EPtiKeyboardHalfQwerty && aKey == EStdKeyFullStop) { @@ -987,6 +1033,60 @@ return iTextBuffer; } +TBool CPtiEngineImpl::MapAgainst(TInt aKey, TInt aMode, TInt16 aAgainst, TInt aCase) + { + SetInputMode((TPtiEngineInputMode)aMode); + TBuf data; + MappingDataForKey((TPtiKey)aKey, data, (TPtiTextCase)aCase); + if(data.Length() > 0) + { + return (data[0] == aAgainst); + } + return EFalse; + } +TInt CPtiEngineImpl::ScanCodeForCharacter( TUint aChar, TPtiTextCase& aCase ) + { +#ifdef RD_INTELLIGENT_TEXT_INPUT + CPtiCoreLanguage *lang = static_cast( CurrentLanguage() ); + MPtiKeyMappings* keymapping = lang->GetQwertyKeymappings(); + if ( keymapping ) + { + TPtiEngineInputMode oldInputMode = InputMode(); + SetInputMode( EPtiEngineQwertyPredictive ); + TInt retKey = keymapping->KeyForCharacter( (TUint16)aChar ); + if(MapAgainst(retKey, EPtiEngineQwertyPredictive, aChar, EPtiCaseLower)) + { + aCase = EPtiCaseLower; + } + else if(MapAgainst(retKey, EPtiEngineQwertyPredictive, aChar, EPtiCaseUpper)) + { + aCase = EPtiCaseUpper; + } + else if(MapAgainst(retKey, EPtiEngineQwertyPredictive, aChar, EPtiCaseFnLower)) + { + aCase = EPtiCaseFnLower; + } + else if(MapAgainst(retKey, EPtiEngineQwertyPredictive, aChar, EPtiCaseFnUpper)) + { + aCase = EPtiCaseFnUpper; + } + else + { + } + SetInputMode( oldInputMode ); +#if defined(__WINS__) + if (retKey == EPtiKeyQwertyPlus) + { + retKey = EStdKeyNkpPlus; + } +#endif + return retKey; + } + return EPtiKeyNone; +#else + return EPtiKeyNone; +#endif // RD_INTELLIGENT_TEXT_INPUT + } // --------------------------------------------------------------------------- // CPtiEngineImpl::DeleteKeyPress @@ -1056,7 +1156,9 @@ TPtrC CPtiEngineImpl::RedirectKeyForChineseQwerty(TPtiKey aKey, TBool& aRedirected) { aRedirected = EFalse; - TPtiKeyboardType kbdType = KeyboardType(); + TPtiKeyboardType kbdType = KeyboardType(); + TBuf data; + TInt key; switch (iInputMode) { @@ -1112,47 +1214,48 @@ if(EPtiKeyboardQwerty4x10 == keyboardType || EPtiKeyboardQwerty3x11 == keyboardType ) { - TBuf lowerdata; TInt StrokeUnicodePosition =0; - MappingDataForKey((TPtiKey)aKey, lowerdata, EPtiCaseLower); - if(lowerdata.Length()>0) + MappingDataForKey((TPtiKey)aKey, data, EPtiCaseLower); + if(data.Length()>0) { - for(TInt i=0;i StrokeUnicodePosition && iCase + if (data.Length() > StrokeUnicodePosition && iCase == EPtiCaseLower) { - if (lowerdata[StrokeUnicodePosition] + if (data[StrokeUnicodePosition] == KStrokeHorizontalValue - || lowerdata[StrokeUnicodePosition] + || data[StrokeUnicodePosition] == KStrokeVerticalValue - || lowerdata[StrokeUnicodePosition] + || data[StrokeUnicodePosition] == KStrokeDownToLeftValue - || lowerdata[StrokeUnicodePosition] + || data[StrokeUnicodePosition] == KStrokeDownToRightValue - || lowerdata[StrokeUnicodePosition] + || data[StrokeUnicodePosition] == KStrokeBendingValue - || lowerdata[StrokeUnicodePosition] + || data[StrokeUnicodePosition] == KStrokeQuestionValue) { return TPtrC(); } } - if (iCase == EPtiCaseLower && (aKey == EPtiKeyQwertySpace - || aKey == EPtiKeyQwertyChr || aKey - == EPtiKeyQwertyApostrophe)) - { - return TPtrC(); - } - if(iCase == EPtiCaseLower && aKey == EPtiKeyQwertySpace) + + if(iCase == EPtiCaseLower && (aKey == EPtiKeyQwertySpace || aKey == EPtiKeyQwertyZ)) { return TPtrC(); } @@ -1219,8 +1322,14 @@ case EPtiEngineNormalCangjieQwerty: case EPtiEngineEasyCangjieQwerty: case EPtiEngineAdvCangjieQwerty: + MappingDataForKey((TPtiKey)aKey, data, EPtiCaseUpper); + key = aKey; + if(data.Length() > 0) + { + key = (TPtiKey)data[0]; + } if ((iCase == EPtiCaseLower) && - (aKey >= EPtiKeyQwertyA) && (aKey <= EPtiKeyQwertyY)) + (key >= EPtiKeyQwertyA) && (key <= EPtiKeyQwertyY)) { return TPtrC(); } @@ -1247,19 +1356,18 @@ else if(EPtiKeyboardQwerty4x10 == kbdType || EPtiKeyboardQwerty3x11 == kbdType ) { - TBuf lowerdata; - TInt i; - MappingDataForKey((TPtiKey) aKey, lowerdata, EPtiCaseLower); - if (lowerdata.Length() > 0) + MappingDataForKey((TPtiKey) aKey, data, EPtiCaseLower); + if (data.Length() > 0) { - for ( i = 0; i < lowerdata.Length(); i++) + TInt i; + for ( i = 0; i < data.Length(); i++) { - if (lowerdata[i] == KZhuyinIndicator) + if (data[i] == KZhuyinIndicator) { break; } } - if(i!=lowerdata.Length() && iCase == EPtiCaseLower ) + if(i!=data.Length() && iCase == EPtiCaseLower ) { return TPtrC(); } @@ -3223,6 +3331,7 @@ CPtiQwertyKeyMappings* maps = static_cast(iCurrentLanguage->GetQwertyKeymappings()); if( maps != NULL ) { + maps->SetKeyboardType(KeyboardType()); maps->GetDataForKey(aKey, aResult, aCase); } } diff -r ecbabf52600f -r bd83ceabce89 textinput/ptienginev2/src/PtiKeyMapData.cpp --- a/textinput/ptienginev2/src/PtiKeyMapData.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/ptienginev2/src/PtiKeyMapData.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -43,7 +43,7 @@ implArray->Close(); } -const TInt KNumItemsPerDeadKeyDataRow = 6; + // // CPtiKeyMapData @@ -211,10 +211,10 @@ { if (data[0] == index) { - data++; - return TPtrC(data, KNumItemsPerDeadKeyDataRow - 1); + data += 2; + return TPtrC(data, *(data - 1)); } - data += KNumItemsPerDeadKeyDataRow; + data += (data[1] + 2); } } diff -r ecbabf52600f -r bd83ceabce89 textinput/ptienginev2/src/PtiKeyMappings.cpp --- a/textinput/ptienginev2/src/PtiKeyMappings.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/ptienginev2/src/PtiKeyMappings.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -19,6 +19,7 @@ #include "PtiKeyMappings.h" #include + // CONSTANTS #ifdef _DEBUG _LIT(KPtiNoKeyMapDataPanic, "PtiEngine: No ITU-T keymap data set."); diff -r ecbabf52600f -r bd83ceabce89 textinput/ptienginev2/src/Ptiqwertykeymappings.cpp --- a/textinput/ptienginev2/src/Ptiqwertykeymappings.cpp Wed Sep 01 12:23:33 2010 +0100 +++ b/textinput/ptienginev2/src/Ptiqwertykeymappings.cpp Tue Sep 14 21:59:06 2010 +0300 @@ -80,6 +80,7 @@ { EPtiKeyQwertyS, EPtiKeyQwertyF, EPtiKeyQwertyR, EPtiKeyQwertyX, EPtiKeyQwertyJ }; +const TUint16 KShortCombine = 0xF010; // @@ -540,6 +541,23 @@ // TUint16 CPtiQwertyKeyMappings::GetCharForMode(TPtiEngineInputMode aMode, TPtrC aChars, TBool aSkipFirst) { + if( DoesModeCharMatchToInputMode(KPtiPinyinMarker, aMode) || + DoesModeCharMatchToInputMode(KPtiStrokeMarker, aMode) || + DoesModeCharMatchToInputMode(KPtiZhuyinMarker, aMode) || + DoesModeCharMatchToInputMode(KPtiCangjieMarker, aMode)) + { + for (TInt i = 0; i < aChars.Length(); i++) + { + if (DoesModeCharMatchToInputMode(aChars[i], aMode)) + { + if (i + 1 >= aChars.Length()) + { + return 0; + } + return aChars[i + 1]; + } + } + } for (TInt i = 0; i < aChars.Length(); i++) { if (!IsModeControlChar(aChars[i])) @@ -549,15 +567,14 @@ iCurrentChar++; continue; } + if(aChars[i] != KShortCombine) + { return aChars[i]; } - if (DoesModeCharMatchToInputMode(aChars[i], aMode)) - { - if (i + 1 >= aChars.Length()) + else { return 0; } - return aChars[i + 1]; } i++; // Wrong mode, skip char } @@ -604,7 +621,13 @@ if (key != EPtiKeyNone) { TPtrC keyData = DataForKeyLocal(key, textCase, EPtiEngineQwerty); - if (keyData.Locate(aChar) != KErrNotFound) + TInt indexOfSpecialMark = keyData.Locate(KShortCombine); + TInt indexOfChar = keyData.Locate(aChar); + if (indexOfSpecialMark != KErrNotFound && indexOfChar != KErrNotFound && indexOfChar > indexOfSpecialMark) + { + continue; + } + else if ( indexOfChar != KErrNotFound) { return key; }