--- a/fep/aknfep/src/AknFepManager.cpp Fri Jul 23 16:49:01 2010 +0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,20732 +0,0 @@
-/*
-* Copyright (c) 2002-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0""
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-* Provides the CAknFepManager methods.
-*
-*/
-
-
-
-
-
-
-
-
-
-
-
-#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
-#include <uikon/eikdefmacros.h>
-#endif
-#include "AknFepManager.h"
-#include "AknFepManagerInterface.h" // MAknFepManagerInterface
-#include "aknfepindicator.h"
-#include "AknFepPanic.h"
-#include "AknFepKeyCatcher.h"
-#include "AknFepGlobalEnums.h"
-#include "AknFepCaseManager.h"
-#include "AknFepHashKeyManager.h"
-#include "AknFepSharedDataInterface.h"
-#include "AknFepInlineTextDecorator.h"
-#include "AknFepUiManagerBase.h"
-#include "AknFepUiManagerChinese.h"
-#include "AknFepUiManagerWestern.h"
-
-#include "AknFepPluginManager.h"
-#include "AknFepUiIndicInputManager.h"
-#include "AknFepUiIndicEnums.h"
-#include <AknFepUIStylusPopupMenu.h>
-#include "aknfepuispellinputpane.h"
-
-#include <bautils.h>
-#include <coeaui.h> //CCoeAppUi
-#include <aknedsts.h> //CAknEdwinState
-#include <uikon.hrh> //keys
-#include <aknenv.h> //CAknEnv
-#include <PtiEngine.h> //CPtiEngine
-#include <AknJapaneseReading.h> //CAknJapaneseReading
-#include <featmgr.h> //FeatureManager
-#include <e32base.h> //CPeriodic
-#include <PtiDefs.h> //keys
-#include <fepipext.h> //MCoeFepSpecificExtensions
-
-#include <aknsoundsystem.h>
-#include <avkon.rsg>
-#include <avkon.hrh>
-
-#include <tagma.h>
-#include <frmtview.h>
-#include <aknedformaccessor.h>
-
-#include <aknfep.rsg>
-#include <avkon.mbg>
-
-#include "aknconsts.h"
-#include <aknfeppeninputenums.h>
-#include <eikproc.h> // User Dictionary
-#include <eikapp.h> // User Dictionary
-
-#include <StringLoader.h>
-
-#include <centralrepository.h>
-#include <AknFepInternalCRKeys.h>
-#include <settingsinternalcrkeys.h>
-#include <AknUtils.h>
-#include <AknCustomCursorSupport.h>
-#include <PtiKeyMappings.h>
-#include <aknfeppeninputimeplugin.h>
-#include <peninputcmd.h>
-
-#include <AknSettingCache.h>
-#include <aknextendedinputcapabilities.h>
-#include <AvkonInternalCRKeys.h>
-#include <hlplch.h>
-#include <aknfepdocumentnavigation.h>
-
-#include <eikcolib.h>
-#include <akntoolbar.h>
-
-#include <eikfrlbd.h>
-#include <eikccpu.h>
-#include <aknappui.h>
-#include <apgwgnam.h>
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#include "AknFepUiWordPopupContent.h"
-#include "AknFepFnKeyManager.h"
-//#include <csxhelp/cp.hlp.hrh>
-#endif //RD_INTELLIGENT_TEXT_INPUT
-
-#ifdef RD_TACTILE_FEEDBACK
-#include <touchfeedback.h>
-#endif //RD_TACTILE_FEEDBACK
-#include "AknFepThaiSCTSelector.h"
-
-//the follow 10 filse include for phrase creation
-#include <bamdesca.h>
-#include <eikspane.h> //CEikStatusPane
-#include <akntitle.h> //CAknTitlePane
-#include <akntoolbar.h> //CAknToolBar
-#include <aknappui.h>
-#include "AknFep.hrh"
-#include "aknfepuserdbdlg.h"
-#include "aknfepzhuyinkeyhandler.h"
-#include "AknFepZhuyinAnalyser.h"
-#include "AknFepZhuyinAnalyserDb.h"
-
-#include <aknnavi.h>
-#include <aknnavide.h>
-
-#include <eikedwin.h>
-#include <aknCharMap.h>
-
-const TInt KSelectItemSize(10);
-_LIT(KAknFepResourceFileName, "z:\\resource\\fep\\aknfep.rsc");
-_LIT(KFEPPREDINPUT_HLP_INPUT, "PREDINPUT_HLP_INPUT"); //
-
-#define text_to_field_mode_hash_key ';'
-#define iAvkonAppUi ((CAknAppUi*)CEikonEnv::Static()->EikAppUi())
-#define __SHIFT_KEY_LOOP
-
-// EAknEditorNativeKeysNumberModeKeymap is used for example in MFNE editors.
-#define EAknEditorNativeKeysNumberModeKeymap EAknEditorReservedInternalUseKeymap
-
-// UID of user dictionary application
-const TUid KUidUserDictApp = {0x101F8645};
-
-const TText KAknFEPLineFeedSymbol = 0x21B2;
-const TText KAknFEPMirroredLineFeedSymbol = 0x21B3;
-const TText KAknFEPZeroKey = 0x30;
-
-// inline text decoration potentially adds 2 directional markers for every "real" character. Buffer needs to be 3 x predictive engine bufsize
-const TInt KMaxInlineEditSize( 3 * CAknFepManager::EMaximumFepWordLength );
-
-// Maximum number of chunks to navigate throught attempting to get to the visual end of a selection.
-// Since chunks are arranged only within a line, this should be more than the number of chunks likely in
-// a single line of text
-const TInt KMaxChunkWalkIterations(20);
-
-// This command is is used for setting empty CBA.
-const TInt KNullCommandId = 0;
-
-_LIT_SECURE_ID(KPhoneSecureId, 0x100058b3);
-
-#ifdef RD_HINDI_PHONETIC_INPUT
-
-const TUint KQuestionMark = 0x003F;
-
-#endif
-
-// Ccpu key events.
-/*As part of build warnings commenting this perticular code it might require when touch is enabled.
-const TKeyEvent KEditorCopyEvent = {3, 67, 161, 0}; // Ctrl + C
-const TKeyEvent KEditorCutEvent = {24, 88, 161, 0}; // Ctrl + X
-*/
-
-const TInt KTouchInputPreviewOn = 1;
-const TInt KTouchInputPreviewOff = 0;
-
-#ifdef RD_SCALABLE_UI_V2
-const TKeyEvent KAknCcpuCopyEvent = {EKeyF18, EEikCmdEditCopy, EModifierCtrl, 1}; // Copy event for AknCcpuSupport
-const TKeyEvent KAknCcpuCutEvent = {EKeyF18, EEikCmdEditCut, EModifierCtrl, 1}; // Cut event for AknCcpuSupport
-
-const TInt KMaxMenuSize = 23;
-const TInt KEditorMenuPermitedSend[KMaxMenuSize] =
- {
- EJapanFepCmdModeHiragana,
- EJapanFepCmdModeKatakana,
- EJapanFepCmdEditModeAlpha,
- EJapanFepCmdEditModeNumber,
- EJapanFepCmdModeFullWidth,
- EJapanFepCmdModeHalfWidth,
- EChinFepCmdModePinyin,
- EChinFepCmdModeZhuyin,
- EChinFepCmdModeStroke,
- EAknCmdT9PredictiveT9Off,
- EAknCmdMultitapPredictiveT9On,
- EJapanFepCmdMultitapPredictiveT9On,
- EChinFepCmdModeZhuyinFind,
- EChinFepCmdModeStrokeFind,
- EAknCmdEditModeAlpha,
- EAknCmdEditModeLatinText,
- EChinFepCmdModeLatinUpper,
- EChinFepCmdModeLatinLower,
- EAknCmdEditModeNumber,
- EChinFepCmdModeNumber,
- EAknCmdEditModeArabicIndicNumber,
- EAknCmdEditModeEasternArabicIndicNumber,
- EAknCmdEditModeIndicNumber
- };
-
-#endif // RD_SCALABLE_UI_V2
-
-
-// Number modes used by Arabic or Hindi.
-enum TNonLatinNumberModes
- {
- ENbrModeLatin,
- ENbrModeArabic = 1,
- ENbrModeIndic = 1
- };
-
-// Number mode type
-enum TNonLatinNumberModeType
- {
- ENbrModeTypeArabic,
- ENbrModeTypeIndic,
- ENbrModeTypeEasternArabic //for Urdu & Farsi languages
- };
-
-// The passwd timeout is same as defined on CEikSecretEditor.
-const TInt KSyncPasswdTimeout = 1000000;
-
-#ifdef RD_SCALABLE_UI_V2
-TUid AppUidFromWndGroupId(TInt aWndGrpId);
-extern TUid GetCurAppUid();
-extern TBool IsGlobalNotesApp(TUid& aUid);
-TInt GetForegroundTaskAppWgId();
-#endif
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-const TInt KWordToFocusInCandidateList = 1;
-#endif
-
-LOCAL_C TInt RemapVietnameseAccentedCharacter(TUint16 aChr);
-
-//
-// Class TTextDirectionalInfo
-//
-/**
-* The implementation inializes with well-defined "null" state
-*/
-CAknFepManager::TTextDirectionalInfo::TTextDirectionalInfo() :
-iDirectionalStatus(EUnknown), iBlockEnvironment(EUndefined)
- {}
-
-void CAknFepManager::TTextDirectionalInfo::SetDirectionFromChunk(
- const CTmTextLayout::TTmChunkDescription& aChunk )
- {
- if ( aChunk.iStart >= 0 ) // Condition for valid block. Does nothing otherwise
- iDirectionalStatus = aChunk.iRightToLeft ? ERightToLeft : ELeftToRight;
- }
-
-
-void TFepLanguageTranslation::ReadFromResource(TResourceReader& aReader)
- {
- iName.Set(aReader.ReadTPtrC());
- iLanguageId = aReader.ReadInt16();
- iCommandId = aReader.ReadInt16();
- }
-
-
-CAknFepManager::CAknFepManager(CCoeEnv& aConeEnvironment)
- :CCoeFep(aConeEnvironment),
- iAsyncResouceChanged(EActivePriorityDefault),
- iPreviousEditingState(EStateNone),
- iInputCapabilities(TCoeInputCapabilities::ENone),
- iModeBefore(ELatin),
- #ifdef RD_INTELLIGENT_TEXT_INPUT
- iKeyPressedDuringShift(EFalse),
-#endif
- iCharWidth(EHalfWidthChar),
- iAsyncOwnSimulateKey(EActivePriorityDefault),
- iLongThai0Key(EFalse),
- iEditCharsPtr(0,0),
- iComposChrFlag(0),
- iIsUserdbdlgActive(0),
- iLongClearAfterCloseUI(EFalse),
- // phrase creation
- iPhraseCreation(0),
- iPinyinPhraseCreation(0),
- iEntryPhrase(0)
-
-
- {
- }
-
-void CAknFepManager::ConstructL(const CCoeFepParameters& aFepParameters)
- {
- BaseConstructL(aFepParameters);
- iUiInterface = CAknFepUIInterface::NewL();
- iIndicator = iUiInterface->NewIndicatorL();
- iPreviousIndicator = CAknEnv::Static()->SwapEditingStateIndicator(iIndicator);
-
- // Set up resources
- TFileName resourceName(KAknFepResourceFileName);
- CCoeEnv* coeEnv = CCoeEnv::Static();
- BaflUtils::NearestLanguageFile(coeEnv->FsSession(), resourceName);
- iResId = coeEnv->AddResourceFileL(resourceName);
-
- // Save Japanese Feature support to a member variable
- iFeatureSupportedJapanese = FeatureManager::FeatureSupported(KFeatureIdJapanese);
-
- iUiLanguage = User::Language();
-
- // Shared Data
- iSharedDataInterface = CAknFepSharedDataInterface::NewL(this);
-
- TInt previUiLanguage = iSharedDataInterface->PluginUILanguage();
-
- if (iUiLanguage != previUiLanguage)
- {
-
- // if UI language has changed we need to set text input language according to UI language
- iSharedDataInterface->SetPluginUILanguage(iUiLanguage);
- iSharedDataInterface->SetInputTextLanguage(0); // signals that it needs to be updated
- }
-
- if (!iSharedDataInterface->InputMode()) //not initialised yet - first time device is switched on
- {
- switch (iUiLanguage)
- {
- case ELangPrcChinese:
- iSharedDataInterface->SetInputMode(EPinyin);
- break;
- case ELangTaiwanChinese:
- iSharedDataInterface->SetInputMode(EZhuyin);
- break;
- case ELangHongKongChinese:
- iSharedDataInterface->SetInputMode(EStroke);
- iSharedDataInterface->SetCangJieMode(ECangJieNormal);
- break;
- case ELangJapanese:
- iSharedDataInterface->SetInputMode(EHiraganaKanji);
- break;
- case ELangKorean:
- iSharedDataInterface->SetInputMode(EHangul);
- break;
- case ELangHindi:
- iSharedDataInterface->SetInputMode(EHindi);
- break;
- default:
- iSharedDataInterface->SetInputMode(ELatin);
- break;
- }
- }
-
- iUiInterface->SetFepMenuObserver(this);
-
- TInt inputLanguage = iSharedDataInterface->InputTextLanguage();
-
- // A process instantiating Fep may miss ECapabilityWriteDeviceData capability,
- // which is needed for updating locale repository.
- // A workaround is to delay change up to a process that has the capability
- TSecurityInfo info;
- info.Set(RProcess());
-
- TBool hasCapability = info.iCaps.HasCapability(ECapabilityWriteDeviceData);
-
- if (!inputLanguage && hasCapability)
- {
- // set correct input language
- inputLanguage = SubstituteSublanguageId(iUiLanguage);
-
- // If Ptiengine is not initialize, initialize it
- if (!iPtiEngine)
- {
- iPtiEngine = CPtiEngine::NewL(ETrue);
- }
- // If still not found, default to english.
- if (!iPtiEngine->GetLanguage(inputLanguage))
- {
- inputLanguage = ELangEnglish;
- }
-
- // Set the current input language
- iSharedDataInterface->SetInputTextLanguage(inputLanguage);
-
- // update numeric input
- if ( iUiLanguage == ELangArabic )
- {
- SetDefaultNumberMode( ENbrModeArabic,
- ENbrModeTypeArabic );
- }
- else if ( ( iUiLanguage == ELangUrdu ) ||
- ( iUiLanguage == ELangFarsi ) )
- {
- SetDefaultNumberMode( ENbrModeArabic,
- ENbrModeTypeEasternArabic );
- }
- else if ( TAknFepUiIndicInputManager::IsScriptDevanagari( iUiLanguage ) )
- {
- SetDefaultNumberMode( ENbrModeLatin,
- ENbrModeTypeIndic );
- }
- else
- {
- SetDefaultNumberMode( ENbrModeLatin, ENbrModeTypeArabic );
- }
- }
-
- iSctEditChars = HBufC::NewL( 10 );
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- if(CCoeEnv::Static()->AppUi())
- iExactWordPopupContent = iUiInterface->CreateWordPopupContentL();
- // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
- // If the following line is uncommented, the FEP is fully constructed
- // for all applications at application startup.
- // ConstructFullyL();
- iShiftKeypressMonitor = CPeriodic::NewL(CActive::EPriorityStandard);
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- iFnKeyManager = CAknFepFnKeyManager::NewL( *this,iSharedDataInterface );
-#endif
- TRAPD(result,iKeyCatcher = CAknFepKeyCatcher::NewL(*this));
- if(result == KErrNone)
- {
- iKeyCatcher->ActivateL();
- }
- // the follow 3 objects for phrase creation
- iZhuyinKeyHandler = CZhuyinKeyHandler::NewL();
- iZhuyinAnalyserDb = CZhuyinAnalyserDbFeed::NewL(EPinyinAnalyserTypeZhuyin);
- iZhuyinAnalyser = CAknFepZhuyinAnalyser::NewL(iZhuyinAnalyserDb);
- iAknFepThaiSCTSelector = CAknFepThaiSCTSelector::NewL();
- iHybridAplphaChangedToAlphanumeric = EFalse;
- iLastFocusedEditor = NULL;
- iFepAwareDialogParentEditor = NULL;
- }
-
-void CAknFepManager::ConstructFullyL()
- {
- if (!iPtiEngine)
- {
- iPtiEngine = CPtiEngine::NewL(ETrue);
- }
-
- if ( !(iPtiEngine->GetLanguage(iSharedDataInterface->InputTextLanguage())) )
- {
- // If input language cenrep value is set to language unknown to PtiEngine,
- // try to reset based on UI-language.
- TInt inputLang = SubstituteSublanguageId(iUiLanguage);
-
- // If still not found, default to english.
- if (!iPtiEngine->GetLanguage(inputLang))
- {
- inputLang = ELangEnglish;
- }
- iSharedDataInterface->SetInputTextLanguage(inputLang);
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef FF_DUAL_LANGUAGE_SUPPORT
- if (iPtiEngine->GetLanguage(iSharedDataInterface->InputTextLanguageSecondary()) == NULL)
- {
- // If secondary input language is unknown to PtiEngine, set it to none
- iSharedDataInterface->SetInputTextLanguageSecondary(0);
- }
-#endif //FF_DUAL_LANGUAGE_SUPPORT
-#endif
-
- if(NULL == iKeyCatcher)
- {
- iKeyCatcher = CAknFepKeyCatcher::NewL(*this);
- iKeyCatcher->ActivateL();
- }
-
- iConcatenationTimer=CPeriodic::NewL(CActive::EPriorityStandard);
- iPostEventCheck=CIdle::NewL(CActive::EPriorityStandard);
- iChrKeypressMonitor = CPeriodic::NewL(CActive::EPriorityStandard);
-
- CCoeEnv* coeEnv = CCoeEnv::Static();
- TInt inputLanguage = iSharedDataInterface->InputTextLanguage();
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef FF_DUAL_LANGUAGE_SUPPORT
- TInt inputLanguageSecondary = iSharedDataInterface->InputTextLanguageSecondary();
-#endif //FF_DUAL_LANGUAGE_SUPPORT
-#endif
- SetWesternPredictive(iSharedDataInterface->PredictiveTextOn());
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- iIsAutoCompleteOn = iSharedDataInterface->PredictiveTextAutoCompleteOn(); // AutoCompletion disabled by Default
-#endif //RD_INTELLIGENT_TEXT_INPUT
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- iIsAutoCompleteOn = iSharedDataInterface->PredictiveTextAutoCompleteOn(); // AutoCompletion disabled by Default
- iTypingCorrectionLevel = iSharedDataInterface->PredictiveTextTypingCorrectionLevel();
- iIsNumberCandidateShown = iSharedDataInterface->PredictiveTextNumberCandidateShown();
- TInt primaryCandidateValue = iSharedDataInterface->PredictiveTextPrimaryCandidate();
- if( primaryCandidateValue == 0)
- iPrimaryCandidate = ETrue;
- else if(primaryCandidateValue == 1)
- iPrimaryCandidate = EFalse;
-#endif // RD_INTELLIGENT_TEXT_INPUT
- iJapanesePredictive = iSharedDataInterface->PredictiveTextJapaneseOn();
- iQwertyInputMode = iSharedDataInterface->QwertyInputMode();
- iMultiTapTimer = iSharedDataInterface->MultiTapTimer();
- iJapaneseQwertyFlags = iSharedDataInterface->JapaneseQwertyFlags();
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(!iFnKeyManager)
- {
- iFnKeyManager = CAknFepFnKeyManager::NewL( *this,iSharedDataInterface );
- }
-#endif
- iCaseMan = CAknFepCaseManager::NewL(*this);
- iLangMan = CAknFepLanguageManager::NewL(this, iCaseMan);
- iPtiEngine->ActivateLanguageL(inputLanguage);
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef FF_DUAL_LANGUAGE_SUPPORT
- iPtiEngine->SetSecondaryInputL(inputLanguageSecondary);
-#endif //FF_DUAL_LANGUAGE_SUPPORT
-#endif
- iLangMan->SetInputLanguageL(inputLanguage);
- SetInputLanguageCapabilities(inputLanguage);
- iCurrentFepUI = iLangMan->GetFepUI(ELatin, iCharWidth, IsPredictive(ELatin));
-
- iLastKeyPressedWasHashKey = EFalse;
- iDeviceSupportsRtlLanguage = DeviceSupportsRTLLanguageL();
-
- TResourceReader reader;
- // get character from resource to represent an 'enter' character
- coeEnv->CreateResourceReaderLC(reader, R_AVKON_SCT_SPACE_SYMBOL);
- iSpaceCharacterCode = reader.ReadUint16();
- coeEnv->CreateResourceReaderLC(reader, R_AVKON_SCT_FULLWIDTHSPACE_SYMBOL);
- iFullWidthSpaceCharacterCode = reader.ReadUint16();
- CleanupStack::PopAndDestroy(2); //reader
-
- //initialise states
- iMode = EAknEditorNullInputMode; //Force a sync of mode...
- SyncStates(EAknFepStateNull);
- ResetFlags();
- ResetExtendedFlags();
-
- ReadHashKeyLoopL();
- iHashKeyMan = CAknFepHashKeyManager::NewL(*this, iCaseMan);
- SetHashKeyStyle();
- iInlineTextDecorator = new (ELeave) CAknFepInlineTextDecorator;
- if (IsFeatureSupportedJapanese())
- {
- CAknJapaneseReading::CreateL(iPtiEngine);
- }
- // setting call back
- TCallBack callback(DoSimulateKey, this);
- iAsyncOwnSimulateKey.Set(callback);
-
- TCallBack resourcechangedcallback(HandleResourceChangedCallback,this);
- iAsyncResouceChanged.Set(resourcechangedcallback);
-#ifdef RD_SCALABLE_UI_V2
- iFepPluginManager = CAknFepPluginManager::NewL
- ( *this, *iSharedDataInterface, *iLangMan, *iCaseMan);
- iNotifyPlugin = ETrue;
-#endif //RD_SCALABLE_UI_V2
-
- iFepFullyConstructed = ETrue;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- iIsFnKeyMapped = IsFnKeyMappedL();
- iKeyboardType = (TPtiKeyboardType)iSharedDataInterface->KeyboardLayout();
-#endif
- }
-
-CAknFepManager::~CAknFepManager()
- {
-#ifdef RD_PF_SEC_APPARC
- delete iNullService;
-#else
- //Embedding - removing created document
- if ( iEmbedded )
- {
- CEikonEnv::Static()->Process()->DestroyDocument(iEmbedded); // User dictionary
- iEmbedded = NULL;
- }
-#endif
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- SetFlag(CAknFepManager::EFlagSupressAutoUpdate);
- TRAPD(err, CommitInlineEditL())
- if (err)
- {
- CleanUpFep();
- }
- }
-
- if ( EditorState() )
- {
- EditorState()->SetObserver(NULL);
- }
- if (iLastFocusedEditor)
- {
- iLastFocusedEditor->SetObserver(NULL);
- iLastFocusedEditor = NULL;
- }
- if (iFepAwareDialogParentEditor)
- {
- iFepAwareDialogParentEditor->SetObserver(NULL);
- iFepAwareDialogParentEditor = NULL;
- }
-
- delete iSharedDataInterface;
- MAknEditingStateIndicator* indicator = CAknEnv::Static()->EditingStateIndicator();
- if (indicator == iIndicator)
- {
- CAknEnv::Static()->SwapEditingStateIndicator(NULL);
- }
-
-
- delete iIndicator;
- iIndicator = NULL;
- CCoeEnv::Static()->DeleteResourceFile(iResId);
-
- // Everything that is constructed in ConstructFullyL() method
- // needs to be deleted in CommonDestroyFep() method.
- CommonDestroyFep();
-
- if (iUiInterface)
- iUiInterface->SetFepMenuObserver(NULL);
-
- delete iPtiEngine;
- delete iSctEditChars;
-
-#ifdef RD_SCALABLE_UI_V2
- if ( FepAwareTextEditor() )
- {
- UnregisterObserver();
- }
- delete iFepPluginManager;
- delete iStylusCcpuMenu;
-
- delete iSpellInitText;
-#endif // RD_SCALABLE_UI_V2
- delete iUiInterface;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- delete iExactWordPopupContent;
- iExactWordPopupContent = 0;
- delete iCandidatePopup;
- iCandidatePopup = 0;
- delete iResourceString;
- iResourceString = 0;
- // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
- // the follow objects for phrase creation
- delete iZhuyinKeyHandler;
- delete iZhuyinAnalyser;
- delete iAknFepThaiSCTSelector;
- }
-
-void CAknFepManager::CommonDestroyFep()
- {
- iFepFullyConstructed = EFalse;
-
- // This method is called both from destructor and CleanUpFep methods.
- iAsyncOwnSimulateKey.Cancel();
- iAsyncResouceChanged.Cancel();
- delete iShiftKeypressMonitor;
- iShiftKeypressMonitor = NULL;
- delete iConcatenationTimer;
- iConcatenationTimer = NULL;
- delete iChrKeypressMonitor;
- iChrKeypressMonitor = NULL;
- delete iLangMan;
- iLangMan = NULL;
- iCurrentFepUI = NULL;
- delete iKeyCatcher;
- iKeyCatcher = NULL;
-
- delete iPostEventCheck;
- iPostEventCheck = NULL;
- delete iHashKeyMan;
- iHashKeyMan = NULL;
- delete iCaseMan;
- iCaseMan = NULL;
- delete iInlineTextDecorator;
- iInlineTextDecorator = NULL;
- iHashKeyLoop.Close();
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(iFnKeyManager)
- {
- delete iFnKeyManager;
- iFnKeyManager = NULL;
- }
- if( iNumericResourceTimer )
- {
- delete iNumericResourceTimer;
- iNumericResourceTimer = NULL;
- }
-#endif
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-void CAknFepManager::SetKeyboardLayout(TPtiKeyboardType aType)
- {
-
- if(iQwertyInputMode && iFnKeyManager
- && (iFnKeyManager->FnKeyState()== CAknFepFnKeyManager::EFnKeyLock
- ||iFnKeyManager->FnKeyState()== CAknFepFnKeyManager::EFnKeyNext))
- {
- iMode = ENumber;
- }
-
- if(iFnKeyManager)
- {
- iFnKeyManager->ClearFnKeyState();
- }
-
- if(iPtiEngine)
- {
- iPtiEngine->SetKeyboardType(aType);
- }
- iKeyboardType = aType;
- }
-
-TPtiKeyboardType CAknFepManager::KeyboardLayout() const
- {
- return iKeyboardType;
- }
-#endif
-TBool CAknFepManager::TryCloseUiL()
- {
-#ifdef RD_HINDI_PHONETIC_INPUT
- if ((iSharedDataInterface->InputTextLanguage() == KLangHindiPhonetic) &&
- IsFlagSet(CAknFepManager::EFlagNoMatches))
- {
- ClearFlag(CAknFepManager::EFlagNoMatches);
- if (PreviousChar() == KQuestionMark)
- RemovePreviousCharacterL();
- }
-#endif
- if (iFepManState == EAknFepStateUIActive)
- {
- // In Japanese input,
- // commit inline editing at only the western predictive mode.
- if (!IsFeatureSupportedJapanese() || WesternPredictive())
- {
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- TryRemoveNoMatchesIndicatorL();
- UpdateCbaL(NULL);
- }
-
-
-
-//#ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if ( iFepPluginManager &&
- (iFepPluginManager->PluginInputMode() == EPluginInputModeNone))
- {
- RemoveSuggestedAdvanceCompletionL();
- }
-#endif // RD_INTELLIGENT_TEXT_INPUT
-//#endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
-
-#ifdef RD_SCALABLE_UI_V2
-
- if ( iFepPluginManager != NULL &&
- iFepPluginManager->BeforeSpell() )
- {
- iFepPluginManager->SetBeforeSpell(EFalse);
- }
- else
-#endif
-
- {
- CommitInlineEditL();
- }
- }
- if (IsCcpuFlagSet(ECcpuStataCommitPredictiveWord))
- {
- // Word commiting must be done after CommitInlineEditL call (because
- // of Japanese ReadingTextL funtionality), hence the delayed commit here.
- iPtiEngine->CommitCurrentWord();
- ClearCcpuFlag(ECcpuStataCommitPredictiveWord);
- }
- InternalFepUI()->CloseUI();
- SyncStates(EAknFepStateInitial);
- if (iMode == EPinyin || iMode == EZhuyin || iMode == EStroke || iMode == ECangJie)
- {
- SetCursorType(EActive);
- if ( EditorState() )
- {
- EditorState()->SetFlags( EditorState()->Flags() & ~EAknEditorFlagChinesePopup );
- }
- }
-
- // EFalse in case of latin input in Japanese variant
- if (IsFeatureSupportedJapanese()
- && iMode == ELatin && !WesternPredictive())
- {
- return EFalse;
- }
-
- return ETrue;
- }
- else
- {
- if (IsKoreanInputLanguage())
- {
- if (IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))
- {
- CommitInlineEditL();
- PtiEngine()->ClearCurrentWord();
- }
- }
-
- //in initial state characters should either:
- //1. not be consumed by the FEP.
- //2. be committed immediately by the Input State.
- //3. be multitap chars, in which case they may need to be committed
- // here. It is best to let the engine deal with this.
- if ( IsFlagSet( EFlagInsideInlineEditingTransaction ) )
- {
- InternalFepUI()->ExpireMultitapTimer();
- }
- return EFalse;
- }
- }
-
-void CAknFepManager::SendUIActivatedNotification()
- {
- SyncStates(EAknFepStateUIActive);
- }
-
-void CAknFepManager::SendUIDeActivatedNotification()
- {
- SyncStates(EAknFepStateInitial);
- }
-
-void CAknFepManager::PlaySound(TAvkonSystemSID aSound) const
- {
- if (SoundSystem())
- {
- SoundSystem()->PlaySound(aSound);
- }
- }
-
-void CAknFepManager::SetLongClearAfterCloseUI(TBool aLongClear)
- {
- iLongClearAfterCloseUI = aLongClear;
- }
-
-TKeyResponse CAknFepManager::HandleKeyEventL(TUint aCode, TKeyPressLength aLength,TEventCode aEventCode)
- {
- TKeyResponse response = EKeyWasNotConsumed;
-
- TInt documentLength = -1;
- if (iInputCapabilities.FepAwareTextEditor())
- {
- documentLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- }
-
- if (iFepFullyConstructed && iConcatenationTimer->IsActive())
- {
- if (!( aCode == EKeyRightArrow ||
- aCode == EKeyLeftArrow ||
- aCode == EKeyUpArrow ||
- aCode == EKeyDownArrow ))
- {
- iConcatenationTimer->Cancel();
- }
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-
- if(iKeyBackSpaceHit && aCode != EKeyBackspace)
- iKeyBackSpaceHit = 0;
-
- if (aCode != EPtiKeyStar && iNumericResourceTimer)
- {
- // return with EKeyWasConsumed if any of the arrow keys are pressed with
- // iNumericResourceTimer is active
- if(NumericResourceMultiTapTimerTimeoutL()&&
- (aCode == EKeyRightArrow || aCode == EKeyLeftArrow || aCode == EKeyUpArrow || aCode ==EKeyDownArrow))
- return EKeyWasConsumed;
- }
-#endif
-
-
-
- // This method is implemented independent of all modes, so it can be called by anyone, anywhere
- if ( BidiCursorRequired() )
- {
- response = AttemptCursorFlipAtAmbiguousPointL( aCode );
- if ( response == EKeyWasConsumed )
- {
- return response;
- }
- }
-
- if ( aCode != EPtiKeyHash
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
-#ifdef __SHIFT_KEY_LOOP
- && ( aCode != EPtiKeyQwertyLeftShift
- || EPtiKeyboardHalfQwerty != KeyboardLayout() )
-#endif //__SHIFT_KEY_LOOP
-#endif //__HALF_QWERTY_KEYPAD
-#endif //RD_INTELLIGENT_TEXT_INPUT
- )
-
- {
-
- SetLastPressedHashKeyStatus(EFalse);
-
- if(iHashKeyMan)
- {
- iHashKeyMan->CancelHashKeyTimer();
- if (aCode != EKeyOK)
- {
- iHashKeyMan->ClearSelectionModeHashKeyLoop();
- }
- }
- }
- // Always commit the text before handling arrow keys
- if (iMode == EHangul && IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))
- {
- if ( aCode == EKeyRightArrow ||
- aCode == EKeyLeftArrow ||
- aCode == EKeyUpArrow ||
- aCode == EKeyDownArrow )
- {
- CommitInlineEditL();
- iPtiEngine->ClearCurrentWord();
- }
- }
- TBool isPassNext = IsFlagSet(EFlagPassNextKey);
-
- switch (aCode)
- {
- case EKeyEscape:
-
-#ifdef RD_SCALABLE_UI_V2
- if( iFepFullyConstructed && iFepPluginManager)
- {
- iFepPluginManager->ResetMenuState(EFalse);
- }
-#endif
- if (TryCloseUiL())
- {
- response = EKeyWasConsumed;
- // phrase creation
- PhraseCreation(EFalse);
- // phrase creation
- PinyinPhraseCreation(EFalse);
- }
- break;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
-#ifdef __SHIFT_KEY_LOOP
- case EPtiKeyQwertyLeftShift:
- if( EPtiKeyboardHalfQwerty == KeyboardLayout() )
- {
- response = HandleHashKeyL(aLength);
- (aLength == ELongKeyPress)? SetLastPressedHashKeyStatus(EFalse):SetLastPressedHashKeyStatus(ETrue);
- }
- break;
-#endif //__SHIFT_KEY_LOOP
-#endif //__HALF_QWERTY_KEYPAD
-#endif //RD_INTELLIGENT_TEXT_INPUT
- case EPtiKeyHash:
- if(InputMode() == EHangul)
- {
- if (aLength == EShortKeyPress)
- {
- FepUI()->HandleKeyL(aCode, aLength);
- response = EKeyWasConsumed;
- }
- else
- {
- //PhraseCreation(EFalse);
- response = HandleHashKeyL(aLength);
- (aLength == ELongKeyPress)? SetLastPressedHashKeyStatus(EFalse):
- SetLastPressedHashKeyStatus(ETrue);
- }
- }
- else if (InputMode()!= EZhuyin)
- {
- if (IsPinyinPhraseCreation() )
- {
- ClearCcpuFlag( ECcpuStateHashDown );
- response = EKeyWasConsumed;
- }
- else
- {
- response = HandleHashKeyL(aLength);
- (aLength == ELongKeyPress)
- ? SetLastPressedHashKeyStatus(EFalse)
- : SetLastPressedHashKeyStatus(ETrue);
- }
- }
- else
- {
- PhraseCreation(EFalse);
- response = HandleHashKeyL(aLength);
- (aLength == ELongKeyPress)
- ? SetLastPressedHashKeyStatus(EFalse)
- : SetLastPressedHashKeyStatus(ETrue);
- }
- break;
- case EKeyCBA1:
- if(Japanese())
- {
- if (FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
- }
- break;
- }
- // phrase creation the key CBA2 need to solve.
- if ( IsEntryPhrase() )
- {
- if ( FepUI()->HandleKeyL( aCode, aLength ) )
- {
- response = EKeyWasConsumed;
- break;
- }
- }
-
- if (!WesternPredictive())
- {
- if (TryCloseUiL())
- {
- response = EKeyWasConsumed;
- }
- }
- break;
- case EKeyCBA2:
- if(Japanese())
- {
- if (FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
- }
- break;
- }
- if (!WesternPredictive())
- {
- if (TryCloseUiL())
- {
- // phrase creation the key CBA2 need to solve.
- PhraseCreation( EFalse );
- response = EKeyWasConsumed;
- }
- }
- else
- {
- if ( IsFlagSet( EFlagInsideInlineEditingTransaction ) )
- {
- InternalFepUI()->ExpireMultitapTimer();
- }
- }
- // phrase creation the key CBA2 need to solve.
- EntryPhrase( EFalse );
- break;
- case EPtiKeyStar:
- if (IsFlagSet(EFlagPassNextKey))
- {
- ClearFlag(EFlagPassNextKey);
- }
- else if ( !IsFepAwareTextEditor() )
- {
- // The editor is MFNE or other non FEP aware text editor.
- // Pass the key to the editor to handle.
- response = EKeyWasNotConsumed;
- }
- else if (IsFlagSet(EFlagShiftKeyDepressed))
- {
- response = EKeyWasConsumed;
- }
- else
- {
-#ifdef RD_SCALABLE_UI_V2
- iStarKeyPressed = ETrue;
-#endif // RD_SCALABLE_UI_V2
- if (FepUI()->HandleKeyL(aCode, aLength, aEventCode))
- {
- response = EKeyWasConsumed;
- }
-#ifdef RD_SCALABLE_UI_V2
- iStarKeyPressed = EFalse;
-#endif // RD_SCALABLE_UI_V2
- }
- break;
- case EKeyRightArrow:
- if (TryHandleArrowRightEventL(documentLength))
- {
- response = EKeyWasConsumed;
- break;
- }
- // fall through
- case EKeyLeftArrow:
- if (aCode == EKeyLeftArrow && TryHandleArrowLeftEventL(documentLength))
- {
- response = EKeyWasConsumed;
- break;
- }
-
- if (IsCcpuFlagSet(ECcpuStateCopy | ECcpuStateCut))
- {
- response = EKeyWasNotConsumed;
- break;
- }
- else if (IsCcpuFlagSet(ECcpuStateStartCopy | ECcpuStateStartCut))
- {
- TryHandleCommonArrowAndBackspaceFunctionalityL(aCode, response);
- break;
- }
-
- if (iLanguageCapabilities.iInputLanguageCode == ELangJapanese && iMode != ELatin)
- {
- if(FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
- }
- }
- else
- {
- if (WesternPredictive())
- {
- response = HandleWesternPredictiveArrowKeyL(aCode, aLength);
- }
- else
- {
- if (iFepManState == EAknFepStateUIActive)
- {
- FepUI()->HandleKeyL(aCode, aLength);
- response = EKeyWasConsumed;
- }
- else
- {
- /*
- TCursorSelection currentEditorSelection(0,0);
- if(iInputCapabilities.FepAwareTextEditor())
- {
- iInputCapabilities.FepAwareTextEditor()->
- GetCursorSelectionForFep(currentEditorSelection);
- }
-
- if(!IsMfneEditor() &&
- (PluginInputMode() == EPluginInputModeItut ||
- PluginInputMode() == EPluginInputModeFSQ) &&
- currentEditorSelection.Length() != 0)
- {
- response = EKeyWasConsumed;
- break;
- }
- */
-
- response = HandleNaviEventOutsideInlineEditL(aCode, aLength);
- if (response == EKeyWasConsumed)
- {
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- else if (aCode == EKeyLeftArrow && !IsFlagSet(EFlagShiftKeyDepressed))
- {
- iCaseMan->UpdateCase(ELeftNaviEvent);
- }
- else if (!IsFlagSet(EFlagShiftKeyDepressed))
- {
- iCaseMan->UpdateCase(ERightNaviEvent);
- }
- }
- }
- }
- break;
- case EKeyDownArrow:
- if( iWesternPredictive && IsFlagSet(EFlagInsideInlineEditingTransaction) &&
- ( EPtiKeyboard12Key == KeyboardLayout() ) && ( IsFlagSet(EFlagShiftKeyDepressed) ||
- HashKeySelectionInUse()&& IsCcpuFlagSet(ECcpuStateHashDown) ) )
- {
- iPtiEngine->CommitCurrentWord();
- CommitInlineEditL();
- response = EKeyWasConsumed;
- break;
- }
-
- if (TryHandleArrowDownEventL(documentLength) || IsFlagSet(EFlagNoMatches))
- {
- response = EKeyWasConsumed;
- break;
- }
-
- case EKeyUpArrow:
- if (iLanguageCapabilities.iInputLanguageCode == ELangJapanese && iMode != ELatin)
- {
- if ( (iAknEditorFlags & EAknEditorFlagNoLRNavigation) &&
- IsFlagSet(EFlagShiftKeyDepressed) )
- {
- // Up or down key is pressed during shift key press.
- ClearFlag(EFlagNoActionDuringShiftKeyPress);
- return EKeyWasNotConsumed;
- }
-
- if(FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
- }
- else
- {
- TryHandleCommonArrowAndBackspaceFunctionalityL(aCode, response);
- }
- }
- else
- {
- if (iLanguageCapabilities.iInputLanguageCode == ELangThai &&
- iFepManState == EAknFepStateUIActive &&
- WesternPredictive() )
- {
- if (FepUI()->HandleKeyL(aCode, aLength))
- {
- ClearFlag(EFlagChangeInputMode);
- response = EKeyWasConsumed;
- }
- break;
- }
- else if ( (iAknEditorFlags & EAknEditorFlagNoLRNavigation) &&
- IsFlagSet(EFlagShiftKeyDepressed) )
- {
- // Up or down key is pressed during shift key press.
- ClearFlag(EFlagNoActionDuringShiftKeyPress);
- return EKeyWasNotConsumed;
- }
- if (WesternPredictive())
- {
- // For customizabal of Down/Up scroll keypress action.
- // If it need to custom it, the function of HandleKeyL returns EFalse.
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- if ( IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) )
- {
- TInt wordIndexToSelect = 0;
-
- if(iQwertyInputMode && EPtiKeyboardHalfQwerty != KeyboardLayout())
- {
- if(!iPrimaryCandidate)
- iPtiEngine->HandleCommandL( EPtiCommandUserActionGetIndexOfSecondaryCandidate,
- &wordIndexToSelect );
-
- if( iQwertyInputMode
- && ( iExactWordPopupContent->IsPopUpVisible()
- || ( iFepPluginManager && iFepPluginManager->IsTooltipOpenOnFSQ() ) )
- && aCode == EKeyUpArrow )
- {
- iExactWordPopupContent->HidePopUp();
-
- // When press up, if FSQ is opened,
- // also need to check and close tooltip on it.
- SendEventsToPluginManL( EPluginHideTooltip );
-
- iPtiEngine->HandleCommandL(
- EPtiCommandUserActionSetCurrentIndexOfCandidates,
- &wordIndexToSelect );
- iPtiEngine->HandleCommandL( EPtiCommandLockCurrentCandidate );
- /* Update the Candidate List in case of Exact Typing as best predicted word is
- selected from the tooltip to the editor */
- if(!iPrimaryCandidate)
- iPtiEngine->HandleCommandL(EPtiCommandSetFlagToUpdateCandidates);
-
- TPtrC selectedWord = iPtiEngine->CurrentWord();
- UpdateInlineEditL( selectedWord, selectedWord.Length() );
- response = EKeyWasConsumed;
-
- }
- else
- {
- LaunchCandidatePopupListL( wordIndexToSelect );
- response = EKeyWasConsumed;
- }
- }
- else
- {
- if (!IsFlagSet(EFlagInsideMultitapInlineEditingTransaction))
- {
- TInt lastCandidateIndex = iPtiEngine->NumberOfCandidates() -1;
- if( EPtiKeyboard12Key == KeyboardLayout() && ( IsFlagSet(EFlagShiftKeyDepressed) ||
- HashKeySelectionInUse()&& IsCcpuFlagSet(ECcpuStateHashDown) ) )
- {
- if (response != EKeyWasConsumed)
- {
- response = HandleWesternPredictiveArrowKeyL(aCode, aLength);
- }
- }
- else if(aCode == EKeyUpArrow && lastCandidateIndex >= 0)
- {
- // Get last word on list
- LaunchCandidatePopupListL( lastCandidateIndex );
- response = EKeyWasConsumed;
- }
- else
- {
- // Get next word on list (wrap around if at end)
- iPtiEngine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates,
- &wordIndexToSelect );
- wordIndexToSelect < lastCandidateIndex ? wordIndexToSelect++ : wordIndexToSelect = 0;
- LaunchCandidatePopupListL( wordIndexToSelect );
- response = EKeyWasConsumed;
- }
- }
- else
- response = EKeyWasConsumed;
- }
- }
- else
- {
- // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
- if(iFepManState == EAknFepStateUIActive &&
- FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-
- // When press up, if FSQ is opened,
- // also need to check and close tooltip on it.
- SendEventsToPluginManL( EPluginHideTooltip );
-
- // Predictive QWERTY (XT9) changes ---->
- // Exact word popup is hidden when the exact word is selected
- iExactWordPopupContent->HidePopUp();
- // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
- // normal operation of Down/Up scroll keypress action.
- if (response != EKeyWasConsumed)
- {
- response = HandleWesternPredictiveArrowKeyL(aCode, aLength);
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- } // Predictive QWERTY (XT9) changes
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
- else
- {
- if (iFepManState == EAknFepStateUIActive)
- {
- FepUI()->HandleKeyL(aCode, aLength);
- response = EKeyWasConsumed;
- }
- else
- {
- TryHandleCommonArrowAndBackspaceFunctionalityL(aCode, response);
- }
- }
- }
- break;
- case EKeyBackspace:
- if (iLanguageCapabilities.iInputLanguageCode == ELangJapanese &&
- !(iMode == ELatin || iMode == ENumber))
- {
- if (FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
- }
- }
- else if (iLanguageCapabilities.iInputLanguageCode == ELangVietnamese)
- {
- TCursorSelection cursorSelection;
- if ( !IsFepAwareTextEditor() )
- {
- response = EKeyWasNotConsumed;
- }
- else
- {
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSelection);
- if (cursorSelection.Length() != 0)
- {
- response = EKeyWasNotConsumed;
- }
-#ifdef RD_SCALABLE_UI_V2
- else if ( !documentLength
- && ( iFepPluginManager->PluginInputMode() == EPluginInputModeItut
- || iFepPluginManager->PluginInputMode() == EPluginInputModeVkb ) )
- {
- response = EKeyWasConsumed;
- }
-#endif
- else
- {
- if (FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
- }
- else
- {
- if( WesternPredictive() )
- {
- // We need to start the autoconcatination timer
- SimulateKeyEventL(EKeyF24);
- }
- }
- }
- }
-
- }
- else if (IsKoreanInputLanguage() && iMode == EHangul)
- {
- if (FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
- }
- }
- else
- {
- if (iFepManState == EAknFepStateInitial)
- {
-#ifdef RD_SCALABLE_UI_V2
- if ( iFepPluginManager->PluginInputMode() == EPluginInputModeItut )
- {
- if ( iFepPluginManager->CurrentFepInputUI() &&
- FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
- break;
- }
- }
- if ( !documentLength
- && ( iFepPluginManager->PluginInputMode() == EPluginInputModeItut
- || iFepPluginManager->PluginInputMode() == EPluginInputModeVkb ) )
- {
- response = EKeyWasConsumed;
- break;
-
- }
-#endif
- if (IsFlagSet(EFlagLineFeedCharacter))
- {
- // restore cursor visibility
- if (IsFlagSet(EFlagInsideMultitapInlineEditingTransaction))
- {
- iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL(ETrue);
- }
-
- iInputCapabilities.FepAwareTextEditor()->CancelFepInlineEdit();
- ClearFlag(EFlagInsideMultitapInlineEditingTransaction |
- EFlagInsideInlineEditingTransaction |
- EFlagLineFeedCharacter);
- response = EKeyWasConsumed;
- }
- else
- {
- response = HandleNaviEventOutsideInlineEditL(aCode, aLength);
- if (WesternPredictive() && response == EKeyWasNotConsumed)
- {
- // if we're passing a backspace to the editor simulate any old keypress
- // to catch and check the state of play after the deletion
- SimulateKeyEventL(EKeyF24);
- }
- if (response == EKeyWasNotConsumed)
- {
- if(iMode == EZhuyinFind)
- {
- SetFlag(EFlagSupressAutoUpdate);
- }
- if (iLongClearAfterCloseUI &&
- aLength == ELongKeyPress)
- {
- response = EKeyWasConsumed;
- }
-
- iCaseMan->UpdateCase(EBackspaceEvent);
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(IsAutoCompleteOn())
- {
- TInt tailLength = 0;
- iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength,
- &tailLength );
- if(tailLength > 0)
- {
- RemoveSuggestedAdvanceCompletionL();
- }
- }
-#endif
- }
-
- // Clear the star key flag.
- if( FepUI() )
- {
- FepUI()->SetStarKeyFlag( EFalse );
- }
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- else if (IsAutoCompleteOn())
- {
- TInt tailLength = 0;
- iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength,
- &tailLength );
- if(tailLength > 0)
- {
- TryRemoveNoMatchesIndicatorL();
- RemoveSuggestedAdvanceCompletionL();
- SimulateKeyEventL(EKeyF19);
- UpdateCbaL(NULL);
- response=EKeyWasConsumed;
- }
- else if(FepUI()->HandleKeyL(aCode, aLength))
- {
- if( EPtiKeyboardHalfQwerty == KeyboardLayout()
- && iWesternPredictive
- && iCaseMan->CurrentCase() != EAknEditorUpperCase )
- {
- ClearFlag(CAknFepManager::EFlagChangeInputMode);
- }
- iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength );
- if(tailLength > 0)
- {
- RemoveSuggestedAdvanceCompletionL();
- }
- response = EKeyWasConsumed;
- }
- }
- else if(FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
- }
- SendEventsToPluginManL( EPluginHideTooltip );
- if(iExactWordPopupContent && iExactWordPopupContent->IsPopUpVisible())
- {
- iExactWordPopupContent->HidePopUp();
- }
-#else
- else if (FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
- break;
- case EKeyDelete:
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(IsAutoCompleteOn())
- {
- TInt tailLength = 0;
- iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength,
- &tailLength );
- if(tailLength > 0)
- {
- RemoveSuggestedAdvanceCompletionL();
- }
- }
-
- // When press delete key, if FSQ is opened,
- // also need to check and close tooltip on it.
- SendEventsToPluginManL( EPluginHideTooltip );
-
- if(iExactWordPopupContent && iExactWordPopupContent->IsPopUpVisible())
- {
- iExactWordPopupContent->HidePopUp();
- }
- if ( IsFlagSet( EFlagInsideInlineEditingTransaction ) )
- {
- TryRemoveNoMatchesIndicatorL();
- UpdateCbaL(NULL);
- CommitInlineEditL();
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
- break;
- case EKeyF19: // Fep simulated event to asynchronously update the case.
- iCaseMan->UpdateCase(ENullNaviEvent);
- response=EKeyWasConsumed;
- ClearExtendedFlag(EExtendedFlagOkKeyPressOnCandidatePopup );
- break;
- case EKeyF22:
- if (WesternPredictive())
- {
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- if (CursorInsideWord())
- {
- MoveCursorToEndOfWordL();
- }
- if (iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep())
- {
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- }
- else if (iMode == ELatin)
- {
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- ClearCcpuFlag(ECcpuStateIgnoreStarUp);
- response=EKeyWasConsumed;
- break;
- case EKeyF23:
- if (WesternPredictive())
- {
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- if (CursorInsideWord())
- {
- MoveCursorToStartOfWordL();
- }
- if (iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep())
- {
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- }
- else if (iMode == ELatin)
- {
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- ClearCcpuFlag(ECcpuStateIgnoreStarUp);
- response=EKeyWasConsumed;
- break;
- case EKeyF24:
- if (WesternPredictive() && CursorInsideWord())
- {
- // word concatenation - start the timer; add concatenated word
- // to UDB on timer expiry
- iConcatenationTimer->Start(EWordConcatenationTimeout, EWordConcatenationTimeout,
- TCallBack(WordConcatenationTimerTimeoutCallback, this));
- }
- response=EKeyWasConsumed;
- break;
- case EPtiKey0: //fall through
- case EPtiKey1:
- case EPtiKey2:
- case EPtiKey3:
- case EPtiKey4:
- case EPtiKey5:
- case EPtiKey6:
- case EPtiKey7:
- case EPtiKey8:
- case EPtiKey9:
- #ifdef RD_SCALABLE_UI_V2
- if ( aLength == ELongKeyPress && !isPassNext && (aCode == EPtiKey0) )
- {
- if( !IsQwerty() &&
- !IsFlagSet(CAknFepManager::EFlagPassNextKey)&&
- iFepPluginManager->PluginInputMode() != EPluginInputModeItut )
- {
- iFepPluginManager->ClosePluginInputModeL( ETrue );
- }
- }
- #endif
- if (IsFlagSet(EFlagLineFeedCharacter) && aCode != EPtiKey0)
- {
- // There is line feed character waiting. Pospone this event and handle
- // line feed first.
- CancelInlineEdit();
- if (!(iAknEditorFlags & EAknEditorFlagFindPane) || iQwertyInputMode)
- {
- SimulateKeyEventL(EKeyEnter);
- SimulateKeyEventL(EKeyF19); // Asyncronous case update
- }
- SimulateKeyEventL((TPtiKey)aCode);
- ClearFlag(EFlagLineFeedCharacter);
- return EKeyWasConsumed;
- }
- if (iLanguageCapabilities.iInputLanguageCode == ELangJapanese && iMode != ELatin)
- {
- if (EditorHasFreeSpace() || iFepManState == EAknFepStateUIActive)
- {
- if (FepUI()->HandleKeyL(aCode, aLength))
- {
- ClearFlag(EFlagChangeInputMode);
- response = EKeyWasConsumed;
- }
- // response is EKeyWasNotConsumed
- }
- }
- else
- {
- //pass extra key received when doing secret text edit
- if (IsFlagSet(EFlagPassNextKey))
- {
- ClearFlag(EFlagPassNextKey);
- }
- else if (IsFlagSet(EFlagShiftKeyDepressed) || IsCcpuFlagSet(ECcpuStateHashDown))
- {
- response = EKeyWasConsumed;
- }
-
- // The key event is passed to the editor to handle in case of
- // MFNE and other non FEP aware editors (response = EKeyWasNotConsumed).
- else if ( IsFepAwareTextEditor() )
- {
- if ( ( iMode != ENumber && iMode != ENativeNumber ) ||
- ( ( iMode == ENumber || iMode == ENativeNumber ) && aLength == ELongKeyPress))
- {
- // Be default the key event is handled by FEP for FEP aware editors.
- response = EKeyWasConsumed;
- }
-
- // New character can be entered to the editor if there is
- // space left in the editor. Editor can be modified also
- // is the last character is multitapped or last character
- // in inline state is replaced with a digit.
- /*Hindi*/
- //This condition is added for Hindi language in case of multitapping of EKey1 to get
- //a numeral value "1" because of a clasical case of Halant and ZWS getting added
- //before numeral 1 which may affect incase of limited space in editor
-
- if (( EditorHasFreeSpace()
- || (!WesternPredictive() && !EditorHasFreeSpace() &&
- (TAknFepUiIndicInputManager::IsIndicLangauge(
- TLanguage(iLanguageCapabilities.iInputLanguageCode))))
- || IsFlagSet(EFlagInsideMultitapInlineEditingTransaction)
- || (IsFlagSet(EFlagInsideInlineEditingTransaction) && aLength == ELongKeyPress)))
- {
- ClearFlag(EFlagEditorFull);
-
- if (aLength == ELongKeyPress &&
- (iMode != ELatin && iMode != ENumber && iMode != ENativeNumber && iMode != EStrokeFind && iMode != EHangul) &&
- FepUI()->IsValidNumericLongKeyPress(aCode))
- {
- if (iFepManState == EAknFepStateInitial) // Multitapping
- {
-#ifdef RD_SCALABLE_UI_V2
- if (iFepFullyConstructed &&
- iFepPluginManager->CurrentFepInputUI() )
- {
- if (iFepPluginManager->CurrentFepInputUI()->HandleKeyL(aCode,
- aLength))
- {
- response = EKeyWasConsumed;
- break;
- }
- }
-#endif
- // Current multitabbed character is replaced with a number.
- TChar ch(aCode);
- TBuf<1> buf;
- buf.Append(ch);
- NewCharacterL(buf);
- CommitInlineEditL();
- iPtiEngine->ClearCurrentWord();
- }
- else
- {
- // Long number key press is given to the editor.
- TryCloseUiL();
- response = EKeyWasNotConsumed;
- }
- }
- else if (FepUI()->HandleKeyL(aCode, aLength))
- {
- if ( (iMode == EPinyin || iMode == EZhuyin || iMode == EStroke || iMode == ECangJie)
- && iFepManState == EAknFepStateUIActive )
- {
- if ( EditorState() )
- {
- EditorState()->SetFlags( EditorState()->Flags() | EAknEditorFlagChinesePopup );
- }
- }
- ClearFlag(EFlagChangeInputMode);
- // for japanese variant
- if (IsFeatureSupportedJapanese()
- && iMode == ENumber)
- {
- response = EKeyWasConsumed;
- }
- }
- else
- {
- //By default, pass long keypress to an editor for inserting number.
- response = EKeyWasNotConsumed;
- //No need to handle long key press in dialer
- if ( RProcess().SecureId().iId != KPhoneSecureId )
- {
-
- if ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic )
- {
- SimulateKeyEventL( aCode + KLatinToArabicIndicDigitsDelta );
- response = EKeyWasConsumed;
- }
- else if( iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic )
- {
- SimulateKeyEventL( aCode + KLatinToEasternArabicIndicDigitsDelta );
- response = EKeyWasConsumed;
- }
- /*Hindi*/
- else if ( iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari
- || iPreviousEditingState == EDevanagariIndicNumeric )
- {
-
- SimulateKeyEventL( aCode + KLatinToDevanagariDigitsDelta );
-
- response = EKeyWasConsumed;
- }
- }
- }
- }
- }
- }
- break;
- case EKeyOK:
- {
- if (iUiInterface->SoftkeysExist() && EditSubmenuInUse())
- {
- if (iUiInterface->SoftkeyCommandId(ELeftSoftkeyIndex) == EAknFepSoftkeyStartCopy)
- {
- ProcessCommandL(EAknFepSoftkeyStartCopy);
- response = EKeyWasConsumed;
- break;
- }
- else if (iUiInterface->SoftkeyCommandId(ELeftSoftkeyIndex) == EAknFepSoftkeyStartCut)
- {
- ProcessCommandL(EAknFepSoftkeyStartCut);
- response = EKeyWasConsumed;
- break;
- }
- else if (iUiInterface->SoftkeyCommandId(ELeftSoftkeyIndex) == EEikCmdEditCopy)
- {
- ProcessCommandL(EEikCmdEditCopy);
- response = EKeyWasConsumed;
- break;
- }
- else if (iUiInterface->SoftkeyCommandId(ELeftSoftkeyIndex) == EEikCmdEditCut)
- {
- ProcessCommandL(EEikCmdEditCut);
- response = EKeyWasConsumed;
- break;
- }
- }
-
- if ( (iAknEditorFlags & EAknEditorFlagNoLRNavigation) &&
- IsFlagSet(EFlagShiftKeyDepressed) )
- {
- // Selection key is pressed during shift key press.
- ClearFlag(EFlagNoActionDuringShiftKeyPress);
- return EKeyWasNotConsumed;
- }
- if (iLanguageCapabilities.iInputLanguageCode == ELangJapanese && iMode != ELatin)
- {
- if (FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
- }
- }
- else
- {
- if (IsFlagSet(EFlagShiftKeyDepressed) &&
- !(iAknEditorFlags & EAknEditorFlagSupressShiftMenu))
- {
- response = EKeyWasConsumed;
- }
- else if (iFepManState == EAknFepStateUIActive)
- {
- if (FepUI()->HandleKeyL(aCode, aLength))
- {
- response = EKeyWasConsumed;
- }
- }
- else if (iMode == ELatin && !WesternPredictive() &&
- IsFlagSet(EFlagInsideMultitapInlineEditingTransaction))
- {
- CommitInlineEditL();
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- // Accept current candidate (including possible auto-completed part) and insert space after the word
- // if selection key pressed while inline editing (on Qwerty only!)
- // this is not the expected behavior for half qwerty
-
- TBool isQwertyMode = iQwertyInputMode &&
- !( EPtiKeyboardHalfQwerty == KeyboardLayout() );
- if ( response == EKeyWasNotConsumed && iWesternPredictive && isQwertyMode &&
- IsFlagSet(EFlagInsideInlineEditingTransaction)
- // For addition of ITI features on FSQ.
- // If FSQ is opened with ITI features activated, don't commit as HW's action
- && !( iFepPluginManager && iFepPluginManager->EnableITIOnFSQ() ) )
- {
-
- // If the primary candidate setting is exact typing, The tooltip/bubble always shows the best prediction.
- // Word on the typing line is accepted into editor on selection key event..
-
- iPtiEngine->CommitCurrentWord();
- CommitInlineEditL();
- TryCloseUiL();
- if(!static_cast<TChar>(NextChar()).IsSpace())
- {
- SimulateKeyEventL(EKeySpace);
- }
- else
- {
- TCursorSelection sel;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(sel);
- sel.iCursorPos++;
- sel.iAnchorPos++;
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel);
- }
- SimulateKeyEventL(EKeyF19); // asynchronous case update
-
- response = EKeyWasConsumed;
- }
- // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
- }
- break;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- case EKeyPhoneEnd:
- {
- // Suggested word should get committed in exact typing
- if ( iWesternPredictive &&
- IsFlagSet(EFlagInsideInlineEditingTransaction) )
- {
-
- // If the primary candidate setting is exact typing, The tooltip/bubble always shows the best prediction.
- // Word on the typing line is accepted into editor on end key event..
-
- iPtiEngine->CommitCurrentWord();
- CommitInlineEditL();
- TryCloseUiL();
- ClearFlag(CAknFepManager::EFlagNoMatches);
- SimulateKeyEventL(EKeyF19); // asynchronous case update
- }
- }
- break;
-#endif //RD_INTELLIGENT_TEXT_INPUT
- default:
- break;
- }
- SchedulePostEventCheckL(aCode);
-
-#ifdef RD_SCALABLE_UI_V2
- if ( !isPassNext )
- {
- SendEventsToPluginManL( EPluginKeyEvent, aCode );
- }
-#endif
-
- return response;
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-void CAknFepManager::HandleShiftHalfQwertyChineseL(TEventCode aEventCode)
- {
- if (aEventCode == EEventKeyDown)
- {
- ClearCcpuFlag(ECcpuStateCbaShown);
- SetFlag(EFlagShiftKeyDepressed | EFlagNoActionDuringShiftKeyPress);
- ClearFlag(EFlagNoActionDuringChrKeyPress);
- SetFlag(EFlagQwertyShiftMode);
- // Long press of shift key timer is activated.
- iShiftKeypressMonitor->Start(EShiftKeyRepeatDelay,
- EShiftKeyRepeatDelay, TCallBack(ResetShiftKeyMonitorCallback,
- this) );
- }
- else if (aEventCode == EEventKeyUp)
- {
- ClearFlag(EFlagShiftKeyDepressed
- |EFlagNoActionDuringShiftKeyPress);
- ClearFlag(EFlagQwertyShiftMode);
- iShiftKeypressMonitor->Cancel();
-
- if ( (iKeyPressedDuringShift)|| IsFlagSet(EFlagLongShiftKeyPress) )
- {
- iKeyPressedDuringShift = EFalse;
- ClearFlag( EFlagLongShiftKeyPress );
- if ( iFnKeyManager->FnKeyState() )
- {
- iFnKeyManager->SetFnKeyState( CAknFepFnKeyManager::EFnKeyNone );
- }
- UpdateIndicators();
- }
- else
- {
- CAknEdwinState* editorState = EditorState();
- TInt permittedCases = editorState->PermittedCases();
- permittedCases = permittedCases == 0 ?
- EAknEditorLowerCase | EAknEditorUpperCase : permittedCases;
-
- if (iMode == ELatin && (permittedCases & EAknEditorTextCase))
- {
- // Latin case update is changed back to automatic if latin
- // text case is allowed and the case is changed manually from #-key.
- ClearFlag(CAknFepManager::EFlagSupressAutoUpdate);
- }
- TInt currentCase = iCaseMan->CurrentCase();
-
- // Is current latin case last available case.
- TBool lastCase = ( ( !(permittedCases & EAknEditorTextCase)
- && ((currentCase == EAknEditorLowerCase)
- || (currentCase == EAknEditorUpperCase
- && !(permittedCases
- & EAknEditorLowerCase)) )
- || (editorState->Flags() & EAknEditorFlagFixedCase) )
- || (editorState->Flags()
- & EAknEditorFlagForceTransparentFepModes) );
-
- if (iMode == ELatin
- && !IsFlagSet(CAknFepManager::EFlagChangeInputMode)
- && !lastCase)
- {
- if (iWesternPredictive)
- {
- // Input mode is still Latin. Only case is updated.
- if (permittedCases & EAknEditorTextCase)
- {
- iCaseMan->ManualCaseUpdate();
- }
- else
- {
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- }
- }
- else
- {
- if(iCaseMan->CurrentCase() == EAknEditorUpperCase)
- {
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- }
- else
- {
- iCaseMan->SetCurrentCase(EAknEditorUpperCase);
- }
- }
-
- // Next time input mode is changed if any text is not entered before.
- SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- else
- {
- // Input mode is incremented.
- SetChangeModeByShiftAndSpace( EFalse );
- TryIncrementChineseModeForQwertyL(iMode);
-
- ClearFlag(CAknFepManager::EFlagChangeInputMode);
-
- if ( iMode == ELatin && iWesternPredictive ) // New mode after Increment.
-
- {
- if (editorState->Flags() & EAknEditorFlagFixedCase)
- {
- // Only one fixed case is available. Use it.
- iCaseMan->ConfigureCaseStateFromEditorState();
- SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- else if (editorState->Flags()
- & EAknEditorFlagForceTransparentFepModes)
- {
- // Only lower case is used with find pane.
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- SetFlag(CAknFepManager::EFlagSupressAutoUpdate);
- SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- else if (permittedCases & EAknEditorTextCase)
- {
- iCaseMan->SetCurrentCase(EAknEditorTextCase);
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- else
- {
- if (permittedCases & EAknEditorUpperCase)
- {
- iCaseMan->SetCurrentCase(EAknEditorUpperCase);
- if ( !(permittedCases
- & EAknEditorLowerCase))
- {
- // We need to move to next input mode since only upper case
- // is permitted in Latin input mode.
- SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- }
- else
- {
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- }
- }
- }
- }
- }
- }
-
-void CAknFepManager::HandleShiftQwertyChineseL(TEventCode aEventCode)
- {
- if ( IsFlagSet( EFlagQwertyChrKeyDepressed ) &&
- !IsFeatureSupportedJapanese() &&
- iCurrentFepUI->IsValidShiftKeyPress())
- {
- ClearFlag(EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress);
- LaunchLanguagesPopupListL();
- return;
- }
-
- TInt language = iSharedDataInterface->InputTextLanguage();
-
- if (aEventCode == EEventKeyUp)
- {
- ClearCcpuFlag(ECcpuStateCbaShown);
- if (FepUI())
- {
- FepUI()->HandleKeyL(EKeyLeftShift, EShortKeyPress);
- }
- TBool validShift = iCurrentFepUI->IsValidShiftKeyPress();
-
- if (IsFlagSet(EFlagLongShiftKeyPress) ||iKeyPressedDuringShift)
- {
- if (iKeyPressedDuringShift || IsFlagSet(EFlagQwertyShiftMode))
- {
- iShiftKeypressMonitor->Cancel();
- iKeyPressedDuringShift = EFalse;
- ClearFlag(EFlagQwertyShiftMode);
- }
- }
- else
- if (IsFlagSet(EFlagQwertyShiftMode))
- {
- if ( iMode != ELatin && validShift )
- {
- iModeBefore = iMode;
- TryChangeModeL(ELatin);
- ClearFlag( EFlagQwertyShiftMode );
- }
- }
- else
- {
- if (iMode == ELatin)
- {
- TBool isWsPr= EFalse;
- if (WesternPredictive())
- {
- SetWesternPredictive(EFalse);
- isWsPr = ETrue;
- }
- TInt Modetemp = iModeBefore;
- TInt sharedDataMode = iSharedDataInterface->InputMode();
- if (Modetemp == EStroke &&
- iQwertyInputMode &&
- sharedDataMode == ECangJie)
- {
- Modetemp = ECangJie;
- }
-
- TryChangeModeL(Modetemp);
- if (isWsPr)
- {
- SetWesternPredictive(ETrue);
- }
- }
- }
-
- ClearFlag(EFlagShiftKeyDepressed);
-
- if (IsFlagSet(EFlagLongShiftKeyPress)
- && iMode == ELatin
- && IsFlagSet(EFlagQwertyShiftMode))//latin shift ->abc
- {
- ClearFlag(EFlagQwertyShiftMode);
- }
-
- if (IsFlagSet(EFlagLongShiftKeyPress)) //long keypress up
- {
- ClearFlag(EFlagLongShiftKeyPress
- |EFlagNoActionDuringShiftKeyPress);
- }
- else // short keypress up
- {
- iShiftKeypressMonitor->Cancel();
- }
-
- ClearFlag(EFlagNoActionDuringChrKeyPress);
- ClearFlag(EFlagNoActionDuringShiftKeyPress);
- if ( validShift )
- {
- UpdateIndicators();
- }
- else
- {
- ClearFlag(EFlagQwertyShiftMode);
- }
- }
- else
- if (aEventCode == EEventKeyDown)
- {
-
- SetFlag(EFlagShiftKeyDepressed | EFlagNoActionDuringShiftKeyPress);
- ClearFlag(EFlagNoActionDuringChrKeyPress);
-
- if (IsFlagSet(EFlagQwertyShiftMode))
- {
- ClearFlag(EFlagQwertyShiftMode);
- }
- else
- {
- SetFlag(EFlagQwertyShiftMode);
- if ( iCurrentFepUI->IsValidShiftKeyPress()
- || iMode == ELatin )
- {
- UpdateIndicators();
- }
- // If the iShiftKeypressMonitor is actived now, cancel it first.
- iShiftKeypressMonitor->Cancel();
- // Long press of shift key timer is activated.
- iShiftKeypressMonitor->Start(EShiftKeyRepeatDelay,
- EShiftKeyRepeatDelay, TCallBack(
- ResetShiftKeyMonitorCallback, this));
- }
- }
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
-TKeyResponse CAknFepManager::HandleShiftKeyEventL(TEventCode aEventCode)
- {
- TKeyResponse response = EKeyWasNotConsumed;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // GQF clarification
- // In case irrespective Fn/shift key Text case should not be changed.
- // Like Shift +Fn + Shift should not toggle the text case of the editor.
- // Only Consecutive press of shift key should change the text case
- if( iQwertyInputMode && (EEventKeyDown== aEventCode) && EPtiKeyboardHalfQwerty != KeyboardLayout())
- {
- if( (iFnKeyManager->FnKeyState() == CAknFepFnKeyManager::EFnKeyNext) &&
- IsFlagSet(EFlagQwertyShiftMode))
- {
- iFnKeyManager->ClearFnKeyState();
- iPtiEngine->SetCase((TPtiTextCase)EPtiCaseLower);
- ClearFlag(EFlagQwertyShiftMode);
- }
- }
- TInt language = iSharedDataInterface->InputTextLanguage();
-#endif
-
- if (iQwertyInputMode)
- {
- if ( !iInputCapabilities.FepAwareTextEditor() )
- {
- response = EKeyWasNotConsumed;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- else if (language == ELangTaiwanChinese||
- language == ELangHongKongChinese ||
- language == ELangPrcChinese)
- {
- if ( ( EPtiKeyboardHalfQwerty == KeyboardLayout() && FepUI() ) &&
- iPtiEngine &&
- ( EPtiCaseFnUpper == iPtiEngine->Case() || EPtiCaseFnLower == iPtiEngine->Case() ) &&
- ( aEventCode == EEventKeyDown || aEventCode == EEventKeyUp ) )
- {
- // Ignore the KeyUp event
- if( aEventCode == EEventKeyDown )
- {
- FepUI()->HandleKeyL( EPtiKeyQwertyLeftShift,
- EShortKeyPress );
- }
- if( aEventCode == EEventKeyUp )
- {
- ClearCcpuFlag(ECcpuStateCbaShown);
- }
- }
- else
- {
- if ((iAknEditorFlags & EAknEditorFlagFindPane)&& (CAknFepFnKeyManager::EFnKeyNone ==FnKeyState()))
- {
- if (aEventCode == EEventKeyUp)
- {
- ClearCcpuFlag(ECcpuStateCbaShown);
- if ( iKeyPressedDuringShift )
- {
- iKeyPressedDuringShift = EFalse;
- }
- else
- {
- TryIncrementModeChineseQwertyL( iMode );
- }
- ClearFlag( EFlagShiftKeyDepressed | EFlagNoActionDuringShiftKeyPress );
- }
- else if(aEventCode == EEventKeyDown)
- {
- SetFlag(EFlagShiftKeyDepressed | EFlagNoActionDuringShiftKeyPress);
- ClearFlag(EFlagNoActionDuringChrKeyPress);
- }
- return EKeyWasConsumed;
- }
- if (EPtiKeyboardHalfQwerty == KeyboardLayout())
- {
- HandleShiftHalfQwertyChineseL(aEventCode);
- }
- else
- {
- HandleShiftQwertyChineseL(aEventCode);
- }
- }
- }
-#endif // ITI flag
- else if (aEventCode == EEventKeyDown)
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
- if( ( EPtiKeyboardHalfQwerty == KeyboardLayout() && FepUI() ) &&
- iPtiEngine && EditorHasFreeSpace())
- {
- if (IsFlagSet(CAknFepManager::EFlagInsideMultitapInlineEditingTransaction))
- {
- iPtiEngine->CancelTimerActivity();
- }
- if( EPtiCaseFnUpper == iPtiEngine->Case() || EPtiCaseFnLower == iPtiEngine->Case() )
- {
- FepUI()->HandleKeyL( EPtiKeyQwertyLeftShift,
- EShortKeyPress );
- iFnCharInsertedForShift = ETrue;
- }
- }
-#endif // Half Qwerty flag
-#endif // ITI flag
-
- // Shift key is pressed down.
- SetFlag(EFlagShiftKeyDepressed | EFlagNoActionDuringShiftKeyPress);
- ClearFlag(EFlagNoActionDuringChrKeyPress);
- if ( IsFlagSet(EFlagQwertyShiftMode) && IsFlagSet(EFlagNoActionDuringShiftKeyPress) )
- {
- ClearFlag(EFlagQwertyShiftMode | EFlagNoActionDuringShiftKeyPress);
- // If long shift key press flag is set, then do not do manual case update.
- if (!IsFlagSet(EFlagLongShiftKeyPress))
- {
- iCaseMan->ManualCaseUpdate();
- }
- }
- else
- {
- if (!(iCurrentFepUI->IsValidShiftKeyPress()))
- {
- return EKeyWasConsumed;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
- if(!iFnCharInsertedForShift)
-#endif //RD_INTELLIGENT_TEXT_INPUT
-#endif //__HALF_QWERTY_KEYPAD
- {
- SetFlag(EFlagQwertyShiftMode);
- }
-
- if(iShiftKeypressMonitor->IsActive())
- iShiftKeypressMonitor->Cancel();
- // Long press of shift key timer is activated.
- iShiftKeypressMonitor->Start(EShiftKeyRepeatDelay, EShiftKeyRepeatDelay,
- TCallBack(ResetShiftKeyMonitorCallback, this));
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Shift kkey hack for GQF implementation. Need to check
- // if it has any side effect.
- if((iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyLock)
- && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyForced)
- && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyDown)
- && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNext))
-#endif
- UpdateIndicators();
- }
- }
- else if (aEventCode == EEventKeyUp)
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
- if( ( EPtiKeyboardHalfQwerty == KeyboardLayout() && FepUI() ) &&
- iPtiEngine )
- {
- ClearCcpuFlag(ECcpuStateHashDown
- | ECcpuStateHashKeyDeleteDone
- | ECcpuStateChangeToPredictionMode);
- if (IsCcpuFlagSet(ECcpuStateEdwinInSelectionMode))
- {
- SetCcpuFlag(ECcpuStateSelectionEventPosted);
- ClearCcpuFlag(ECcpuStateEdwinInSelectionMode);
- SetFlag(EFlagLongShiftKeyPress);
-
- TKeyEvent ccpuStart = {0, EStdKeyLeftShift, 0, 0};
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, aEventCode);
- }
- if( CAknFepFnKeyManager::EFnKeyNone != FnKeyState())
- {
- ClearFlag(EFlagQwertyShiftMode);
- }
- // iFnCharInsertedForShift = EFalse;
- }
-
-#endif // Half Qwerty flag
-#endif // ITI flag
-
- ClearFlag(EFlagShiftKeyDepressed);
- ClearCcpuFlag(ECcpuStateCbaShown);
- if ( !IsFlagSet(EFlagNoActionDuringShiftKeyPress) ||
- (IsFlagSet(EFlagNoActionDuringShiftKeyPress) && IsFlagSet(EFlagLongShiftKeyPress)) )
- {
- ClearFlag(EFlagQwertyShiftMode);
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
- if( IsFlagSet(EFlagQwertyChrKeyDepressed) && IsFlagSet(EFlagNoActionDuringShiftKeyPress))
- {
-#ifdef FF_DUAL_LANGUAGE_SUPPORT
- // Currently dual language feature would work correctly for ITUT and Half Qwerty products
- // Hence the dual language settings should also be displayed only for ITUT and Halfqwerty products
- if(iKeyboardType == EPtiKeyboardHalfQwerty )
- LaunchDualLanguageSettingDialogL();
- else
-#endif //FF_DUAL_LANGUAGE_SUPPORT
- LaunchLanguagesPopupListL();
- ClearFlag(EFlagQwertyChrKeyDepressed|EFlagNoActionDuringChrKeyPress|EFlagNoActionDuringShiftKeyPress);
- }
-
-#ifdef __SHIFT_KEY_LOOP
- if( KeyboardLayout() == EPtiKeyboardHalfQwerty &&
- // looping does not happen for long key press
- !IsFlagSet(EFlagLongShiftKeyPress) &&
- // looping does not happen in functionized state
- iFnKeyManager->FnKeyState() == CAknFepFnKeyManager::EFnKeyNone &&
- // looping happens only when no action
- // has happened when the shift key has been pressed
- IsFlagSet(EFlagNoActionDuringShiftKeyPress) && !iFnCharInsertedForShift )
- {
- HandleKeyEventL( EStdKeyLeftShift, EShortKeyPress );
- ClearFlag(EFlagQwertyShiftMode);
- }
- iFnCharInsertedForShift = EFalse;
-#endif //__SHIFT_KEY_LOOP
-#endif //__HALF_QWERTY_KEYPAD
-#endif //RD_INTELLIGENT_TEXT_INPUT
- if (IsFlagSet(EFlagLongShiftKeyPress)) //long keypress up
- {
- ClearFlag(EFlagLongShiftKeyPress);
- }
- else // short keypress up
- {
- iShiftKeypressMonitor->Cancel();
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
-#ifdef __SHIFT_KEY_LOOP
- // Cancel multitap timer
-
- if( iPtiEngine != NULL )
- {
- iPtiEngine->CancelTimerActivity();
- }
-#endif //__SHIFT_KEY_LOOP
-#endif //__HALF_QWERTY_KEYPAD
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
- ClearFlag( EFlagNoActionDuringShiftKeyPress );
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Shift kkey hack for GQF implementation. Need to check
- // if it has any side effect.
- if((iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyLock)
- && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyForced)
- && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyDown)
- &&(iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNext))
-#endif
- UpdateIndicators();
- }
- }
- else
- {
- if ( !iInputCapabilities.FepAwareTextEditor() && (!iCandidatePopup))
- {
- response = EKeyWasNotConsumed;
- }
- else if (aEventCode == EEventKeyDown)
- {
- if (Japanese() && iInputCapabilities.FepAwareTextEditor())
- {
- if (!(iCurrentFepUI->IsValidShiftKeyPress()))
- {
- return EKeyWasConsumed;
- }
- TryCloseUiL();
- }
-
- // Shift key is pressed down but no any other key is pressed.
- ClearCcpuFlag(ECcpuSupressEditMenuFromShiftUp);
- SetFlag(EFlagShiftKeyDepressed | EFlagNoActionDuringShiftKeyPress);
- if ( !(iAknEditorFlags & EAknEditorFlagNoLRNavigation))
- {
- // Cancel the timer first if active.
- // EEventKeyUp is not sent always for shift key during debugging on emulator.
- iShiftKeypressMonitor->Cancel();
- // Long press of shift key timer is activated.
- iShiftKeypressMonitor->Start(EShiftKeyRepeatDelay, EShiftKeyRepeatDelay,
- TCallBack(ResetShiftKeyMonitorCallback, this));
- }
- if ( IsFlagSet(EFlagInsideInlineEditingTransaction) &&
- WesternPredictive() && iFepManState == EAknFepStateUIActive )
- {
- TryRemoveNoMatchesIndicatorL();
- UpdateCbaL(NULL);
- }
- }
- else if (aEventCode == EEventKeyUp)
- {
- ClearFlag(EFlagShiftKeyDepressed);
- ClearCcpuFlag(ECcpuStateCbaShown);
- if (IsFlagSet(EFlagLongShiftKeyPress)) //long keypress up
- {
- ClearFlag(EFlagLongShiftKeyPress | EFlagNoActionDuringShiftKeyPress);
- // Shift long key press timer started, in between release of
- // Shift key should cancel active long shift key timer.
- iShiftKeypressMonitor->Cancel();
- if (!iInputCapabilities.FepAwareTextEditor())
- {
- TKeyEvent ccpuStart = {0, EStdKeyLeftShift, 0, 0};
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKeyUp);
- }
- }
- else // short keypress up
- {
- iShiftKeypressMonitor->Cancel();
- if (!(iAknEditorFlags & EAknEditorFlagSupressShiftMenu) &&
- IsFlagSet(EFlagNoActionDuringShiftKeyPress) && //iCurrentFepUI->IsValidShiftKeyPress() &&
- !IsCcpuFlagSet(ECcpuSupressEditMenuFromShiftUp))
- {
- // Shift key is released before any other key is pressed.
- // Edit menu is launched if it is allowed.
- ClearFlag(EFlagNoActionDuringShiftKeyPress);
- //Check if pointer event drag is not there before launch of edit menu.
- if( !IsExtendedFlagSet(EExtendedFlagPointerEventTypeEDrag))
- {
- LaunchSelectModeMenuL();
- }
-
- if (iInputCapabilities.FepAwareTextEditor())
- {
- response = EKeyWasConsumed;
- }
- }
- }
- }
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if (aEventCode == EEventKeyUp &&
- EPtiKeyboardQwerty4x10 == KeyboardLayout() && FepUI())
- {
- FepUI()->HandleKeyL(EKeyLeftShift, EShortKeyPress);
- }
-#endif
- return response;
- }
-
-TKeyResponse CAknFepManager::HandleThai0KeyEvent(TEventCode aEventCode, TKeyPressLength aLength,
- TBool& aThai0KeyHandling)
- {
- TKeyResponse response = EKeyWasNotConsumed;
- aThai0KeyHandling = EFalse;
- if(iQwertyInputMode)
- {
- return response;
- }
-
- if ( iLanguageCapabilities.iInputLanguageCode == ELangThai &&
- iMode != ENumber && iMode != ENativeNumber )
- {
- if (!IsPredictive())
- {
- if (aEventCode != EEventKeyUp)
- {
- response = EKeyWasConsumed;
- if ( aLength == ELongKeyPress)
- {
- if (!iLongThai0Key)
- {
- iLongThai0Key = ETrue;
- response = EKeyWasNotConsumed; // 0 to editor
- aThai0KeyHandling = ETrue;
- }
- }
- }
-
- else if (aEventCode == EEventKeyUp)
- {
- if (iLongThai0Key)
- {
- iLongThai0Key = EFalse;
- response = EKeyWasConsumed;
- }
- else
- {
- response = EKeyWasNotConsumed; // Show Thai 0 key SCT
- aThai0KeyHandling = ETrue;
- }
- }
- }
- }
- return response;
- }
-
-TBool CAknFepManager::HandleQwertyChrKeyEventL(TEventCode aEventCode)
- {
- TBool response = EFalse;
- if ( !iQwertyInputMode || !iInputCapabilities.FepAwareTextEditor() )
- {
- return response;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(IsFlagSet(EFlagShiftKeyDepressed))
- {
- iKeyPressedDuringShift = ETrue;
- }
-#ifdef __HALF_QWERTY_KEYPAD
-
- if( (aEventCode == EEventKeyUp) )
- {
- ClearFlag(EFlagQwertyChrKeyDepressed);
- }
- // Handle shift for Half Qwerty seperately
- if( ( EPtiKeyboardHalfQwerty == KeyboardLayout() && FepUI() ) &&
- iPtiEngine /*&&
- ( aEventCode == EEventKeyDown || aEventCode == EEventKeyUp ) */ && !IsFlagSet(EFlagShiftKeyDepressed))
- {
-
- if( HandleChrKeyForHalfQwertyL(aEventCode) )
- {
- return ETrue;
- }
- }
-#endif // Half Qwerty flag
- // This part of code for error fixing.
- // whenever fep is Fnupper state, press of "CHR" key
- // always launch SCT table.
- if( (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNone)&&
- (IsFlagSet(EFlagQwertyShiftMode) || IsFlagSet(EFlagLongShiftKeyPress)))
- {
- ClearFlag(EFlagNoActionDuringShiftKeyPress | EFlagLongShiftKeyPress | EFlagShiftKeyDepressed | EFlagQwertyShiftMode);
- iShiftKeypressMonitor->Cancel();
- SetFlag(EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress);
- return response;
- }
-
-
-#endif // ITI flag
- if (aEventCode == EEventKeyDown)
- {
- SetFlag(EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress);
- response = EFalse;
-
- if (IsFeatureSupportedJapanese() ||
- ( IsChineseInputLanguage()
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- && KeyboardLayout() == EPtiKeyboardHalfQwerty
-#endif //RD_INTELLIGENT_TEXT_INPUT
- ) )
- {
- // start timer for Chr key long pressing
- iChrKeypressMonitor->Start(EChrKeyRepeatDelay, EChrKeyRepeatDelay,
- TCallBack(HandleChrKeyMonitorCallback, this));
- }
- }
- else if (aEventCode == EEventKeyUp)
- {
- if (iChrKeypressMonitor->IsActive())
- {
- iChrKeypressMonitor->Cancel();
- }
-
- if (IsFlagSet(EFlagShiftKeyDepressed) && IsFlagSet(EFlagNoActionDuringChrKeyPress)
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- ||
- IsFlagSet(EFlagQwertyShiftMode)
-#endif
- )
- {
- ClearFlag(EFlagNoActionDuringShiftKeyPress | EFlagLongShiftKeyPress |
- EFlagShiftKeyDepressed | EFlagQwertyShiftMode |EFlagQwertyChrKeyDepressed);
- iShiftKeypressMonitor->Cancel();
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- iKeyPressedDuringShift = EFalse;
-#endif
- UpdateIndicators();
- // In Japanese variant, the selecting input language is unnecessary.
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if (EPtiKeyboardQwerty4x10 == KeyboardLayout() || EPtiKeyboardHalfQwerty == KeyboardLayout())
- {
- if (!IsFeatureSupportedJapanese() && iCurrentFepUI->IsValidShiftKeyPress())
- {
-#ifdef FF_DUAL_LANGUAGE_SUPPORT
- // Currently dual language feature would work correctly for ITUT and Half Qwerty products
- // Hence the dual language settings should also be displayed only for ITUT and Halfqwerty products
- if(iKeyboardType == EPtiKeyboard12Key || iKeyboardType == EPtiKeyboardHalfQwerty )
- LaunchDualLanguageSettingDialogL();
- else
-#endif //FF_DUAL_LANGUAGE_SUPPORT
- LaunchLanguagesPopupListL();
- }
- }
- else
- {
-#endif
- if (!IsFeatureSupportedJapanese() && iCurrentFepUI->IsValidShiftKeyPress())
- {
- LaunchLanguagesPopupListL();
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- }
-#endif
- }
- else if (IsFlagSet(EFlagNoActionDuringChrKeyPress))
- {
- // pass key to Chinese UI manager in Chinese qwerty input for sct table
- if(IsChineseInputLanguage() && iMode != ELatin)
- {
- FepUI()->HandleKeyL(EStdKeyLeftFunc, EShortKeyPress);
- ClearFlag( EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress );
- }
- else if (Japanese())
- {
- if (iMode != EHiragana)
- {
- // Commit characters
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Set the iSupressCursorMoveToEndChrKeyPressed when cursor is in
- // between two words and SCT is launched
- iSupressCursorMoveToEndChrKeyPressed = ETrue;
-#endif //RD_INTELLIGENT_TEXT_INPUT
- HandleChangeInFocus();
- LaunchSpecialCharacterTableL();
- }
- }
- else if ( IsAbleToLaunchSCT() )
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Set the iSupressCursorMoveToEndChrKeyPressed when cursor is in
- // between two words and SCT is launched
- iSupressCursorMoveToEndChrKeyPressed = ETrue;
-#endif //RD_INTELLIGENT_TEXT_INPUT
- HandleChangeInFocus();
- LaunchSpecialCharacterTableL();
- }
- else if(IsFlagSet(EFlagQwertyChrKeyDepressed))
- {
- ClearFlag(EFlagQwertyChrKeyDepressed);
- }
- }
- else
- {
- FepUI()->ExpireMultitapTimer();
- ClearFlag(EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress);
-
- response = ETrue;
- }
- }
- return response;
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
-TKeyResponse CAknFepManager::HandleChrKeyForHalfQwertyL( TEventCode aEventCode)
- {
- if ((IsFlagSet(CAknFepManager::EFlagInsideMultitapInlineEditingTransaction)) && !(EPtiCaseFnUpper == iPtiEngine->Case() || EPtiCaseFnLower == iPtiEngine->Case()))
- {
- iPtiEngine->CancelTimerActivity();
- }
- // in functionized mode the chr key is mapped to specific chars
- // and should therefore be handled by the states
- if ( EPtiCaseFnUpper == iPtiEngine->Case() || EPtiCaseFnLower == iPtiEngine->Case() || IsReverseFnkeyInput())
- {
- if( aEventCode == EEventKeyDown && ( EditorHasFreeSpace() ||
- IsFlagSet( EFlagInsideMultitapInlineEditingTransaction )))
- {
- FepUI()->HandleKeyL( EStdKeyLeftFunc,
- EShortKeyPress );
- }
- return EKeyWasConsumed;
- }
- // in non-functionized predictive mode,
- // a long key press of the chr key should produce the SCT
- // a short key press should produce the candidate list
- if ( ( iWesternPredictive || IsChineseInputLanguage() ) /*&&
- ( iMode != EPinyin && iMode != EStroke && iMode != EZhuyin )*/ )
- {
-
- if(!iChrKeypressMonitor->IsActive())
- {
- // this monitors long key presses of chr key
- // the framework does not give us the iRepeats info
- // for chr key for some reason
- iChrKeypressMonitor->Start(EHalfQwertyChrKeyRepeatDelay, EHalfQwertyChrKeyRepeatDelay,
- TCallBack(HandleChrKeyMonitorCallback, this));
- }
-
- if( aEventCode != EEventKeyUp )
- {
- SetFlag( EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress);
- return EKeyWasConsumed;
- }
-
- if ( aEventCode == EEventKeyUp && IsFlagSet(EFlagNoActionDuringChrKeyPress) )
- {
- if(!iChrLongKeyPress )
- {
- // if we have come here it's a short press
- // the flag EFlagNoActionDuringChrKeyPress is cleared in the timer callback
- if(!IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) || IsFlagSet(CAknFepManager::EFlagInsideMultitapInlineEditingTransaction))
- {
- // when not in inline editing mode,
- // chr key should produce the SCT
- if ( !IsChineseInputLanguage() )
- {
- LaunchSpecialCharacterTableL();
- }
- else
- {
- FepUI()->HandleKeyL( EStdKeyLeftFunc,
- EShortKeyPress );
- }
- }
- ClearFlag( EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress);
-
- iChrKeypressMonitor->Cancel();
-
- TInt wordToFocus = KWordToFocusInCandidateList;
- TInt numberOfCandidates = iPtiEngine->NumberOfCandidates();
- if (numberOfCandidates > 1)
- {
- wordToFocus = KWordToFocusInCandidateList;
- }
- LaunchCandidatePopupListL(wordToFocus);
-
- return EKeyWasConsumed;
- }
- else
- {
-
-
- // Cancel the timer
- iChrKeypressMonitor->Cancel();
-
- // commit the characters
- HandleChangeInFocus();
-
- // Clear the chr key depressed flag
- ClearFlag( EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress);
- // launch the special character table
- iChrLongKeyPress = EFalse;
-
- if ( IsAbleToLaunchSCT() )
- {
- LaunchSpecialCharacterTableL();
- }
-
- return EKeyWasConsumed;
- }
- }
- else
- {
- return EKeyWasNotConsumed;
- }
- }
- return EKeyWasNotConsumed;
- }
-#endif //__HALF_QWERTY_KEYPAD
-#endif //RD_INTELLIGENT_TEXT_INPUT
-
-TKeyResponse CAknFepManager::HandleQwertyControlKeyEventL(const TKeyEvent& aKeyEvent,
- TEventCode aEventCode)
- {
- TKeyResponse response = EKeyWasConsumed;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if (EPtiKeyboardQwerty4x10 == KeyboardLayout())
- {
- if( iCurrentFepUI && !iCurrentFepUI->IsValidShiftKeyPress() && aEventCode == EEventKeyUp )
- {
- FepUI()->HandleKeyL(EKeyLeftCtrl, EShortKeyPress);
- return EKeyWasConsumed;
- }
- }
-#endif
-
- // need to ignore [Ctrl] + the following simbol keys
- // because FEP doesn't consume [Ctrl] combination keys.
- if (Japanese() && aEventCode == EEventKey)
- {
- TBool comsume = EFalse;
- switch (aKeyEvent.iScanCode)
- {
- case EStdKeyNkpPlus:
- case EPtiKeyQwertyPlus:
- case EPtiKeyQwertyMinus:
- case EPtiKeyQwertyComma:
- case EPtiKeyQwertySemicolon:
- case EPtiKeyQwertyFullstop:
- case EPtiKeyQwertyHash:
- case EPtiKeyQwertySlash:
- case EPtiKeyQwertyApostrophe:
- case EPtiKeyQwertySpace:
- comsume = ETrue;
- break;
- default:
- break;
- }
- if (comsume)
- {
- return EKeyWasConsumed;
- }
- }
-
-#ifdef RD_SCALABLE_UI_V2
- if (aKeyEvent.iModifiers & EModifierCtrl
- && (aKeyEvent.iScanCode == EPtiKeyQwertyC || aKeyEvent.iScanCode == EPtiKeyQwertyV ||
- aKeyEvent.iScanCode == EPtiKeyQwertyX))
- {
- SendEventsToPluginManL( EPluginSyncFepAwareText );
- // Let copy / cut / paste events to flow through.
- response = EKeyWasNotConsumed;
- }
-#endif
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- // Ctrl combinations which affect the editor state, must commit the current inline edit.
- // Otherwise the currently active inline word might be lost.
- if ( iWesternPredictive && iQwertyInputMode && IsFlagSet(EFlagInsideInlineEditingTransaction) )
- {
- switch (aKeyEvent.iScanCode)
- {
- case EStdKeyUpArrow:
- case EStdKeyDownArrow:
- case EStdKeyLeftArrow:
- case EStdKeyRightArrow:
- case EPtiKeyQwertyC:
- case EPtiKeyQwertyV:
- case EPtiKeyQwertyX:
- case EPtiKeyQwertyA:
- iPtiEngine->CommitCurrentWord();
- TryCloseUiL();
- break;
- default:
- break;
- }
- }
- // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
-
- if (aEventCode != EEventKeyUp)
- {
- return EKeyWasNotConsumed;
- }
-
- if(iQwertyInputMode)
- {
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Query ptiEngine to know if the scancode maps to EPtiKeyQwertyC,
- // EPtiKeyQwertyV or EPtiKeyQwertyX.
- // we should not always rely on scancode as products may change it, while
- // still having the 'C', 'V' and 'X' mappings
-
- TBuf<32> mapData;
- iPtiEngine->MappingDataForKey((TPtiKey)aKeyEvent.iScanCode, mapData, EPtiCaseUpper);
-
- if( mapData.Length() > 0 )
- {
- if( mapData[0] == EPtiKeyQwertyC || mapData[0] == EPtiKeyQwertyV ||
- mapData[0] == EPtiKeyQwertyX )
- {
- // Let copy / cut / paste events to flow through.
- response = EKeyWasNotConsumed;
- }
- }
-#else
- if (aKeyEvent.iScanCode == EPtiKeyQwertyC || aKeyEvent.iScanCode == EPtiKeyQwertyV ||
- aKeyEvent.iScanCode == EPtiKeyQwertyX)
- {
- // Let copy / cut / paste events to flow through.
- response = EKeyWasNotConsumed;
- }
-#endif
-
-
- if (aKeyEvent.iScanCode == EStdKeyRightShift || aKeyEvent.iScanCode == EStdKeyLeftShift
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- ||
- IsFlagSet(EFlagQwertyShiftMode)
-#endif //RD_INTELLIGENT_TEXT_INPUT
- )
- {
- if(!iInputCapabilities.FepAwareTextEditor())
- {
- response = EKeyWasNotConsumed;
- }
- else
- {
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- if ( iMode != ENumber && iMode!= ENativeNumber )
- {
- iModeBefore = iMode;
- }
-#ifdef RD_HINDI_PHONETIC_INPUT
-
- if(iSharedDataInterface->InputTextLanguage() == KLangHindiPhonetic)
- {
- TryChangePhoneticModeL();
- }
- else
- {
-#endif
- if((!(IsOnlyNumericPermitted() ||
- (iAknEditorFlags & EAknEditorFlagLatinInputModesOnly))) &&
- TAknFepUiIndicInputManager::IsIndicLangauge(
- (TLanguage)iSharedDataInterface->InputTextLanguage()))
- {
- if(iLanguageCapabilities.iInputLanguageCode == ELangEnglish)
- {
- ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage());
- }
- else
- {
- ChangeInputLanguageL(ELangEnglish);
- }
- }
- else
- {
- TryIncrementModeChineseQwertyL(iMode);
- }
-#ifdef RD_HINDI_PHONETIC_INPUT
- }
-#endif
- }
- ClearFlag(EFlagShiftKeyDepressed);
- if ( !IsFlagSet(EFlagNoActionDuringShiftKeyPress) ||
- (IsFlagSet(EFlagNoActionDuringShiftKeyPress) && IsFlagSet(EFlagLongShiftKeyPress)) )
- {
- ClearFlag(EFlagQwertyShiftMode);
- }
- if (IsFlagSet(EFlagLongShiftKeyPress)) //long keypress up
- {
- ClearFlag(EFlagLongShiftKeyPress);
- }
- else // short keypress up
- {
- iShiftKeypressMonitor->Cancel();
- }
- ClearFlag( EFlagNoActionDuringShiftKeyPress );
- UpdateIndicators();
- }
- else if(aKeyEvent.iScanCode == EStdKeySpace) // switch between last used Chinese input mode and English
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- // Toggle the predictive mode with ctrl+space
- if ( (iPermittedInputModes & EAknEditorTextInputMode) &&
- !(iAknEditorFlags & EAknEditorFlagNoT9) &&
- iMode == ELatin &&
- iLanguageCapabilities.iSupportsWesternQwertyPredictive )
- {
- if (iWesternPredictive)
- {
- //ProcessCommandL(EAknCmdT9PredictiveT9Off);
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- //HandleChangeInFocus();
- if (iMode != ELatin)
- {
- TryChangeModeL(ELatin);
- }
- else
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- RemoveSuggestedAdvanceCompletionL();
-#endif // RD_INTELLIGENT_TEXT_INPUT
- CommitInlineEditL();
- }
- SetCcpuFlag(ECcpuStataCommitPredictiveWord);
- SetWesternPredictive(EFalse);
- HandleChangeInFocus();
- }
- else
- {
- //ProcessCommandL(EAknCmdMultitapPredictiveT9On);
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- //HandleChangeInFocus();
- SetWesternPredictive(ETrue);
- TryCloseUiL();
- TryChangeModeL(ELatin);
- }
- // Reset the function key state,if predictive mode is cahnged.
- if (iFnKeyManager)
- {
- iFnKeyManager->ClearFnKeyState();
- }
- }
- else // Predictive QWERTY (XT9) changes <----
- {
-#endif //RD_INTELLIGENT_TEXT_INPUT
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- if(iMode != iModeBefore && iMode != ENumber && iMode != ENativeNumber )
- {
- TInt mode = iMode;
- if(iMode != ELatin && iModeBefore != ELatin) // more than one Chinese input modes
- {
- TryChangeModeL(ELatin);
- }
- else
- {
- TryChangeToModeBeforeL();
- }
- iModeBefore = mode; // deposit previous input mode
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT //// Predictive QWERTY (XT9) changes: open the edit menu with Fn+space ---->
- else if (aKeyEvent.iScanCode == EStdKeyLeftFunc)
- {
- LaunchSelectModeMenuL();
- } // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
-
- if (IsCcpuFlagSet(ECcpuStatePosted))
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Query ptiEngine to know if the scancode maps to EPtiKeyQwertyC,
- // EPtiKeyQwertyV or EPtiKeyQwertyX.
- // we should not always rely on scancode as products may change it, while
- // still having the 'C', 'V' and 'X' mappings
-
- TBuf<32> mapData;
- iPtiEngine->MappingDataForKey((TPtiKey)aKeyEvent.iScanCode, mapData, EPtiCaseUpper);
-
- if( mapData.Length() > 0 )
- {
- if( mapData[0] == EPtiKeyQwertyC || mapData[0] == EPtiKeyQwertyX )
- {
- // Let copy / cut events to flow through.
- response = EKeyWasNotConsumed;
- }
- }
-#else
- if (aKeyEvent.iScanCode == EPtiKeyQwertyC || aKeyEvent.iScanCode == EPtiKeyQwertyX)
- {
- // Let copy / cut events to flow through.
- response = EKeyWasNotConsumed;
- }
-#endif
- ResetCcpuFlags();
- }
-
-
-//Removed as part of the fix STAA-7FXCTK
-
-/* if (EPtiKeyboardQwerty4x10 == KeyboardLayout())
- {
- FepUI()->HandleKeyL(EKeyLeftCtrl, EShortKeyPress);
- }*/
-
-
- return response;
- }
-
-TBool CAknFepManager::HandleQwertyKeyEventL(const TKeyEvent& aKeyEvent, TKeyResponse& aResponse)
- {
- TBool keyHandled = EFalse;
- aResponse = EKeyWasNotConsumed;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(iKeyBackSpaceHit && (EKeyBackspace != aKeyEvent.iCode || EStdKeyBackspace != aKeyEvent.iScanCode))
- iKeyBackSpaceHit = 0;
-
- if(IsMfneEditor())
- {
- // multi-field editors need the key event to be sent to them directly
- // therefore not consuming it here
- return EFalse;
- }
-
- if(IsFlagSet(EFlagShiftKeyDepressed))
- {
- iKeyPressedDuringShift = ETrue;
- }
- // This part of code for error fixing
- // After short pressing of Fn/shift, if user press enter key, delete key
- // it will reset the shift key and Fn key state.
- if( EKeyEnter == aKeyEvent.iCode || EStdKeyEnter == aKeyEvent.iScanCode||
- EKeyBackspace == aKeyEvent.iCode || EStdKeyBackspace == aKeyEvent.iScanCode)
- {
- // if the shift key is still depressed,
- // don't clear the qwerty shift mode
- if(!IsFlagSet(EFlagShiftKeyDepressed))
- ClearFlag(EFlagQwertyShiftMode);
- if( iFnKeyManager->FnKeyState() == CAknFepFnKeyManager::EFnKeyNext )
- {
- iFnKeyManager->ClearFnKeyState();
- }
- }
-#endif
-
- if ( iQwertyInputMode &&
- ( EditorHasFreeSpace() ||
-#ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- KeyEventWillReplaceCharacter( aKeyEvent ) ||
-#endif // RD_INTELLIGENT_TEXT_INPUT
-#endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
- ( Japanese() && iFepManState == EAknFepStateUIActive ) ) )
- {
- if (IsFlagSet(EFlagPassNextKey))
- {
-#ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Don't clear the pass next flag yet on the simulated "rollback key"
- // used with secret editors, the actual key code to be entered to the
- // editor will follow next.
- if ( aKeyEvent.iCode != EKeyF20 )
-#endif // RD_INTELLIGENT_TEXT_INPUT
-#endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
- ClearFlag(EFlagPassNextKey);
- return ETrue;
- }
-
- TInt keyScanCode = aKeyEvent.iScanCode;
-#if defined(__WINS__)
- if ( keyScanCode == EStdKeyNkpPlus )
- {
- // Workaround solution for the qwerty '+' key in emulator environment.
- // I did not find a way how to to configure epoc_352x416_Qwerty.ini to send '+' keyevent.
- keyScanCode = 0x2b; // '+' key.
- }
-#endif
- TBool phoneIdle = (EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor);
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- TInt keyLayout =iSharedDataInterface->KeyboardLayout();
- if (IsOnlyNumericPermitted() && phoneIdle &&
-#ifdef __REVERSE_FN_KEY_SUPPORTED
- !iIsReverseFnkeyInput &&
-#endif
- (keyLayout != EPtiKeyboardHalfQwerty ))
-#else
- if (IsOnlyNumericPermitted() && phoneIdle)
-#endif
- {
- return ETrue;
- }
- //if this SpecialNumeric editor, do not consume event.
- if (IsOnlyNumericPermitted() && IsSpecialNumericEditor())
- {
- return EFalse;
- }
-
-
-#ifdef FF_HOME_SCREEN_EASY_DIALING
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-
- // This piece of code part of error fixing
- // The Fep will insert the char, if Phone application launch the
- // Phone number acquire editor in idle mode
- // Specially Fep does not maintain Fn key state for non Fepware editor.
- // So, Intermediate state of FnKey like FnNext will not work
- // Hold on Fn key modify the modifier of of key event.
- const TBool fnDown = (aKeyEvent.iModifiers & EModifierRightFunc);
- if( phoneIdle && fnDown && iFnKeyManager )
- {
- iFnKeyManager->SetFnKeyState(CAknFepFnKeyManager::EFnKeyDown);
- SetCase((TCase)EFnKeyLowerCase);
- }
-#endif // RD_INTELLIGENT_TEXT_INPUT
-#endif // FF_HOME_SCREEN_EASY_DIALING
-
-
- const TBool shifted = (aKeyEvent.iModifiers & (EModifierLeftShift |
- EModifierRightShift | EModifierShift));
-
- // This is needed for forcing shif state if this is the first key press in
- // phone idle.
- if (shifted && phoneIdle)
- {
- SetFlag(EFlagQwertyShiftMode);
- }
-
-
- if (aKeyEvent.iRepeats == 1)
- {
- iKeyRepeat = ELongKeyPress;
- }
- else
- {
- iKeyRepeat = EShortKeyPress;
- }
-
- if ( IsFlagSet(EFlagShiftKeyDepressed) &&
- IsChineseInputLanguage() &&
- keyScanCode == EPtiKeyQwertySpace)
- {
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- ClearFlag(EFlagQwertyShiftMode);
- ClearFlag(EFlagLongShiftKeyPress);
- SetChangeModeByShiftAndSpace( ETrue );
- TryIncrementChineseModeForQwertyL(iMode);
- keyHandled = ETrue;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- else
- {
- if(iKeyRepeat == ELongKeyPress && iPtiEngine->CurrentWord().Length() == EMaximumFepWordLength)
- {
- keyHandled = ETrue;
- }
- else
- {
- keyHandled = FepUI()->HandleKeyL(keyScanCode, iKeyRepeat);
- if( EPtiKeyboardHalfQwerty == KeyboardLayout()
- && iWesternPredictive
- && iCaseMan->CurrentCase() != EAknEditorUpperCase )
- {
- ClearFlag(CAknFepManager::EFlagChangeInputMode);
- }
- if ( keyHandled && iFepManState == EAknFepStateUIActive
- && (iMode == EPinyin || iMode == EZhuyin || iMode == EStroke || iMode == ECangJie) )
- {
- if ( EditorState() )
- {
- EditorState()->SetFlags( EditorState()->Flags() | EAknEditorFlagChinesePopup );
- }
- }
- }
- }
-#else
- if (IsChineseInputLanguage() && keyScanCode == EStdKeyBackspace)
- {
- keyHandled = FepUI()->HandleKeyL(keyScanCode, iKeyRepeat);
- }
- else
- {
- keyHandled = FepUI()->HandleKeyL(keyScanCode, EShortKeyPress);
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
-
- if (keyHandled)
- {
- aResponse = EKeyWasConsumed;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY changes ---->
- ShowExactWordPopupIfNecessaryL();
- // Predictive QWERTY changes <----
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
-
- // The indicators should be updated only if the key was handled. Otherwise
- // the shift-copy-pasting will mess up the indicators.
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- TInt language = iSharedDataInterface->InputTextLanguage();
- TBool IsChineseInput = language == ELangTaiwanChinese||
- language == ELangHongKongChinese ||
- language == ELangPrcChinese;
-#endif
- if ( !shifted )
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(IsChineseInput && (iKeyboardType!= EPtiKeyboardHalfQwerty))
- {
- ClearFlag(EFlagQwertyShiftMode);
- UpdateIndicators();
- }
- else if( keyHandled )
- {
-#endif
- ClearFlag(EFlagQwertyShiftMode);
- UpdateIndicators();
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- }
-#endif
- }
-
-#ifdef RD_SCALABLE_UI_V2
- if ( ( (keyScanCode >= EPtiKeyQwertyA && keyScanCode <= EPtiKeyQwertyZ) ||
- (keyScanCode >= EPtiKeyQwerty0 && keyScanCode <= EPtiKeyQwerty9) ||
- (keyScanCode == EStdKeyEnter) ||
- (keyScanCode == EPtiKeyQwertyPlus) ||
- (keyScanCode == EPtiKeyQwertyMinus) ||
- (keyScanCode == EPtiKeyQwertyComma) ||
- (keyScanCode == EPtiKeyQwertySemicolon) ||
- (keyScanCode == EPtiKeyQwertyFullstop) ||
- (keyScanCode == EPtiKeyQwertyHash) ||
- (keyScanCode == EPtiKeyQwertySlash) ||
- (keyScanCode == EPtiKeyQwertyApostrophe) )
- && !( iFepPluginManager && iFepPluginManager->EnableITIOnFSQ() ) )
- {
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- //iFepPluginManager->ClosePluginInputModeL(ETrue);
- }
- else if( keyHandled )
- {
- //for QWERTY, number only, the number is send to editor
- //bypass FEP
- SendEventsToPluginManL( EPluginSyncFepAwareText );
- //iFepPluginManager->SyncFepAwareText();
- }
-#endif
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-
- TInt lang = iSharedDataInterface->InputTextLanguage();
-
- if(lang == ELangTaiwanChinese||
- lang == ELangHongKongChinese ||
- lang == ELangPrcChinese)
- {
- if( iPtiEngine->CurrentLanguage()->LanguageCode()== ELangEnglish
- && IsFlagSet(EFlagQwertyShiftMode)
- && !IsFlagSet(EFlagLongShiftKeyPress))
- {
- ClearFlag(EFlagQwertyShiftMode);
- UpdateIndicators();
- }
- }
-#endif // RD_INTELLIGENT_TEXT_INPUT
- iKeyRepeat = EShortKeyPress;
- return keyHandled;
- }
-
-
-
-void CAknFepManager::CancelTransaction()
- {
- if (iInputCapabilities.FepAwareTextEditor() && IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- CancelInlineEdit();
- }
- }
-
-void CAknFepManager::IsOnHasChangedState()
- {
- }
-
-void CAknFepManager::OfferKeyEventL(TEventResponse& /*aEventResponse*/,
- const TKeyEvent& /*aKeyEvent*/,
- TEventCode /*aEventCode*/)
- {
- }
-
-void CAknFepManager::OfferPointerEventL(TEventResponse& /*aEventResponse*/,
- const TPointerEvent& /*aPointerEvent*/,
- const CCoeControl* /*aWindowOwningControl*/)
- {
- }
-
-void CAknFepManager::OfferPointerBufferReadyEventL(TEventResponse& /*aEventResponse*/,
- const CCoeControl* /*aWindowOwningControl*/)
- {
- }
-
-TInt CAknFepManager::NumberOfAttributes() const
- {
- return 0;
- }
-
-TUid CAknFepManager::AttributeAtIndex(TInt /*aIndex*/) const
- {
- return KNullUid;
- }
-
-void CAknFepManager::WriteAttributeDataToStreamL(TUid /*aAttributeUid*/, RWriteStream& /*aStream*/) const
- {
- }
-
-void CAknFepManager::ReadAttributeDataFromStreamL(TUid /*aAttributeUid*/, RReadStream& /*aStream*/)
- {
- }
-
-void CAknFepManager::HandleGainingForeground()
- {
- if (iFepFullyConstructed)
- {
- ClearFlag(EFlagRemoveMatchesMenuItem);
- ClearCcpuFlag(ECcpuStateHashDown | ECcpuStateSelectionEventPosted |
- ECcpuStateEdwinInSelectionMode);
- TRAPD(err, iPtiEngine->HandleCommandL(EPtiCommandReloadLearningInfo));
- if (err != KErrNone)
- {
- CleanUpFep();
- }
- }
-
-#ifdef RD_SCALABLE_UI_V2
- CCoeControl* focusCtrl = static_cast<const CCoeAppUi*>(CCoeEnv::Static()->AppUi())->TopFocusedControl();
- iGainForeground = ETrue;
- /*if( iLoseForeAndGainFocus )
- {
- SendEventsToPluginManL( EPluginFocusChanged, iGainForeground );
- }*/
- if(focusCtrl && focusCtrl->IsFocused())
- {
- if(GetForegroundTaskAppWgId() == CCoeEnv::Static()->RootWin().Identifier())
- //SendEventsToPluginManL( EPluginFocusChanged, iGainForeground );
- TRAP_IGNORE(SendEventsToPluginManL( EPluginForegroundChanged, ETrue));
- }
- else
- {
- if (iFepPluginManager)
- {
- iFepPluginManager->HandleiDimGainForeground(ETrue);
- }
- }
-#endif // RD_SCALABLE_UI_V2
- }
-
-void CAknFepManager::HandleLosingForeground()
- {
- if (iFepFullyConstructed)
- {
- // Forget the shift state on FEP switch (i.e. when application goes to background)
- ClearFlag(EFlagQwertyShiftMode | EFlagShiftKeyDepressed |
- EFlagLongShiftKeyPress | EFlagNoActionDuringShiftKeyPress);
- }
- if (Japanese())
- {
- TRAP_IGNORE(TryCloseUiL());
- }
- if (IsChineseInputLanguage())
- {
- TRAP_IGNORE(TryCloseUiL());
- }
-
-#ifdef RD_SCALABLE_UI_V2
- iGainForeground = EFalse;
- //SendEventsToPluginManL( EPluginFocusChanged, iGainForeground );
- TRAP_IGNORE(SendEventsToPluginManL( EPluginForegroundChanged, EFalse));
-#endif // RD_SCALABLE_UI_V2
- }
-
-void CAknFepManager::HandleChangeInFocus()
- {
- TRAPD(err, HandleChangeInFocusL());
- if (err != KErrNone)
- {
- CleanUpFep();
- }
- }
-
-void CAknFepManager::HandleDestructionOfFocusedItem()
- {
- if (iInputCapabilities.FepAwareTextEditor())
- {
- iFocusedItemDestroy = ETrue;
- if ( iFepManState == EAknFepStateUIActive )
- {
- TRAP_IGNORE(SendEventsToPluginManL( EPluginFocusItemDestroy ));
- if (Japanese() && iAknEditorFlags & EAknEditorFlagFindPane)
- {
- // In case of Find pane while inputting japanese characters,
- // No update or commit characters.
- iPtiEngine->ClearCurrentWord();
- }
-
- #ifdef RD_SCALABLE_UI_V2
- // For addition of ITI features on FSQ,
- // need to restore some values stored before opening FSQ
- // When go into this section,
- // touch ui won't be closed by ClosePluginInputUiL,
- // but need to restore fep state here
- if ( iFepPluginManager )
- {
- iFepPluginManager->ResetItiStateL();
- }
- #endif
- // Close UI
- FepUI()->CloseUI();
- }
- else
- {
- TRAP_IGNORE(SendEventsToPluginManL( EPluginFocusItemDestroy, ETrue ));
- }
- iFocusedItemDestroy = EFalse;
- }
-
- if ( !(IsFlagSet(EFlagForegroundUIComponentVisible) ||
- IsFlagSet(EFlagMenuPaneVisible)) )
- {
- iLanguageCapabilities.iNumericEditorDigitType = EDigitTypeUnknown;
- //UpdateLocalDigitMode();
- }
- if(IsFlagSet(EFlagForegroundUIComponentVisible))
- {
- ClearFlag(EFlagForegroundUIComponentVisible);
- }
-
- ClearFlag( EFlagInsideInlineEditingTransaction |
- EFlagInsideMultitapInlineEditingTransaction |
- EFlagLineFeedCharacter | EFlagNoMatches );
-
- iInputCapabilities = NULL;
- }
-
-void CAknFepManager::HandleAknEdwinStateEventL(CAknEdwinState* aAknEdwinState,
- EAknEdwinStateEvent aEventType)
- {
- if(aEventType == EAknEdwinDestroy)
- {
- // Reset the last focus editor when destroy it.
- if ( aAknEdwinState == iLastFocusedEditor )
- {
- iLastFocusedEditor->SetObserver( NULL );
- iLastFocusedEditor = NULL;
- }
-
- // Whenever the editor is destroyed, we destroy all the UI components we launched
- if(iFepAwareDialogParentEditor == NULL ||
- iFepAwareDialogParentEditor == aAknEdwinState)
- {
- // EExtendedFlagEdwinEditorDestroyed flag is used to leave once the dialog is closed.
- SetExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
- // Delete any candidate popup is launched
- if(iCandidatePopup)
- {
- delete iCandidatePopup;
- iCandidatePopup = NULL;
- }
- // Delete anu UI components launched by Fep.
- iUiInterface->DeleteDialogs();
- }
- }
- if ( IsFepAwareTextEditor() )
- {
- CAknEdwinState* editorState = EditorState();
- if ( editorState != aAknEdwinState || !iFepFullyConstructed )
- {
- // FEP state update is not needed because editor state of non-focused
- // editor was changed.
- return;
- }
-
- switch (aEventType)
- {
- case EAknEdwinStateInputModeUpdate:
- {
- TUint currentInputMode = editorState->CurrentInputMode();
- if ( EditorModeFromFepMode(iMode) != currentInputMode )
- {
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- TryRemoveNoMatchesIndicatorL();
- }
- UpdateCbaL(NULL);
- TryCloseUiL();
- ConfigureFEPFromEditorStateL();
- }
- }
- break;
- case EAknEdwinStateCaseModeUpdate:
- {
- TInt currentCaseMode = editorState->CurrentCase();
- if ( currentCaseMode != iCaseMan->CurrentCase() )
- {
- iCaseMan->SetCurrentCase(currentCaseMode);
- }
- }
- break;
- case EAknEdwinStateLocalLanguageUpdate:
- {
- TLanguage localLanguage = ELangTest;
- if (GetLocalLanguage( localLanguage ) )
- {
- iLanguageCapabilities.iLocalInputLanguageInUse = ETrue;
- if ( localLanguage != iLanguageCapabilities.iInputLanguageCode )
- {
- ChangeInputLanguageL(localLanguage);
- }
- }
- }
- break;
- case EAknEdwinStateFlagsUpdate:
- {
- TInt oldEditorFlags = iAknEditorFlags;
- if(iAknEditorFlags != editorState->Flags())
- {
- iAknEditorFlags = editorState->Flags();
- UpdateLocalDigitMode();
- }
- if ( iAknEditorFlags != oldEditorFlags )
- {
- if ( (iAknEditorFlags & EAknEditorFlagNoT9) !=
- (oldEditorFlags & EAknEditorFlagNoT9))
- {
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- TryRemoveNoMatchesIndicatorL();
- }
- UpdateCbaL(NULL);
- TryCloseUiL();
- ConfigureFEPFromEditorStateL();
- }
-
- if ( (iAknEditorFlags & EAknEditorFlagNoEditIndicators) !=
- (oldEditorFlags & EAknEditorFlagNoEditIndicators))
- {
- // We only need to update indicators when EAknEditorFlagNoEditIndicators was modified.
- // Current Fep state is not lost.
- UpdateIndicators();
- }
-
- if ( (iAknEditorFlags & EAknEditorFlagFixedCase) !=
- (oldEditorFlags & EAknEditorFlagFixedCase))
- {
- // We only need to update EFlagSupressAutoUpdate flag when the
- // EAknEditorFlagFixedCase was modified.
- // Current Fep state is not lost.
- if (iAknEditorFlags & EAknEditorFlagFixedCase)
- {
- SetFlag(EFlagSupressAutoUpdate);
- }
- else
- {
- ClearFlag(EFlagSupressAutoUpdate);
- }
- }
- }
- }
- break;
- case EAknEdwinStateEventStateUpdate:
- {
- // Feps state is reseted and new state is fetched completelly from editor state.
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- TryRemoveNoMatchesIndicatorL();
- }
- UpdateCbaL(NULL);
- TryCloseUiL();
- ConfigureFEPFromEditorStateL();
- }
- break;
- case EAknSyncEdwinState:
-#ifdef RD_SCALABLE_UI_V2
- if ( !IsCcpuFlagSet(ECcpuStateIgnoreNextEdwinSyncEvent) && iFepPluginManager &&
- iFepPluginManager->PluginInputMode() == EPluginInputModeNone )
-#else
- if ( !IsCcpuFlagSet(ECcpuStateIgnoreNextEdwinSyncEvent) )
-#endif
- {
- HandleChangeInFocusL();
- }
- else
- {
- ClearCcpuFlag(ECcpuStateIgnoreNextEdwinSyncEvent);
- }
- break;
-
-#ifdef RD_SCALABLE_UI_V2
- case EAknActivatePenInputRequest:
- SendEventsToPluginManL( EPluginEditorActivate );
- break;
- case EAknClosePenInputRequest:
- if ( iFepPluginManager )
- {
- iFepPluginManager->ClosePluginInputModeL( EFalse );
- }
- break;
- case EAknEdwinStatePromptUpdate:
- SendEventsToPluginManL( EPluginPromptChanged );
- break;
-#endif // RD_SCALABLE_UI_V2
- case EAknCursorPositionChanged:
-#ifdef RD_SCALABLE_UI_V2
- SendEventsToPluginManL( EPluginSyncFepAwareText );
- HandleCopyCutStateL();
-#endif
- // whenever focus cahnged happen, internally
- // editor treat cursorposition change.
- // In between, if editor context not in inline edit state.
- // Try to update the case editor gets the focus, and editor
- // context come in inline state.
- //iCaseMan->UpdateCase(ENullNaviEvent);
- break;
-
- default:
- break;
- }
- }
- }
-
-
-CAknExtendedInputCapabilities::TEditorType CAknFepManager::EditorType() const
- {
- MObjectProvider* mop = iInputCapabilities.ObjectProvider();
-
- if ( mop )
- {
- CAknExtendedInputCapabilities* extendedInputCapabilities =
- mop->MopGetObject( extendedInputCapabilities );
-
- if ( extendedInputCapabilities && iInputCapabilities.FepAwareTextEditor() )
- {
- TInt type = extendedInputCapabilities->EditorType();
- return static_cast<CAknExtendedInputCapabilities::TEditorType>( type );
- }
- }
-
- return CAknExtendedInputCapabilities::EUndefined;
- }
-
-TUint CAknFepManager::MIDPConstraint() const
- {
- TUint ConstraintValue=0xFFFFFFFF;
- MObjectProvider* mop = iInputCapabilities.ObjectProvider();
-
- if ( mop )
- {
- CAknExtendedInputCapabilities* extendedInputCapabilities =
- mop->MopGetObject( extendedInputCapabilities );
- if ( extendedInputCapabilities && iInputCapabilities.FepAwareTextEditor() )
- {
- ConstraintValue = extendedInputCapabilities->MIDPConstrainst();
- }
- }
- return ConstraintValue;
- }
-
-TBool CAknFepManager::IsSpecialNumericEditor()
- {
- TBool JavaNumericEditor = EFalse;
- TUint ConstraintValue = MIDPConstraint();
- if((ConstraintValue & ESplConstraintMask) == ESplNumeric ||
- (ConstraintValue & ESplConstraintMask) == ESplDecimal)
- JavaNumericEditor = ETrue;
-
- return JavaNumericEditor;
-
- }
-#ifdef RD_SCALABLE_UI_V2
-void CAknFepManager::HandleInputCapabilitiesEventL( TInt aEvent, TAny* /*aParams*/ )
- {
- switch (aEvent)
- {
- case CAknExtendedInputCapabilities::MAknEventObserver::EActivatePenInputRequest:
- SendEventsToPluginManL( EPluginEditorActivate );
- break;
- case CAknExtendedInputCapabilities::MAknEventObserver::EPointerEventReceived:
-
-/*
-#ifdef RD_TACTILE_FEEDBACK
- CAknExtendedInputCapabilities::
- MAknEventObserver::TPointerEventReceivedParams* params =
- static_cast<CAknExtendedInputCapabilities::
- MAknEventObserver::TPointerEventReceivedParams*>(aParams);
- if (params->iPointerEvent.iType == TPointerEvent::EButton1Down)
- {
-
- MTouchFeedback* feedback = MTouchFeedback::Instance();
- if (feedback && iFepPluginManager && !iFepPluginManager->VKBIsOpened())
- {
- feedback->InstantFeedback( ETouchFeedbackBasic );
- }
- }
-#endif // RD_TACTILE_FEEDBACK
-*/
- if( IsFlagSet( EFlagInsideInlineEditingTransaction ) )
- {
- if (IsFeatureSupportedJapanese())
- {
- TryCloseUiL();
- }
- else
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- iPtiEngine->CommitCurrentWord();
- CommitInlineEditL();
- TryCloseUiL();
-
-#else
- CommitInlineEditL();
-#endif
- }
- }
- break;
- case CAknExtendedInputCapabilities::MAknEventObserver::EControlContentUpdatedInternally:
- SendEventsToPluginManL( EPluginSyncFepAwareText, EPluginSyncAll );
- break;
- case CAknExtendedInputCapabilities::MAknEventObserver::EOpenStylusMenuCcpu:
- // User has highlighted text and editor requests stylus ccpu popup menu
- // to be displayed.
- LaunchStylusCcpuMenuL(iClickPoint);
- break;
- }
- }
-
-void CAknFepManager::SubmitInlineTextL( const TDesC& aData )
- {
- if(TextIsValidInEditor(aData))
- {
- StartInlineEditL(aData);
- CommitInlineEditL();
- }
- }
-
-// for japanese
-void CAknFepManager::NotifyJapaneseSetting()
- {
- TInt param = 0;
- // Deleting direction ON(right side) / OFF(left side)
- if (iSharedDataInterface->ClearDirection() == EClearDirectionRight)
- {
- param |= EPenInputJapaneseSettingDeletingDirection;
- }
- // Japanese predictive ON(predictive on) / OFF(predictive off)
- if (iJapanesePredictive)
- {
- param |= EPenInputJapaneseSettingPredictive;
- }
- // Japanese HWR conversion ON / OFF
- if (iSharedDataInterface->JapaneseHwrConversion() == EJapaneseConversionOn)
- {
- param |= EPenInputJapaneseSettingConversion;
- }
- // Japanese HWR conversion ON / OFF
- if (iCharWidth == EFullWidthChar)
- {
- param |= EPenInputJapaneseSettingCharacterWidth;
- }
- // Japanese qwerty setting flag
- TInt qwertflag = iSharedDataInterface->JapaneseQwertyFlags();
- // Qwerty Comma
- if (qwertflag & EJapQwertySettingComma)
- {
- param |= EPenInputJapaneseSettingQwertyComma;
- }
- // Qwerty Period
- if (qwertflag & EJapQwertySettingPeriod)
- {
- param |= EPenInputJapaneseSettingQwertyPeriod;
- }
- // Qwerty Width Of Space
- if (qwertflag & EJapQwertySettingSpaceFullWidth)
- {
- param |= EPenInputJapaneseSettingQwertyWidthOfSpace;
- }
- // Lunch SCT
- if (IsAbleToLaunchSCT())
- {
- param |= EPenInputJapaneseSettingLunchSCT;
- }
-#ifdef RD_SCALABLE_UI_V2
- // Set Japanese setting
- if(iFepPluginManager->CurrentPluginInputFepUI())
- {
- TRAP_IGNORE(iFepPluginManager->CurrentPluginInputFepUI()->HandleCommandL(
- ECmdPenInputJapaneseSetting, param));
- }
-#endif //RD_SCALABLE_UI_V2
- }
-
-TBool CAknFepManager::FullyFepAwareTextEditor() const
- {
- if ( iInputCapabilities.FepAwareTextEditor() )
- {
- if ( EditorType() != CAknExtendedInputCapabilities::EMFNEBased )
- {
- return ETrue;
- }
- }
-
- return EFalse;
- }
-
-TBool CAknFepManager::SemiFepAwareTextEditor( TBool aAtLeast ) const
- {
- if ( aAtLeast )
- {
- switch ( EditorType() )
- {
- case CAknExtendedInputCapabilities::EEdwinBased:
- case CAknExtendedInputCapabilities::EMFNEBased:
- return ETrue;
-
- default:
- return EFalse;
- }
- }
- else
- {
- return EditorType() == CAknExtendedInputCapabilities::EMFNEBased;
- }
- }
-
-void CAknFepManager::ProcessEditorMenuCommand(TInt aCommand)
- {
- TRAP_IGNORE(ProcessCommandL(aCommand));
- }
-
-TInt CAknFepManager::GetPermittedEditorMenu(TBool aOnlyCount)
- {
- TInt count = 0;
- TRAP_IGNORE(count = GetPermittedEditorMenuL(aOnlyCount));
- return count;
- }
-
-TInt CAknFepManager::GetPermittedEditorMenuL(TBool aOnlyCount)
- {
-
- CAknEdwinState* editorState = NULL;
- if (iInputCapabilities.FepAwareTextEditor())
- {
- editorState = EditorState();
- }
-
- CAknFepUiInterfaceMenuBar* menuBar = NULL;
-
- RPointerArray<CEikMenuPaneItem> editorMenuItemList;
-
- CEikMenuPane* editorMenuPane = new (ELeave) CEikMenuPane((MEikMenuObserver*)(this));
- editorMenuPane->SetItemArrayOwnedExternally(EFalse);
- TResourceReader reader;
- CCoeEnv::Static()->CreateResourceReaderLC(reader, R_AVKON_TOUCH_INDICATOR_EDIT_MODE_MENU);//
-
- const TInt menuCount=reader.ReadInt16();
- for ( TInt ii=0; ii<menuCount; ++ii )
- {
- CEikMenuPaneItem* item = new(ELeave) CEikMenuPaneItem();
- CleanupStack::PushL( item );
- item->iData.iCommandId = reader.ReadInt32();
- item->iData.iCascadeId = reader.ReadInt32();
- item->iData.iFlags = reader.ReadInt32();
- TPtrC txtptr = reader.ReadTPtrC();
- item->SetScaleableTextL( txtptr );
- TPtrC extratxtptr = reader.ReadTPtrC();
- item->iData.iExtraText = extratxtptr;
- TPtrC bitmapFile = reader.ReadTPtrC();
- TInt bitmapId = reader.ReadInt16();
- TInt bitmapMaskId = reader.ReadInt16();
- CleanupStack::Pop(); // pop first, since additem pushes again
- editorMenuPane->AddMenuItemL( item->iData );
- editorMenuItemList.Append(item);
- reader.ReadInt32(); // extension link
- }
-
- CleanupStack::PopAndDestroy(); //reader
-
-
- if (editorState)
- {
- menuBar = iUiInterface->EditorStateMenuBar(editorState);
- }
-
- TInt count = 0;
-
- if ( menuBar )
- {
- CAknFepUiInterfaceMenuPane* menuPane = menuBar->MenuPane();
-
- CEikMenuPane* oldMenuPane = menuPane->GetMenuPane();
-
- menuPane->SetMenuPane(editorMenuPane);
-
- DynInitTouchMenuPaneL(menuPane);
-
- menuPane->SetMenuPane(oldMenuPane);
-
-
- for (TInt ii = 0; ii < KMaxMenuSize; ii++)
- {
- CEikMenuPaneItem::SData& itemdata =
- editorMenuPane->ItemData(KEditorMenuPermitedSend[ii]);
- if ( !(itemdata.iFlags & EEikMenuItemDimmed ) )
- {
- count = count + 1;
- iEditorCommandList[count] = itemdata.iCommandId;
- }
- }
- iEditorCommandList[0] = count;
- if (!aOnlyCount && iFepPluginManager->CurrentPluginInputFepUI())
- {
- iFepPluginManager->CurrentPluginInputFepUI()->HandleCommandL(
- ECmdPenInputSendEditMenuData, reinterpret_cast<TInt>(iEditorCommandList));
- }
-
- editorMenuItemList.ResetAndDestroy();
- delete editorMenuPane;
- editorMenuPane = NULL;
- }
-
- return count;
- }
-#endif // RD_SCALABLE_UI_V2
-
-void CAknFepManager::ExitPluginSpellModeByOk()
- {
- TRAP_IGNORE(ExitPluginSpellModeByOkL());
- }
-
-void CAknFepManager::ExitPluginSpellModeByOkL()
- {
-#ifdef RD_SCALABLE_UI_V2
- if (iFepPluginManager->IsSpellVisible())
- {
- HBufC* spell = iFepPluginManager->SpellTextInput();
-
- iFepPluginManager->SetITUTSpellingStateL(EFalse);
- iFepPluginManager->DestroySpellEditor();
-
- if (spell)
- {
- CleanupStack::PushL(spell);
- TPtr text = spell->Des();
- FepUI()->AddTextToUserDictionaryL(text);
- InsertTextFromDialogL(text, iFepPluginManager->CursorSelection());
- CleanupStack::PopAndDestroy(spell);
- }
-
- UpdateCbaL(NULL);
- if (iFepPluginManager->CaseUpdatesSupressed())
- {
- SetFlag(EFlagSupressAutoUpdate);
- }
- else
- {
- ClearFlag(EFlagSupressAutoUpdate);
- }
- ClearFlag(EFlagSupressAutoUpdateAtEditorStart);
- }
-#endif
- }
-
-void CAknFepManager::ExitPluginSpellModeByCancel()
- {
-/*
-#ifdef RD_SCALABLE_UI_V2
- if (iFepPluginManager->IsSpellVisible())
- {
- iFepPluginManager->SetITUTSpellingStateL(EFalse);
- iFepPluginManager->DestroySpellEditor();
- UpdateCbaL(NULL);
- HandleChangeInFocus();
- if (iFepPluginManager->CursorSelection().Length())
- {
- EditorState()->SetInlineEditSpan(iFepPluginManager->CursorSelection());
- ConfigureFEPFromEditorStateL();
- }
- TransferFepStateToEditorL();
-
- if (iFepPluginManager->CaseUpdatesSupressed())
- {
- SetFlag(EFlagSupressAutoUpdate);
- }
- else
- {
- ClearFlag(EFlagSupressAutoUpdate);
- }
- ClearFlag(EFlagSupressAutoUpdateAtEditorStart);
- iFepPluginManager->SetBeforeSpell(ETrue);
- }
-#endif
-*/
-#ifdef RD_SCALABLE_UI_V2
- if (iFepPluginManager->IsSpellVisible())
- {
- TRAP_IGNORE(iFepPluginManager->SetITUTSpellingStateL(EFalse));
- iFepPluginManager->DestroySpellEditor();
-
- TRAP_IGNORE(UpdateCbaL(NULL));
- if (iFepPluginManager->CaseUpdatesSupressed())
- {
- SetFlag(EFlagSupressAutoUpdate);
- }
- else
- {
- ClearFlag(EFlagSupressAutoUpdate);
- }
- ClearFlag(EFlagSupressAutoUpdateAtEditorStart);
- }
-#endif
- }
-
-void CAknFepManager::ProcessCommandL(TInt aCommandId)
- {
- //ProcessCommandL() is called before HandleChangeInFocus() for the editor to insert the
- //number into, so have to force a call
-
- //Process pen input menu if avaliable
-#ifdef RD_SCALABLE_UI_V2
-
- if (iFepPluginManager &&
- (iFepPluginManager->PluginInputMode() == EPluginInputModeItut))
- {
- switch(aCommandId)
- {
- case EAknSoftkeyOptions:
- {
- LaunchSelectModeMenuL();
- }
- return;
- case EAknSoftkeyOk:
- {
- iFepPluginManager->ClosePluginInputModeL(ETrue);
- }
- return;
- default:
- {
- break;
- }
- }
- }
-
- SendEventsToPluginManL( EPluginMenuCmd, aCommandId );
-
-#endif //RD_SCALABLE_UI_V2
- MAknFepManagerInterface* currentFepUI=NULL;
- switch (aCommandId)
- {
- // Edit mode menu commands
- //The soft CBA event from touch screen.
- case EAknSoftkeyCancel:
- // case (TUint16)EAknSoftkeyCancel:
- case EAknSoftkeySelect:
- // case (TUint16)EAknSoftkeySelect:
- currentFepUI = FepUI();
- if (currentFepUI)
- currentFepUI->HandleCommandL( aCommandId );
- break;
- // --- commands for Japanese ---
- case EJapanFepCmdModeHiragana:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(EHiraganaKanji);
- break;
- case EJapanFepCmdModeKatakana:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(EKatakana);
- break;
- case EAknCmdEditInsertPictograph:
- SetStopProcessFocus(ETrue);
- HandleChangeInFocus();
- LaunchPictographCharacterTableL();
- SetStopProcessFocus(EFalse);
- break;
- case EJapanFepCmdModeFullWidth:
- case EPenInputJpCmdFullWidth:
- case EJapanFepCmdModeHalfWidth:
- case EPenInputJpCmdHalfWidth:
- {
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- if (aCommandId == EJapanFepCmdModeFullWidth
- || aCommandId == EPenInputJpCmdFullWidth)
- {
- iCharWidth = EFullWidthChar;
- }
- else
- {
- iCharWidth = EHalfWidthChar;
- }
- UpdateIndicators();
- TryChangeModeL(iMode);
-#ifdef RD_SCALABLE_UI_V2
- if (aCommandId == EPenInputJpCmdFullWidth
- || aCommandId == EPenInputJpCmdHalfWidth)
- {
- // Re-open pen input window
- SendEventsToPluginManL( EPluginActivate );
- }
-#endif //RD_SCALABLE_UI_V2
- }
- break;
- case EJapanFepCmdModeUserDic:
- case EPenInputJpCmdSaveWord:
- {
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- // User dictionary
-#ifdef RD_PF_SEC_APPARC
- // Launch settings app
- if ( iNullService )
- {
- delete iNullService;
- iNullService = NULL;
- }
- iNullService = CAknNullService::NewL( KUidUserDictApp, this );
-#else
- CEikProcess* process = CEikonEnv::Static()->Process();
- if (iEmbedded)
- {
- process->DestroyDocument(iEmbedded);
- }
-#if (defined(SYMBIAN_SUPPORT_UI_FRAMEWORKS_V1) || defined(__SERIES60_27__) || defined(__SERIES60_28__))
- iEmbedded = process->AddNewDocumentL(_L("User Dictionary"), KUidUserDictApp);
-#else
- iEmbedded = process->AddNewDocumentL(KUidUserDictApp);
-#endif
- iEmbedded->NewDocumentL();
- iEmbedded->EditL(NULL);
-#endif //RD_PF_SEC_APPARC
- }
- break;
- case EPenInputJpCmdKutenCode:
- case EJapanFepCmdModeKutenCodeInput:
- {
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- LaunchKutenCodeQueryL();
-#ifdef RD_SCALABLE_UI_V2
- if (aCommandId == EPenInputJpCmdKutenCode)
- {
- // Re-open pen input window
- SendEventsToPluginManL( EPluginActivate );
- }
-#endif //RD_SCALABLE_UI_V2
- }
- break;
- case EAknCmdEditClearDirectionLeft:
- case EAknCmdEditClearDirectionRight:
- {
- TInt value = EClearDirectionLeft;
- if (aCommandId == EAknCmdEditClearDirectionRight)
- {
- value = EClearDirectionRight;
- }
- iSharedDataInterface->SetClearDirection(value);
- }
- break;
- case EAknFepSoftkeyCloseWindow:
- if(IsChineseInputLanguage())
- {
- TryCloseUiL();
- }
- if (iCcpuMode != ECcpuStateNone)
- {
- ResetCcpuFlags();
-
- // reset select mode indicators
- iIndicator->SetCopyMode(EFalse);
- // update view
- iPreviousEditingState = EStateNone;
- UpdateIndicators();
-
- iUiInterface->DeleteSoftkeys();
- break;
- }
- case EAknFepSoftkeyCommit:
- case EAknFepSoftkeySelectCandidate:
- case EAknFepSoftkeyConvert:
- case EAknFepSoftkeyOtherModes:
- case EAknFepSoftkeyRetroActiveHalf:
- case EAknFepSoftkeyRetroActiveFull:
- {
- FepUI()->HandleCommandL(aCommandId);
- }
- break;
- case EAknFepSoftkeyPredictiveOn:
- {
- iJapanesePredictive = ETrue;
- iSharedDataInterface->SetJapanesePredictiveTextOn();
- iHashKeyMan->SetMode(iMode, ETrue);
- UpdateIndicators();
- FepUI()->HandleCommandL(aCommandId);
- }
- break;
- case EJapanFepCmdModePredictiveOn:
- {
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- if (!iJapanesePredictive)
- {
- LaunchConfirmationNoteL(R_AVKON_JAPANESE_PREDICTIVE_ACTIVATED_NOTE);
- }
- iJapanesePredictive = ETrue;
- TryChangeModeL(EHiraganaKanji);
- iSharedDataInterface->SetJapanesePredictiveTextOn();
- }
- break;
- case EJapanFepCmdModePredictiveOff:
- {
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- if (iJapanesePredictive)
- {
- LaunchConfirmationNoteL(R_AVKON_JAPANESE_PREDICTIVE_DEACTIVATED_NOTE);
- }
- iJapanesePredictive = EFalse;
- TryChangeModeL(EHiraganaKanji);
- iSharedDataInterface->ResetJapanesePredictiveTextOn();
- }
- break;
-#ifdef RD_SCALABLE_UI_V2
- case EPenInputJpCmdPredictiveOn:
- {
- iJapanesePredictive = ETrue;
- iSharedDataInterface->SetJapanesePredictiveTextOn();
- if (iFepPluginManager->PluginInputMode() == EPluginInputModeHwr)
- {
- iSharedDataInterface->SetJapaneseHwrConversion(EJapaneseConversionOn);
- }
- }
- break;
- case EPenInputJpCmdPredictiveOff:
- {
- iJapanesePredictive = EFalse;
- iSharedDataInterface->ResetJapanesePredictiveTextOn();
- }
- break;
- case EPenInputJpCmdConversionOn:
- {
- iSharedDataInterface->SetJapaneseHwrConversion(EJapaneseConversionOn);
- }
- break;
- case EPenInputJpCmdConversionOff:
- {
- iSharedDataInterface->SetJapaneseHwrConversion(EJapaneseConversionOff);
- }
- break;
-#endif //RD_SCALABLE_UI_V2
-
- // --- commands for Chinese ---
- case EChinFepCmdModePinyin:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(EPinyin);
- break;
- case EChinFepCmdModeZhuyin:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(EZhuyin);
- break;
- case EChinFepCmdModeStroke:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(EStroke);
- break;
- case EChinFepCmdModeCangJie:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(ECangJie);
- break;
- case EChinFepCmdModeCangJieOption:
- // Launch CangJie option dialog
- {
- SetStopProcessFocus(ETrue);
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- TInt newMode = LaunchCangJieOptionDlgL();
- SetStopProcessFocus(EFalse);
- UpdateCangJieState( newMode );
- }
- break;
- case EChinFepCmdModeLatinUpper:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(ELatinUpper);
- // delete it for support auto update to text-case
- //SetFlag(EFlagSupressAutoUpdate);
- iCaseMan->SetCurrentCase(EAknEditorUpperCase);
- break;
- case EAknCmdEditModeKorean:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(EHangul);
- // delete it for support auto update to text-case
- //SetFlag(EFlagSupressAutoUpdate);
- iCaseMan->SetCurrentCase(EAknEditorUpperCase);
- break;
- case EChinFepCmdModeLatinLower:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(ELatinLower);
- // delete it for support auto update to text-case
- //SetFlag(EFlagSupressAutoUpdate);
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- break;
- case EAknCmdEditModeNumber:
- case EJapanFepCmdEditModeNumber:
- case EChinFepCmdModeNumber:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- if ( iLanguageCapabilities.iArabicIndicDigitsAllowed
- || iLanguageCapabilities.iEasternArabicIndicDigitsAllowed
- || iLanguageCapabilities.iIndicDigitsAllowed )
- {
- iLanguageCapabilities.iLocalDigitType = EDigitTypeWestern;
- }
- TryChangeModeL(ENumber);
- break;
- case EAknCmdEditModeArabicIndicNumber:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- iLanguageCapabilities.iLocalDigitType = EDigitTypeArabicIndic;
- TryChangeModeL(ENativeNumber);
- break;
- /*For Eastern Arabic Numeric*/
- case EAknCmdEditModeEasternArabicIndicNumber:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- iLanguageCapabilities.iLocalDigitType = EDigitTypeEasternArabicIndic;
- TryChangeModeL(ENativeNumber);
- break;
- /*for Hindi*/
- case EAknCmdEditModeIndicNumber:
- HandleChangeInFocus();
- iLanguageCapabilities.iLocalDigitType = EDigitTypeDevanagari;
- TryChangeModeL(ENativeNumber);
- break;
- case EChinFepCmdInstructions:
- SetStopProcessFocus(ETrue);
- HandleChangeInFocus();
- LaunchHelpTextQueryL();
- SetStopProcessFocus(EFalse);
- break;
- case EChinFepCmdModeZhuyinFind:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(EZhuyinFind);
- break;
- case EChinFepCmdModeStrokeFind:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(EStrokeFind);
- break;
-
- // commands for western or common
- case EJapanFepCmdMultitapPredictiveT9On:
- case EAknCmdMultitapPredictiveT9On:
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- case EAknFepCmdPredActivate:
-#endif //RD_INTELLIGENT_TEXT_INPUT
- SetStopProcessFocus(ETrue, EFalse);
- HandleChangeInFocus();
-#ifdef RD_SCALABLE_UI_V2
- if( iFepFullyConstructed && iFepPluginManager)
- {
- iFepPluginManager->SetMenuState();
- }
-#endif
- if ( !iWesternPredictive )
- {
- LaunchConfirmationNoteL(R_AVKON_T9_ACTIVATED_NOTE);
- }
- SetWesternPredictive(ETrue);
- SetStopProcessFocus(EFalse);
- TryChangeModeL(ELatin);
- break;
- case EAknCmdT9PredictiveT9Off:
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- case EAknFepCmdPredDeactivate:
-#endif //RD_INTELLIGENT_TEXT_INPUT
- SetStopProcessFocus(ETrue, EFalse);
- HandleChangeInFocus();
-#ifdef RD_SCALABLE_UI_V2
- if( iFepFullyConstructed && iFepPluginManager)
- {
- iFepPluginManager->SetMenuState();
- }
-#endif
- if (iMode != ELatin)
- {
- TryChangeModeL(ELatin);
- }
- else
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- RemoveSuggestedAdvanceCompletionL();
-#endif // RD_INTELLIGENT_TEXT_INPUT
- CommitInlineEditL();
- }
- if ( iWesternPredictive )
- {
- LaunchConfirmationNoteL(R_AVKON_T9_DEACTIVATED_NOTE);
- }
- SetWesternPredictive(EFalse);
- SetStopProcessFocus(EFalse);
- break;
- case EAknCmdEditModeEnglish:
- case EAknCmdEditModeAlpha:
- case EJapanFepCmdEditModeAlpha:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(ELatin);
- iCaseMan->UpdateCase( ENullNaviEvent );
- ClearFlag(EFlagSupressAutoUpdate);
- break;
- case EAknCmdEditModeLatinText:
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- TryChangeModeL(ELatinText);
- ClearFlag(EFlagSupressAutoUpdate);
- iCaseMan->SetCurrentCase(EAknEditorTextCase);
- break;
- case EAknCmdEditInsertSymbol:
- case EAknCmdEditInsertSymbolJp:
- case EAknFepSoftkeySymbol:
- case EAknCmdEditInsertSmiley:
- SetCcpuFlag(ECcpuStateSupressCursorMoveToEnd);
-#ifdef RD_SCALABLE_UI_V2
- if (iFepPluginManager &&
- (iFepPluginManager->PluginInputMode() == EPluginInputModeItut ||
- iFepPluginManager->PluginInputMode() == EPluginInputModeFSQ ||
- iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr))
- {
- iFepPluginManager->SetMenuState();
- }
-
-#endif //RD_SCALABLE_UI_V2
- SetStopProcessFocus(ETrue, EFalse);
- HandleChangeInFocus();
- if (aCommandId == EAknFepSoftkeySymbol)
- {
- SetCcpuFlag(ECcpuStateCbaSymbol);
- }
- // Show Thai specific SCT with Thai vowels and tonemarks
- if ( (iLanguageCapabilities.iInputLanguageCode == ELangThai ) &&
- (iMode!=ENumber && iMode != ENativeNumber ) )
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // if itut call Thai multitap HandleCommandL to Launch SCT
- if(!iQwertyInputMode)
- {
-#endif
- TInt resourceId = 0;
- if (iAknFepThaiSCTSelector)
- {
- resourceId = iAknFepThaiSCTSelector->ThaiSCRResourceId(PreviousChar(),EPtiKeyStar);
- }
- LaunchSpecialCharacterTableL(resourceId,
- aCommandId==EAknCmdEditInsertSymbol,
- aCommandId==EAknCmdEditInsertSmiley);
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- }
- else
- {
- CAknFepUIManagerWestern* westernUIManager = static_cast<CAknFepUIManagerWestern*>(FepUI());
- LaunchSpecialCharacterTableL(westernUIManager->ThaiSCTResourceId(static_cast<TChar>(PreviousChar()),EPtiKeyStar),
- aCommandId==EAknCmdEditInsertSymbol,
- aCommandId==EAknCmdEditInsertSmiley);
- }
-#endif
- }
- else
- {
- LaunchSpecialCharacterTableL(0,
- aCommandId==EAknCmdEditInsertSymbol,
- aCommandId==EAknCmdEditInsertSmiley);
- }
- SetStopProcessFocus(EFalse);
- ClearCcpuFlag(ECcpuStateCbaSymbol);
- break;
- case EAknFepSoftkeyPrevious:
- FepUI()->HandleCommandL(aCommandId);
- break;
- case EAknFepSoftkeySpell:
- LaunchEditWordQueryL();
- break;
- case EAknCmdT9PredictiveInsertWord:
- SetStopProcessFocus(ETrue);
- HandleChangeInFocus();
- LaunchInsertWordQueryL(KNullDesC, TCursorSelection(0,0));
- SetStopProcessFocus(EFalse);
-#ifdef RD_SCALABLE_UI_V2
- if( iFepFullyConstructed && iFepPluginManager)
- {
- iFepPluginManager->ResetMenuState();
- }
-#endif
- break;
- case EAknCmdT9PredictiveEditWord:
- SetStopProcessFocus(ETrue);
- HandleChangeInFocus();
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- RemoveSuggestedAdvanceCompletionL();
-#endif // RD_INTELLIGENT_TEXT_INPUT
- LaunchEditWordQueryL();
- SetStopProcessFocus(EFalse);
-#ifdef RD_SCALABLE_UI_V2
- if( iFepFullyConstructed && iFepPluginManager )
- {
- iFepPluginManager->ResetMenuState();
- }
-#endif
- break;
- case EAknCmdT9PredictiveMatches:
- SetStopProcessFocus(ETrue,EFalse);
- LaunchMatchesPopupListL();
- SetStopProcessFocus(EFalse);
- break;
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- case EAknCmdPredictiveAutoWord:
- if ( !iIsAutoCompleteOn )
- {
- SetStopProcessFocus(ETrue);
- LaunchConfirmationNoteL(R_AVKON_PREDICTIVE_AUTOCOMPLETION_ACTIVATED_NOTE);
- SetStopProcessFocus(EFalse);
- }
- iIsAutoCompleteOn = ETrue;
- iSharedDataInterface->SetPredictiveTextAutoCompleteOn();
-#ifdef RD_SCALABLE_UI_V2
- if(iFepPluginManager->PluginInputMode() == EPluginInputModeItut)
- {
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- HandleChangeInFocus();
- }
-#endif
- UpdateIndicators();
- break;
- case EAknCmdPredictiveNormal:
- if ( iIsAutoCompleteOn )
- {
- SetStopProcessFocus(ETrue);
- LaunchConfirmationNoteL(R_AVKON_PREDICTIVE_AUTOCOMPLETION_DEACTIVATED_NOTE);
- SetStopProcessFocus(EFalse);
- }
- iIsAutoCompleteOn = EFalse;
- iSharedDataInterface->ResetPredictiveTextAutoCompleteOn();
- UpdateIndicators();
- break;
-#endif
- case EAknCmdInputLanguage:
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- case EAknFepCmdPredInputLanguage:
-#endif //RD_INTELLIGENT_TEXT_INPUT
- SetStopProcessFocus(ETrue, EFalse);
- HandleChangeInFocus();
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef FF_DUAL_LANGUAGE_SUPPORT
- // Currently dual language feature would work correctly for ITUT and Half Qwerty products
- // Hence the dual language settings should also be displayed only for ITUT and Halfqwerty products
- if(iKeyboardType == EPtiKeyboard12Key || iKeyboardType == EPtiKeyboardHalfQwerty )
- LaunchDualLanguageSettingDialogL();
- else
- {
- LaunchLanguagesPopupListL(aCommandId == EAknCmdInputLanguage);
- iStopProcessFocus = EFalse;
- }
-#else // FF_DUAL_LANGUAGE_SUPPORT
- LaunchLanguagesPopupListL(aCommandId == EAknCmdInputLanguage);
- //HandleChangeInFocus();
- iStopProcessFocus = EFalse;
-#endif // FF_DUAL_LANGUAGE_SUPPORT
-#else
- LaunchLanguagesPopupListL(aCommandId == EAknCmdInputLanguage);
- HandleChangeInFocus();
- iStopProcessFocus = EFalse;
-#endif
- break;
- case EAknEditMenuCmdCutText:
- StartCcpuModeL(EFalse);
- if (WesternPredictive())
- {
- // Remove underlining from predicted word when focus is re-gained.
- SetCcpuFlag(ECcpuStateUncommitWhenFocused);
- }
- SetCcpuFlag(ECcpuStateIgnoreNextFocusChange);
- SetCcpuFlag(ECcpuStateEdwinInSelectionMode);
- break;
- case EAknEditMenuCmdCopyText:
- StartCcpuModeL(ETrue);
- if (WesternPredictive())
- {
- // Remove underlining from predicted word when focus is re-gained.
- SetCcpuFlag(ECcpuStateUncommitWhenFocused);
- }
- SetCcpuFlag(ECcpuStateIgnoreNextFocusChange);
- SetCcpuFlag(ECcpuStateEdwinInSelectionMode);
- break;
- case EAknFepSoftkeyStartCopy:
- case EAknFepSoftkeyStartCut:
- {
- ResetCcpuFlags();
- if (aCommandId == EAknFepSoftkeyStartCopy)
- {
- SetCcpuFlag(ECcpuStateCopy);
- }
- else
- {
- SetCcpuFlag(ECcpuStateCut);
- }
-
- __ASSERT_DEBUG(iUiInterface->SoftkeysExist(),
- AknFepPanic(EAknFepPanicNoHandleToFepAwareTextEditor));
-
- TBool update = UpdateCBALabelL(ELeftSoftkeyIndex, KNullCommandId, R_TEXT_SOFTKEY_EMPTY);
- update |= UpdateCBALabelL(ERightSoftkeyIndex, EAknFepSoftkeyCloseWindow,
- R_AKNFEP_SOFTKEY_CCPU_CANCEL);
- update |= UpdateCBALabelL( EMiddleSoftkeyIndex, KNullCommandId, R_TEXT_SOFTKEY_EMPTY );
- if (update)
- {
- iUiInterface->DrawSoftkeysNow();
- }
- }
- break;
- case EEikCmdEditCopy:
- case EEikCmdEditCut:
- {
-#ifdef RD_SCALABLE_UI_V2
- if (iFepPluginManager &&
- (iFepPluginManager->PluginInputMode() == EPluginInputModeItut ||
- iFepPluginManager->PluginInputMode() == EPluginInputModeFSQ ||
- iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr))
- {
- iFepPluginManager->SetMenuState(EFalse);
- }
-
-#endif //RD_SCALABLE_UI_V2
- SetStopProcessFocus(ETrue, EFalse);
- HandleCopyCutEventL(aCommandId);
- SetStopProcessFocus(EFalse);
- }
- break;
- case EEikCmdEditPaste:
- {
- // We have a hindi character in clipboard which can form ligature with the existing text
- // if pasted. While the input language is English, the cursor aligmment check would not happen.
- // When selecting Options->Paste, the Fep context at this point is for the menu.
- // iInputCapabilities for editor context is retrived from CCoeEnv and is restored back
- // after doing the operation, else FepAwareTextEditor will be true in menu context.
- if ( (!BidiCursorRequired()) && (!WesternPredictive()) )
- {
- TCoeInputCapabilities origInputCapabilities = iInputCapabilities;
-
- CCoeEnv* coeEnv = CCoeEnv::Static();
- iInputCapabilities = static_cast<const CCoeAppUi*>(coeEnv->AppUi())->InputCapabilities();
-
- if( !(iInputCapabilities.SupportsSecretText()) )
- {
- DoCursorDirectionCheckL();
- }
- iInputCapabilities = origInputCapabilities;
- }
- }
- break;
-
- case EAknCmdEditMenuSctSelected:
- {
- SetCcpuFlag(ECcpuStateSupressCursorMoveToEnd);
- HandleChangeInFocus(); // to re-establish contact with editor
-
- TBuf<ESingleCharacter> charAsDesc(ESingleCharacter);
- for ( TInt ii = 0; ii < iSctEditChars->Length(); ii++)
- {
- charAsDesc[0]=(TText) (*iSctEditChars)[ii];
- if (charAsDesc[0] == TText(0x000A) // 0x000A is line feed
- || charAsDesc[0] == CEditableText::EParagraphDelimiter)
- {
- // This is line feed character. Post it to editor and let it decide
- // if it is valid.
- if (!(iAknEditorFlags & EAknEditorFlagFindPane) && iSctEditChars->Length() == 1)
- {
- SimulateKeyEventL(EKeyEnter);
- SimulateKeyEventL(EKeyF19); // Asyncronous case update
- }
- }
- else
- {
- if (CharIsValidInEditor(charAsDesc[0]))
- {
- TCursorSelection cursorSelection(0,0);
- if ((iAknEditorFlags & EAknEditorFlagMTAutoOverwrite) &&
- iMode == ELatin && !WesternPredictive())
- {
- TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- if (iUncommittedText.iCursorPos < edSize && iUncommittedText.Length() == 0)
- {
- cursorSelection = TCursorSelection(iUncommittedText.iCursorPos + 1,
- iUncommittedText.iAnchorPos);
- }
- }
-
- if (EditorHasFreeSpace())
- {
- InsertTextFromDialogL(charAsDesc, cursorSelection);
- }
-
- }
- }
-
- }
- }
- break;
- case EAknCmdTaskSwapper:
- SendEventsToPluginManL( EPluginFaseSwap, ETrue );
- break;
-
- case EAknCmdEditMenuClose:
- {
- // Handle destruction of menu
- StopDisplayingMenuBar();
- }
- break;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- case EAknFepCmdPredMatches:
- {
- HandleChangeInFocus(); // to re-establish contact with editor
- // Focus current active word in list ---->
- TInt wordToFocus;
- iPtiEngine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates, &wordToFocus );
- iSListLaunchedFromMenu = ETrue;
- TKeyEvent candLaunch = {EKeyDownArrow, EStdKeyDownArrow, 0, 0};
- CEikonEnv::Static()->WsSession().SimulateKeyEvent(candLaunch);
- //LaunchCandidatePopupListL( wordToFocus );
- }
- break;
- case EAknFepCmdPredSettings:
- LaunchPredictiveSettingDialogL();
- break;
- /*
- This code is the part of fixing TSW Error ID: BSAN-7G58DB : Edit Menu :
- "Matches" and "insert word" options are not available under Edit Menu.
- This is For Insert Word Functionality*/
- case EAknEditMenuCmdInsertWord:
- HandleChangeInFocus();
- LaunchInsertWordQueryL(KNullDesC, TCursorSelection(0,0));
- break;
-#ifdef __USER_DICTIONARY_EDITING__
- case EAknFepCmdPredEditUserDictionary:
- if ( IsAutoCompleteOn() )
- {
- HandleChangeInFocus();
- RemoveSuggestedAdvanceCompletionL();
- }
- UiInterface()->LaunchUserDictEditDialogL();
- break;
-#endif //__USER_DICTIONARY_EDITING__
-
- case EAknFepCmdPredHelp:
- // Help ID:PREDINPUT_HLP_INPUT
- {
- const TInt KArrayGranularity = 3;
- CArrayFix<TCoeHelpContext>* contexts =
- new (ELeave) CArrayFixFlat<TCoeHelpContext>( KArrayGranularity );
- CleanupStack::PushL ( contexts );
- TUid appuid = { 0x100058EC };
- contexts->AppendL( TCoeHelpContext( appuid, KFEPPREDINPUT_HLP_INPUT ) );
- CleanupStack::Pop( contexts );
- HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(), contexts );
- }
- break;
- // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
- // add for phrase creation user db view.
- case EAknCmdUserDBDlg:
- {
- HandleChangeInFocus();
- LaunchUserDBDlgL();
- }
- break;
- case EPenInputCmdPreviewOn:
- {
- iSharedDataInterface->SetFepShowVkbPreviewStatus(KTouchInputPreviewOn);
- SendEventsToPluginManL(EPluginPreview, KTouchInputPreviewOn);
- }
- break;
- case EPenInputCmdPreviewOff:
- {
- iSharedDataInterface->SetFepShowVkbPreviewStatus(KTouchInputPreviewOff);
- SendEventsToPluginManL(EPluginPreview, KTouchInputPreviewOff);
- }
- break;
- case EPenInputCmdRecognitionWithDictionary:
- {
- SetStopProcessFocus(ETrue);
- HandleChangeInFocus();
- LaunchRecognitionWithDictionaryPopupListL();
- HandleChangeInFocus();
- iStopProcessFocus = EFalse;
- }
- break;
- default:
- break;
- }
-
-
- StopDisplayingMenuBar();
- }
-
-void CAknFepManager::SetEmphasis(CBase* /*aMenuControl*/,TBool aEmphasis)
- {
- if (aEmphasis)
- { // opening main menu pane
- SetFlag(EFlagMenuPaneVisible);
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- SetFlag(EFlagInlineEditInBackground);
- }
- }
- else
- {
- // The pointer to be cleared when the callback is received on leaving the focus from the menu pane.
-#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__
- iOptionsMenuBar = NULL;
-#endif
- ClearFlag(EFlagMenuPaneVisible | EFlagRemoveMatchesMenuItem | EFlagInlineEditInBackground);
- }
- }
-
-void CAknFepManager::DynInitMenuBarL(TInt aResourceId, CAknFepUiInterfaceMenuBar* aMenuBar)
- {
- if (iFepFullyConstructed && IsFlagSet(EFlagLaunchEditMenu))
- {
- aMenuBar->ReplaceAllMenuPanes(R_AVKON_EDIT_MODE_MENU);
- }
-
-#ifdef RD_SCALABLE_UI_V2
- if (iFepFullyConstructed &&
- aResourceId == R_AVKON_PENINPUT_OPTION_MENU_BAR)
- {
- aMenuBar->ReplaceAllMenuPanes(R_AVKON_TOUCH_TOUCHINPUT_MENU);
- }
-#endif //RD_SCALABLE_UI_V2
-
- }
-
-#ifdef RD_SCALABLE_UI_V2
-void CAknFepManager::DynInitTouchMenuPaneL(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- if ( !iFepFullyConstructed )
- {
- return;
- }
-
-
- if (iFepManState != EAknFepStateNull &&
- iInputCapabilities.FepAwareTextEditor() &&
- !(iAknEditorFlags & EAknEditorFlagFindPane))
- {
- // 'Input language' menu item on option menu isn't supported in Japanese variant.
- if (!IsFeatureSupportedJapanese())
- {
- // Insert 'Input language' item to incoming menu if editor is active on screen and
- // menu contains 'Help' or 'Exit' item.
- if (!IsOnlyNumericPermitted())
- {
- TInt helpIndex;
- if (aMenuPane->MenuItemExists(EAknCmdHelp, helpIndex) ||
- aMenuPane->MenuItemExists(EAknCmdExit, helpIndex))
- {
- AddInputLanguageItemL(aMenuPane, helpIndex);
- }
- }
- }
- }
-
- TInt index;
- if(aMenuPane->MenuItemExists(EAknCmdEditItemPlaceHolder, index))
- {
- aMenuPane->DeleteMenuItem(EAknCmdEditItemPlaceHolder);
- }
-
- ClearFlag(EFlagLaunchEditMenu);
-
- DimInputmodeTouchMenuItems(aMenuPane);
- }
-#endif //RD_SCALABLE_UI_V2
-void CAknFepManager::DynInitMenuPaneL(TInt aResourceId, CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- if ( !iFepFullyConstructed )
- {
- return;
- }
-
-#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__
- CAknEdwinState* editorState = NULL;
- if (iInputCapabilities.FepAwareTextEditor())
- {
- editorState = EditorState();
- }
-
- if (editorState)
- {
- iOptionsMenuBar = iUiInterface->EditorStateMenuBar(editorState);
- }
-#endif
-
- SetCcpuFlag(ECcpuStateIgnoreNextEdwinSyncEvent);
-
- if (iFepManState != EAknFepStateNull &&
- iInputCapabilities.FepAwareTextEditor() &&
- !(iAknEditorFlags & EAknEditorFlagFindPane))
- {
- // 'Input language' menu item on option menu isn't supported in Japanese variant.
- if (!IsFeatureSupportedJapanese())
- {
- // Insert 'Input language' item to incoming menu if editor is active on screen and
- // menu contains 'Help' or 'Exit' item.
- //Also, no need for writing language/ITI options in telephony's dialer
- if ( (RProcess().SecureId().iId != KPhoneSecureId) && !IsOnlyNumericPermitted() )
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- //This method gets called multiple times - first before the help and exit
- //commands are populated and finally after these items are added.
- //So if we have already added the input options menu and/or writing language menu,
- //remove it. It will get added again to the correct place with the below code.
- //No need to handle following menu types here.
- if ( !( R_AVKON_EDIT_MODE_MENU == aResourceId ||
- R_AKNFEP_PRED_INPUT_OPTIONS_SUBMENU == aResourceId ||
- R_AVKON_PREDICTIVE_TEXT_MENU_T9 == aResourceId ||
- R_AVKON_INPUT_MODE_SUB_MENU == aResourceId ||
- R_AKNFEP_EDIT_SUBMENU == aResourceId ||
- R_AVKON_TOUCH_TOUCHINPUT_MENU == aResourceId )
- // Add this condition for adding "input options" into the option menu of FSQ.
- || ( R_AVKON_TOUCH_TOUCHINPUT_MENU == aResourceId
- && iFepPluginManager
- && iFepPluginManager->IsSupportITIOnFSQ() )
- )
- {
- FindAndRemoveInputOptionsMenuItemL( aMenuPane );
- FindAndRemoveEditSubMenuItemL (aMenuPane);
- AddInputOptionsMenuItemL( aMenuPane );
- }
-#else
- TInt helpIndex;
- if ( aMenuPane->MenuItemExists(EAknCmdHelp, helpIndex) ||
- aMenuPane->MenuItemExists(EAknCmdExit, helpIndex) )
- {
- AddInputLanguageItemL(aMenuPane, helpIndex);
- }
-
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if ( IsChineseInputLanguage() &&
- ( iKeyboardType == EPtiKeyboardQwerty4x10 ||
- iKeyboardType == EPtiKeyboardQwerty3x11 ) )
- {
- // the follow added for phrase creation
- TInt iptlanguage;
- if ( !iIsUserdbdlgActive )
- {
- aMenuPane->MenuItemExists( EAknCmdInputLanguage, iptlanguage );
- AddUserDBDlgItemL( aMenuPane, iptlanguage );
- }
- }
-#endif
-
- if (!(aResourceId == R_AVKON_EDIT_MODE_MENU ||
- aResourceId == R_AVKON_TOUCH_TOUCHINPUT_MENU ||
- aResourceId == R_AVKON_TOUCH_INDICATOR_EDIT_MODE_MENU))
- {
- AddEditSubmenuL(aMenuPane);
- }
- }
-
- //HWR Hindi, Training application is not available,
- //Disable Menu option
- if(aResourceId == R_AVKON_TOUCH_TOUCHINPUT_MENU &&
- iLanguageCapabilities.iInputLanguageCode == ELangHindi)
- {
- aMenuPane->SetItemDimmed(EPenInputCmdHwrTraining, ETrue);
- }
- TInt index;
- if(aMenuPane->MenuItemExists(EAknCmdEditItemPlaceHolder, index))
- {
- aMenuPane->DeleteMenuItem(EAknCmdEditItemPlaceHolder);
- }
-#ifdef RD_SCALABLE_UI_V2
- TInt oldPermitModes = -1;
- if (R_AVKON_TOUCH_TOUCHINPUT_MENU == aResourceId )
- {
- oldPermitModes = iPermittedInputModes;
-
- if( iFepPluginManager != NULL )
- {
- iPermittedInputModes = iFepPluginManager->PreviousPermitMode();
- }
- }
-
- iFepPluginManager->InitMenuPaneL( iRememberEditorState, aMenuPane, aResourceId );
- if (oldPermitModes != -1)
- {
- iPermittedInputModes = oldPermitModes;
- }
-#endif // RD_SCALABLE_UI_V2
- switch (aResourceId)
- {
- case R_AVKON_TOUCHINPUT_PREVIEW:
- {
- InitPreviewMenuPane(aMenuPane);
- }
- break;
- case R_AVKON_EDIT_MODE_MENU:
- case R_AVKON_TOUCH_INDICATOR_EDIT_MODE_MENU:
- {
- ClearFlag(EFlagLaunchEditMenu);
-
- //call comes here when edit key or '*' is pressed and displays avkon edit menu
- //moving only the essential condition checks in EditSubmenuInUse() here
- //no need of checking iSharedDataInterface->EditSubmenuInUse() because for devices with edit key
- //this would return 0 and would not populate CUT and COPY option
-
- TBool tempFlag = ETrue;
- if ( ( ( RProcess().SecureId().iId == KPhoneSecureId ) && (iQwertyInputMode) ) ||
- ( ExtendedInputCapabilities() &
- CAknExtendedInputCapabilities::EForceEditSubmenuStatusFlagOff)
-
- )
- {
- tempFlag = EFalse;
- }
-
- if (tempFlag)
- {
- TInt posit(0);
-
- if (!(iAknEditorFlags & EAknEditorFlagFindPane) &&
- iInputCapabilities.FepAwareTextEditor() &&
- aMenuPane->MenuItemExists(EEikCmdEditCut, posit) &&
- !IsOnlyNumericPermitted()
- )
- {
- if (iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep() > 0 )
- {
- if (iRememberEditorState && iRememberEditorState->CcpuState() &&
- !iRememberEditorState->CcpuState()->CcpuCanCopy()&&
- PluginInputMode() != EPluginInputModeItut )
- {
- TBuf<KMaxFileName> titleStr;
- StringLoader::Load(titleStr, R_AKNFEP_OPTIONS_EDIT_MENU_CUT_TEXT);
-
- CAknFepUiInterfaceMenuPane::SItemData itemData;
-
- itemData.iCommandId = EAknEditMenuCmdCutText;
- itemData.iCascadeId = 0;
- if (titleStr.Length())
- {
- itemData.iText.Copy(titleStr.Mid(1, titleStr.Length() - 1));
- }
- itemData.iFlags = 0;
- aMenuPane->InsertMenuItemL(itemData, posit);
-
- titleStr.Zero();
- itemData.iText.Zero();
- StringLoader::Load(titleStr, R_AKNFEP_OPTIONS_EDIT_MENU_COPY_TEXT);
-
- itemData.iCommandId = EAknEditMenuCmdCopyText;
- if (titleStr.Length())
- {
- itemData.iText.Copy(titleStr.Mid(1, titleStr.Length() - 1));
- }
- aMenuPane->InsertMenuItemL(itemData, posit);
- }
- else //Hack for browser in case there are some text already selected
- {
- if (iRememberEditorState && iRememberEditorState->CcpuState() )
- {
- if(iRememberEditorState->CcpuState()->CcpuCanPaste())
- aMenuPane->SetItemDimmed(EEikCmdEditPaste,EFalse);
- if(iRememberEditorState->CcpuState()->CcpuCanCopy())
- aMenuPane->SetItemDimmed(EEikCmdEditCopy,EFalse);
- if(iRememberEditorState->CcpuState()->CcpuCanCut())
- aMenuPane->SetItemDimmed(EEikCmdEditCut,EFalse);
- }
- }
- }
- //if the document size is 0 and there are items in clipboard then dislay Paste item
- if ( iRememberEditorState && iRememberEditorState->CcpuState() &&
- iRememberEditorState->CcpuState()->CcpuCanPaste())
- aMenuPane->SetItemDimmed(EEikCmdEditPaste,EFalse);
-
- }
-
- }
-
- DimInputmodeMenuItems(aMenuPane);
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- //Is this an edit menu launched for a western language?
- if ( R_AVKON_EDIT_MODE_MENU == aResourceId && !IsChineseInputLanguage()
- && ELangJapanese != iLanguageCapabilities.iInputLanguageCode )
- {
- //If this is edit menu (launched from '*' or edit key) and predictive input is allowed,
- //we need to remove "Input language" and add "Input options" menu item.
- if (!IsOnlyNumericPermitted() && IsLanguageSupportPrediction() && !(iAknEditorFlags & EAknEditorFlagNoT9))
- {
- TInt menuitemPos(0);
- if(aMenuPane->MenuItemExists(EAknCmdEditInsertSmiley,menuitemPos)) // insert after smiley if exist
- {
- AddPredictiveModeEditMenuL(aMenuPane,menuitemPos+1);
- }
- else if(aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol,menuitemPos)) // insert after smybol if exist
- {
- AddPredictiveModeEditMenuL(aMenuPane,menuitemPos+1);
- }
- }
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
-
- }
- break;
-
- case R_AVKON_PREDICTIVE_TEXT_MENU_T9:
- {
- if (iMode != ELatin)
- {
- aMenuPane->SetItemDimmed(EAknCmdT9PredictiveInsertWord, ETrue);
- }
- if (!IsFlagSet(EFlagInlineEditInBackground))
- {
- aMenuPane->SetItemDimmed(EAknCmdT9PredictiveMatches, ETrue);
- aMenuPane->SetItemDimmed(EAknCmdT9PredictiveEditWord, ETrue);
- }
- else if (IsFlagSet(EFlagRemoveMatchesMenuItem))
- {
- aMenuPane->SetItemDimmed(EAknCmdT9PredictiveMatches, ETrue);
- }
- break;
- }
- case R_AVKON_INPUT_MODE_SUB_MENU:
- {
- if (IsChineseInputLanguage())
- {
- DoChineseSubMenu(aMenuPane);
- }
- break;
- case R_AKNFEP_EDIT_SUBMENU:
- DisableEditSubmenuItems(aMenuPane);
- break;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- case R_AKNFEP_PRED_INPUT_OPTIONS_SUBMENU:
- {
- // This part of code fixing TSW Errors :STAA-7GZE5W
- // :STAA-7GZEBX
- // "Edit word" option is not available under edit menu in ITU-T mode.
- // "Insert word" Should not be available QWERTY mode.
- //TSW: AKSS-7P87XG
- //TSW: AKSS-7P88Wf
- if (IsKoreanInputLanguage() ||
- iPtiEngine->CurrentLanguage()->LanguageCode() == ELangPrcChinese ||
- iPtiEngine->CurrentLanguage()->LanguageCode() == ELangTaiwanChinese ||
- iPtiEngine->CurrentLanguage()->LanguageCode() == ELangHongKongChinese )
- {
- // No text prediction for korean.
- aMenuPane->SetItemDimmed(EAknFepCmdPredActivate, ETrue );
- aMenuPane->SetItemDimmed(EAknFepCmdPredDeactivate,ETrue );
- aMenuPane->SetItemDimmed( EAknFepCmdPredSettings, ETrue );
- }
- else
- {
- aMenuPane->SetItemDimmed( EAknFepCmdPredSettings, EFalse );
- if(iSharedDataInterface->PredictiveTextOn())
- {
- aMenuPane->SetItemDimmed( EAknFepCmdPredActivate, ETrue );
- }
- else
- {
- aMenuPane->SetItemDimmed(EAknFepCmdPredDeactivate,ETrue );
- }
- }
- }
- break;
-
-#endif //RD_INTELLIGENT_TEXT_INPUT
- default:
- break;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- /*
- This code is the part of fixing TSW Error ID: BSAN-7G58DB : Edit Menu :
- "Matches" and "insert word" options are not available under Edit Menu.
- This is To make visible/invisible the Insert Word in Optios menu & Edit Menu*/
- iIsLastResourceEditMenu = aResourceId;
-#endif
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-void CAknFepManager::FindAndRemoveInputOptionsMenuItemL( CAknFepUiInterfaceMenuPane* aMenuPane )
- {
- //Logic :
- //Loop through each item in menu pane and check if the data
- //CEikMenuPaneItem::SData::iCascadeId == R_AKNFEP_PRED_INPUT_OPTIONS_SUBMENU
- //or if CEikMenuPaneItem::SData::iCommandId == EAknCmdInputLanguage
- //If so, delete that item.
- TInt numOfMenuItems = aMenuPane->NumberOfItemsInPane();
- CEikMenuPane* menuPane = aMenuPane->GetMenuPane();
- for (TInt index(0); index < numOfMenuItems ; ++index )
- {
- CEikMenuPaneItem::SData itemData = menuPane->ItemDataByIndexL( index );
- if ( itemData.iCascadeId == R_AKNFEP_PRED_INPUT_OPTIONS_SUBMENU ||
- itemData.iCommandId == EAknCmdInputLanguage ||
- itemData.iCascadeId == R_AVKON_INPUT_MODE_SUB_MENU ||
- ( IsChineseInputLanguage() && iSharedDataInterface->QwertyInputMode() &&
- itemData.iCommandId == EChinFepCmdModeCangJieOption ) )
- {
- menuPane->DeleteBetweenMenuItems( index, index );
- //Assumption - there can only be one such item in the menu pane
- //Hence we can return without going through the remaining items
- numOfMenuItems = aMenuPane->NumberOfItemsInPane();
- index--;
- }
- }
- }
-
-void CAknFepManager::FindAndRemoveEditSubMenuItemL( CAknFepUiInterfaceMenuPane* aMenuPane )
- {
- //Logic :
- //Loop through each item in menu pane and check if the data
- //CEikMenuPaneItem::SData::iCascadeId == R_AKNFEP_EDIT_SUBMENU
- //If so, delete that item.
- TInt numOfMenuItems = aMenuPane->NumberOfItemsInPane();
- CEikMenuPane* menuPane = aMenuPane->GetMenuPane();
- for (TInt index(0); index < numOfMenuItems ; ++index )
- {
- CEikMenuPaneItem::SData itemData = menuPane->ItemDataByIndexL( index );
- if ( itemData.iCascadeId == R_AKNFEP_EDIT_SUBMENU )
- {
- menuPane->DeleteBetweenMenuItems( index, index );
- //Assumption - there can only be one such item in the menu pane
- //Hence we can return without going through the remaining items
- return;
- }
- }
- }
-
-void CAknFepManager::AddInputOptionsMenuItemL( CAknFepUiInterfaceMenuPane* aMenuPane )
- {
- //Logic:
- //Appropriate location is :
- // if Avkon Help command exists, then immediately above it
- // else if Avkon Exit command exists, then immediately above it
- // else if there are 3 or more items in the Options menu, then 3rd from last
- // else it is the last item.
- TInt posToInsertItem( 0 );
- //MenuItemExists() will return the index of the item in 2nd parameter
- //But if item is not found, it is returning the total number of items.
- if ( ( aMenuPane->MenuItemExists(EAknCmdHelp, posToInsertItem) ) ||
- ( aMenuPane->MenuItemExists(EAknCmdExit, posToInsertItem) ) )
- {
- //do nothing - we already have posToInsertItem with required value
- }
- else
- {
- TInt numOfMenuItems = aMenuPane->NumberOfItemsInPane();
- if ( numOfMenuItems > 2 )
- {
- //We should add the new item as third from last, after ignoring
- //any dimmed items in the menu pane
- TInt numOfUnDimmedItems(0);
- //loop from bottom for better performance
- for (TInt index(numOfMenuItems-1); index >= 0 ; --index )
- {
- CEikMenuPaneItem::SData itemData = aMenuPane->GetMenuPane()->ItemDataByIndexL( index );
- if ( !(itemData.iFlags & EEikMenuItemDimmed) )
- {
- ++numOfUnDimmedItems;
- }
- if ( numOfUnDimmedItems == 2 )
- {
- //We have our position - save it and break from this loop
- if ( index > 1 )
- {
- posToInsertItem = index;
- }
- else
- {
- //There are two or less items on this menu that will be displayed
- //Hence, push ITI options to the end of the list:
- posToInsertItem = numOfMenuItems;
- }
- break;
- }
- }
- }
- else
- {
- posToInsertItem = numOfMenuItems;
- }
- }
- //Now we have the position at which we need to insert the menu item.
- if (
-#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__
- iQwertyInputMode &&
-#endif
- IsLanguageSupportPrediction() && !(iAknEditorFlags & EAknEditorFlagNoT9))
- {
- AddPredictiveModeOptionsL(aMenuPane, posToInsertItem);
- }
- else
- {
- AddInputLanguageItemL(aMenuPane, posToInsertItem);
- }
- }
-#endif // RD_INTELLIGENT_TEXT_INPUT
-
-
-void CAknFepManager::AddEditSubmenuL(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- // Adds edit-submenu to options menu when required contidions are met.
- // Edit-submenu is added if:
- // 1. There is active editor on screen
- // 2. Editor contains text or there is text in clipboard.
- // 3. Editor is not in Find Pane.
- //
- // Since menu will have focus, we also need to remeber certain values
- // to be able to access undelying editor attributes.
-
- CAknEdwinState* editorState = EditorState();
- iEditorCcpuStatus = 0;
- if (editorState && editorState->CcpuState())
- {
- iEditorCcpuStatus = EditorCcpuStatus(editorState);
- }
- else
- {
- // The editor doesn't have ccpu-capability, doen't display the menu.
- return;
- }
- TInt index;
- if (aMenuPane->MenuItemExists(EAknCmdEditTextMenu, index))
- {
- return;
- }
-
- iRememberLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
-
- if (iRememberLength > 0 || (iEditorCcpuStatus & ECcpuStatusFlagCanPaste))
- {
- if (aMenuPane->MenuItemExists(EAknCmdEditItemPlaceHolder, index) ||
- aMenuPane->MenuItemExists(EAknCmdInputLanguage, index) ||
- aMenuPane->MenuItemExists(EAknCmdHelp, index) ||
- aMenuPane->MenuItemExists(EAknCmdExit, index))
- {
- TBuf<KMaxFileName> titleStr;
- StringLoader::Load(titleStr, R_AKNFEP_OPTIONS_EDIT_SUBMENU_TITLE);
-
- CAknFepUiInterfaceMenuPane::SItemData mData;
-
- mData.iCommandId = EAknCmdEditTextMenu;
- mData.iCascadeId = R_AKNFEP_EDIT_SUBMENU;
- mData.iFlags = 0;
- mData.iText.Copy(titleStr.Mid(1, titleStr.Length() - 1).Left(
- CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength));
-
- aMenuPane->InsertMenuItemL(mData, index);
-
- if(aMenuPane->MenuItemExists(EAknCmdEditItemPlaceHolder, index))
- {
- aMenuPane->DeleteMenuItem(EAknCmdEditItemPlaceHolder);
-
- }
- // Remember editor state, because there is no access to it while
- // menu is on screen.
- iRememberEditorState = editorState;
- }
- }
- }
-
-
-void CAknFepManager::DisableEditSubmenuItems(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- aMenuPane->SetItemDimmed(EAknEditMenuCmdCopyText, ETrue);
- aMenuPane->SetItemDimmed(EEikCmdEditCopy, ETrue);
- aMenuPane->SetItemDimmed(EAknEditMenuCmdCutText, ETrue);
- aMenuPane->SetItemDimmed(EEikCmdEditCut, ETrue);
- aMenuPane->SetItemDimmed(EEikCmdEditPaste, ETrue);
-
- if (iRememberLength > 0)
- {
- if (iEditorCcpuStatus & ECcpuStatusFlagCanCopy)
- {
- aMenuPane->SetItemDimmed(EEikCmdEditCopy, EFalse);
- }
- else
- {
- aMenuPane->SetItemDimmed(EAknEditMenuCmdCopyText, EFalse);
- }
-
- if (iEditorCcpuStatus & ECcpuStatusFlagCanCut)
- {
- aMenuPane->SetItemDimmed(EEikCmdEditCut, EFalse);
- }
- else
- {
- aMenuPane->SetItemDimmed(EAknEditMenuCmdCutText, EFalse);
- }
- }
-
- if (iEditorCcpuStatus & ECcpuStatusFlagCanPaste)
- {
- aMenuPane->SetItemDimmed(EEikCmdEditPaste, EFalse);
- }
- }
-
-
-void CAknFepManager::StartCcpuModeL(TBool aCopyMode)
- {
- ResetCcpuFlags();
- if (!iUiInterface->SoftkeysExist())
- {
- iUiInterface->CreateSoftkeys(R_AVKON_SOFTKEYS_EMPTY, this);
- }
-
- TBool update = EFalse;
- if (aCopyMode)
- {
- SetCcpuFlag(ECcpuStateStartCopy);
- update = UpdateCBALabelL(ELeftSoftkeyIndex, EAknFepSoftkeyStartCopy,
- R_AKNFEP_SOFTKEY_CCPU_START);
- update |= UpdateCBALabelL( EMiddleSoftkeyIndex, EAknFepSoftkeyStartCopy,
- R_AVKON_SOFTKEY_SELECT_TEXT );
- }
- else
- {
- SetCcpuFlag(ECcpuStateStartCut);
- update = UpdateCBALabelL(ELeftSoftkeyIndex, EAknFepSoftkeyStartCut,
- R_AKNFEP_SOFTKEY_CCPU_START);
- update |= UpdateCBALabelL( EMiddleSoftkeyIndex, EAknFepSoftkeyStartCut,
- R_AVKON_SOFTKEY_SELECT_TEXT );
- }
-
- update |= UpdateCBALabelL(ERightSoftkeyIndex, EAknFepSoftkeyCloseWindow,
- R_AKNFEP_SOFTKEY_CCPU_CANCEL);
-
- if (update)
- {
- iUiInterface->DrawSoftkeysNow();
- }
-
- iIndicator->SetCopyMode(ETrue);
- UpdateIndicators(); // updates status of indicators
- }
-
-
-TBool CAknFepManager::OkToActivateSelectionMode() const
- {
- if (iFepManState != EAknFepStateNull &&
- iInputCapabilities.FepAwareTextEditor() &&
- !(iAknEditorFlags & EAknEditorFlagFindPane))
- {
- return ETrue;
- }
-
- return EFalse;
- }
-
-
-TBool CAknFepManager::HandleCcpuModeKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aEventCode,
- TKeyResponse& aRetCode, TBool aLongPressFlag)
- {
- TKeyPressLength length = aKeyEvent.iRepeats ? ELongKeyPress : EShortKeyPress;
- TBool indicLang = TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(
- iLanguageCapabilities.iInputLanguageCode))
-#ifdef RD_HINDI_PHONETIC_INPUT
- || TAknFepUiIndicInputManager :: IsIndicPhoneticLanguage(TLanguage(
- iLanguageCapabilities.iInputLanguageCode))
-#endif
- ;
- if(aKeyEvent.iCode == EKeyEscape)
- return EFalse;
- if (aEventCode == EEventKey && aKeyEvent.iCode == '*')
- {
- iStarScan = aKeyEvent.iScanCode;
- }
-
- if ((aKeyEvent.iScanCode == EStdKeyDevice0)
- || (aKeyEvent.iScanCode == EStdKeyDevice1))
- {
- if (HashKeySelectionInUse()
- && IsCcpuFlagSet(ECcpuStateHashDown))
- {
- if (IsCcpuFlagSet(ECcpuStateChangeToPredictionMode))
- {
- ClearCcpuFlag(ECcpuStateChangeToPredictionMode);
- if (iModeBefore == ELatin
- || iModeBefore == EHiraganaKanji)
- {
- TBool preFlag = IsPredictive();
- TryChangePredictiveInputModeL(!preFlag);
- }
- else
- {
- TryChangeToModeBeforeL();
- }
- }
- }
- // Always let sofkeys fall through.
- return EFalse;
- }
-
- if (IsCcpuFlagSet(ECcpuStateSelectionEventPosted))
- {
- ClearCcpuFlag(ECcpuStateSelectionEventPosted);
- return EFalse;
- }
-
- if (HashKeySelectionInUse())
- {
- if (aKeyEvent.iScanCode == EStdKeyHash && aEventCode == EEventKeyDown
- && iInputCapabilities.FepAwareTextEditor())
- {
- SetCcpuFlag(ECcpuStateHashDown);
- iHashKeyMan->ResetPreviousSelectionStyleMode();
- return EFalse;
- }
-
- if (!IsOnlyNumericPermitted())
- {
- if (IsFeatureSupportedJapanese())
- {
- if (FepUI()->IsValidShiftKeyPress()
- && aKeyEvent.iScanCode == iStarScan
- && !iQwertyInputMode
- && !(iMode == EKatakana && iFepManState == EAknFepStateUIActive))
- {
- if ( aEventCode == EEventKeyUp && !aLongPressFlag
- && !(iMode == ELatin && WesternPredictive()
- && iFepManState == EAknFepStateUIActive))
- {
- if (!IsCcpuFlagSet(ECcpuStateIgnoreStarUp))
- {
- LaunchSpecialCharacterTableL();
- }
- return EFalse;
- }
- else if ( aEventCode == EEventKey
- && !aLongPressFlag
- && length == ELongKeyPress )
- {
- LaunchSelectModeMenuL();
- aRetCode = EKeyWasConsumed;
- return ETrue;
- }
- }
- }
- else
- {
- if ((aKeyEvent.iScanCode == iStarScan && aEventCode == EEventKeyUp &&
- !aLongPressFlag && !iQwertyInputMode) &&
- (!indicLang || WesternPredictive() || (iMode == ENumber || iMode == ENativeNumber) ))
- {
- // Disables *-key on korean multitapping mode
- if(IsKoreanInputLanguage() && iMode == EHangul)
- {
- SetCcpuFlag(ECcpuStateIgnoreStarUp);
- }
-
- if (!IsCcpuFlagSet(ECcpuStateIgnoreStarUp))
- {
-#ifdef RD_SCALABLE_UI_V2
- if (iFepPluginManager->CurrentFepInputUI())
- {
- if (iFepPluginManager->CurrentFepInputUI()->HandleKeyL(EStdKeyNull, EShortKeyPress))
- {
- return EFalse;
- }
- }
-#endif
- LaunchSelectModeMenuL();
- aRetCode = EKeyWasConsumed;
- return ETrue;
- }
- return EFalse;
- }
- else if((aKeyEvent.iScanCode == iStarScan && aEventCode == EEventKey
- && !aLongPressFlag && !iQwertyInputMode)
- && (indicLang)
- && (! WesternPredictive())
- && (length == ELongKeyPress)
- && (iMode != ENumber && iMode != ENativeNumber ))
- {
- LaunchSelectModeMenuL();
- return EFalse;
- }
- }
- }
- }
-
- if (IsCcpuFlagSet(ECcpuStateHashDown))
- {
- if (aEventCode == EEventKey)
- {
- if (aKeyEvent.iScanCode == EStdKeyDownArrow
- || aKeyEvent.iScanCode == EStdKeyRightArrow
- || aKeyEvent.iScanCode == EStdKeyLeftArrow
- || aKeyEvent.iScanCode == EStdKeyUpArrow)
- {
- if (IsFlagSet(EFlagInsideInlineEditingTransaction) && iMode == EHangul)
- {
- CommitInlineEditL();
- iPtiEngine->ClearCurrentWord();
- }
-
- if ((IsCcpuFlagSet(ECcpuStateStartCopy)) ||
- (IsCcpuFlagSet(ECcpuStateStartCut)))
- {
- aRetCode = EKeyWasConsumed;
- return ETrue;
- }
-
- if (!IsCcpuFlagSet(ECcpuStateEdwinInSelectionMode))
- {
- // User wants to select and not to change mode, so cancel the mode change
- // caused by initial hash key press.
- if(!(iAknEditorFlags & EAknEditorFlagFindPane))
- {
- iHashKeyMan->SetPreviousSelectionStyleModeL();
- SetCcpuFlag(ECcpuStateEdwinInSelectionMode);
- TKeyEvent ccpuStart = {EKeyF21, EStdKeyF21, 0, 0};
- // to enable copy/paste support on cba. We simulate via CCoeEnv
- // to avoid fep SimulateKeyEventL adding shift modifiers
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKey);
- }
- }
-
- // If prediction is changed while pressing hash-key,
- // it go back previous prediction state.
- if (IsCcpuFlagSet(ECcpuStateChangeToPredictionMode))
- {
- ClearCcpuFlag(ECcpuStateChangeToPredictionMode);
- if (iModeBefore == ELatin
- || iModeBefore == EHiraganaKanji)
- {
- TBool preFlag = IsPredictive();
- TryChangePredictiveInputModeL(!preFlag);
- }
- else
- {
- TryChangeToModeBeforeL();
- }
- }
-
- if (WesternPredictive() && IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- // This will commit inline edit if it is active for predictive mode.
- return EFalse;
- }
-
- aRetCode = EKeyWasNotConsumed;
- return ETrue;
- }
- else if (aKeyEvent.iScanCode == EStdKeyBackspace)
- {
- if (!(aKeyEvent.iModifiers & EStdKeyLeftShift))
- {
- // Simulate edit key + clear key functionality via hash key in no-edit-key device.
- TKeyEvent ccpuStart = {127, EStdKeyBackspace, EStdKeyLeftShift, 0};
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, aEventCode);
-
- aRetCode = EKeyWasConsumed;
- return ETrue;
- }
- else if (!IsCcpuFlagSet(ECcpuStateHashKeyDeleteDone))
- {
- // Hash key + clear key was pressed, but hash key was released before
- // changing to selection mode. Need to return to previous mode, because
- // user didn't want to change input mode.
- iHashKeyMan->SetPreviousSelectionStyleModeL();
- SetCcpuFlag(ECcpuStateHashKeyDeleteDone);
- }
-
- // If prediction is changed while pressing hash-key,
- // it go back previous prediction state.
- if (IsCcpuFlagSet(ECcpuStateChangeToPredictionMode))
- {
- ClearCcpuFlag(ECcpuStateChangeToPredictionMode);
- if (iModeBefore == ELatin
- || iModeBefore == EHiraganaKanji)
- {
- TBool preFlag = IsPredictive();
- TryChangePredictiveInputModeL(!preFlag);
- }
- else
- {
- TryChangeToModeBeforeL();
- }
- }
-
- }
- }
- else if (aKeyEvent.iScanCode == EStdKeyHash && aEventCode == EEventKeyUp)
- {
- ClearCcpuFlag(ECcpuStateHashDown
- | ECcpuStateHashKeyDeleteDone
- | ECcpuStateChangeToPredictionMode);
- if (IsCcpuFlagSet(ECcpuStateEdwinInSelectionMode))
- {
- SetCcpuFlag(ECcpuStateSelectionEventPosted);
- ClearCcpuFlag(ECcpuStateEdwinInSelectionMode);
- SetFlag(EFlagLongShiftKeyPress);
-
- TKeyEvent ccpuStart = {0, EStdKeyLeftShift, 0, 0};
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, aEventCode);
- }
-
- return EFalse;
- }
- }
-
- if (IsCcpuFlagSet(ECcpuStateStartCopy | ECcpuStateStartCut))
- {
- if (aKeyEvent.iScanCode == EStdKeyDevice3 && aEventCode == EEventKey)
- {
- aRetCode = EKeyWasConsumed;
- if (IsCcpuFlagSet(ECcpuStateStartCopy))
- {
- ProcessCommandL(EAknFepSoftkeyStartCopy);
- }
- else
- {
- ProcessCommandL(EAknFepSoftkeyStartCut);
- }
- return ETrue;
- }
- else if (aKeyEvent.iScanCode < EStdKeyLeftArrow ||
- aKeyEvent.iScanCode > EStdKeyDownArrow)
- {
- aRetCode = EKeyWasConsumed;
- return ETrue;
- }
- }
- else if (IsCcpuFlagSet(ECcpuStateCopy | ECcpuStateCut))
- {
- if ((aKeyEvent.iScanCode >= EStdKeyLeftArrow) && (aKeyEvent.iScanCode <= EStdKeyDownArrow))
- {
- if (!(aKeyEvent.iModifiers & EModifierShift))
- {
- TKeyEvent ccpuStart = aKeyEvent;
- ccpuStart.iModifiers |= EModifierShift;
- ccpuStart.iModifiers |= EModifierRightShift;
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, aEventCode);
-
- aRetCode = EKeyWasConsumed;
- return ETrue;
- }
- else
- {
- aRetCode = EKeyWasNotConsumed;
- return ETrue;
- }
- }
-
- TCursorSelection cursorSelection;
- if( iInputCapabilities.FepAwareTextEditor() )
- {
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSelection);
- if( (aEventCode == EEventKeyUp) && (cursorSelection.Length() == 0)
- && ((aKeyEvent.iScanCode == EStdKeyBackspace) || (aKeyEvent.iCode == EKeyBackspace)
- || (aKeyEvent.iScanCode == EStdKeyDelete) || (aKeyEvent.iCode == EKeyDelete)))
- {
- ClearCcpuFlag(ECcpuStateButton);
- }
- }
- if (aKeyEvent.iScanCode != EStdKeyBackspace && aKeyEvent.iCode != EKeyOK)
- {
- aRetCode = EKeyWasConsumed;
- return ETrue;
- }
- else
- {
- if (iInputCapabilities.FepAwareTextEditor())
- {
- TCursorSelection cursorSelection;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSelection);
- if (cursorSelection.Length() == 0)
- {
- aRetCode = EKeyWasConsumed;
- return ETrue;
- }
- else if (aKeyEvent.iScanCode == EStdKeyBackspace)
- {
- // Selection will be removed, handle cba button state accordingly
- if (iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep() ==
- cursorSelection.Length())
- {
- // Whole text was selected and will be removed. Cancel the ccpu mode.
- ProcessCommandL(EAknFepSoftkeyCloseWindow);
- }
- else
- {
- // Part of the text will be removed. Set Cba-buttons to initial ccpu-mode status.
- __ASSERT_DEBUG(iUiInterface->SoftkeysExist(),
- AknFepPanic(EAknFepPanicNoHandleToFepAwareTextEditor));
-
- TBool update = UpdateCBALabelL(ELeftSoftkeyIndex, KNullCommandId, R_TEXT_SOFTKEY_EMPTY);
- update |= UpdateCBALabelL(ERightSoftkeyIndex, EAknFepSoftkeyCloseWindow, R_AKNFEP_SOFTKEY_CCPU_CANCEL);
- update |= UpdateCBALabelL( EMiddleSoftkeyIndex, KNullCommandId, R_TEXT_SOFTKEY_EMPTY );
- if (update)
- {
- iUiInterface->DrawSoftkeysNow();
- }
- }
- }
- }
- }
- }
-
- return EFalse;
- }
-
-
-
-void CAknFepManager::AddInputLanguageItemL(CAknFepUiInterfaceMenuPane* aMenuPane, TInt aIndex)
- {
- CAknFepUiInterfaceMenuPane::SItemData mData;
-
- TBuf<KMaxFileName> langStr;
- TInt Inputlangindex;
- if(!aMenuPane->MenuItemExists(EAknCmdInputLanguage, Inputlangindex))
- {
- StringLoader::Load(langStr, R_AKNFEP_OPTIONS_INPUT_LANGUAGE);
-
- mData.iCommandId = EAknCmdInputLanguage;
- mData.iCascadeId = 0;
- mData.iFlags = 0;
- mData.iText.Copy(langStr.Mid(1, langStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength));
-
- aMenuPane->InsertMenuItemL(mData, aIndex);
- }
-
- // Chinese input mode switching from the option menu
- if (IsChineseInputLanguage() && iSharedDataInterface->QwertyInputMode())
- {
- // Add Chinese language items
- langStr.Zero();
-
- StringLoader::Load(langStr, R_AKNFEP_OPTIONS_INPUT_MODE_CHI);
-
- mData.iCommandId = EAknCmdInputMethod;
- mData.iCascadeId = R_AVKON_INPUT_MODE_SUB_MENU;
- mData.iFlags = 0;
- mData.iText.Copy(langStr.Mid(1, langStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength));
-
- aMenuPane->InsertMenuItemL(mData, ++aIndex);
-
- // Check if the current engine has CangJie feature or not, if not
- // then CangJie mode becomes invisible, similar impl in IsInputModeAvailable
- // and DoChineseSubMenu
- TBool isCangJieSupported = EFalse;
- MPtiCoreInfo* ptiCoreInfo = iPtiEngine->CoreInfo(EPtiEngineNormalCangjieQwerty);
- if ( ptiCoreInfo )
- {
- isCangJieSupported = ptiCoreInfo->CapsBits() & ESupportCangjieInput;
- }
-
- // Add Hong Kong CangJie option, option available only in HK variant and qwerty mode
- if ( iLanguageCapabilities.iInputLanguageCode ==
- ELangHongKongChinese && isCangJieSupported )
- {
- langStr.Zero();
-
- StringLoader::Load(langStr, R_AKNFEP_OPTIONS_CANGJIE_MODE);
-
- mData.iCommandId = EChinFepCmdModeCangJieOption;
- mData.iCascadeId = 0;
- mData.iFlags = 0;
- mData.iText.Copy(langStr.Mid(1, langStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength));
-
- aMenuPane->InsertMenuItemL(mData, ++aIndex);
- }
- }
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-// Predictive QWERTY (XT9) changes ---->
-void CAknFepManager::AddPredictiveModeOptionsL(CAknFepUiInterfaceMenuPane* aMenuPane,
- TInt aIndex ) const
- {
- CAknFepUiInterfaceMenuPane::SItemData mData;
-
- HBufC* inputMenuStr = StringLoader::LoadLC(R_AKNFEP_PRED_OPTIONS_INPUT_OPTIONS);
-
- mData.iCommandId = 0;
- mData.iCascadeId = R_AKNFEP_PRED_INPUT_OPTIONS_SUBMENU;
- mData.iFlags = 0;
- mData.iText.Copy(inputMenuStr->Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength));
-
- CleanupStack::PopAndDestroy(inputMenuStr);
-
- aMenuPane->InsertMenuItemL(mData, aIndex);
-
- // Chinese input mode switching from the option menu
- if (IsChineseInputLanguage() && iSharedDataInterface->QwertyInputMode())
- {
- // Add Chinese language items
- TBuf<KMaxFileName> langStr;
-
- langStr.Zero();
-
- StringLoader::Load(langStr, R_AKNFEP_OPTIONS_INPUT_MODE_CHI);
-
- mData.iCommandId = EAknCmdInputMethod;
- mData.iCascadeId = R_AVKON_INPUT_MODE_SUB_MENU;
- mData.iFlags = 0;
- mData.iText.Copy(langStr.Mid(1, langStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength));
-
- aMenuPane->InsertMenuItemL(mData, ++aIndex);
-
- // Check if the current engine has CangJie feature or not, if not
- // then CangJie mode becomes invisible, similar impl in IsInputModeAvailable
- // and DoChineseSubMenu
- TBool isCangJieSupported = EFalse;
- MPtiCoreInfo* ptiCoreInfo = iPtiEngine->CoreInfo(EPtiEngineNormalCangjieQwerty);
- if ( ptiCoreInfo != NULL)
- {
- isCangJieSupported = ptiCoreInfo->CapsBits() & ESupportCangjieInput;
- }
-#ifdef __HALF_QWERTY_KEYPAD
- isCangJieSupported = isCangJieSupported && (iKeyboardType != EPtiKeyboardHalfQwerty);
-#endif //__HALF_QWERTY_KEYPAD
-
- // Add Hong Kong CangJie option, option available only in HK variant and qwerty mode
- if ( iLanguageCapabilities.iInputLanguageCode == ELangHongKongChinese && isCangJieSupported )
- {
- langStr.Zero();
-
- StringLoader::Load(langStr, R_AKNFEP_OPTIONS_CANGJIE_MODE);
-
- mData.iCommandId = EChinFepCmdModeCangJieOption;
- mData.iCascadeId = 0;
- mData.iFlags = 0;
- mData.iText.Copy(langStr.Mid(1, langStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength));
-
- aMenuPane->InsertMenuItemL(mData, ++aIndex);
- }
- }
- }
-
-void CAknFepManager::AddPredictiveModeEditMenuL(CAknFepUiInterfaceMenuPane* aMenuPane,
- TInt aIndex ) const
- {
- // Remove Predictive Edit menu option if XT9 options are there --->
- aMenuPane->SetItemDimmed(EAknCmdPredictiveTextCascade, ETrue);
- aMenuPane->SetItemDimmed(EAknCmdMultitapPredictiveT9On, ETrue);
- // Remove Predictive Edit menu option if XT9 options are there <---
- //if current writing language supports prediction then display input options settings -->
- //if current writing language does not supports prediction then display only input language
- //option to modify the writing language, when user wants to modify when edit query is launched. <--
- TBool isLanguagugeSupportsPrediction = EFalse;
- switch(iKeyboardType)
- {
- case EPtiKeyboardHalfQwerty:
-#ifdef __HALF_QWERTY_KEYPAD
- isLanguagugeSupportsPrediction = (iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive);
-#endif //__HALF_QWERTY_KEYPAD
- break;
- case EPtiKeyboardQwerty4x12:
- case EPtiKeyboardQwerty4x10:
- case EPtiKeyboardQwerty3x11:
- case EPtiKeyboardCustomQwerty:
- isLanguagugeSupportsPrediction = (iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternQwertyPredictive);
- break;
- case EPtiKeyboardNone:
- case EPtiKeyboard12Key:
- isLanguagugeSupportsPrediction = (!iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternPredictive);
- break;
- default:
- isLanguagugeSupportsPrediction = (!iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternPredictive);
- break;
- }
- if (isLanguagugeSupportsPrediction && !(iAknEditorFlags & EAknEditorFlagNoT9))
- {
- aMenuPane->SetItemDimmed(EAknCmdInputLanguage, ETrue);
- AddPredictiveModeOptionsL(aMenuPane, aIndex);
- }
- }
-// Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
-void CAknFepManager::DoChineseSubMenu(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- // ZhuyinFind & StrokeFind ONLY available for FindEditors
- if (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes)
- {
- if (iMode == EZhuyinFind)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyinFind, ETrue);
- }
-
- if (iMode == EStrokeFind)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModeStrokeFind, ETrue);
- }
- }
- else
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyinFind, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeStrokeFind, ETrue);
- }
-
- // Customize menu item for Chinese mainland
- if (iLanguageCapabilities.iInputLanguageCode == ELangPrcChinese)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModeCangJie, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyin, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyinFind, ETrue);
-
- if (iMode == EPinyin)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModePinyin, ETrue);
- }
- else if (iMode == EStroke)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModeStroke, ETrue);
- }
- else if (iMode == ELatin)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- }
- else
- return;
- }
- // Customize menu item for HongKong
- else if (iLanguageCapabilities.iInputLanguageCode == ELangHongKongChinese)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModePinyin, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyin, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyinFind, ETrue);
-
- TBool isCangJieSupported = EFalse;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if ( EPtiKeyboardQwerty3x11 == KeyboardLayout() )
- {
- isCangJieSupported = ETrue;
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
- isCangJieSupported = isCangJieSupported && (iKeyboardType != EPtiKeyboardHalfQwerty);
-#endif //__HALF_QWERTY_KEYPAD
-#endif //RD_INTELLIGENT_TEXT_INPUT
-
- // CangJie is only for qwerty mode
- if ( !iSharedDataInterface->QwertyInputMode() || !isCangJieSupported )
- aMenuPane->SetItemDimmed(EChinFepCmdModeCangJie, ETrue);
-
- if (iMode == EStroke)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModeStroke, ETrue);
- }
- else if (iMode == ECangJie)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModeCangJie, ETrue);
- }
- else if (iMode == ELatin)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- }
- else
- return;
- }
- // Customize menu item for TaiWan
- else if (iLanguageCapabilities.iInputLanguageCode == ELangTaiwanChinese)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModePinyin, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeCangJie, ETrue);
-
- if (iMode == EStroke)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModeStroke, ETrue);
- }
- else if (iMode == EZhuyin)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyin, ETrue);
- }
- else if (iMode == ELatin)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- }
- else
- return;
- }
- else
- return;
- }
-#ifdef RD_SCALABLE_UI_V2
-
-void CAknFepManager::DoWesternTouchMenu(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- const TInt inputLanguage = iLanguageCapabilities.iInputLanguageCode;
- // if mode is already hangul or language is not korean dim korean mode menu item
- TInt index;
-
- if( iMode == EHangul || inputLanguage != ELangKorean || !(IsModePermitted(EHangul)))
- {
- if ( aMenuPane->MenuItemExists( EAknCmdEditModeKorean, index) )
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeKorean, ETrue);
- }
- }
- else
- {
- if ( aMenuPane->MenuItemExists( EAknCmdEditModeKorean, index ) )
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeKorean, EFalse);
- }
- }
- // remove Chinese specific items from menu
- aMenuPane->SetItemDimmed(EAknCmdEditModeAlpha, ETrue);
-
- if (aMenuPane->MenuItemExists(EJapanFepCmdModeUserDic, index))
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeUserDic, ETrue);
- }
-
- // T9 stuff
- if (WesternPredictive())
- {
- aMenuPane->SetItemDimmed(EAknCmdPredictiveTextCascade, EFalse);
- if(iPtiEngine->CurrentLanguage()->HasInputMode(EPtiEngineWordCompletion))
- {
- // Disable Autoword Completion feature for Touch Input
- #ifndef RD_SCALABLE_UI_V2
- aMenuPane->SetItemDimmed(EAknCmdPredictiveModeCascade, EFalse);
- #endif // RD_SCALABLE_UI_V2
- }
-
- if (aMenuPane->MenuItemExists(EAknCmdT9PredictiveT9Off, index))
- {
- aMenuPane->SetItemDimmed(EAknCmdT9PredictiveT9Off, EFalse);
- }
- }
- else
- {
- if ( (iPermittedInputModes & EAknEditorTextInputMode) &&
- !(iAknEditorFlags & EAknEditorFlagNoT9) &&
- iMode == ELatin &&
- !IsKoreanInputLanguage() &&
- iLanguageCapabilities.iSupportsWesternPredictive)
- {
- aMenuPane->SetItemDimmed(EAknCmdMultitapPredictiveT9On, EFalse);
- }
- }
-
- if ( ( iMode == ENumber || iMode == ENativeNumber ) &&
- (iPermittedInputModes & (EAknEditorTextInputMode | EAknEditorSecretAlphaInputMode)) )
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeAlpha, EFalse);
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue);
- if( iMode == EHangul || inputLanguage == ELangKorean)
- {
- TInt index;
- if ( aMenuPane->MenuItemExists( EAknCmdEditModeKorean, index ) )
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeKorean, EFalse);
- }
- }
- }
-
- if ( IsModePermitted(ENumber) )
- {
- if (( iMode != ENumber ||
- iMode == ENumber && iLanguageCapabilities.iArabicIndicDigitsAllowed &&
- !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) &&
- (iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic))
- || ( iMode != ENumber ||
- iMode == ENumber && iLanguageCapabilities.iEasternArabicIndicDigitsAllowed &&
- !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) &&
- (iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic))
- ||( iMode != ENumber ||
- iMode == ENumber && iLanguageCapabilities.iIndicDigitsAllowed &&
- !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) &&
- (iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari)) &&
- (!(iPermittedInputModes==EAknEditorNumericInputMode))) // hide the menu if number editor
-
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeNumber, EFalse);
- }
- }
- //modified by zhangfeiyan, fix bug SKIN-7LABJ3
- if ( IsModePermitted( ENativeNumber ) )
- {
- if ( iLanguageCapabilities.iArabicIndicDigitsAllowed &&
- !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) &&
- iMode != ENativeNumber )
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeArabicIndicNumber, EFalse);
- }
- else if ( iLanguageCapabilities.iEasternArabicIndicDigitsAllowed &&
- !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) &&
- iMode != ENativeNumber )
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeEasternArabicIndicNumber, EFalse);
- }
- else if( iLanguageCapabilities.iIndicDigitsAllowed &&
- !( iAknEditorFlags & EAknEditorFlagLatinInputModesOnly ) &&
-
- iMode != ENativeNumber )
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeIndicNumber, EFalse);
- }
- }
-
- if (IsAbleToLaunchSCT())
- {
- if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index))
- {
- aMenuPane->SetItemDimmed(EAknCmdEditInsertSymbol, EFalse);
- }
- }
-
- if ( iMode != ENumber && iMode != ENativeNumber &&
- iPtiEngine->NumberOfLanguages() > 1 &&
- !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly))
- {
- aMenuPane->SetItemDimmed(EAknCmdInputLanguage, EFalse);
- }
-
- if (iPermittedInputModes == EAknEditorNumericInputMode)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue);
- }
- else if ( (iMode == ELatin || iMode == ENumber || iMode == ENativeNumber ) &&
- (iPermittedInputModes & EAknEditorSecretAlphaInputMode) &&
- !(iPermittedInputModes & EAknEditorTextInputMode))
- {
- // Text case mode is not available in secret editors.
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- }
-
- if (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue);
- }
-
- if (iCaseMan->CurrentCase() == EAknEditorUpperCase)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue);
- }
- else if (iCaseMan->CurrentCase() == EAknEditorLowerCase)
- {
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue);
- }
-
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
-
- if (!(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly)
- && iFepPluginManager->IsNonLatinLanguage(TLanguage(iSharedDataInterface->InputTextLanguage())))
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue);
- }
- if( iMode == EHangul )
- {
- //aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, EFalse);
- //aMenuPane->SetItemDimmed(EAknCmdEditModeAlpha, EFalse);
-
- aMenuPane->SetItemDimmed(EAknCmdEditModeEnglish, EFalse);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue);
-
- }
- else
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeEnglish, ETrue);
- }
- }
-
-void CAknFepManager::DoChineseTouchMenu(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- TInt index;
- if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index)
- && aMenuPane->MenuItemExists(EJapanFepCmdModeUserDic, index))
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeUserDic, ETrue);
- }
-
- if (WesternPredictive())
- {
- aMenuPane->SetItemDimmed(EAknCmdPredictiveTextCascade, EFalse);
- if(iPtiEngine->CurrentLanguage()->HasInputMode(EPtiEngineWordCompletion))
- {
- // Disable Autoword Completion feature for Touch Input
- #ifndef RD_SCALABLE_UI_V2
- aMenuPane->SetItemDimmed(EAknCmdPredictiveModeCascade, EFalse);
- #endif // RD_SCALABLE_UI_V2
- }
-
- if (aMenuPane->MenuItemExists(EAknCmdT9PredictiveT9Off, index))
- {
- aMenuPane->SetItemDimmed(EAknCmdT9PredictiveT9Off, EFalse);
- }
- }
- else
- {
- if ( (iPermittedInputModes & EAknEditorTextInputMode) &&
- !(iAknEditorFlags & EAknEditorFlagNoT9) &&
- iMode == ELatin)
- {
- aMenuPane->SetItemDimmed(EAknCmdMultitapPredictiveT9On, EFalse);
- }
- }
- if (IsAbleToLaunchSCT() &&
- aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index))
- {
- aMenuPane->SetItemDimmed(EAknCmdEditInsertSymbol, EFalse);
- }
- if( (iFepPluginManager && (iFepPluginManager->PluginInputMode() != EPluginInputModeItut ) )
- && aMenuPane->MenuItemExists(EChinFepCmdInstructions, index) )
- {
- aMenuPane->SetItemDimmed(EChinFepCmdInstructions, ETrue);
- }
- else if ( !(iPermittedInputModes == EAknEditorNumericInputMode ||
- iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) )
- {
- if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index))
- {
- aMenuPane->SetItemDimmed(EChinFepCmdInstructions, EFalse);
- }
- }
-
- if ( iMode != ENumber && iPtiEngine->NumberOfLanguages() > 1 &&
- !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly))
- {
- aMenuPane->SetItemDimmed(EAknCmdInputLanguage, EFalse);
- }
-
- if (iPermittedInputModes == EAknEditorNumericInputMode)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue);
- }
- else if ( (iMode == ELatin || iMode == ENumber) &&
- (iPermittedInputModes & EAknEditorSecretAlphaInputMode) &&
- !(iPermittedInputModes & EAknEditorTextInputMode))
- {
- // Text case mode is not available in secret editors.
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- }
- if (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue);
- }
-
- if ( IsModePermitted(ENumber) && iMode != ENumber )
- {
- //aMenuPane->SetItemDimmed(EChinFepCmdModeNumber, EFalse); // original statement
- aMenuPane->SetItemDimmed(EAknCmdEditModeNumber, EFalse);
- // end modifying
- }
- }
-TBool CAknFepManager::IsChineseInputMode( TInt aMode )
- {
- return aMode == EPRCFind || aMode == ECangJie || aMode == EZhuyinFind
- || aMode == EStrokeFind || aMode == EPinyin || aMode == EZhuyin
- || aMode == EStroke;
- }
-
-#endif //RD_SCALABLE_UI_V2
-void CAknFepManager::DoWesternMenu(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- // remove Chinese specific items from menu
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue);
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- const TInt inputLanguage = iLanguageCapabilities.iInputLanguageCode;
-
-
- TInt pos=-1;
-
- if( aMenuPane->MenuItemExists( EAknCmdEditModeKorean, pos ) )
- {
- // if mode is already hangul or language is not korean dim korean mode menu item
- if( iMode == EHangul || inputLanguage != ELangKorean || !(IsModePermitted(EHangul)))
- {
-
- aMenuPane->SetItemDimmed(EAknCmdEditModeKorean, ETrue);
- }
- else
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeKorean, EFalse);
- }
- }
-
- TInt index;
-
- if (aMenuPane->MenuItemExists(EJapanFepCmdModeUserDic, index))
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeUserDic, ETrue);
- }
-
- // T9 stuff
- if (WesternPredictive())
- {
- aMenuPane->SetItemDimmed(EAknCmdPredictiveTextCascade, EFalse);
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- if(iPtiEngine->CurrentLanguage()->HasInputMode(EPtiEngineWordCompletion))
- {
- // Disable Autoword Completion feature for Touch Input
- #ifndef RD_SCALABLE_UI_V2
- aMenuPane->SetItemDimmed(EAknCmdPredictiveModeCascade, EFalse);
- #endif // RD_SCALABLE_UI_V2
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
- else
- {
- if ( (iPermittedInputModes & EAknEditorTextInputMode) &&
- !(iAknEditorFlags & EAknEditorFlagNoT9) &&
- iMode == ELatin &&
- !IsKoreanInputLanguage() &&
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- ((
-#endif //RD_INTELLIGENT_TEXT_INPUT
- iLanguageCapabilities.iSupportsWesternPredictive && !IsKoreanInputLanguage()
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- && !iQwertyInputMode) ||
- (iLanguageCapabilities.iSupportsWesternQwertyPredictive && iQwertyInputMode)
- )
- // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
- )
- {
- aMenuPane->SetItemDimmed(EAknCmdMultitapPredictiveT9On, EFalse);
- }
- }
-
- if ( ( iMode == ENumber || iMode == ENativeNumber ) &&
- (iPermittedInputModes & (EAknEditorTextInputMode | EAknEditorSecretAlphaInputMode)) )
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeAlpha, EFalse);
- }
-
- if ( IsModePermitted(ENumber) )
- {
- if ( iMode != ENumber ) // hide the menu if number editor
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeNumber, EFalse);
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- // There's no need for numeric mode when full qwerty keyboard is in use (like in MAXI)
- if (iQwertyInputMode)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeNumber, ETrue);
- }
- // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
-
- if ( IsModePermitted(ENativeNumber) && iMode != ENativeNumber)
- {
- if ( iLanguageCapabilities.iArabicIndicDigitsAllowed ) // hide the menu if number editor)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeArabicIndicNumber, EFalse);
- }
- else if ( iLanguageCapabilities.iEasternArabicIndicDigitsAllowed ) // hide the menu if number editor)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeEasternArabicIndicNumber, EFalse);
- }
- else if( iLanguageCapabilities.iIndicDigitsAllowed ) // hide the menu if number editor)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeIndicNumber, EFalse);
- }
- }
-
- if (IsAbleToLaunchSCT())
- {
- if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index))
- {
- aMenuPane->SetItemDimmed(EAknCmdEditInsertSymbol, EFalse);
- }
- }
- TInt writtingLanguage = 0;
- if ( iMode != ENumber && iMode != ENativeNumber && iPtiEngine->NumberOfLanguages() > 1 &&
- !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly)
- && aMenuPane->MenuItemExists( EAknCmdInputLanguage, writtingLanguage ) )
- {
- aMenuPane->SetItemDimmed(EAknCmdInputLanguage, EFalse);
- }
- }
-
-void CAknFepManager::DoChineseMenu(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- TInt index;
- if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index)
- && aMenuPane->MenuItemExists(EJapanFepCmdModeUserDic, index))
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeUserDic, ETrue);
- }
-
- if (WesternPredictive())
- {
- aMenuPane->SetItemDimmed(EAknCmdPredictiveTextCascade, EFalse);
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- if(iPtiEngine->CurrentLanguage()->HasInputMode(EPtiEngineWordCompletion))
- {
- // Disable Autoword Completion feature for Touch Input
- #ifndef RD_SCALABLE_UI_V2
- aMenuPane->SetItemDimmed(EAknCmdPredictiveModeCascade, EFalse);
- #endif // RD_SCALABLE_UI_V2
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
- else
- {
- if ( (iPermittedInputModes & EAknEditorTextInputMode) &&
- !(iAknEditorFlags & EAknEditorFlagNoT9) &&
- iMode == ELatin)
- {
- aMenuPane->SetItemDimmed(EAknCmdMultitapPredictiveT9On, EFalse);
- }
- }
- if (IsAbleToLaunchSCT() &&
- aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index))
- {
- aMenuPane->SetItemDimmed(EAknCmdEditInsertSymbol, EFalse);
- }
- if( iQwertyInputMode && aMenuPane->MenuItemExists(EChinFepCmdInstructions, index) )
- {
- aMenuPane->SetItemDimmed(EChinFepCmdInstructions, ETrue);
- }
- else if ( !(iPermittedInputModes == EAknEditorNumericInputMode ||
- iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) )
- {
- if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index)
- && aMenuPane->MenuItemExists(EChinFepCmdInstructions, index))
- {
- aMenuPane->SetItemDimmed(EChinFepCmdInstructions, EFalse);
- }
- }
-
- if ( (!IsOnlyNumericPermitted()) && iPtiEngine->NumberOfLanguages() > 1 &&
- !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly))
- {
- aMenuPane->SetItemDimmed(EAknCmdInputLanguage, EFalse);
- // the follow added for phrase creation
- TInt iptlanguage;
- if ( !iIsUserdbdlgActive
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- && EPtiKeyboardHalfQwerty != KeyboardLayout()
-#endif
- && IsChineseInputLanguage() )
- {
- aMenuPane->MenuItemExists( EAknCmdInputLanguage, iptlanguage );
- MPtiLanguage* ptilang = iPtiEngine->CurrentLanguage();
- TInt inputLanguage = (ptilang)? ptilang->LanguageCode() : 0;
- if (iQwertyInputMode && (inputLanguage == ELangPrcChinese ||
- inputLanguage == ELangHongKongChinese ||
- inputLanguage == ELangTaiwanChinese))
- {
- TRAP_IGNORE(AddUserDBDlgItemL( aMenuPane, iptlanguage ));
- }
- }
- }
-
- if (iPermittedInputModes == EAknEditorNumericInputMode)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue);
- }
- else if ( (iMode == ELatin || iMode == ENumber) &&
- (iPermittedInputModes & EAknEditorSecretAlphaInputMode) &&
- !(iPermittedInputModes & EAknEditorTextInputMode))
- {
- // Text case mode is not available in secret editors.
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- }
- if (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue);
- }
-
- if ( IsModePermitted(ENumber) && iMode != ENumber )
- {
- //aMenuPane->SetItemDimmed(EChinFepCmdModeNumber, EFalse); // original statement
- aMenuPane->SetItemDimmed(EAknCmdEditModeNumber, EFalse);
- // end modifying
- }
- }
-
-void CAknFepManager::DoJapaneseMenu(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- // remove Chinese specific items from menu
- TInt index;
- if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index))
- {
- aMenuPane->SetItemDimmed(EAknCmdEditInsertSymbol, ETrue);
- }
-
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue);
- aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue);
- aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue);
-
- if (IsAbleToLaunchSCT()
- && !iSharedDataInterface->QwertyInputMode())
- {
- aMenuPane->SetItemDimmed(EAknCmdEditInsertSymbolJp, EFalse);
- }
-
- if (IsAbleToLaunchPCT()
- && !iSharedDataInterface->QwertyInputMode())
- {
- aMenuPane->SetItemDimmed(EAknCmdEditInsertPictograph, EFalse);
- }
-
- if (!(iPermittedInputModes & EAknEditorHiraganaKanjiInputMode) &&
- aMenuPane->MenuItemExists(EJapanFepCmdModeUserDic, index)
- )
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeUserDic, ETrue);
- }
-
- if (iPermittedInputModes == (EAknEditorSecretAlphaInputMode | EAknEditorNumericInputMode))
- {
- if (iMode == ELatin)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdEditModeNumber, EFalse);
- }
- else if (iMode == ENumber)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdEditModeAlpha, EFalse);
- }
- }
- else
- {
- // If the fep is running on the Janapnse User Dictionary Application,
- // "User Dictionary" in editting options menu is hidden.
- if (CEikonEnv::Static()->EikAppUi()->Application())
- {
- if (CEikonEnv::Static()->EikAppUi()->Application()->AppDllUid() == KUidUserDictApp)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeUserDic, ETrue);
- }
- }
-
- if (iPermittedInputModes & EAknEditorHiraganaKanjiInputMode)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeKutenCodeInput, EFalse);
- }
-
- TInt value = iSharedDataInterface->ClearDirection();
- if (value == EClearDirectionRight)
- {
- aMenuPane->SetItemDimmed(EAknCmdEditClearDirectionLeft, EFalse);
- }
- else
- {
- aMenuPane->SetItemDimmed(EAknCmdEditClearDirectionRight, EFalse);
- }
-
- if (!iSharedDataInterface->QwertyInputMode())
- {
- if (IsPredictive(ELatin))
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdPredictiveTextCascade, EFalse);
- }
- else if ((iPermittedInputModes & EAknEditorHalfWidthTextInputMode)
- && !(iAknEditorFlags & EAknEditorFlagNoT9))
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdMultitapPredictiveT9On, EFalse);
- }
- }
-
- if (IsPredictive(EHiraganaKanji))
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModePredictiveOff, EFalse);
- }
- else if((iPermittedInputModes & EAknEditorHiraganaKanjiInputMode)
- && !(iAknEditorFlags & EAknEditorFlagNoT9))
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModePredictiveOn, EFalse);
- }
-
- if (iMode != EHiraganaKanji && iPermittedInputModes & EAknEditorHiraganaKanjiInputMode)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeHiragana, EFalse);
- }
-
- if (iCharWidth == EHalfWidthChar)
- {
- if (iPermittedInputModes & EAknEditorKatakanaInputMode && iMode != EKatakana)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeKatakana, EFalse);
- }
-
- if (iMode != ELatin && (iPermittedInputModes & EAknEditorHalfWidthTextInputMode
- || iPermittedInputModes & EAknEditorSecretAlphaInputMode))
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdEditModeAlpha, EFalse);
- }
-
- if (iMode != ENumber
- && iPermittedInputModes & EAknEditorNumericInputMode
- && !iSharedDataInterface->QwertyInputMode())
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdEditModeNumber, EFalse);
- }
-
- if (iMode == EKatakana && iPermittedInputModes & EAknEditorFullWidthKatakanaInputMode)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeFullWidth, EFalse);
- }
-
- if (iMode == ELatin && !iWesternPredictive
- && iPermittedInputModes & EAknEditorFullWidthTextInputMode)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeFullWidth, EFalse);
- }
-
- if (iMode == ENumber
- && iPermittedInputModes & EAknEditorFullWidthNumericInputMode)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeFullWidth, EFalse);
- }
- }
- else // Full width Character
- {
- if (iMode != EKatakana && iPermittedInputModes & EAknEditorFullWidthKatakanaInputMode)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeKatakana, EFalse);
- }
-
- if (iMode != ELatin && iPermittedInputModes & EAknEditorFullWidthTextInputMode)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdEditModeAlpha, EFalse);
- }
-
- if (iMode != ENumber
- && iPermittedInputModes & EAknEditorFullWidthNumericInputMode
- && !iSharedDataInterface->QwertyInputMode())
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdEditModeNumber, EFalse);
- }
-
- if (iMode == EKatakana && iPermittedInputModes & EAknEditorKatakanaInputMode)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeHalfWidth, EFalse);
- }
-
- if (iMode == ELatin && iPermittedInputModes & EAknEditorFullWidthTextInputMode)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeHalfWidth, EFalse);
- }
-
- if (iMode == ENumber
- && iPermittedInputModes & EAknEditorFullWidthNumericInputMode)
- {
- aMenuPane->SetItemDimmed(EJapanFepCmdModeHalfWidth, EFalse);
- }
- }
- }
- }
-
-void CAknFepManager::HandlePointerEventInInlineTextL(TPointerEvent::TType /*aType*/, TUint /*aModifiers*/, TInt /*aPositionInInlineText*/)
- {
- }
-
-void CAknFepManager::GetFormatOfFepInlineText(TCharFormat& aFormat,
- TInt& aNumberOfCharactersWithSameFormat,
- TInt aPositionOfCharacter) const
- {
- if ( FepUI() )
- {
- FepUI()->GetFormatOfFepInlineText(aFormat, aNumberOfCharactersWithSameFormat,
- aPositionOfCharacter);
- }
- }
-
-void CAknFepManager::NumberModeChangeGSNotification()
- {
- iLanguageCapabilities.iNumericEditorDigitType = EDigitTypeUnknown;
- UpdateNumericEditorDigitType();
- UpdateLocalDigitMode();
- }
-
-void CAknFepManager::HandleChangeInFocusL()
- {
- // Closing SCT has done focus change, so here just reset the flag.
-#ifdef RD_SCALABLE_UI_V2
- if(iDisalbleFocusChangeForSCT)
- {
- iDisalbleFocusChangeForSCT = EFalse;
- return;
- }
-#endif
-
- //The CCPU flag ECcpuStateShiftkeyWasPressedBeforeLosingFocus suggests that the candidate list was closed
- //with a long key press of shift key. If so then, FEP needs to set the EFlagShiftKeyDepressed for the CCPU mode to work
- //correctly. The state of the shift state is copied to local variable isToSetShiftKeyStateDown because as a function of change
- //of focus the FEP clears all the CCPU flags which would reset ECcpuStateShiftkeyWasPressedBeforeLosingFocus also.
- TBool isToSetShiftKeyStateDown = IsCcpuFlagSet(ECcpuStateShiftkeyWasPressedBeforeLosingFocus);
- if (!Japanese() || iFepManState != EAknFepStateUIActive)
- {
- if (IsCcpuFlagSet(ECcpuStateIgnoreNextFocusChange))
- {
- // The focus event was caused by menu selection, don't clear all ccpu flags.
- ClearCcpuFlag(ECcpuStateIgnoreNextFocusChange);
- }
- else
- {
- if((HashKeySelectionInUse() && IsCcpuFlagSet(ECcpuStateHashDown)
- && IsCcpuFlagSet(ECcpuStateEdwinInSelectionMode)))
- {
- ClearCcpuFlag(ECcpuStateHashDown);
- SetCcpuFlag(ECcpuStateSelectionEventPosted);
- ClearCcpuFlag(ECcpuStateEdwinInSelectionMode);
- SetFlag(EFlagLongShiftKeyPress);
- TKeyEvent ccpuStart = {0, EStdKeyLeftShift, 0, 0};
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKeyUp);
- }
- else
- {
- TBool isToSupressCursorMove = IsCcpuFlagSet(ECcpuStateSupressCursorMoveToEnd);
- TBool isCommitPredictiveWord = IsCcpuFlagSet(ECcpuStataCommitPredictiveWord);
- CancelCcpuMode();
- if(isToSupressCursorMove)
- SetCcpuFlag(ECcpuStateSupressCursorMoveToEnd);
- if(isCommitPredictiveWord)
- SetCcpuFlag(ECcpuStataCommitPredictiveWord);
- }
-
- }
- SetCcpuFlag(ECcpuSupressEditMenuFromShiftUp);
- iPreviousEditingState = EStateNone;
- iEditIndicatorAtLastUpdate = NULL;
- ClearFlag( EFlagBidiCursorIsInitialized );
-#ifndef RD_INTELLIGENT_TEXT_INPUT
-// removing the no match indicator is not necessary for ITI
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- TryRemoveNoMatchesIndicatorL();
- }
-#endif
- UpdateCbaL(NULL);
-
- if (iFepFullyConstructed)
- {
- SetCcpuFlag(ECcpuStateLosingFocus); // CommitInlineEditL needs to now we're losing focus (for cursor handling):
- CancelAllTimerActivity();
- FepUI()->ExpireMultitapTimer();
- ClearCcpuFlag(ECcpuStateLosingFocus); // Cleared right away to make sure nothing else is affected.
- }
- // Forget shift key and chr key press if application or UI component is
- // changed during shiftkey press.
- ClearFlag(EFlagQwertyChrKeyDepressed);
- //If candidate list was closed by long keypress of shift key, set the flag EFlagShiftKeyDepressed for CCPU mode
- //to work correctly once it re-focuses on the editor.
- if(isToSetShiftKeyStateDown)
- {
- SetFlag(EFlagShiftKeyDepressed);
- ClearCcpuFlag(ECcpuStateShiftkeyWasPressedBeforeLosingFocus);
- }
- else
- {
- ClearFlag(EFlagShiftKeyDepressed);
- }
- if ( iFepFullyConstructed && IsFepAwareTextEditor() )
- {
- //save state of old item
- TransferFepStateToEditorL();
-
- if ( WesternPredictive() )
- {
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- // To rip off suggested word completion when there is a change in focus
- if(IsAutoCompleteOn())
- {
- RemoveSuggestedCompletionL();
-
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
- SetCcpuFlag(ECcpuStateLosingFocus); // CommitInlineEditL needs to now we're losing focus (for cursor handling):
- CommitInlineEditL();
- ClearCcpuFlag(ECcpuStateLosingFocus); // Cleared right away to make sure nothing else is affected.
- }
- else
- {
- TryCloseUiL();
- }
-
- iRememberLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- if (iLastFocusedEditor && !IsExtendedFlagSet(EExtendedFlagFepAwareDialogLaunched))
- {
- iLastFocusedEditor->SetObserver(NULL);
- iLastFocusedEditor = NULL;
- }
- // When editor launches a non-fep aware dialog, then we
- // should not set the observer to Null. Because if the dialog is
- // destroyed we will not know and the dialog will remain orphaned.
- // Also we need to know the fep editor pointer.
- iLastFocusedEditor = EditorState();
- iEditorCcpuStatus = EditorCcpuStatus(iLastFocusedEditor);
- //iLastFocusedEditor->SetObserver(NULL);
-#ifdef RD_SCALABLE_UI_V2
- UnregisterObserver();
-#endif // RD_SCALABLE_UI_V2
- }
-
- if (iPermittedInputModes & EAknEditorSecretAlphaInputMode &&
- !(iPermittedInputModes & EAknEditorTextInputMode))
- {
- // For password editors.
- ClearFlag(EFlagSupressAutoUpdate);
- }
-
- // Losing focus is over, from this point on we are gaining focus.
- ClearCcpuFlag(ECcpuStateLosingFocus);
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(iFnKeyManager)
- iFnKeyManager->ClearFnKeyState();
-
- if(iResourceString)
- {
- delete iResourceString;
- iResourceString = NULL;
- }
-#endif // RD_INTELLIGENT_TEXT_INPUT
-
- // get input capabilities from newly focused item
- CCoeEnv* coeEnv = CCoeEnv::Static();
- iInputCapabilities = static_cast<const CCoeAppUi*>(coeEnv->AppUi())->InputCapabilities();
- SetQwertyModeToInputcapbility();
- if ( IsFepAwareTextEditor() )
- {
- // Now at the launch of non-fep aware dialogs we do not set the editor observer to NULL,
- // and retain the editor pointer in iLastFocusedEditor.
- // So in case the editor is back in focus, we set iLastFocusedEditor to NULL
- // and set the editor observer again.
-
- // At launch of fep aware dialog on a fep aware editor say spell query launched on messaging editor,
- // we have the flag EExtendedFlagFepAwareDialogLaunched set.
- // So in this scenario we retain the observer for both the editor as we need to close the spell query
- // on close of messaging editor.
- // Specific scenario is explained, the same is applicable for all general scenarios, for any
- // fep aware dialog launched on any other fep aware editor.
- if (iLastFocusedEditor && !IsExtendedFlagSet(EExtendedFlagFepAwareDialogLaunched))
- {
- iLastFocusedEditor->SetObserver(NULL);
- iLastFocusedEditor = NULL;
- }
- if( EditorState() )
- {
- EditorState()->SetObserver(this);
- }
- ConfigureFEPFromEditorStateL();
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if( PtiEngine() )
- {
- if(!IsAutoCompleteOn())
- {
- TInt tailLength = 0;
- TRAP_IGNORE( PtiEngine()->HandleCommandL(
- EPtiCommandGetAutoCompletionTailLength,
- &tailLength ));
- if(tailLength)
- {
- RemoveSuggestedAdvanceCompletionL();
- }
- }
- }
-#endif
- if (!iWesternPredictive && iMode == ELatin)
- {
- // It is possible to cause situation (by ill-acting client
- // app) where focus handling goes out of sync and there actually
- // is uncomitted inline edit operation going on in to-be-focused
- // editor. Multitapping mode doesn't like that, so we make sure here
- // that it won't happen.
- CancelInlineEdit();
- }
- AdjustCursorTypeForCurrentPosition();
-
- if (IsCcpuFlagSet(ECcpuStateUncommitWhenFocused))
- {
- // One of the ccpu editing options mode was started from
- // options menu. If there is active predictive word it
- // needs to be deactivated.
- ClearCcpuFlag(ECcpuStateUncommitWhenFocused);
- DeactivatePredicitveWordAndMoveCursorL();
- }
-#ifdef RD_SCALABLE_UI_V2
- RegisterObserver();
-#endif // RD_SCALABLE_UI_V2
- }
- else // no FepAwareTextEditor
- {
-#ifdef RD_SCALABLE_UI_V2
- // register to receive TInputCapabilitiesEvent events
- if ( SemiFepAwareTextEditor() )
- {
- RegisterObserver();
- TLanguage localLanguage = ELangTest;
- if (GetLocalLanguage( localLanguage ) )
- {
- iLanguageCapabilities.iLocalInputLanguageInUse = ETrue;
- if ( localLanguage != iLanguageCapabilities.iInputLanguageCode )
- {
- ChangeInputLanguageL(localLanguage);
- }
- }
- else if (iLanguageCapabilities.iLocalInputLanguageInUse)
- {
- iLanguageCapabilities.iLocalInputLanguageInUse = EFalse;
- ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage());
- }
-
- if (IsFlagSet(EFlagNewSharedDataInputLanguage) )
- {
- //Global mode or input language has been changed in general settings
- if ( !iLanguageCapabilities.iLocalInputLanguageInUse)
- {
- ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage());
- }
- ClearFlag(EFlagNewSharedDataInputLanguage);
- }
- }
-#endif // RD_SCALABLE_UI_V2
- // Check for non Edwin derived editors (eg mfne, tel no editor etc)
- if (iInputCapabilities.SupportsWesternNumericIntegerPositive() ||
- iInputCapabilities.SupportsWesternNumericIntegerNegative() ||
- iInputCapabilities.SupportsWesternNumericReal() )
- {
- SyncStates(EAknFepStateInitial);
- iPermittedInputModes = EAknEditorNumericInputMode;
- iAknEditorNumericKeymap = EAknEditorNativeKeysNumberModeKeymap;
- iAknEditorFlags = 0;
- iCharWidth = EHalfWidthChar;
- UpdateNumericEditorDigitType();
-
- if ( IsMfneEditor() )
- {
- UpdateLocalDigitMode();
- }
-
- if( IsInputModeAvailable(ENativeNumber) &&
- ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) )
- {
- TryChangeModeL( ENativeNumber );
- }
- else
- {
- TryChangeModeL( ENumber );
- }
- }
- else //we don't have a valid editor
- {
- SyncStates(EAknFepStateNull);
-
- // Reset the qwerty shift case mode when we do not have a valis editor.
- ClearFlag(IsFlagSet( EFlagQwertyShiftMode ));
- if (!IsFlagSet(EFlagForegroundUIComponentVisible | EFlagMenuPaneVisible) &&
- iIndicator)
- {
- iIndicator->SetState(EStateNone);
- iHybridAplphaChangedToAlphanumeric = EFalse;
- }
- ClearFlag(EFlagForegroundUIComponentVisible);
- iPermittedInputModes = EAknEditorNullInputMode;
-
-#ifdef RD_SCALABLE_UI_V2
- RegisterObserver();
-#endif // RD_SCALABLE_UI_V2
- }
- }
- }
- else if (Japanese() && iFepManState == EAknFepStateUIActive)
- {
- if (iInputCapabilities.FepAwareTextEditor())
- {
- TryCloseUiL();
- }
- }
-
-#ifdef RD_SCALABLE_UI_V2
- {
- /*
- if( iGainForeground )
- {
- iLoseForeAndGainFocus = EFalse;
- }
- else
- {
- iLoseForeAndGainFocus = ETrue;
- }
- SendEventsToPluginManL( EPluginFocusChanged, iGainForeground );
- */
- CCoeControl* focusCtrl = static_cast<const CCoeAppUi*>(CCoeEnv::Static()->AppUi())->TopFocusedControl();
- CAknAppUi* aui = static_cast<CAknAppUi*>(CEikonEnv::Static()->AppUi());
- TBool bForeGround = aui->IsForeground();
- if(iGainForeground && ! bForeGround)
- {
- iGainForeground = EFalse;
- }
-
- if(iGainForeground && iNotifyPlugin)
- {
- SendEventsToPluginManL( EPluginFocusChanged,
- iGainForeground && focusCtrl!=0 && focusCtrl->IsFocused());
- }
- }
-#endif // RD_SCALABLE_UI_V2
- if( PtiEngine() && FepAwareTextEditor() )
- {
- if( FepAwareTextEditor()->DocumentLengthForFep() == 0 &&
- IsFlagSet(EFlagInsideInlineEditingTransaction)&&
- iFepManState == EAknFepStateUIActive )
- {
- PtiEngine()->ClearCurrentWord();
- TryCloseUiL();
- }
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- ShowExactWordPopupIfNecessaryL();
- // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
-
-void CAknFepManager::CleanUpFep()
- {
- if (iFepFullyConstructed)
- {
- CancelAllTimerActivity();
- iInputCapabilities.FepAwareTextEditor()->CancelFepInlineEdit();
- }
- else
- {
- CommonDestroyFep();
- }
- }
-
-#ifdef RD_SCALABLE_UI_V2
-void CAknFepManager::UnregisterObserver()
- {
-
- MObjectProvider* mop = iInputCapabilities.ObjectProvider();
-
- if ( mop )
- {
- CAknExtendedInputCapabilities* extendedInputCapabilities =
- mop->MopGetObject( extendedInputCapabilities );
-
- if ( extendedInputCapabilities )
- {
- extendedInputCapabilities->UnregisterObserver( this );
- }
- }
- }
-
-void CAknFepManager::RegisterObserver()
- {
-
- MObjectProvider* mop = iInputCapabilities.ObjectProvider();
-
- if ( mop )
- {
- CAknExtendedInputCapabilities* extendedInputCapabilities =
- mop->MopGetObject( extendedInputCapabilities );
-
- if ( extendedInputCapabilities )
- {
- extendedInputCapabilities->RegisterObserver( this );
- }
- }
- }
-
-#endif // RD_SCALABLE_UI_V2
-
-void CAknFepManager::SimulateKeyEventL(TUint aKeyCode, TBool aActiveObj)
- {
- if (aActiveObj)
- {
- iSimulateKey = aKeyCode;
- iAsyncOwnSimulateKey.CallBack();
- }
- else
- {
- CArrayFix<TUint>* simCharArray = new(ELeave) CArrayFixFlat<TUint>(1);
- CleanupStack::PushL(simCharArray);
- simCharArray->AppendL(aKeyCode);
- SimulateKeyEventsL(simCharArray->Array());
- CleanupStack::PopAndDestroy(); // simCharArray
- }
- }
-
-TInt CAknFepManager::ResetShiftKeyMonitorCallback(TAny* aObj)
- {
- TRAPD(err, static_cast<CAknFepManager*>(aObj)->ResetShiftKeyMonitorL());
- if (err)
- {
- static_cast<CAknFepManager*>(aObj)->CleanUpFep();
- return KErrDied;
- }
- return KErrNone;
- }
-
-void CAknFepManager::ResetShiftKeyMonitorL()
- {
- TBool phoneIdle = (EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor);
- if(phoneIdle)
- {
- iShiftKeypressMonitor->Cancel();
- return;
- }
-
- SetFlag(EFlagLongShiftKeyPress);
-#ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Copy-paste with shift+SKs is always available on ITU-T. On QWERTY,
- // it's available if activated in the Central Repository.
- if ( (!iQwertyInputMode || iSharedDataInterface->ShiftCopyPastingOnQwerty()) &&
- !(iAknEditorFlags & EAknEditorFlagFindPane) )
-#endif // RD_INTELLIGENT_TEXT_INPUT
-#else
- if (!iQwertyInputMode && !(iAknEditorFlags & EAknEditorFlagFindPane))
-#endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
- {
- if (HashKeySelectionInUse() && IsCcpuFlagSet(ECcpuStateHashDown))
- {
- SetCcpuFlag(ECcpuStateEdwinInSelectionMode);
- iHashKeyMan->SetPreviousSelectionStyleModeL();
- }
- if(iCandidatePopup)
- { // if candidate list is launched and then a long key press of shift key is done, destroy the candidate list first
- iCandidatePopup->AttemptExitL(EFalse);
- HandleChangeInFocusL();
- }
- if(!IsCcpuFlagSet(ECcpuStateCbaShown))
- {
- TKeyEvent ccpuStart = {EKeyF21, EStdKeyF21, 0, 0};
- // to enable copy/paste support on cba. We simulate via CCoeEnv
- // to avoid fep SimulateKeyEventL adding shift modifiers
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKey);
- SetCcpuFlag(ECcpuStateCbaShown);
- }
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
- // we should not enter the copy-paste mode in find pane editors
- if( EPtiKeyboardHalfQwerty == KeyboardLayout() && !(iAknEditorFlags & EAknEditorFlagFindPane))
- {
- CAknFepFnKeyManager::TFnKeyState fnState = FnKeyState();
-
- if( CAknFepFnKeyManager::EFnKeyNone != fnState
- || iFnCharInsertedForShift )
- {
- TText prevCh = PreviousChar();
- if (prevCh == '#' || prevCh == '/')
- {
- RemovePreviousCharacterL();
- }
- // reset the fn state if it is FnNext
- if( fnState == CAknFepFnKeyManager::EFnKeyNext )
- {
- SetFnKeyState( CAknFepFnKeyManager::EFnKeyNone );
- }
- }
- SetCcpuFlag( CAknFepManager::ECcpuStateEdwinInSelectionMode );
- if(!IsCcpuFlagSet(ECcpuStateCbaShown))
- {
- TKeyEvent ccpuStart = {EKeyF21, EStdKeyF21, 0, 0};
-
- // to enable copy/paste support on cba. We simulate via CCoeEnv
- // to avoid fep SimulateKeyEventL adding shift modifiers
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKey);
- SetCcpuFlag(ECcpuStateCbaShown);
- }
- }
-#endif //__HALF_QWERTY_KEYPAD
-
-#endif//RD_INTELLIGENT_TEXT_INPUT
- iShiftKeypressMonitor->Cancel();
- }
-
-void CAknFepManager::CancelAllTimerActivity()
- {
- if (iShiftKeypressMonitor->IsActive())
- {
- iShiftKeypressMonitor->Cancel();
- }
- if (iConcatenationTimer->IsActive())
- {
- iConcatenationTimer->Cancel();
- }
- if (iChrKeypressMonitor->IsActive())
- {
- iChrKeypressMonitor->Cancel();
- }
- if (iPostEventCheck->IsActive())
- {
- iPostEventCheck->Cancel();
- }
- if ( iHashKeyMan )
- {
- iHashKeyMan->CancelHashKeyTimer();
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if( iNumericResourceTimer )
- {
- TRAP_IGNORE( NumericResourceMultiTapTimerTimeoutL());
- }
-#endif
- }
-
-TBool CAknFepManager::IsModePermitted(TInt aMode, TWidthChar aWidth) const
- {
- if (aWidth == ENoneWidthChar)
- {
- aWidth = iCharWidth;
- }
-
- TBool isModePermitted = ETrue;
- const TInt inputLanguage = iLanguageCapabilities.iInputLanguageCode;
-
- if ( aMode == ENativeNumber && !IsInputModeAvailable( aMode ) )
- {
- if ( inputLanguage == ELangThai && iFepPluginManager &&
- iFepPluginManager->PluginInputMode() != EPluginInputModeItut &&
- !iQwertyInputMode)
- {
- return ETrue;
- }
- return EFalse;
- }
-
- TUint editorMode = EditorMode(aMode, aWidth);
-
- //Support Boxcn default Chinese inputmode when defaul inputmode is Cangjie Hongkong
- //only if Chinese input is permitted in the editor
- if (!( (iVariantPermittedModes | ELatinText | ELatinUpper | ELatinLower | EHiragana) & aMode) )
- {
- //the mode is never valid in this variant
- isModePermitted = EFalse;
- }
- else if( aMode == ECangJie && !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly))
- {
- if (iQwertyInputMode || iFepPluginManager->PluginInputMode() == EPluginInputModeVkb
- || iFepPluginManager->PluginInputMode() == EPluginInputModeFSQ)
- {
- isModePermitted = ETrue;
- }
- else
- {
- isModePermitted = EFalse;
- }
- }
- else if (!(iPermittedInputModes & editorMode))
- {
- isModePermitted = EFalse;
- }
- else if (((aMode == EPinyin) || (aMode == EZhuyin) || (aMode == EStroke) || (aMode == ECangJie)
- || (aMode == EHiraganaKanji) || (aMode == EKatakana)
- || (((aMode == ELatin) || (aMode == ENumber) || iMode == ENativeNumber ) && (iCharWidth == EFullWidthChar)))
- && (iAknEditorFlags & EAknEditorFlagLatinInputModesOnly))
- {
- //the editor does not allow Chinese modes
- isModePermitted = EFalse;
- }
- else if (((aMode == EStrokeFind) || (aMode == EZhuyinFind))
- && (!(iAknEditorFlags & EAknEditorFlagForceTransparentFepModes)))
- {
- //StrokeFind and ZhuyinFind modes are only valid in a chinese find pane
- isModePermitted = EFalse;
- }
- else
- {
- TUint editorsWhichAllowThisMode;
- if (aMode == ENumber || aMode == ENativeNumber )
- {
- //The FEP's ENumber mode has a direct mapping to EAknEditorNumericInputMode
- // or EAknEditorFullWidthNumericInputMode
- editorsWhichAllowThisMode = EAknEditorNumericInputMode;
- if (aWidth == EFullWidthChar)
- {
- editorsWhichAllowThisMode = EAknEditorFullWidthNumericInputMode;
- }
- }
- else if (aMode == EHiragana)
- {
- editorsWhichAllowThisMode = EAknEditorHiraganaInputMode;
- }
- else if (aMode == EKatakana || (aMode == ELatin && aWidth == EFullWidthChar))
- {
- editorsWhichAllowThisMode = EditorMode(aMode, aWidth);
- }
- else if (aMode == EHiraganaKanji)
- {
- // HiraganaKanji mode allows all input mode.
- editorsWhichAllowThisMode = EAknEditorAllInputModes;
- }
- else if (aMode == EHangul)
- {
- editorsWhichAllowThisMode =(EAknEditorTextInputMode | EAknEditorSecretAlphaInputMode | EAknEditorHalfWidthTextInputMode);
- }
- else
- {
- //if the editor allows Text Input or Secret Alpha Mode,
- //we infer that Chinese Modes are valid
- editorsWhichAllowThisMode =(EAknEditorTextInputMode |
- EAknEditorSecretAlphaInputMode |
- EAknEditorHalfWidthTextInputMode);
- }
- isModePermitted = iPermittedInputModes & editorsWhichAllowThisMode;
- }
-
- return isModePermitted;
- }
-
-TInt CAknFepManager::SyncStates(TAknFepManagerState aState)
- {
- TInt ret = KErrNone;
-
- if (!iFepFullyConstructed)
- {
- if (aState == EAknFepStateNull)
- {
- return KErrNone;
- }
-
- TRAP(ret, ConstructFullyL());
- }
- if (iFepFullyConstructed)
- {
- iFepManState = aState;
- iKeyCatcher->SetState(aState);
- }
-
- return ret;
- }
-
-TUint CAknFepManager::EditorMode(TInt aMode, TWidthChar aWidth) const
- {
- TInt editorMode = 0;
- switch(aMode)
- {
- case EPinyin:
- case EZhuyin:
- case EStroke:
- case ECangJie:
- case EPRCFind:
- case EZhuyinFind:
- case EStrokeFind:
- case EHangul:
- {
- editorMode = EAknEditorTextInputMode;
- }
- break;
- case EHindi:
- case ELatin:
- case ELatinText:
- case ELatinUpper:
- case ELatinLower:
- {
- if (iPermittedInputModes & EAknEditorTextInputMode)
- {
- editorMode = EAknEditorTextInputMode;
- }
- else if (iPermittedInputModes & EAknEditorHalfWidthTextInputMode)
- {
- if (IsFeatureSupportedJapanese())
- {
- editorMode = EAknEditorHalfWidthTextInputMode;
- }
- else
- {
- editorMode = EAknEditorTextInputMode;
- }
- }
- else
- {
- editorMode = EAknEditorSecretAlphaInputMode;
- }
- if (aWidth == EFullWidthChar)
- {
- editorMode = EAknEditorFullWidthTextInputMode;
- }
- }
- break;
- case EHiragana:
- {
- editorMode = EAknEditorHiraganaInputMode;
- }
- break;
- case EHiraganaKanji:
- {
- editorMode = EAknEditorHiraganaKanjiInputMode;
- }
- break;
- case EKatakana:
- {
- editorMode = EAknEditorKatakanaInputMode;
- if (aWidth == EFullWidthChar)
- {
- editorMode = EAknEditorFullWidthKatakanaInputMode;
- }
- }
- break;
- case ENumber:
- case ENativeNumber:
- {
- editorMode = EAknEditorNumericInputMode;
- if (aWidth == EFullWidthChar)
- {
- editorMode = EAknEditorFullWidthNumericInputMode;
- }
- }
- break;
- default:
- break;
- }
-
- return editorMode;
- }
-
-void CAknFepManager::LaunchPenSupportMenuL()
- {
- if (HashKeySelectionInUse() && IsCcpuFlagSet(ECcpuStateHashDown))
- {
- return;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(iCandidatePopup)
- {
- iCandidatePopup->AttemptExitL(EFalse);
- HandleChangeInFocusL();
- }
-#endif
-
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- TryRemoveNoMatchesIndicatorL();
- /*
- This code is the part of fixing TSW Error ID: BSAN-7G58DB : Edit Menu :
- "Matches" and "insert word" options are not available under Edit Menu.
- When we launch Edit Menu.the word which in Inline Editing in the BackGorund
- Should not Commit*/
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- CommitInlineEditL();
-#endif
- /*
- This code is the part of fixing TSW Error ID: BSAN-7G58DB : Edit Menu :
- "Matches" and "insert word" options are not available under Edit Menu.
- This Flag is useful for deciding whether "Matches" Menu Item can Visible
- or not*/
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- SetFlag(EFlagInlineEditInBackground);
-#endif
- /*
- This code is the part of fixing TSW Error ID: BSAN-7G58DB : Edit Menu :
- "Matches" and "insert word" options are not available under Edit Menu.*/
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- ClearFlag(EFlagInsideInlineEditingTransaction);
-#endif
- }
-
- CAknEdwinState* editorState = NULL;
- if (iInputCapabilities.FepAwareTextEditor())
- {
- editorState = EditorState();
- }
-
- iEditMenuBar = NULL;
- if (editorState)
- {
- iEditMenuBar = iUiInterface->EditorStateMenuBar(editorState);
- }
-
- if (iEditMenuBar &&
- !iEditMenuBar->IsDisplayed())
- {
-
- iPenSupportMenu = ETrue;
- // SetFlag(EFlagLaunchEditMenu);
- CAknFepUiInterfaceMenuPane* menuPane = iEditMenuBar->MenuPane();
-
- CEikMenuPane* oldMenuPane = menuPane->GetMenuPane();
- if (!oldMenuPane)
- {
- menuPane = NULL;
- }
-
- iRememberEditorState = EditorState();
-
- iEditMenuBar->SetMenuType(CAknFepUiInterfaceMenuBar::EMenuEdit);
- // It is unnecessary to add ROW SCT in Editting option menu.
- iEditMenuBar->TryDisplayMenuBarL();
- if (menuPane && menuPane->NumberOfItemsInPane() == 0)
- {
- // Edit menu do not contain any items.
- iEditMenuBar->StopDisplayingMenuBar();
- }
- else
- {
- //adjust menu position to the front of dialog to
- //avoid input capability is wrongly got
- CCoeEnv* coeEnv = CCoeEnv::Static();
- CCoeAppUi* appUi = (CCoeAppUi*)(coeEnv->AppUi());
- if( appUi->IsDisplayingDialog() )
- {
- iEditMenuBar->RemoveFromStack();
- iEditMenuBar->AddToStackL(ECoeStackPriorityDialog + 1, ECoeStackFlagStandard);
- }
- }
-
- iEditMenuBar->SetMenuType(CAknFepUiInterfaceMenuBar::EMenuOptions);
- }
- iPenSupportMenu = EFalse;
- }
-
-void CAknFepManager::LaunchSelectModeMenuL()
- {
- if (HashKeySelectionInUse() && IsCcpuFlagSet(ECcpuStateHashDown))
- {
- return;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(iCandidatePopup)
- {
- iCandidatePopup->AttemptExitL(EFalse);
- HandleChangeInFocusL();
- }
-#endif
-
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- TryRemoveNoMatchesIndicatorL();
- /*
- This code is the part of fixing TSW Error ID: BSAN-7G58DB : Edit Menu :
- "Matches" and "insert word" options are not available under Edit Menu.
- When we launch Edit Menu.the word which in Inline Editing in the BackGorund
- Should not Commit*/
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- CommitInlineEditL();
-#endif
- /*
- This code is the part of fixing TSW Error ID: BSAN-7G58DB : Edit Menu :
- "Matches" and "insert word" options are not available under Edit Menu.
- This Flag is useful for deciding whether "Matches" Menu Item can Visible
- or not*/
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- SetFlag(EFlagInlineEditInBackground);
-#endif
- /*
- This code is the part of fixing TSW Error ID: BSAN-7G58DB : Edit Menu :
- "Matches" and "insert word" options are not available under Edit Menu.*/
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- ClearFlag(EFlagInsideInlineEditingTransaction);
-#endif
- }
-
- CAknEdwinState* editorState = NULL;
- if (iInputCapabilities.FepAwareTextEditor())
- {
- editorState = EditorState();
- }
-
- iEditMenuBar = NULL;
- if (editorState)
- {
- iEditMenuBar = iUiInterface->EditorStateMenuBar(editorState);
- }
-
- if (iEditMenuBar &&
- !iEditMenuBar->IsDisplayed())
- {
- // SetFlag(EFlagLaunchEditMenu);
- CAknFepUiInterfaceMenuPane* menuPane = iEditMenuBar->MenuPane();
- CEikMenuPane* oldMenuPane = menuPane->GetMenuPane();
- if (!oldMenuPane)
- {
- menuPane = NULL;
- }
- if(menuPane)
- SetFlag(EFlagLaunchEditMenu);
-
- iRememberEditorState = EditorState();
-
- // It is unnecessary to add ROW SCT in Editting option menu.
- if (!IsFeatureSupportedJapanese())
- {
- iEditCharsPtr.Copy(KNullDesC);
- iEditCharsPtr.Set( iSctEditChars->Des() );
-
- // get the SCT resource id from editor default settings
- TInt currentEditorSCTResId = GetCurrentEditorSCTResId();
- TInt charResourceId = ENoCharacters;
- if ( currentEditorSCTResId == EDefaultNumericCharMapResId)
- {
- charResourceId = NumericModeSCTResourceId();
- if ( charResourceId != ENoCharacters && IsAbleToLaunchSCT()&&
- EditorType() != CAknExtendedInputCapabilities::EEikSecretEditorBased)
- {
-
- if( menuPane != NULL )
- {
- menuPane->ConstructMenuSctRowL( iEditCharsPtr, charResourceId );
- }
- }
- else
- {
- currentEditorSCTResId = charResourceId;
- }
- }
- else
- {
- TInt sctChars = EAknSCTChiChineseInputModes;
- if (iCharWidth == EFullWidthChar)
- {
- sctChars = EAknSCTFullCase;
- }
- else
- {
- if (iMode == ELatin)
- {
- if ( FeatureManager::FeatureSupported(KFeatureIdChinese) )
- {
- sctChars = EAknSCTChiLatinInputModes;
- }
- else
- {
- if (iQwertyInputMode)
- {
- sctChars = EAknSCTQwerty;
- }
- else
- {
- sctChars = EAknSCTUpperCase;
- if (iCaseMan->CurrentCase() == EAknEditorLowerCase)
- {
- sctChars = EAknSCTLowerCase;
- }
- }
- }
- }
- else if (iMode == ENumber || iMode == ENativeNumber)
- {
- sctChars = EAknSCTNumeric;
- if ( ((iAknEditorFlags & EAknEditorFlagUseSCTNumericCharmap) ||
- (iAknEditorNumericKeymap == EAknEditorAlphanumericNumberModeKeymap)) &&
- !IsOnlyHalfWidthCharacterPermitted() )
- {
- sctChars = EAknSCTLowerCase;
- }
- }
- //delete for phrase creation
-// else if (iMode == EStroke && iFepManState == EAknFepStateUIActive)
-// {
-// return;
-// }
- else if (iMode == EHiraganaKanji)
- {
- sctChars = EAknSCTFullCase;
- }
- else if(iMode == EKatakana)
- {
- sctChars = EAknSCTHalfCase;
- }
- }
-
- if (!(ExtendedInputCapabilities() & CAknExtendedInputCapabilities::EDisableSCT))
- {
- if( menuPane && (EditorType() != CAknExtendedInputCapabilities::EEikSecretEditorBased))
- {
- if(IsAbleToLaunchSmiley())
- {
- sctChars |= EAknCharMapEmotionUse;
- }
-
- menuPane->ConstructMenuSctRowFromDialogL( sctChars, iEditCharsPtr,
- currentEditorSCTResId );
- }
- }
- }
- }
- iEditMenuBar->SetMenuType(CAknFepUiInterfaceMenuBar::EMenuEdit);
- iFepPluginManager->SetMenuState( ETrue );
- iEditMenuBar->TryDisplayMenuBarL();
- if (menuPane && menuPane->NumberOfItemsInPane() == 0)
- {
- // Edit menu do not contain any items.
- iEditMenuBar->StopDisplayingMenuBar();
- iFepPluginManager->ResetMenuState( ETrue );
- }
- else
- {
- //adjust menu position to the front of dialog to
- //avoid input capability is wrongly got
- CCoeEnv* coeEnv = CCoeEnv::Static();
- CCoeAppUi* appUi = (CCoeAppUi*)(coeEnv->AppUi());
- if( appUi->IsDisplayingDialog() )
- {
- iEditMenuBar->RemoveFromStack();
- // Set the MenuBar not focused, the later add to stack operation could unfocus other control correctly
- iEditMenuBar->SetFocus(EFalse);
- iEditMenuBar->AddToStackL(ECoeStackPriorityDialog + 1, ECoeStackFlagStandard);
- }
- }
-
- iEditMenuBar->SetMenuType(CAknFepUiInterfaceMenuBar::EMenuOptions);
- }
- }
-
-void CAknFepManager::LaunchMatchesPopupListL()
- {
- TInt noOfMatches = iPtiEngine->NumberOfCandidates();
- if (noOfMatches > 1) // 1 => only current match available, 0 => not in inline edit
- {
- // Create a list to pass to the dialog
- CDesCArrayFlat* matchesList=new(ELeave)CDesCArrayFlat(1);
- CleanupStack::PushL(matchesList);
- iPtiEngine->GetCandidateListL(*matchesList);
- TBuf<EMaximumFepWordLength> matchListDesc;
- TInt matchListItemCount = matchesList->MdcaCount();
- TInt currentIndex = ResolveCurrentCandidateListIndex(matchesList);
- for ( TInt ii=0; ii < matchListItemCount ; ii++)
- {
- matchListDesc = matchesList->MdcaPoint(ii);
- TChar tempChar = matchListDesc[0];
- if(tempChar.IsDigit())
- {
- AknTextUtils::ConvertDigitsTo(matchListDesc,iLanguageCapabilities.iLocalDigitType);
- matchesList->Delete(ii);
- matchesList->InsertL(ii,matchListDesc);
- }
- }
-
- // add 'Spell' to the bottom of the list
- TResourceReader reader;
- CCoeEnv* coeEnv = CCoeEnv::Static();
- coeEnv->CreateResourceReaderLC(reader, R_AVKON_T9_MATCHES_QUERY_SPELL_ITEM);
- matchesList->AppendL(reader.ReadTPtrC());
- CleanupStack::PopAndDestroy(); // reader
-
- TInt index = 0;
- SetFlag(EFlagForegroundUIComponentVisible);
-
- TUid fepUid = CCoeEnv::Static()->FepUid();
- ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
- // Fire up the dialog
- TInt returnValue = iUiInterface->LaunchListPopupL(R_AVKON_T9_MATCHES_QUERY, index,
- currentIndex, matchesList, NULL);
- PrepareFepAfterDialogExitL(fepUid);
- if(returnValue == EAknSoftkeyOk)
- {// Selected item 'index' from the matches array
- HandleChangeInFocusL();
- TBuf<EMaximumFepWordLength> newText;
- // Get current match from editor and show it as a default text in 'insert word' query.
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(newText,
- iUncommittedText.iAnchorPos, iUncommittedText.Length());
-
- if (index==noOfMatches) // => 'spell' item at the bottom of the list
- {
- LaunchInsertWordQueryL(newText, iUncommittedText);
- #ifdef RD_SCALABLE_UI_V2
- if( iFepFullyConstructed && iFepPluginManager )
- {
- iFepPluginManager->ResetMenuState();
- }
- #endif
- }
- else
- { // insert word at index into text
- TBuf<EMaximumFepWordLength> modifiedMatch;
- modifiedMatch.Copy(matchesList->MdcaPoint(index));
- TChar first(newText[0]);
- if (first.IsUpper())
- {
- TChar converted(modifiedMatch[0]);
- converted.UpperCase();
- modifiedMatch[0] = converted;
- }
- InsertTextFromDialogL(modifiedMatch, iUncommittedText);
- }
- }
- CleanupStack::PopAndDestroy(); // matchesList
- }
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-// Predictive QWERTY (XT9) changes ---->
-void CAknFepManager::LaunchCandidatePopupListL( TInt aFocusedIndex )
- {
- iKeyBackSpaceHit = 1;
- //CPtiEngine* ptiEngine = iPtiEngine;
-
- // Addition for ITI features on FSQ.
- // Before open candidate list, if FSQ is opened,
- // also need to check and close tooltip on it.
- SendEventsToPluginManL( EPluginHideTooltip );
-
- // Before open candidate list, if touch ui is opened,
- // also need to close touch ui firstly.
- if ( iFepPluginManager->PluginInputMode() != EPluginInputModeNone )
- {
- iFepPluginManager->ClosePluginInputUiL( ETrue );
- }
-
- iExactWordPopupContent->HidePopUp();
-
- TBool isShiftKeyDepressedAfterCandidateListLaunched = EFalse;
- // Retrieve active index for QWERTY keypad when Best Prediction is Set
- TInt activeIndex = KErrNotFound;
-
- if(iPrimaryCandidate && IsQwerty() && ( KeyboardLayout() != EPtiKeyboardHalfQwerty))
- {
- iPtiEngine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates, &activeIndex );
- }
-
- TInt noOfMatches = iPtiEngine->NumberOfCandidates();
- if (noOfMatches > 0)
- {
- //! The compact candidate popup that opens with when arrow down pressed while inline editing
- //MAknFepCandidatePopup *candidatePopup;
-
- //Predictive QWERTY (XT9) changes for new Architecture ---->
- iCandidatePopup = UiInterface()->NewCandidatePopupL(*this);
- //Predictive QWERTY (XT9) changes for new Architecture <----
-
- // Determine the place where to spawn the candidate popup.
- TPoint inlineEditorTl;
- TPoint inlineEditorBr;
- TInt height;
- TInt ascent;
- TInt documentOffset = iPtiEngine->CurrentWord().Length();
-
- // Popup Position was not right for RTL ---->
- if(iLanguageCapabilities.iRightToLeftLanguage)
- documentOffset = 0;
- // Popup Position was not right for RTL <----
- GetScreenCoordinatesL(inlineEditorTl, height, ascent, documentOffset);
-
- inlineEditorTl.iY -= height;
- GetScreenCoordinatesL(inlineEditorBr, height, ascent);
-
- // Focus next word in list ---->
- // To fix the bug STAA-7GYDB6, Candidate list opens with the highlight on 3rd candidate when Exact typing is use.
- // Show the popup.
- TInt selectedIdx = aFocusedIndex;
- TKeyEvent lastKeyEvent;
-
- if(selectedIdx == KErrNotFound)
- {
- if (noOfMatches > 1)
- {
- selectedIdx = KWordToFocusInCandidateList;
- }
- // Focus next word in list <----
- if(iSListLaunchedFromMenu)
- {
- iPtiEngine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates, &selectedIdx );
- iSListLaunchedFromMenu = EFalse;
- }
- }
- TUid fepUid = CCoeEnv::Static()->FepUid();
- ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
- TInt popupCmd = iCandidatePopup->ExecutePopupL( TRect(inlineEditorTl, inlineEditorBr),
- selectedIdx, lastKeyEvent, iLanguageCapabilities.iRightToLeftLanguage,
- (TInt)KeyboardLayout() );
- PrepareFepAfterDialogExitL(fepUid);
-
- if((lastKeyEvent.iScanCode == EStdKeyDevice3 ) ||
- ((lastKeyEvent.iScanCode == KAknFEPZeroKey)&& ((KeyboardLayout()== EPtiKeyboard12Key)||(KeyboardLayout()==EPtiKeyboardHalfQwerty)))
- || lastKeyEvent.iCode == EKeySpace )
- {
- SetExtendedFlag(EExtendedFlagOkKeyPressOnCandidatePopup);
- }
-
-
- TBool needToExecute(EFalse);
- //The candidate list was closed by long key press of shift key
- isShiftKeyDepressedAfterCandidateListLaunched = IsFlagSet(EFlagShiftKeyDepressed) && (KeyboardLayout()== EPtiKeyboard12Key);
- if (popupCmd != EAknSoftkeyCancel)
- {
- HandleChangeInFocusL();
-
- if (popupCmd == EAknFepSoftkeySpell)
- {
- // For QWERTY Input Mode
- if (iQwertyInputMode && EPtiKeyboardHalfQwerty != iKeyboardType)
- {
- TInt activeIdx = KErrNotFound;
- TInt secondaryIdx = KErrNotFound;
-
- iPtiEngine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates,
- &activeIdx );
- iPtiEngine->HandleCommandL( EPtiCommandUserActionGetIndexOfSecondaryCandidate,
- &secondaryIdx );
-
- if(activeIdx != secondaryIdx)
- {
- iPtiEngine->HandleCommandL(
- EPtiCommandUserActionSetCurrentIndexOfCandidates, &secondaryIdx );
- }
- else
- {
- secondaryIdx = 0;
- iPtiEngine->HandleCommandL(
- EPtiCommandUserActionSetCurrentIndexOfCandidates, &secondaryIdx );
- }
- TPtrC selectedWord = iPtiEngine->CurrentWord();
- if(!IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- StartInlineEditingWithSelectedWord(selectedWord);
- }
- UpdateInlineEditL( selectedWord, selectedWord.Length() );
-
- }
- // For ITUT Keypad, remove autocompletion part before launching Query Dialog
- else
- {
- RemoveSuggestedAdvanceCompletionL();
- }
-
- // delete the candidate popup before launching the edit word dialog
- // as the candidate list has already been closed.
- if(iCandidatePopup)
- {
- delete iCandidatePopup;
- iCandidatePopup = NULL;
- }
-
- LaunchEditWordQueryL();
- }
-
- // Close with space or selection key: Commit and add space or move cursor ahead one
- // character if next character already is space
- else if ( ( lastKeyEvent.iScanCode == EStdKeyDevice3 || lastKeyEvent.iScanCode == KAknFEPZeroKey )
- && ( KeyboardLayout() == EPtiKeyboard12Key || KeyboardLayout() == EPtiKeyboardHalfQwerty ) )
- {
- iPtiEngine->HandleCommandL( EPtiCommandUserActionSetCurrentIndexOfCandidates,
- &selectedIdx );
- TPtrC selectedWord = iPtiEngine->CurrentWord();
- if(!IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- StartInlineEditingWithSelectedWord(selectedWord);
- }
- UpdateInlineEditL( selectedWord, selectedWord.Length() );
- iPtiEngine->CommitCurrentWord();
- CommitInlineEditL();
- #ifdef RD_INTELLIGENT_TEXT_INPUT
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- #endif
-
- AddOneSpaceOrMoveCursorL();
- }
- // Close with right arrow commits the word, does not add space
- else if ( lastKeyEvent.iScanCode == EStdKeyRightArrow )
- {
- // Change of UI Spec
- /*
- * The following codde change is a part of bug fix for improper
- * behavior of right arrow key when the candidate list is open. The
- * right arrow key according to the UI specs should not the selected
- * candicdate and cursor should be end of the word.
- */
- iPtiEngine->HandleCommandL( EPtiCommandUserActionSetCurrentIndexOfCandidates,
- &selectedIdx );
- TPtrC selectedWord = iPtiEngine->CurrentWord();
- if(!IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- StartInlineEditingWithSelectedWord(selectedWord);
- }
- UpdateInlineEditL( selectedWord, selectedWord.Length() ); //selection.iAnchorPosition
- iPtiEngine->CommitCurrentWord();
- CommitInlineEditL();
- #ifdef RD_INTELLIGENT_TEXT_INPUT
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- #endif
-
- SimulateKeyEventL(EKeyF19);
- }
- else if(popupCmd == EAknSoftkeyOk)
- {
- iPtiEngine->HandleCommandL( EPtiCommandUserActionSetCurrentIndexOfCandidates,
- &selectedIdx );
- TPtrC selectedWord = iPtiEngine->CurrentWord();
- if(!IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- StartInlineEditingWithSelectedWord(selectedWord);
- }
- UpdateInlineEditL( selectedWord, selectedWord.Length() );
- iPtiEngine->CommitCurrentWord();
- CommitInlineEditL();
- AddOneSpaceOrMoveCursorL();
- }
- else
- {
- iPtiEngine->HandleCommandL( EPtiCommandUserActionSetCurrentIndexOfCandidates,
- &selectedIdx );
- TPtrC selectedWord = iPtiEngine->CurrentWord();
- if(!IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- StartInlineEditingWithSelectedWord(selectedWord);
- }
- UpdateInlineEditL( selectedWord, selectedWord.Length() );
- needToExecute = ETrue;
- }
- }
- else if (popupCmd == EAknSoftkeyCancel && iPrimaryCandidate && IsQwerty()
- && ( KeyboardLayout() != EPtiKeyboardHalfQwerty ) )
- {
- iPtiEngine->HandleCommandL( EPtiCommandUserActionSetIndexOfActiveCandidate, &activeIndex );
- iKeyBackSpaceHit = 0;
- }
- else if(lastKeyEvent.iCode == EKeyPhoneEnd )
- {
- HandleChangeInFocusL();
- CCoeEnv::Static()->SimulateKeyEventL( lastKeyEvent, EEventKey );
- }
- else if (popupCmd == EAknSoftkeyCancel && IsQwerty() && ( KeyboardLayout() != EPtiKeyboardHalfQwerty ) )
- iKeyBackSpaceHit = 0;
-
- // If the dialog is not closed by pressing softkeys, escape, or right arrow
- // then the pressed key is handled also by Fep. This way the user can keep typing when the popup is open.
-
- //=============== Error fixing and simplify the condition ==========================================
- // The following piece of code should be excuted, if focus word
- // in the candidate list is accept, otherwise word sholud remain as it is.
- // If user does not accept the word,popupCmd always be EAknSoftkeyCancel.
- // Insetead of earlier lengthy condition, makes it simple.
-
- if( needToExecute )
- {
- const TBool shifted = (lastKeyEvent.iModifiers & (EModifierLeftShift |
- EModifierRightShift | EModifierShift));
- const TBool chrDown = (lastKeyEvent.iModifiers & (EModifierLeftFunc));
-
- const TBool fnDown = (lastKeyEvent.iModifiers & (EModifierRightFunc));
- if(fnDown )
- iFnKeyManager->SetFnKeyState(CAknFepFnKeyManager::EFnKeyDown) ;
-
- if (shifted)
- {
- SetFlag(EFlagQwertyShiftMode|EFlagNoActionDuringShiftKeyPress);
- }
- else
- {
- ClearFlag(EFlagQwertyShiftMode|EFlagNoActionDuringShiftKeyPress);
- }
-
- if (chrDown)
- {
- SetFlag(EFlagQwertyChrKeyDepressed|EFlagNoActionDuringChrKeyPress);
- }
- else
- {
- ClearFlag(EFlagQwertyChrKeyDepressed|EFlagNoActionDuringChrKeyPress);
- }
- if ( lastKeyEvent.iScanCode == EStdKeyDevice3 )
- {
- CCoeEnv::Static()->SimulateKeyEventL( lastKeyEvent, EEventKey );
- }
- if (! ( lastKeyEvent.iScanCode == EStdKeyDevice3 ||
- lastKeyEvent.iScanCode == EStdKeyRightArrow ) )
- {
- /*
- * The following code change is a part of bug fix for improper
- * behavior of any keypress when the candidate list is open. The
- * keypress according to the UI specs should lock the selected
- * candidate to editor and the inserted letter is appended to it.
- */
- iPtiEngine->HandleCommandL( EPtiCommandLockCurrentCandidate);
- TPtrC selectedWord = iPtiEngine->CurrentWord();
- if(!IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- StartInlineEditingWithSelectedWord(selectedWord);
- }
- UpdateInlineEditL( selectedWord, selectedWord.Length() ); //selection.iAnchorPosition
- // For QWERTY input mode, scanCode is used
- #ifdef __HALF_QWERTY_KEYPAD
- if( KeyboardLayout() == EPtiKeyboardHalfQwerty)
- {
- iHalfQwertyLastKeyEvent = lastKeyEvent;
- iAsyncOwnSimulateKey.CallBack();
- }
- else
- #endif //__HALF_QWERTY_KEYPAD
- if (iQwertyInputMode)
- {
- CCoeEnv::Static()->SimulateKeyEventL( lastKeyEvent, EEventKey );
- }
- // For ITUT input Mode, keyCode is used
- else
- {
- SimulateKeyEventL( lastKeyEvent.iCode);
- }
- }
- }
-
- ShowExactWordPopupIfNecessaryL();
- if(iCandidatePopup)
- {
- delete iCandidatePopup;
- iCandidatePopup = NULL;
- }
- }
- //The flag ECcpuStateShiftkeyWasPressedBeforeLosingFocus suggests that the candidate list was closed with a
- //long key press of edit key (shift key). There are multiple calls to HandleChangedInFocusL() one manually and the other through
- //CONE focus change notifier. We want the flag to be set for CONE's focus handler.
- if(isShiftKeyDepressedAfterCandidateListLaunched)
- {
- SetCcpuFlag(ECcpuStateShiftkeyWasPressedBeforeLosingFocus);
- }
- }
-void CAknFepManager::StartInlineEditingWithSelectedWord(TDesC& aTextToUncommit)
- {
- if(iConcatenationTimer->IsActive())
- iConcatenationTimer->Cancel();
-
- TInt docLenFep=iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- if (iUncommittedText.iCursorPos>docLenFep)
- iUncommittedText.iCursorPos=docLenFep;
- if (iUncommittedText.iAnchorPos>docLenFep)
- iUncommittedText.iAnchorPos=docLenFep;
- // Activates western predictive UI to an inline editing state.
- FepUI()->ActivateUI();
- SyncStates(EAknFepStateUIActive);
- // Predictive QWERTY (XT9) changes <----
- TRAP_IGNORE(StartInlineEditL(iUncommittedText, aTextToUncommit,
- aTextToUncommit.Length(), EFalse));
-
- }
-void CAknFepManager::ShowExactWordPopupIfNecessaryL()
- {
- iExactWordPopupContent->HidePopUp();
-
- // Before open tooltip,
- // also need to check and close tooltip on it.
- SendEventsToPluginManL( EPluginHideTooltip );
-
- if ( iWesternPredictive && iQwertyInputMode
- && IsFlagSet( EFlagInsideInlineEditingTransaction )
- && (EPtiKeyboardHalfQwerty != KeyboardLayout()))
- {
- // In the proactive mode this popup is used to show the exact input if it differs from the
- // default candidate shown inline.
- // In the reactive mode it is used to show the best guess candidate if it differs from the
- // exact word shown inline.
-
- TInt activeIdx = KErrNotFound;
- TInt secondaryIdx = KErrNotFound;
-
- iPtiEngine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates, &activeIdx );
- iPtiEngine->HandleCommandL( EPtiCommandUserActionGetIndexOfSecondaryCandidate,
- &secondaryIdx );
-
- TBool popupBelowInline = EFalse; // ETrue -> popup is above inline editor
-
- if(iKeyBackSpaceHit)
- secondaryIdx = activeIdx;
-
- if ( activeIdx != secondaryIdx )
- {
- popupBelowInline = EFalse;
-
- CDesCArray* candidates = new (ELeave) CDesCArrayFlat(16);
- CleanupStack::PushL(candidates);
- GetCandidatesL(*candidates, activeIdx);
-
- // There is a possibility that the secondary index of the candidate changes
- iPtiEngine->HandleCommandL( EPtiCommandUserActionGetIndexOfSecondaryCandidate,
- &secondaryIdx );
- // In case the active index and the secondary index is same, then we do not need to display the
- // popup
- if ( activeIdx == secondaryIdx )
- {
- CleanupStack::PopAndDestroy(candidates);
- return;
- }
-
- TPtrC secondaryWord = (*candidates)[secondaryIdx];
- iExactWordPopupContent->SetTextL( secondaryWord );
- iExactWordPopupContent->SetArrowDirection( MAknFepUiWordPopupContent::EUpwards );
- CleanupStack::PopAndDestroy(candidates);
-
- // Open FSQ tooltip if FSQ is opened
- SendEventsToPluginManL( EPluginShowTooltip, secondaryIdx );
-
-
- // For addtion of ITI features on FSQ.
- // Showing tooltip on avkon editor and FSQ ICF editor at same time probably
- // cause flicker problem. Add this condition to ensure not to show tooltip on
- // avkon editor when it is being displayed on FSQ.
- if ( iFepPluginManager && !( iFepPluginManager->IsTooltipOpenOnFSQ() ) )
- {
- TPoint popupTopRight;
- TInt height;
- TInt ascent;
- TInt documentOffset = iPtiEngine->CurrentWord().Length();
-
- GetScreenCoordinatesL(popupTopRight, height, ascent, documentOffset);
-
- iExactWordPopupContent->UpdateContentSize();
-
- TBool rightToLeftLang = IsRightToLeftParagraph( DocPos() );
- if ( !rightToLeftLang )
- {
- popupTopRight.iX += iExactWordPopupContent->Size().iWidth;
- }
-
- if ( popupBelowInline )
- {
- popupTopRight.iY += ascent / 2;
- }
- else
- {
- popupTopRight.iY -= height + iExactWordPopupContent->Size().iHeight;
- }
-
- iExactWordPopupContent->SetPosition( popupTopRight );
- iExactWordPopupContent->ShowPopUp();
- }
- }
- }
- else if(iWesternPredictive
- && IsFlagSet( EFlagInsideInlineEditingTransaction )
- && IsFlagSet(CAknFepManager::EFlagNoMatches))
- {
- UpdateCbaL(R_AKNFEP_SOFTKEYS_SPELL_EMPTY);
- }
- }
-
-void CAknFepManager::LaunchPredictiveSettingDialogL()
- {
-#ifdef RD_SCALABLE_UI_V2
- // Addtion of ITI features on FSQ.
- if ( iFepPluginManager
- && iFepPluginManager->IsSupportITIOnFSQ() )
- {
- // Hide touch input ui firstly,
- // otherwise, touch ui can hide status pane.
- // Let CAknFepPluginManager know this setting dialog will be opened.
- iFepPluginManager->ITISettingDialogOpen( ETrue );
- iFepPluginManager->ClosePluginInputUiL( ETrue );
- SendEventsToPluginManL( ELostForeground );
- }
-#endif // RD_SCALABLE_UI_V2
-
- // Hide fixed toolbar just before launching predictive settings dialog
- CEikAppUiFactory * appUiFactory = NULL;
- appUiFactory = static_cast<CEikAppUiFactory*>(CEikonEnv::Static()->AppUiFactory());
-
- CAknToolbar * fixedToolbar = NULL;
- if(appUiFactory)
- fixedToolbar = appUiFactory->CurrentFixedToolbar();
-
- // If fixedtoolbar is not there in the current editor, we don't need to hide it before launching settings dialog
- // and unhide it after settings dialog is done.
- if( fixedToolbar && !( fixedToolbar->IsShown() && fixedToolbar->CountComponentControls()>0 ) )
- fixedToolbar = NULL;
-
- if(fixedToolbar)
- {
- fixedToolbar->SetDimmed(ETrue);
- fixedToolbar->DrawDeferred();
- }
- TUid fepUid = CCoeEnv::Static()->FepUid();
- ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
- UiInterface()->LaunchPredictiveSettingDialogL(R_PREDICTIVESETTING_DIALOG,
- R_PREDICTIVESETTINGDIALOG_MENUBAR,
- R_PREDICTIVETEXTOFF_CONFIRMATION_QUERY,
- R_AKNFEP_PRED_INPUT_SETTINGS_TITLE);
- PrepareFepAfterDialogExitL(fepUid);
-#ifdef RD_SCALABLE_UI_V2
- // // Addtion of ITI features on FSQ.
- if ( iFepPluginManager
- && iFepPluginManager->IsSupportITIOnFSQ() )
- {
- // Let CAknFepPluginManager know this setting dialog will be opened.
- iFepPluginManager->ITISettingDialogOpen( EFalse );
- }
-#endif // RD_SCALABLE_UI_V2
-
- // Enables fixed toolbar after predictive settings dialog is closed
- if(fixedToolbar)
- {
- fixedToolbar->SetDimmed(EFalse);
- fixedToolbar->DrawDeferred();
- }
- }
-#ifdef FF_DUAL_LANGUAGE_SUPPORT
-void CAknFepManager::LaunchWritingLanguageSettingDialogL()
- {
- TUid fepUid = CCoeEnv::Static()->FepUid();
- ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
- UiInterface()->LaunchWritingLanguageSettingDialogL(R_INPUTLANGUAGE_DIALOG, R_PREDICTIVESETTINGDIALOG_MENUBAR, R_INPUT_LANGUAGE_SETTINGS_TITLE);
- PrepareFepAfterDialogExitL(fepUid);
- }
-
-void CAknFepManager:: LaunchDualLanguageSettingDialogL()
- {
- /* In Chinese language variant,if there are more than one languages supporting dual language feature,
- display writing language setting view in which Primary and Secondary Languages can be selected from the list.
-
- In Chinese language variant,if there is only one language supporting dual language feature,
- no need to display the Writing language view which contains Primary and Secondary Language.
- Instead we can display the Writing language list directly to the user;from which the user can select the writing language*/
-
- if( FeatureManager::FeatureSupported( KFeatureIdChinese ) || FeatureManager::FeatureSupported( KFeatureIdJapanese ))
- {
- CArrayFixFlat<TInt>* languages = new( ELeave )CArrayFixFlat<TInt>( ELanguageArrayGranularity );
- CleanupStack::PushL( languages );
- iPtiEngine->GetAvailableLanguagesL( languages );
-
- TInt count = languages->Count();
- TInt noLangSupportWesternPred = count;
- for (TInt index = 0; index < count; index++)
- {
- TInt langCode = languages->At(index);
-
- if (langCode == ELangTaiwanChinese ||
- langCode == ELangHongKongChinese ||
- langCode == ELangPrcChinese ||
- langCode == ELangJapanese ||
- langCode == ELangKorean )
- {
- noLangSupportWesternPred--;
- }
- }
- CleanupStack::PopAndDestroy(languages);
-
- if( noLangSupportWesternPred > 1 )
- {
- SetFlag(CAknFepManager::EFlagNewSharedDataInputMode);
- LaunchWritingLanguageSettingDialogL();
- if(IsFlagSet(CAknFepManager::EFlagNewSharedDataInputLanguage))
- {
- ClearFlag(CAknFepManager::EFlagNewSharedDataInputLanguage);
- HandleChangeInFocusL();
- ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage());
- }
- }
- else
- LaunchLanguagesPopupListL();
- }
- else
- {
- LaunchWritingLanguageSettingDialogL();
- if(IsFlagSet(CAknFepManager::EFlagNewSharedDataInputLanguage))
- {
- ClearFlag(CAknFepManager::EFlagNewSharedDataInputLanguage);
- HandleChangeInFocusL();
- ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage());
- }
- }
-
- }
-#endif //FF_DUAL_LANGUAGE_SUPPORT
-// Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
-void CAknFepManager::LaunchInsertWordQueryL(const TDesC& aInitialText,
- TCursorSelection aTextSpanToReplace)
- {
- TInt recourceId;
- if(EditorState()->Flags() & EAknEditorFlagEnablePartialScreen)
- {
- recourceId = R_AVKON_INSERT_WORD_FS_QUERY;
- }
- else
- {
- recourceId = R_AVKON_INSERT_WORD_QUERY;
- }
- LaunchFepQueryDialogL(recourceId, aInitialText, aTextSpanToReplace);
- }
-
-void CAknFepManager::LaunchEditWordQueryL()
- {
-
- TBuf<EMaximumFepWordLength> newText;
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- if(IsAutoCompleteOn())
- {
- RemoveSuggestedCompletionL();
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(newText,
- iUncommittedText.iAnchorPos,
- iUncommittedText.Length());
-
- TInt recourceId;
- if(EditorState()->Flags() & EAknEditorFlagEnablePartialScreen)
- {
- recourceId = R_AVKON_INSERT_WORD_FS_QUERY;
- }
- else
- {
- recourceId = R_AVKON_INSERT_WORD_QUERY;
- }
- LaunchFepQueryDialogL(recourceId, newText, iUncommittedText);
- }
-
-void CAknFepManager::LaunchFepQueryDialogL(TInt aResourceId, const TDesC& aInitialText,
- TCursorSelection aTextSpanToReplace)
- {
- HBufC* textBuf = HBufC::NewLC(EQueryBufferLength); // buffer for inserted text
- TPtr text = textBuf->Des();
-
- if (aInitialText.Length() <= EQueryBufferLength)
- text.Copy(aInitialText);
- else // truncate the incoming text to EQueryBufferLength before copying
- {
- TPtrC truncatedText = aInitialText.Left(EQueryBufferLength);
- text.Copy(truncatedText);
- }
-
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- TryRemoveNoMatchesIndicatorL();
- CommitInlineEditL();
- }
- UpdateCbaL(NULL);
-
- TInt underlyingCase = iCaseMan->CurrentCase();
- TBool isCaseUpdatesSupressed = IsFlagSet(EFlagSupressAutoUpdateAtEditorStart);
-
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- if (aInitialText.Length())
- {
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- if (aInitialText.Length() == 1)
- {
- if (STATIC_CAST(TChar, aInitialText[0]).IsUpper())
- iCaseMan->SetCurrentCase(EAknEditorTextCase);
- }
- else // length of initial text > 1
- {
- if (STATIC_CAST(TChar, aInitialText[0]).IsUpper())
- {
- if (STATIC_CAST(TChar, aInitialText[1]).IsLower())
- iCaseMan->SetCurrentCase(EAknEditorTextCase);
- else // 2nd character is upper case
- iCaseMan->SetCurrentCase(EAknEditorUpperCase);
- }
- }
- }
-#endif // RD_INTELLIGENT_TEXT_INPUT
-
- if (iCaseMan->CurrentCase() == EAknEditorLowerCase
- || iCaseMan->CurrentCase() == EAknEditorUpperCase)
- {
- SetFlag(EFlagSupressAutoUpdateAtEditorStart);
- }
-
- TransferFepStateToEditorL();
-
- SetFlag(EFlagForegroundUIComponentVisible);
-
- TInt textQueryEditorFlag = 0;
- if ((aResourceId == R_AVKON_INSERT_WORD_QUERY ||
- aResourceId == R_AVKON_EDIT_WORD_QUERY ) &&
- IsChineseInputLanguage())
- {
- textQueryEditorFlag = EAknEditorFlagLatinInputModesOnly;
- }
-#ifdef RD_SCALABLE_UI_V2
- if (iFepFullyConstructed &&
- iFepPluginManager->PluginInputMode() == EPluginInputModeItut &&
- !(EditorState()->Flags() & EAknEditorFlagEnablePartialScreen))
- {
- iFepPluginManager->SpellText(textBuf);
- iFepPluginManager->DisplaySpellEditor(textQueryEditorFlag, aInitialText,
- TCursorSelection(aInitialText.Length(), 0));
-
- delete iSpellInitText;
- iSpellInitText = NULL;
- iSpellInitText = aInitialText.AllocL();
- iSpellInitCurSel = aTextSpanToReplace;
-
- iFepPluginManager->SetCaseUpdatesSupressed(isCaseUpdatesSupressed);
- iFepPluginManager->SetITUTSpellingStateL(ETrue);
- iFepPluginManager->SetCursorSelection(aTextSpanToReplace);
- CleanupStack::PopAndDestroy();
-
- return;
- }
-#endif
-
- if(iFepPluginManager)
- {
- iFepPluginManager->SetInEditWordQueryFlag(ETrue);
- }
-
- PrepareFepForFepAwareDialogLaunch();
- TUid fepUid = CCoeEnv::Static()->FepUid();
- ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
- TInt id = iUiInterface->TextQueryDialogL(text, *EditorState(),
- textQueryEditorFlag, aResourceId);
- PrepareFepAfterFepAwareDialogExitL(fepUid);
- PrepareFepAfterDialogExitL(fepUid);
-
- if(iFepPluginManager)
- {
- iFepPluginManager->SetInEditWordQueryFlag(EFalse);
- }
- if (id == EAknSoftkeyOk)
- {
- // Insert the character into the edwin.
- InsertTextFromDialogL(text, aTextSpanToReplace);
- // Add the word to the user dictionary (except for single character) after it has been added to the editor.
- // FepUI of the main editor is used. Different FepUI is used in multitap
- // query and predictive mode 'main' editor at least in Japanese variant.
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(text.Length() > 1)
- FepUI()->AddTextToUserDictionaryL(text);
-#else
- FepUI()->AddTextToUserDictionaryL(text);
-#endif // RD_INTELLIGENT_TEXT_INPUT
-
- }
- else // restore original case and inline text
- {
- HandleChangeInFocus();
- if (aTextSpanToReplace.Length())
- {
- EditorState()->SetInlineEditSpan(aTextSpanToReplace);
- ConfigureFEPFromEditorStateL();
- }
- iCaseMan->SetCurrentCase(underlyingCase);
- TransferFepStateToEditorL();
- }
-
- if (isCaseUpdatesSupressed)
- {
- SetFlag(EFlagSupressAutoUpdate);
- }
- else
- {
- ClearFlag(EFlagSupressAutoUpdate);
- }
- ClearFlag(EFlagSupressAutoUpdateAtEditorStart);
- CleanupStack::PopAndDestroy(); // text
- }
-
-void CAknFepManager::InsertTextFromDialogL(const TDesC& aTextFromDialog,
- TCursorSelection aExtentOfTextToReplace)
- {
- SetCcpuFlag(ECcpuStateSupressCursorMoveToEnd);
- // ensure we're back on the correct editor
-
-#ifdef RD_SCALABLE_UI_V2
- iNotifyPlugin = EFalse; // not really focus change
- HandleChangeInFocus();
- iNotifyPlugin = ETrue;
-#else
- HandleChangeInFocus();
-#endif
- // need to commit if the editor was previously performing an inline edit
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- CommitInlineEditL();
-
- TInt addedTextLength=0;
-
- TCursorSelection currentSelection;
-// In case input capabilities goes null leaving with an error code and allowing application to handle..
- if (NULL == iInputCapabilities.FepAwareTextEditor())
- User::Leave(KErrCorrupt);
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(currentSelection);
- // Prepare for the edit
- TInt docLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- TInt maxLength = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep();
-
- if (aExtentOfTextToReplace.Length())
- {
- if (currentSelection.Length())
- // Want to 'cancel' the selection so move cursor & anchor to the end of
- // the selection and then to the end of the current word
- {
- TInt endOfSelection=currentSelection.HigherPos();
- iUncommittedText.SetSelection(endOfSelection, endOfSelection);
- if (CursorInsideWord())
- MoveCursorToEndOfWordL();
- }
- iUncommittedText = aExtentOfTextToReplace;
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText);
- addedTextLength = aTextFromDialog.Length();
- if (maxLength != 0)
- {
- addedTextLength = Min(addedTextLength,
- (maxLength - docLength + iUncommittedText.Length()));
- }
- }
- else
- {
- addedTextLength = aTextFromDialog.Length();
-
- //maxLength of 0 means the editor has no limit
- if (maxLength != 0)
- {
- addedTextLength = Min(addedTextLength,
- (maxLength - docLength + currentSelection.Length()));
- }
- if (currentSelection.Length())
- {
- iUncommittedText.SetSelection(currentSelection.HigherPos(),
- currentSelection.LowerPos());
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText);
- }
- else // do this in order for editor to get the correct number of chars to format from GetFormatOfFepInlineText()
- iUncommittedText.iCursorPos+=addedTextLength;
- }
- // if necessary trim text to fit into available space in the editor & perform the edit
- TPtrC textToEditor = aTextFromDialog.Left(addedTextLength);
-
- StartInlineEditL(textToEditor);
- CommitInlineEditL();
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
-#endif
-
- EditorState()->SetInlineEditSpan(iUncommittedText);
- }
-
-void CAknFepManager::LaunchKutenCodeQueryL()
- {
- TInt code;
- TUid fepUid = CCoeEnv::Static()->FepUid();
- ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
- UiInterface()->JapaneseKutenQueryDialogL(R_AKNFEPUICTRLJAPANESEKUTEN_QUERY, code, 0);
-
- PrepareFepAfterDialogExitL(fepUid);
-
- HandleChangeInFocus(); // to re-establish contact with editor under KutenCode Query
-
- if (code > 0 && EditorHasFreeSpace())
- {
- TBuf<ESingleCharacter> text;
- text.Append((TText)code);
- SetFlag(EFlagInsideInlineEditingTransaction);
- iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(text, ESingleCharacter,
- ETrue, NULL, *this, *this);
- CommitInlineEditL();
- }
- }
-
-TInt CAknFepManager::NumericModeSCTResourceId() const
- {
- TInt charMapResId = EDefaultNumericCharMapResId;
- TBool phoneIdle = (EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor);
-
- if( phoneIdle )
- {
- charMapResId=R_AKNFEP_SCT_NUMERIC_MODE_CHARS_STANDARD;
- return charMapResId;
- }
-
- switch (iAknEditorNumericKeymap)
- {
- case EAknEditorStandardNumberModeKeymap:
- charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_STANDARD;
- break;
- case EAknEditorCalculatorNumberModeKeymap:
- charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_CALCULATOR;
- break;
- case EAknEditorConverterNumberModeKeymap:
- charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_CONVERTER;
- break;
- case EAknEditorFixedDiallingNumberModeKeymap:
- charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_FIXED_DIALLING;
- break;
- case EAknEditorSATNumberModeKeymap:
- charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_SAT;
- break;
- case EAknEditorToFieldNumberModeKeymap:
- charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_TO_FIELD;
- break;
- case EAknEditorPlainNumberModeKeymap:
- charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_PLAIN;
- break;
- case EAknEditorNativeKeysNumberModeKeymap:
- //currently this is not in use
- break;
- case EAknEditorSATHiddenNumberModeKeymap:
- charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_SAT_HIDDEN;
- break;
- default:
- //We reach here because there is no valid SCT resource ID set
- //by the current editor. So best we can do now is set the
- //default mode for numeric editors.
- charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_STANDARD;
- break;
- }
- if(IsHybridAplhaEditor() && !IsHybridAlphaModeChangedtoAplhanumeric())
- {
- charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_STANDARD;
- }
- return charMapResId;
- }
-
-
-TBool CAknFepManager::HashKeyModeChangeBlockedInSearchField() const
- {
- if ((iAknEditorFlags & EAknEditorFlagFindPane) &&
- iSharedDataInterface->HashKeySelectionInUse() &&
- !IsChineseInputLanguage() &&
- !IsKoreanInputLanguage() &&
- iLanguageCapabilities.iInputLanguageCode != ELangVietnamese &&
- !FeatureManager::FeatureSupported(KFeatureIdJapanese))
- {
- if (iMode == ELatin || iMode == ENumber || iMode == ENativeNumber )
- {
- return ETrue;
- }
- }
-
- return EFalse;
- }
-
-
-TKeyResponse CAknFepManager::HandleHashKeyL(TKeyPressLength aLength)
- {
- TKeyResponse response = EKeyWasNotConsumed;
- if (IsFlagSet(EFlagPassNextKey))
- {
- ClearFlag(EFlagPassNextKey);
- }
- else if (IsFlagSet(EFlagShiftKeyDepressed))
- {
- response = EKeyWasConsumed;
- }
- else if (HashKeyModeChangeBlockedInSearchField())
- {
- // Do not allow case changes for latin languages in search field
- // if hash key selection is active.
- response = EKeyWasConsumed;
- }
- else
- {
- if ( IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) )
- {
-#ifdef RD_HINDI_PHONETIC_INPUT
- if(iSharedDataInterface->InputTextLanguage() != KLangHindiPhonetic)
-#endif
- FepUI()->ExpireMultitapTimer();
- // For Japanese, send backspace key event in case hash key
- // is pressed while secret text input.
- if (IsFeatureSupportedJapanese())
- {
- if (iInputCapabilities.SupportsSecretText())
- {
- SimulateKeyEventL(EKeyF20); //backspace
- }
- }
-#ifdef RD_HINDI_PHONETIC_INPUT
- if(iSharedDataInterface->InputTextLanguage() != KLangHindiPhonetic)
-#endif
- ClearFlag(EFlagInsideMultitapInlineEditingTransaction);
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- if (aLength == EShortKeyPress)
- {
- if ( iMode != ENumber && iMode != ENativeNumber )
- {
- iModeBefore = iMode;
- if (iModeBefore == ELatin)
- {
- iCaseBefore = iCaseMan->CurrentCase();
- }
- }
- }
-
- // always keep previous input mode for Japanese input
- if (IsFeatureSupportedJapanese())
- {
- iModeBefore = iMode;
- if (iModeBefore == ELatin)
- {
- iCaseBefore = iCaseMan->CurrentCase();
- }
- }
- if (iMode == EHangul && aLength == ELongKeyPress)
- {
- if (IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))
- {
- TPtrC text = iPtiEngine->CurrentWord();
- if (text.Length() > 0)
- {
- CancelInlineEdit();
- StartInlineEditL();
- UpdateInlineEditL(iPtiEngine->PreviousCandidate(), iPtiEngine->PreviousCandidate().Length());
- CommitInlineEditL();
- }
- else
- {
- CancelInlineEdit();
- }
- iPtiEngine->ClearCurrentWord();
- }
- }
-
- response = iHashKeyMan->HandleKeyEventL(aLength);
- if (response == EKeyWasNotConsumed)
- {
- switch (iAknEditorNumericKeymap)
- {
- case EAknEditorStandardNumberModeKeymap: //fall through
- case EAknEditorFixedDiallingNumberModeKeymap:
- case EAknEditorSATNumberModeKeymap:
- case EAknEditorSATHiddenNumberModeKeymap:
- case EAknEditorAlphanumericNumberModeKeymap:
- if (!EditorHasFreeSpace())
- {
- response=EKeyWasConsumed;
- }
- break;
- case EAknEditorCalculatorNumberModeKeymap: //fall through
- case EAknEditorConverterNumberModeKeymap:
- SimulateKeyEventL(CurrentDecimalSeparator());
- if (EditorHasFreeSpace())
- {
- SetFlag(EFlagCharacterAdded);
- }
- response=EKeyWasConsumed;
- break;
- case EAknEditorToFieldNumberModeKeymap:
- SimulateKeyEventL(text_to_field_mode_hash_key);
- if (EditorHasFreeSpace())
- {
- SetFlag(EFlagCharacterAdded);
- }
- response=EKeyWasConsumed;
- break;
- case EAknEditorPlainNumberModeKeymap:
- response=EKeyWasConsumed;
- break;
- case EAknEditorNativeKeysNumberModeKeymap:
- break;
- default:
- break;
- }
- }
- }
- return response;
- }
-
-TInt CAknFepManager::EditorNumericKeymap() const
- {
- return iAknEditorNumericKeymap;
- }
-
-
-TBool CAknFepManager::HashKeySelectionInUse() const
- {
- if (ExtendedInputCapabilities()
- & CAknExtendedInputCapabilities::EForceHashKeySelectionStatusFlagOff)
- {
- return EFalse;
- }
-
- return iSharedDataInterface->HashKeySelectionInUse();
- }
-
-
-TBool CAknFepManager::EditSubmenuInUse() const
- {
- if (RProcess().SecureId().iId == KPhoneSecureId)
- {
- if (iQwertyInputMode)
- {
- return EFalse;
- }
- }
-
- if (ExtendedInputCapabilities() & CAknExtendedInputCapabilities::EForceEditSubmenuStatusFlagOff)
- {
- return EFalse;
- }
-
- return iSharedDataInterface->EditSubmenuInUse();
- }
-
-
-void CAknFepManager::DimEditMenuModeItems(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- // current item
- DimMenuItem(aMenuPane, iMode);
-
- // dim menu items for Chinese input modes that aren't valid in the current editor
- // or the device subvariant
- for (TInt mode = KFirstMode; mode <= KLastMode; mode = mode << 1)
- {
- if (!IsModePermitted(mode))
- {
- DimMenuItem(aMenuPane, mode);
- }
- }
-
- if (IsAbleToLaunchSmiley())
- {
- TInt index;
- if (aMenuPane->MenuItemExists(EAknCmdEditInsertSmiley, index))
- {
- aMenuPane->SetItemDimmed(EAknCmdEditInsertSmiley, EFalse);
- }
- }
- }
-
-void CAknFepManager::DimMenuItem(CAknFepUiInterfaceMenuPane* aMenuPane, TInt aMode)
- {
- TInt dimmedMenuItem = 0;
- switch (aMode)
- {
- case EPinyin:
- dimmedMenuItem = EChinFepCmdModePinyin;
- break;
- case EZhuyin:
- dimmedMenuItem = EChinFepCmdModeZhuyin;
- break;
- case EStroke:
- dimmedMenuItem = EChinFepCmdModeStroke;
- break;
- case ECangJie:
- dimmedMenuItem = EChinFepCmdModeCangJie;
- break;
- case EZhuyinFind:
- dimmedMenuItem = EChinFepCmdModeZhuyinFind;
- break;
- case EStrokeFind:
- dimmedMenuItem = EChinFepCmdModeStrokeFind;
- break;
- case ELatin:
- if ( iLanguageCapabilities.iInputLanguageCode != ELangJapanese)
- {
- // According Katja's info, dim the current case item in the
- // indicator menu.
- if ( iCaseMan->CurrentCase() == EAknEditorUpperCase )
- {
- dimmedMenuItem = EChinFepCmdModeLatinUpper;
- }
- else if(iCaseMan->CurrentCase() == EAknEditorLowerCase)
- {
- dimmedMenuItem = EChinFepCmdModeLatinLower;
- }
- else if(iCaseMan->CurrentCase() == EAknEditorTextCase)
- {
- dimmedMenuItem = EAknCmdEditModeLatinText;
- }
- }
- break;
- case ENativeNumber:
- {
- aMenuPane->SetItemDimmed(EAknCmdEditModeArabicIndicNumber, ETrue);
- aMenuPane->SetItemDimmed(EAknCmdEditModeEasternArabicIndicNumber, ETrue);
- aMenuPane->SetItemDimmed(EAknCmdEditModeIndicNumber, ETrue);
- }
- break;
- default:
- break;
- }
- TInt index;
- if (dimmedMenuItem && aMenuPane->MenuItemExists(dimmedMenuItem, index))
- {
- aMenuPane->SetItemDimmed(dimmedMenuItem, ETrue);
- }
- }
-
-void CAknFepManager::LaunchConfirmationNoteL(TInt aResourceId)
- {
- SetFlag(EFlagForegroundUIComponentVisible);
- iUiInterface->LaunchConfirmationNoteL(aResourceId);
- }
-
-void CAknFepManager::NewCharacterL(const TDesC& aChar)
- {
- if ( aChar.Length() == 0 )
- {
- return;
- }
- TChar ch = aChar[0];
-
- TBool validNewCandidate = CharIsValidInEditor(ch);
- // Check if the character is valid for the editor.
- if ( !validNewCandidate )
- {
- TChar firstNewCandidate = ch;
- TBool goneThroughAllCandidates(EFalse);
- TPtrC8 sequence = iPtiEngine->CurrentInputSequence();
-
- if ( sequence.Length() )
- {
- TPtiKey key = (TPtiKey)sequence[0];
-
- TBuf<20> mapData;
- iPtiEngine->MappingDataForKey(key, mapData, iPtiEngine->Case());
- // If the character was not coming from ptiengine mappings, fail instantly.
- if (mapData.Locate(firstNewCandidate) != KErrNotFound)
- {
- // If there is an ivalid character in chr-loop, try to jump to next valid one.
- for (TInt jj = 0; jj < mapData.Length(); jj++)
- {
- TPtrC text = iPtiEngine->AppendKeyPress(key);
- if ( text.Length() == 0 )
- {
- continue;
- }
- ch = text[0];
- goneThroughAllCandidates = (ch == firstNewCandidate);
- validNewCandidate = CharIsValidInEditor(ch);
- if (validNewCandidate || goneThroughAllCandidates)
- {
- break;
- }
- }
- }
- }
- }
- if (!validNewCandidate)
- {
- // No valid characters at all.
- CancelInlineEdit();
- return;
- }
-
- if ( (ch == KAknFEPLineFeedSymbol ||
- ch == KAknFEPMirroredLineFeedSymbol) &&
- (EditorHasFreeSpace() || IsFlagSet(EFlagLastCharacterInEditor)))
- {
- SetFlag(EFlagLineFeedCharacter);
- }
- else
- {
- ClearFlag(EFlagLineFeedCharacter);
- }
-
- if ( (ch == EKeySpace) &&
- (EditorHasFreeSpace() || IsFlagSet(EFlagLastCharacterInEditor)))
- {
- SetFlag(EFlagSpaceCharacter);
- }
- else
- {
- ClearFlag(EFlagSpaceCharacter);
- }
-
-
- if (iInputCapabilities.SupportsSecretText())
- {
- if (IsFlagSet(EFlagInsideMultitapInlineEditingTransaction))
- {
- SimulateKeyEventL(EKeyF20); // to delete previous char in secret text editor
- }
- //we receive an extra key press if we simulate a key that is also a device key
- if (ch.IsDigit() || TUint(ch) == EStarKeyUnicodeValue || TUint(ch) == EHashKeyUnicodeValue)
- {
- SetFlag(EFlagPassNextKey);
- }
- if ( ch.IsDigit() && iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic )
- {
- ClearFlag(EFlagPassNextKey);
- SimulateKeyEventL(ch + (TChar)KLatinToArabicIndicDigitsDelta );
- }
- else if ( ch.IsDigit()
- && iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic )
- {
- ClearFlag(EFlagPassNextKey);
- if(iLanguageCapabilities.iInputLanguageCode == ELangUrdu
- || iLanguageCapabilities.iInputLanguageCode == ELangFarsi)
- {
- SimulateKeyEventL(ch + (TChar)KLatinToEasternArabicIndicDigitsDelta );
- }
- }
- else if ( ch.IsDigit() && iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari )
- {
- ClearFlag(EFlagPassNextKey);
- SimulateKeyEventL(ch + (TChar)KLatinToDevanagariDigitsDelta);
- }
- else
- {
- SimulateKeyEventL(ch);
- }
- SetFlag(EFlagInsideMultitapInlineEditingTransaction | EFlagInsideInlineEditingTransaction);
- }
- else if (EditorHasFreeSpace() || IsFlagSet(EFlagInsideMultitapInlineEditingTransaction))
- {
- TBuf<1> buf;
- if ( ch.IsDigit() && iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic )
- {
- buf.Append( ch + (TChar)KLatinToArabicIndicDigitsDelta );
- }
- else if ( ch.IsDigit()
- && iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic )
- {
- if(iLanguageCapabilities.iInputLanguageCode == ELangUrdu
- || iLanguageCapabilities.iInputLanguageCode == ELangFarsi)
- {
- buf.Append( ch + (TChar)KLatinToEasternArabicIndicDigitsDelta );
- }
- }
- else if ( ch.IsDigit() && iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari )
- {
- buf.Append( ch + (TChar)KLatinToDevanagariDigitsDelta );
- }
- else
- {
- buf.Append( ch );
- }
-
- if (iFepManState == EAknFepStateInitial) //multitapping
- {
- if (!IsFlagSet(EFlagInsideMultitapInlineEditingTransaction))
- {
- TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- if (iAknEditorFlags & EAknEditorFlagMTAutoOverwrite && iMode == ELatin
- && !WesternPredictive()
- && iUncommittedText.iCursorPos < edSize
- && iUncommittedText.Length() == 0)
- {
- // If the cursor is at the beginning or in the middle of the text,
- // existing characters are replaced with new ones in latin multitap input.
- iUncommittedText.iCursorPos++;
- StartInlineEditL(iUncommittedText, buf, ESingleCharacter, EFalse);
- SetFlag(EFlagInsideMultitapInlineEditingTransaction);
- UpdateInlineEditL(buf, ESingleCharacter);
- }
- else
- {
- StartInlineEditL(buf);
- SetFlag(EFlagInsideMultitapInlineEditingTransaction);
- }
- }
- else
- {
- UpdateInlineEditL(buf, ESingleCharacter);
- }
-
- if(!EditorHasFreeSpace())
- {
- SetFlag(EFlagLastCharacterInEditor);
- }
- }
- else
- {
- iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(buf, ESingleCharacter,
- ETrue, NULL, *this, *this);
- }
- SetFlag(EFlagInsideInlineEditingTransaction);
- }
- }
-
-void CAknFepManager::NewTextL(const TDesC& aText)
- {
- ClearFlag(EFlagLineFeedCharacter);
- TBool unlimit = EFalse;
- TInt freeSpace = EditorFreeSpace(unlimit);
-
- if (IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) ||
- unlimit || freeSpace > 0 ) //
- {
- if( unlimit || freeSpace > aText.Length() )
- {
- iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(aText, aText.Length(), ETrue,
- NULL, *this, *this);
- }
- else
- {
- iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(aText.Left(freeSpace), freeSpace, ETrue,
- NULL, *this, *this);
- }
-
- SetFlag(EFlagInsideInlineEditingTransaction);
- }
- }
-
-
-void CAknFepManager::NewCharacterSequenceL(const TDesC& aText, TIndicInputResponse aResponse)
- {
- TChar zws((ZERO_WIDTH_SPACE));
- TChar virama((TAknFepUiIndicInputManager::Virama(TLanguage(
- iLanguageCapabilities.iInputLanguageCode))));
- TBool ret = ETrue;
- TBuf<CAknFepManager::EMaximumFepWordLength> buf;
- buf.Zero();
- TBool isTextLayoutPresent = (AknFepDocumentNavigation() || TextLayout()) ? ETrue : EFalse;
- switch( aResponse )
- {
- case EIndicInputResponseNone:
- {
- NewCharacterL(aText);
- }
- break;
- case EIndicInputResponseNumber:
- {
- NewCharacterL(aText);
- CommitInlineEditL();
- }
- break;
- case EIndicInputResponseZWSandCharacter:
- {
- if (! iInputCapabilities.SupportsSecretText() && isTextLayoutPresent)
- {
- buf.Append(zws);
- NewCharacterL(buf);
- CommitInlineEditL();
- }
- NewCharacterL(aText);
- }
- break;
- case EIndicInputResponseInsertZWS:
- {
- buf.Append(virama);
- if(isTextLayoutPresent)
- buf.Append(zws);
- ret = EFalse;
- }
- break;
- case EIndicInputResponseInsertZWSandLigature:
- {
- buf.Append(virama);
- if(isTextLayoutPresent)
- buf.Append(zws);
- if ( iInputCapabilities.SupportsSecretText() )
- {
- buf.Append(aText);
- }
- ret = EFalse;
- }
- break;
-
- case EIndicInputResponseInsertRepha:
- {
- MCoeFepAwareTextEditor* fepAwareTextEditor =
- iInputCapabilities.FepAwareTextEditor();
-
- if( fepAwareTextEditor )
- {
- TInt nextCharPos = 0;
- TCursorSelection curSel;
-
- fepAwareTextEditor->GetCursorSelectionForFep( curSel );
-
- // Insert Repha before the desired syllable.
- TBool leftFlag = GetNextVisualLeftCharacter( nextCharPos );
- if( leftFlag )
- {
- curSel.iCursorPos = nextCharPos;
- curSel.iAnchorPos = nextCharPos;
-
- fepAwareTextEditor->SetCursorSelectionForFepL( curSel );
-
- TAknFepUiIndicInputManager::GetRepha( buf,
- TLanguage( iLanguageCapabilities.iInputLanguageCode ) );
-
- ret = EFalse;
- }
- }
- break;
- }
-
- case EIndicInputResponseInsertRakar:
- {
- TAknFepUiIndicInputManager::GetRakar( buf,
- TLanguage( iLanguageCapabilities.iInputLanguageCode ) );
- ret = EFalse;
- }
- break;
-#ifdef RD_HINDI_PHONETIC_INPUT
- case EIndicInputResponsePhoneticMultitapText:
- {
- buf.Append(aText);
- ret = EFalse;
- }
- break;
- case EIndicInputResponsePhoneticQwertyText:
- {
- buf.Append(aText);
- ret = EFalse;
- }
- break;
-#endif
-
- case EIndicInputResponseInsertDirectLigature:
- {
- // In key-0, the new line character preceeds the Ksha.
- // First clear the new line flag.
- ClearFlag( EFlagLineFeedCharacter );
-
- buf.Append( aText );
- ret = EFalse;
- }
- break;
-
- case EIndicInputResponseInsertViramaZWSandDirectLigature:
- {
- // This case handles the insertion of Virama when star key
- // is pressed.
-
- // In key-0, the new line character preceeds the Ksha.
- // First clear the new line flag.
- ClearFlag( EFlagLineFeedCharacter );
-
- buf.Append(virama);
- if(isTextLayoutPresent)
- buf.Append(zws);
- if ( iInputCapabilities.SupportsSecretText() )
- {
- buf.Append(aText);
- }
- ret = EFalse;
- }
- break;
-
- case EIndicInputResponseZWSandDirectLigature:
- {
- if (! iInputCapabilities.SupportsSecretText() && isTextLayoutPresent)
- {
- buf.Append(zws);
- NewCharacterL(buf);
- CommitInlineEditL();
- }
- buf.Zero();
- buf.Append( aText );
- ret = EFalse;
- }
- break;
-
-#ifdef RD_MARATHI
- case EIndicInputResponseInsertEyeLashRa:
- {
- TAknFepUiIndicInputManager::GetEyeLashRa( buf,
- (TLanguage)iLanguageCapabilities.iInputLanguageCode );
- ret = EFalse;
- }
- break;
-
- case EIndicInputResponseInsertChandraA:
- {
- TAknFepUiIndicInputManager::GetChandraA( buf );
- ret = EFalse;
- }
- break;
-#endif // RD_MARATHI
-
- default:
- break;
- }
-
- if(ret)
- return;
-
- if ( iInputCapabilities.SupportsSecretText() )
- {
- if ( IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) )
- {
- SimulateKeyEventL(EKeyF20); // to delete previous char in secret text editor
- }
- for( TInt counter=0; counter<buf.Length(); counter++ )
- {
- if( (buf[counter] != ZERO_WIDTH_SPACE) )
- SimulateKeyEventL(buf[counter]);
- }
- SetFlag(EFlagInsideMultitapInlineEditingTransaction | EFlagInsideInlineEditingTransaction);
- }
- else if ( EditorHasFreeSpace() || IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) )
- {
- if ( iFepManState == EAknFepStateInitial ) //multitapping
- {
- if ( !IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) )
- {
- TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- if (iAknEditorFlags & EAknEditorFlagMTAutoOverwrite && iMode == ELatin
- && !WesternPredictive()
- && iUncommittedText.iCursorPos < edSize
- && iUncommittedText.Length() == 0)
- {
- // If the cursor is at the beginning or in the middle of the text,
- // existing characters are replaced with new ones in latin multitap input.
- iUncommittedText.iCursorPos++;
- StartInlineEditL(iUncommittedText, buf, ESingleCharacter, EFalse);
- }
- else
- {
- StartInlineEditL();
- }
- SetFlag(EFlagInsideMultitapInlineEditingTransaction);
- }
- UpdateInlineEditL(buf, buf.Length());
-
- if( !EditorHasFreeSpace() )
- {
- SetFlag(EFlagLastCharacterInEditor);
- }
- }
- SetFlag(EFlagInsideInlineEditingTransaction);
-
- // Check if text needs to be committed
- if( ( TAknFepUiIndicInputManager::IsToCommitCharSeq( aResponse ) ) )
- {
- CommitInlineEditL();
- }
- if( aResponse == EIndicInputResponseInsertZWSandLigature )
- {
- NewCharacterL(aText);
- }
- else if( aResponse == EIndicInputResponseInsertViramaZWSandDirectLigature )
- {
- // Doing this here because we first commit the virama
- // and ZWS and keep the ligature in the inline buffer.
- NewLigatureL( aText );
- }
- }
- }
-
-void CAknFepManager::CommitInlineEditL()
- {
- if ( !IsFlagSet( CAknFepManager::EFlagInsideInlineEditingTransaction ) )
- {
- return;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Before commit inline, check and close
- // tooltip on FSQ first.
- SendEventsToPluginManL( EPluginHideTooltip );
-
- // Predictive QWERTY (XT9) changes ---->
- // Exact word popup is hidden when the inline editor is closed
- iExactWordPopupContent->HidePopUp();
- // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
- if (iInputCapabilities.FepAwareTextEditor())
- {
- if (IsFlagSet(EFlagLineFeedCharacter))
- {
- if (iInputCapabilities.SupportsSecretText())
- {
- SimulateKeyEventL(EKeyF20); // backspace to delete previous char in secret text editor
- SimulateKeyEventL(EKeyEnter);
- SimulateKeyEventL(EKeyF19); // Asyncronous case update
- }
- else
- {
- __ASSERT_DEBUG(iInputCapabilities.FepAwareTextEditor(),
- AknFepPanic(EAknFepPanicNoHandleToFepAwareTextEditor));
- iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL(ETrue);
- iInputCapabilities.FepAwareTextEditor()->CancelFepInlineEdit();
-
- // Multitapping enter event is not posted for find pane.
- // It would never accept it anyway but the event causes problems in gallery's find.
- // Allow real enter from qwerty keyboard though.
- if (!(iAknEditorFlags & EAknEditorFlagFindPane) || iQwertyInputMode)
- {
- SimulateKeyEventL(EKeyEnter);
- SimulateKeyEventL(EKeyF19); // Asyncronous case update
- }
- }
- }
- else if (IsFlagSet(EFlagSpaceCharacter | EFlagFullWidthSpaceCharacter))
- {
- TBuf<ESingleCharacter> charAsDesc(ESingleCharacter);
-
- if (IsFlagSet(EFlagSpaceCharacter))
- {
- charAsDesc[0] = TText(0x0020); // 0x0020 is space
- }
- else
- {
- charAsDesc[0] = TText(0x3000); // 0x3000 is full-width space
- }
-
- if (iInputCapabilities.SupportsSecretText())
- {
- SimulateKeyEventL(EKeyF20); // backspace to delete previous char in secret text editor
- SimulateKeyEventL(charAsDesc[0]);
- SimulateKeyEventL(EKeyF19); // Asyncronous case update
- }
- else
- {
- iInputCapabilities.FepAwareTextEditor()->UpdateFepInlineTextL(charAsDesc, 1);
- iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL(ETrue);
- CCoeEnv* coeEnv = CCoeEnv::Static();
- iInputCapabilities.FepAwareTextEditor()->CommitFepInlineEditL(*coeEnv);
- iCaseMan->UpdateCase(ENullNaviEvent);
- if (!EditorHasFreeSpace())
- {
- SetFlag(EFlagEditorFull);
- }
- else
- {
- ClearFlag(EFlagEditorFull);
- }
- }
- }
- else if (IsFlagSet(EFlagInsideInlineEditingTransaction)
- && !iInputCapabilities.SupportsSecretText())
- {
- // Chinese languages seem not to support this
- if ( !IsChineseInputLanguage() &&
- (iUncommittedText.Length() == 0 ||
- (
- #ifdef RD_INTELLIGENT_TEXT_INPUT
- !IsAutoCompleteOn() &&
- #endif //RD_INTELLIGENT_TEXT_INPUT
- !EditorSupportsNeutralProtection()
- )
- )
- )
-
- { // empty insertions need no resolution.
- /*Hindi*/
- if( (TAknFepUiIndicInputManager :: IsIndicLangauge(
- TLanguage(iLanguageCapabilities.iInputLanguageCode)))
- #ifdef RD_HINDI_PHONETIC_INPUT
- || ( TAknFepUiIndicInputManager :: IsIndicPhoneticLanguage(
- TLanguage(iLanguageCapabilities.iInputLanguageCode)) )
- #endif
- )
- {
- // NOTE! Need to get cursor visibility information from some where.
- CommitInlineEditWithoutResolutionL( *(iInputCapabilities.FepAwareTextEditor()),
- ETrue, EFalse);
- }
- else
- {
- // NOTE! Need to get cursor visibility information from some where.
- CommitInlineEditWithoutResolutionL( *(iInputCapabilities.FepAwareTextEditor()),
- ETrue);
- }
- }
- else
- {
-
- //note secret text editors do not use the MCoeFepAwareTextEditor interface,
- //we only need to clear the flags to 'commit' a character
-
- __ASSERT_DEBUG(iInputCapabilities.FepAwareTextEditor(),
- AknFepPanic(EAknFepPanicNoHandleToFepAwareTextEditor));
- CCoeEnv* coeEnv = CCoeEnv::Static();
-
- TBool showCursor = ETrue;
- if (IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) ||
- IsCcpuFlagSet(ECcpuStateLosingFocus))
- {
- showCursor = EFalse;
- }
- else
- {
- if(IsKoreanInputLanguage( ) && IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))
- {
- showCursor = EFalse;
- }
- }
-
- iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL(showCursor);
- ClearFlag(EFlagInsideInlineEditingTransaction);
- iInputCapabilities.FepAwareTextEditor()->CommitFepInlineEditL(*coeEnv);
-
- // Arabic & Hebrew required functionality added ---->
- if (IsFlagSet(EFlagInsideMultitapInlineEditingTransaction)) // Condition added for AknFep.
- {
- // 3 * as each original character can potentially take 2 markers
- HBufC* decoratedTextBuf = HBufC::NewLC(KMaxInlineEditSize + 2); // +2 to accommodate previous and next charcaters
- TPtr decoratedText = decoratedTextBuf->Des();
- // Resolve in a slightly wider range than the new text. Attempt to expand 1 character in each direction
- TCursorSelection resolveSpan(iUncommittedText.HigherPos(),
- iUncommittedText.LowerPos());
- TInt decCursor = 0;
-
- // Gets the CPlainText object from the focused editor if it exists.
- CPlainText* plainText = PlainText();
- TBool containsTextField = EFalse;
- if (resolveSpan.iAnchorPos > 0)
- {
- if (plainText)
- {
- // Check if surrounding document position contains text field.
- containsTextField = plainText->FindFields(resolveSpan.iAnchorPos - 1);
- }
- TBuf<ESingleCharacter> chDes;
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep( chDes,
- resolveSpan.iAnchorPos - 1, ESingleCharacter);
- if ( chDes.Length() != 0 && chDes[0] != CEditableText::EPictureCharacter && !containsTextField)
- {
- // Resolve span is not extended if surrounding character is picture character or it
- // contains text field. Text field data would be lost when FEP replaces existing editor
- // content with new text buffer content that does not have text field data.
- // ResolveDecoratedText() call does not handle these special cases which can has some
- // effects to Arabic & Hebrew text rendering.
- resolveSpan.iAnchorPos--;
- }
- }
- if (resolveSpan.iCursorPos <
- iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep())
- {
- containsTextField = EFalse;
- if (plainText)
- {
- // Check if surrounding document position contains text fields.
- containsTextField = plainText->FindFields(resolveSpan.iCursorPos);
- }
- TBuf<ESingleCharacter> chDes;
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep( chDes,
- resolveSpan.iCursorPos, ESingleCharacter);
- if ( chDes.Length() != 0 && chDes[0] != CEditableText::EPictureCharacter && !containsTextField)
- {
- // Resolve span is not extended if surrounding character is picture character or it
- // contains text field. Text field data would be lost when FEP replaces existing editor
- // content with new text buffer content that does not have text field data.
- // ResolveDecoratedText() call does not handle these special cases which can has some
- // effect to Arabic & Hebrew text rendering.
- resolveSpan.iCursorPos++;
- decCursor++;
- }
- }
-
- // resolveSpan has been widened. Now go get the text for that span.
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(decoratedText,
- resolveSpan.iAnchorPos, resolveSpan.Length());
-
- if ( decoratedText.Length() != resolveSpan.Length() )
- {
- // This assert checks is we have failed to retrieve enough text. Should not happen
- // __ASSERT_DEBUG( decoratedText.Length() == resolveSpan.Length(), Panic(EEikPanicT9CharPosOutOfRange) );
- // Abondon the resolution.
-
- iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL( ETrue );
- }
- else
- {
- TInt lowerOffset = iUncommittedText.LowerPos() - resolveSpan.LowerPos();
-
- TBool needsResolving = iInlineTextDecorator->ResolveDecoratedText(decoratedText,
- TCursorSelection(lowerOffset, lowerOffset + iUncommittedText.Length()));
-
- if ( needsResolving )
- {
- TBool setToTrue=EFalse;
- iInputCapabilities.FepAwareTextEditor()->Extension1()->StartFepInlineEditL(
- setToTrue,
- resolveSpan,
- decoratedText,
- decoratedText.Length() - decCursor,
- EFalse,
- 0, // MFormCustomDrawer*
- *this,
- *this);
-
- iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL( ETrue );
- if (IsFeatureSupportedJapanese())
- {
- // need to call clear buffer of PtiEngine for Japanese varint
- // before calling second CommitFepInlineEditL().
- // because the committed string is set as reading string twice
- iPtiEngine->ClearCurrentWord();
- }
- iInputCapabilities.FepAwareTextEditor()->CommitFepInlineEditL(*coeEnv);
- }
- else
- {
- // Go directly via CTextView because the normal way via the FepAwareEditor can only be called
- // during an inline edit.
- // Line cursor is made invisible here. There is no line cursor in S60 LAF, even though there is
- // an Edwin flag which govern this. See CEikEdwin::SetCursorVisibilityL(TBool)
- // Cursor is not set if this CommitInlineEditL call was prompted when losing focus.
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if ( (docNavi || TextView()) && !IsCcpuFlagSet(ECcpuStateLosingFocus) )
- {
- if (docNavi)
- {
- docNavi->SetCursorVisibilityL( TCursor::EFCursorInvisible,
- TCursor::EFCursorFlashing );
- }
- else
- {
- TextView()->SetCursorVisibilityL( TCursor::EFCursorInvisible,
- TCursor::EFCursorFlashing );
- }
- }
- }
- }
- // iMatchState=EWordMatchFirst;
-
- CleanupStack::PopAndDestroy(); // decoratedTextBuf
- }
- if (iInputCapabilities.FepAwareTextEditor())
- {
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- }
-
- iCaseMan->UpdateCase(ENullNaviEvent);
- // <---- Arabic & Hebrew required functionality added
- if (!EditorHasFreeSpace())
- {
- SetFlag(EFlagEditorFull);
- }
- else
- {
- ClearFlag(EFlagEditorFull);
- }
- }
- }
- else if (IsFlagSet(EFlagInsideInlineEditingTransaction)
- && iInputCapabilities.SupportsSecretText())
- {
- CCoeEnv* coeEnv = CCoeEnv::Static();
- iInputCapabilities.FepAwareTextEditor()->CommitFepInlineEditL(*coeEnv);
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
-
- if (iQwertyInputMode)
- {
- // Case may need to updated automatically in case of qwerty secret text editor
- // beause of the sticky shift feature.
- if (iCaseMan->CurrentCase() == EAknEditorLowerCase)
- {
- SetCase(ELowerCase);
- }
- else
- {
- SetCase(EUpperCase);
- }
- UpdateIndicators();
- }
- }
- }
-
-// SendEventsToPluginManL( EPluginSyncFepAwareText, EPluginSyncUpdatedText );
-
- ClearFlag(EFlagInsideMultitapInlineEditingTransaction | EFlagInsideInlineEditingTransaction |
- EFlagLineFeedCharacter | EFlagLastCharacterInEditor | EFlagSpaceCharacter |
- EFlagFullWidthSpaceCharacter);
-
- // No-edit_key devices: Inline editing ending, allow edit-menu again.
- ClearCcpuFlag(ECcpuStateIgnoreStarUp | ECcpuStateNewPredictiveWord);
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- iUncommittedText.iCursorPos=0;
- iUncommittedText.iAnchorPos=0;
-#endif
- if (!iInputCapabilities.FepAwareTextEditor())
- {
- // In case while updating the inline edit, 3rd party app removes the focus out of editor before the transaction
- // completes, we return with an error.
- User::Leave(KErrCorrupt);
- }
-
- }
-
-void CAknFepManager::CommitInlineEditL(const TDesC& aText, TInt aUncommitedTextChange)
- {
- if (iMode == EHiraganaKanji)
- {
- // When there is not enough editing space to enter the selected candidate,
- // the error tone is played.
- if ((iFreeSpaceOfEditor > 0) && (iFreeSpaceOfEditor < aText.Length()))
- {
- PlaySound(EAvkonSIDErrorTone);
- }
- }
-
- //maxLength of 0 means the editor has no limit
- TInt maxEdSize = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep();
- if ( maxEdSize != 0 && iFreeSpaceOfEditor < aText.Length())
- {
- TPtrC charbuf = aText.Left(iFreeSpaceOfEditor);
- TInt uncommitedTextChange = charbuf.Length();
- UpdateInlineEditL(charbuf, uncommitedTextChange);
- }
- else
- {
- UpdateInlineEditL(aText, aUncommitedTextChange);
- }
-
- ClearFlag(EFlagInsideMultitapInlineEditingTransaction);
- CommitInlineEditL();
- }
-
-void CAknFepManager::CancelInlineEdit()
- {
- if( !EditorState()->CurrentInlineEditSpan().Length() )
- {
- ClearFlag(EFlagInsideInlineEditingTransaction);
- if(IsFlagSet(CAknFepManager::EFlagNoMatches))
- {
- ClearFlag(CAknFepManager::EFlagNoMatches);
- }
- }
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- TRAP_IGNORE(TryRemoveNoMatchesIndicatorL());
-
- if (iInputCapabilities.SupportsSecretText())
- {
- TRAP_IGNORE(SimulateKeyEventL(EKeyF20)); // backspace to delete previous char in secret text editor
- }
- else if (IsFeatureSupportedJapanese()
- && iFepManState == EAknFepStateUIActive)
- {
- FepUI()->CloseUI();
- FepUI()->ExpireMultitapTimer();
- iPtiEngine->ClearCurrentWord();
- SyncStates(EAknFepStateInitial);
- }
- }
-
- iUncommittedText.iCursorPos=0;
-
- iUncommittedText.iAnchorPos=0;
-
- iInputCapabilities.FepAwareTextEditor()->CancelFepInlineEdit();
- ClearFlag(EFlagInsideMultitapInlineEditingTransaction | EFlagInsideInlineEditingTransaction
- | EFlagLineFeedCharacter | EFlagSpaceCharacter | EFlagFullWidthSpaceCharacter);
- ClearCcpuFlag(ECcpuStateNewPredictiveWord);
- }
-
-void CAknFepManager::GetScreenCoordinatesL(TPoint& aLeftSideOfBaseLine, TInt& aHeight,
- TInt& aAscent, TInt aDocumentOffset)
- {
- TCursorSelection cursorSelection;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSelection);
- TInt documentPosition = cursorSelection.LowerPos() - aDocumentOffset;
- if (documentPosition < 0)
- documentPosition = 0;
- iInputCapabilities.FepAwareTextEditor()->GetScreenCoordinatesForFepL(aLeftSideOfBaseLine,
- aHeight, aAscent, documentPosition);
- }
-
-void CAknFepManager::GetScreenCoordinatesL(TPoint& aLeftSideOfBaseLine,
- TInt& aHeight, TInt& aAscent)
- {
- TCursorSelection cursorSelection;
- MCoeFepAwareTextEditor* fepAwareTextEditor = iInputCapabilities.FepAwareTextEditor();
-
- fepAwareTextEditor->GetCursorSelectionForFep(cursorSelection);
- fepAwareTextEditor->GetScreenCoordinatesForFepL(aLeftSideOfBaseLine, aHeight, aAscent,
- cursorSelection.LowerPos());
- }
-
-TBool CAknFepManager::EditorHasFreeSpace( TInt aRequiredNumberOfCharacter ) const
- {
- TBool unlimit = EFalse;
- TInt freeSpace = 0;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(WesternPredictive())
- {
- freeSpace = EditorFreeSpaceForAutoWordCompletion(unlimit);
- }
- else
- {
-#endif //RD_INTELLIGENT_TEXT_INPUT
- freeSpace = EditorFreeSpace(unlimit);
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
- if( unlimit || freeSpace > aRequiredNumberOfCharacter )
- {
- return ETrue;
- }
- return EFalse;
- }
-
-TBool CAknFepManager::IsEditorHasFreeSpace() const
- {
- TBool unlimit = EFalse;
- TInt freeSpace = 0;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(WesternPredictive())
- {
- freeSpace = EditorFreeSpaceForAutoWordCompletion(unlimit);
- }
- else
- {
-#endif //RD_INTELLIGENT_TEXT_INPUT
- freeSpace = EditorFreeSpace(unlimit);
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
- if( unlimit || freeSpace > 0 )
- {
- return ETrue;
- }
- return EFalse;
- }
-
-TInt CAknFepManager::EditorFreeSpace(TBool& aUnlimit,
- TBool isToCountUncommittedTextLength /*= EFalse */) const
- {
- aUnlimit = EFalse;
-
- if (!iInputCapabilities.FepAwareTextEditor())
- {
- //no handle to MCoeFepAwareTextEditor in non Edwin derived editors
- return 0;
- }
-
- //maxLength of 0 means the editor has no limit
- TInt maxEdSize = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep();
- TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- TCursorSelection currentSelection;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(currentSelection);
-
- aUnlimit = (maxEdSize == 0 || ((iAknEditorFlags & EAknEditorFlagMTAutoOverwrite) &&
- (currentSelection.iCursorPos >= 0 &&
- currentSelection.iCursorPos < maxEdSize) ));
- if(aUnlimit)
- {
- return 0;
- }
- else
- {
- if( isToCountUncommittedTextLength )
- {
- return ( maxEdSize - edSize +
- currentSelection.Length() + UncommittedText().Length() );
- }
- return (maxEdSize - edSize + currentSelection.Length());
- }
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-TInt CAknFepManager::EditorFreeSpaceForAutoWordCompletion(TBool& aUnlimit,
- TBool /* isToCountUncommittedTextLength = EFalse*/ ) const
- {
- aUnlimit = EFalse;
-
- if (!iInputCapabilities.FepAwareTextEditor())
- {
- //no handle to MCoeFepAwareTextEditor in non Edwin derived editors
- return 0;
- }
-
- //maxLength of 0 means the editor has no limit
- TInt maxEdSize = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep();
- TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- TInt keySequenceLength = iPtiEngine->CurrentInputSequence().Length();
- TCursorSelection currentSelectionOrUncommitted;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(currentSelectionOrUncommitted);
-
- aUnlimit = (maxEdSize == 0 || ((iAknEditorFlags & EAknEditorFlagMTAutoOverwrite) &&
- (currentSelectionOrUncommitted.iCursorPos >= 0 &&
- currentSelectionOrUncommitted.iCursorPos < maxEdSize) ));
- if(aUnlimit)
- {
- return 0;
- }
- else
- {
-
- if ( !iQwertyInputMode )
- {
- return ( maxEdSize - edSize + currentSelectionOrUncommitted.Length() );
- }
- else
- {
- // In the predictive QWERTY mode, the keySequenceLength doesn't necessarily have anything
- // to do with the amount of characters on screen. At least entering accented characters with
- // Chr-multitapping will increase the key sequence length although number of characters
- // doesn't change (this is either bug or feature of ZiCore). Ask the auto-completion
- // length directly from PtiEngine instead of trying to calculate it on our own.
- TInt tailLength = 0;
- TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength ));
- if( tailLength < 0 )
- {
- tailLength = 0;
- }
- return (maxEdSize - edSize + currentSelectionOrUncommitted.Length() + tailLength);
- }
- }
- }
-#endif
-#ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-
-TInt CAknFepManager::DocumentLength() const
- {
- TInt ret = 0;
- if ( iInputCapabilities.FepAwareTextEditor() )
- {
- ret = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- }
- return ret;
- }
-
-TBool CAknFepManager::KeyEventWillReplaceCharacter( const TKeyEvent& aKeyEvent )
- {
- // The function is currently used only in QWERTY mode. It might not work correctly
- // with ITU-T input.
- TBool ret = EFalse;
- if ( IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) )
- {
- // Multitapping
- ret = ETrue;
- }
- else if ( aKeyEvent.iRepeats &&
- LongPressNumberEntryOnQwerty() &&
- FnKeyState() == CAknFepFnKeyManager::EFnKeyNone &&
- KeyMapsDifferentCharacterWithFn( (TPtiKey)aKeyEvent.iScanCode ) )
- {
- // QWERTY key long press producing another charcter
- ret = ETrue;
- }
- return ret;
- }
-#endif
-#endif
-TChar CAknFepManager::CurrentDecimalSeparator() const
- {
- TLocale tLoc;
- return tLoc.DecimalSeparator();
- }
-
-void CAknFepManager::ConfigureFEPFromEditorStateL()
- {
- User::LeaveIfError(SyncStates(EAknFepStateInitial));
-
- CAknEdwinState* editorState = EditorState();
- TInt editorMode = editorState->CurrentInputMode();
- TInt sharedDataMode = iSharedDataInterface->InputMode();
- TBool latinCaseSet = EFalse;
- iPermittedInputModes = editorState->PermittedInputModes();
- TInt defaultInputMode = editorState->DefaultInputMode();
- if(iAknEditorFlags != editorState->Flags())
- {
- iAknEditorFlags = editorState->Flags();
- UpdateLocalDigitMode();
- }
- iAknEditorNumericKeymap = editorState->NumericKeymap();
-
- TLanguage localLanguage = ELangTest;
- if (GetLocalLanguage( localLanguage ) )
- {
- iLanguageCapabilities.iLocalInputLanguageInUse = ETrue;
- if ( localLanguage != iLanguageCapabilities.iInputLanguageCode )
- {
- ChangeInputLanguageL(localLanguage);
- }
- }
- else if (iLanguageCapabilities.iLocalInputLanguageInUse)
- {
- ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage());
- iLanguageCapabilities.iLocalInputLanguageInUse = EFalse;
- ClearFlag(EFlagNewSharedDataInputMode);
- }
-
- if (IsFlagSet(EFlagNewSharedDataInputLanguage) )
- {
- //Global mode or input language has been changed in general settings
- if ( !iLanguageCapabilities.iLocalInputLanguageInUse)
- {
- ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage());
- }
- ClearFlag(EFlagNewSharedDataInputLanguage);
- }
-
- if (IsFeatureSupportedJapanese())
- {
- // set Japanese predicitve ON/OFF
- if (iAknEditorFlags & EAknEditorFlagNoT9)
- {
- iJapanesePredictive = EFalse;
- }
- else
- {
- // Is it supported Japanese predictive input
- if (HasJapanesePredictionInputMode())
- {
- iJapanesePredictive = iSharedDataInterface->PredictiveTextJapaneseOn();
- }
- else
- {
- // if Predictive Japanese input isn't supported in PtiEngine, set to OFF.
- iJapanesePredictive = EFalse;
- iSharedDataInterface->ResetJapanesePredictiveTextOn();
- }
- }
-
- // In Japanese variant, EAknEditorTextInputMode of allow input mode
- // means all input mode.
- if (iPermittedInputModes & EAknEditorTextInputMode)
- {
- iPermittedInputModes |= (EAknEditorKatakanaInputMode |
- EAknEditorHalfWidthTextInputMode |
- EAknEditorFullWidthTextInputMode |
- EAknEditorFullWidthNumericInputMode |
- EAknEditorFullWidthKatakanaInputMode |
- EAknEditorHiraganaKanjiInputMode |
- EAknEditorHiraganaInputMode);
- }
-
- if (iAknEditorFlags & EAknEditorFlagLatinInputModesOnly)
- {
- if (iPermittedInputModes == EAknEditorNumericInputMode)
- {
- iPermittedInputModes = EAknEditorNumericInputMode;
- }
- else if (iPermittedInputModes & EAknEditorNumericInputMode)
- {
- iPermittedInputModes = (EAknEditorHalfWidthTextInputMode
- | EAknEditorNumericInputMode);
- }
- else
- {
- iPermittedInputModes = EAknEditorHalfWidthTextInputMode;
- }
- }
-
- if (editorMode)
- {
- editorMode = ConfigureFepModeFromEditorMode(editorMode);
- }
- else // for new editors
- {
- iCharWidth = EHalfWidthChar;
- sharedDataMode = EHiraganaKanji;
- // First input mode is changed to Latin from Hiragana/Kanji
- // if display language is English.
- TInt dispLang = iSharedDataInterface->DisplayLanguage();
- // ELangTest means Automatic as display language in GS
- if (dispLang == ELangTest)
- {
- // UiLanguage isn't Japanese, Latin is set.
- if (iUiLanguage != ELangJapanese)
- {
- sharedDataMode = ELatin;
- }
- }
- else if (dispLang != ELangJapanese)
- {
- // Display language isn't Japanese, Latin is set.
- sharedDataMode = ELatin;
- }
-
- if (!(iPermittedInputModes & EAknEditorHiraganaKanjiInputMode))
- {
- if (IsOnlyFullWidthCharacterPermitted())
- {
- iCharWidth = EFullWidthChar;
- }
- else if (IsOnlyHalfWidthCharacterPermitted())
- {
- iCharWidth = EHalfWidthChar;
- }
-
- if (iPermittedInputModes & (EAknEditorKatakanaInputMode |
- EAknEditorFullWidthKatakanaInputMode))
- {
- // In case setting Latin as above, Latin is used preferentially.
- if (sharedDataMode == ELatin
- && (iPermittedInputModes &
- (EAknEditorHalfWidthTextInputMode | EAknEditorFullWidthTextInputMode)))
- {
- sharedDataMode = ELatin;
- }
- else
- {
- sharedDataMode = EKatakana;
- }
- }
- else if (iPermittedInputModes & (EAknEditorHalfWidthTextInputMode |
- EAknEditorFullWidthTextInputMode))
- {
- sharedDataMode = ELatin;
- }
- else if (iPermittedInputModes & (EAknEditorNumericInputMode |
- EAknEditorFullWidthNumericInputMode))
- {
- sharedDataMode = ENumber;
- }
- // First input mode is changed to latin from katakana
- // if display language is English.
- if (!(dispLang == ELangTest || dispLang == ELangJapanese))
- {
- if ((iPermittedInputModes & EAknEditorKatakanaInputMode) &&
- (iPermittedInputModes & EAknEditorHalfWidthTextInputMode))
- {
- sharedDataMode = ELatin;
- }
-
- if ((iPermittedInputModes & EAknEditorKatakanaInputMode) &&
- (iPermittedInputModes & EAknEditorFullWidthTextInputMode))
- {
- sharedDataMode = ELatin;
- }
- }
- }
- }
- }
- else // for other variants (western or chinese)
- {
- if (!(iPermittedInputModes & (EAknEditorTextInputMode | EAknEditorNumericInputMode
- | EAknEditorSecretAlphaInputMode)))
- {
- // Any latin input mode is not permitted by the editor.
- // For compatibility permitted japanese input modes are checked and
- // corresponding latin input modes are allowed.
- if ( iPermittedInputModes & (EAknEditorKatakanaInputMode |
- EAknEditorHalfWidthTextInputMode |
- EAknEditorFullWidthTextInputMode |
- EAknEditorFullWidthKatakanaInputMode |
- EAknEditorHiraganaKanjiInputMode |
- EAknEditorHiraganaInputMode))
- {
- iPermittedInputModes |= EAknEditorTextInputMode;
- }
- if ( iPermittedInputModes & EAknEditorFullWidthNumericInputMode )
- {
- iPermittedInputModes |= EAknEditorNumericInputMode;
- }
-
- if ( !(defaultInputMode & (EAknEditorTextInputMode | EAknEditorNumericInputMode)))
- {
- if (defaultInputMode & (EAknEditorKatakanaInputMode |
- EAknEditorHalfWidthTextInputMode|
- EAknEditorFullWidthTextInputMode |
- EAknEditorFullWidthKatakanaInputMode |
- EAknEditorHiraganaKanjiInputMode |
- EAknEditorHiraganaInputMode))
- {
- defaultInputMode = EAknEditorTextInputMode;
- }
- else if (defaultInputMode & EAknEditorFullWidthNumericInputMode)
- {
- defaultInputMode = EAknEditorNumericInputMode;
- }
- }
- }
- }
-
- // object provider items
- iEditMenuBar = NULL;
- editorState->SetMenu();
- editorState->SetCba();
-
-#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__
- iOptionsMenuBar = NULL;
-#endif
-
- SetWesternPredictive(iSharedDataInterface->PredictiveTextOn());
- //check that we don't have a Chinese find mode saved to an editor that is
- //not a Chinese find pane
- __ASSERT_DEBUG( !((editorMode == EZhuyinFind || editorMode == EStrokeFind) &&
- !(iAknEditorFlags & EAknEditorFlagForceTransparentFepModes))
- , AknFepPanic(EAknFepPanicFindModeSavedToNonFindEditor));
-
- ReadHashKeyLoopL();
-
- UpdateNumericEditorDigitType();
- if ( IsMfneEditor() )
- {
- UpdateLocalDigitMode();
- }
-
- if (editorMode) //should be an editor that has been used before
- {
- if (IsFlagSet(EFlagNewSharedDataInputMode) && (IsModePermitted(sharedDataMode)) && !IsKoreanInputLanguage()
- && (!(iAknEditorFlags & EAknEditorFlagForceTransparentFepModes)))
- {
-
- {
- //change to global mode, except in Find Pane, where we ignore
- //GS setting
- TryChangeModeL(sharedDataMode);
- ClearFlag(EFlagNewSharedDataInputMode);
- latinCaseSet = sharedDataMode & (ELatinUpper | ELatinLower);
- if (sharedDataMode == ELatinText)
- {
- editorState->SetFlags( editorState->Flags() & ~EFlagSupressAutoUpdate );
- }
- }
- }
-
- // Next two cases are apps/UI intitialinsg their editors in the
- // with the modes defined in uikon.hrh, change these to an appropriate
- // FEP mode
- else if (editorMode == EAknEditorNumericInputMode)
- {
- iCharWidth = EHalfWidthChar;
- if ( (iMode == ENumber || iMode == ENativeNumber) &&
- IsModePermitted(iMode))
- {
- TryChangeModeL( iMode );
- }
- else if ( IsInputModeAvailable(ENativeNumber) &&
- ( iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic ) )
- {
- TryChangeModeL( ENativeNumber );
- }
- else
- {
- TryChangeModeL( ENumber );
- }
- }
- else if (editorMode == EAknEditorSecretAlphaInputMode)
- {
- //this is safe default as it is currently allowed in all FEPs
- SetWesternPredictive(EFalse);
- TryChangeModeL(ELatin);
- }
- else if (editorMode == EAknEditorTextInputMode)
- {
- if (IsKoreanInputLanguage())
- {
- if(iMode == EHangul || iMode == ENumber || iMode == EAknEditorNullInputMode )
- {
- SetWesternPredictive(EFalse);
- TryChangeModeL(EHangul);
- }
- else
- {
- TryChangeModeL(ELatin);
- }
- }
- else
- {
- //this is safe default as it is currently allowed in all FEPs
- TryChangeModeL(ELatin);
- }
- }
- else if (!iStrokeUsedInQWERTY)
- {
- if (editorMode == EStroke && sharedDataMode == ECangJie)
- {
- TryChangeModeL(sharedDataMode);
- }
- else
- {
- TryChangeModeL(editorMode);
- }
- }
- else //normal case, use locally stored mode
- {
- if (editorMode == ECangJie && sharedDataMode == ECangJie && iQwertyInputMode)
- {
- TryChangeModeL(EStroke);
- }
- else
- {
- TryChangeModeL(editorMode);
- }
- }
- }
- else if ((iAknEditorFlags & EAknEditorFlagForceTransparentFepModes)
- && !IsFeatureSupportedJapanese()) //new find pane
- {
- // the default chinese find mode is the first mode in the hash key loop, except PrcChinese
- if( iLanguageCapabilities.iInputLanguageCode == ELangPrcChinese)
- {
- // Fix bug EHST-6DBFUJ: Default searching language shall be ELatin
- // Changed from EPinyin to ELatin here
- TryChangeModeL(ELatin);
- }
- else
- {
- TryChangeModeL(iHashKeyLoop[0]);
- }
- }
- else //new editor
- {
- if (defaultInputMode == EAknEditorNumericInputMode)
- {
- //numeric mode is not saved to/retreived from shared data
- iCharWidth = EHalfWidthChar;
-
- if( IsInputModeAvailable(ENativeNumber) &&
- ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) )
- {
- TryChangeModeL( ENativeNumber );
- }
- else
- {
- TryChangeModeL( ENumber );
- }
- }
- else if ((defaultInputMode == EAknEditorTextInputMode) &&
- ((iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) ||
- (iAknEditorFlags & EAknEditorFlagNoT9)))
- {
- //Chinese Modes or Western Predictive mode not allowed.
- //See if we are ok going to the current shared data mode,
- //otherwise go for a safe default
- if (TryChangeModeL(sharedDataMode))
- {
- latinCaseSet = sharedDataMode & (ELatinUpper | ELatinLower);
- }
- else
- {
- TryChangeModeL(ELatin);
- }
- }
- else if (defaultInputMode == EAknEditorHalfWidthTextInputMode)
- {
- iCharWidth = EHalfWidthChar;
- TryChangeModeL(ELatin);
- }
- else if (defaultInputMode == EAknEditorHiraganaInputMode)
- {
- TryChangeModeL(EHiragana);
- }
- else if ( iLanguageCapabilities.iInputLanguageCode == ELangJapanese
- && (defaultInputMode == EAknEditorKatakanaInputMode
- || defaultInputMode == EAknEditorFullWidthKatakanaInputMode))
- {
- iCharWidth = (defaultInputMode == EAknEditorKatakanaInputMode)?
- EHalfWidthChar : EFullWidthChar;
- TryChangeModeL(EKatakana);
- }
- else if (defaultInputMode == EAknEditorFullWidthTextInputMode)
- {
- iCharWidth = EFullWidthChar;
- TryChangeModeL(ELatin);
- }
- else if (defaultInputMode == EAknEditorFullWidthNumericInputMode)
- {
- iCharWidth = EFullWidthChar;
- if( IsInputModeAvailable(ENativeNumber) &&
- ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) )
- {
- TryChangeModeL( ENativeNumber );
- }
- else
- {
- TryChangeModeL( ENumber );
- }
- }
- else if (defaultInputMode == EAknEditorTextInputMode
- && iLanguageCapabilities.iInputLanguageCode == ELangHindi )
- {
- TryChangeModeL( EHindi );
- }
- else // Default input mode is EAknEditorTextInputMode
- {
- // Check possibility move this section on else if
- if (IsKoreanInputLanguage())
- {
- TryChangeModeL(EHangul);
- }
- else if (TryChangeModeL(sharedDataMode))
- {
- latinCaseSet = sharedDataMode & (ELatinUpper | ELatinLower);
- }
- else
- {
- TryChangeModeL(ELatin);
- }
-
- }
- }
-
- if (!iMode)
- {
- // If mode change wasn't successful, try latin mode as fallback.
- TryChangeModeL(ELatin);
- }
-
- // if also fallback fails, panic.
- __ASSERT_DEBUG(iMode, AknFepPanic(EAknFepPanicNoPermittedEditorModesAvailable));
-
- if (iCaseMan && !latinCaseSet)
- {
- iCaseMan->ConfigureCaseStateFromEditorState();
- if ( (editorState->Flags() & EFlagSupressAutoUpdate) ||
- editorMode == EAknEditorSecretAlphaInputMode )
- {
- SetFlag(EFlagSupressAutoUpdate);
- }
- else
- {
- ClearFlag(EFlagSupressAutoUpdate);
- }
- }
- if ((iAknEditorFlags & EAknEditorFlagForceTransparentFepModes) &&
- IsChineseInputLanguage() && iCaseMan != NULL )
- {
- SetFlag(EFlagSupressAutoUpdate);
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- }
-
- UpdateEditorContext();
-
- // Check if this editor was previously inline editing
- if ( WesternPredictive() && editorState->CurrentInlineEditSpan().Length())
- { // restore the fep to an inline editing state
- iUncommittedText = editorState->CurrentInlineEditSpan();
- TInt docLenFep=iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- if (iUncommittedText.iCursorPos>docLenFep)
- iUncommittedText.iCursorPos=docLenFep;
- if (iUncommittedText.iAnchorPos>docLenFep)
- iUncommittedText.iAnchorPos=docLenFep;
-
- TBuf<EMaximumFepWordLength> textToUncommit;
- iInputCapabilities.FepAwareTextEditor()->
- GetEditorContentForFep(textToUncommit, iUncommittedText.iAnchorPos,
- Min(iUncommittedText.Length(), EMaximumFepWordLength));
-
- // Activates western predictive UI to an inline editing state.
- FepUI()->ActivateUI();
- SyncStates(EAknFepStateUIActive);
- TInt err = iPtiEngine->SetCurrentWord(textToUncommit);
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes (TEST) ---->
- // The PtiXt9Core may choose to ignore the SetCurrentInputSequence() call.
- // Make sure our text buffer is in sync with the one in PtiEngine.
- if(KErrNone != err)
- textToUncommit = iPtiEngine->CurrentWord();
- TInt maxEdSize = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep();
- if((maxEdSize > 0) && (iUncommittedText.iAnchorPos + textToUncommit.Length() > maxEdSize))
- {
- textToUncommit.SetLength(maxEdSize - iUncommittedText.iAnchorPos);
- iUncommittedText.iCursorPos = maxEdSize;
- }
- // Predictive QWERTY (XT9) changes <----
-#endif //RD_INTELLIGENT_TEXT_INPUT
- StartInlineEditL(iUncommittedText, textToUncommit, textToUncommit.Length(), EFalse);
-
- // Make sure editor character case in sync
- if( iUncommittedText.iAnchorPos == 0 )
- iCaseMan->UpdateCase(ENullNaviEvent);
-
- }
-
- if (editorState != iPreviousEditorState)
- {
- // we have changed editor, time to update local digits mode
- UpdateLocalDigitMode();
- iPreviousEditorState = editorState;
- }
-
- if(IsExtendedFlagSet(EExtendedFlagShiftReleasedOnPopup) && !(iAknEditorFlags & EAknEditorFlagFindPane) )
- {
- // If in FEP context, shift is released on a non fep aware dialog
- // like "text copied to clipboard", then release the shift
- // when the editor comes in focus by simulating shift up event.
- ClearExtendedFlag(EExtendedFlagShiftReleasedOnPopup);
- TKeyEvent shiftUp = {0, EStdKeyLeftShift, 0, 0};
- CCoeEnv::Static()->SimulateKeyEventL(shiftUp, EEventKeyUp);
- }
- else if (IsFlagSet(EFlagLongShiftKeyPress) && !(iAknEditorFlags & EAknEditorFlagFindPane))
- {
- // Find pane editor does not require any shift simulation
-
- // After the "text copied" note and if the shift key was not released
- // then simulate shift down event.
- TKeyEvent shiftDown = {0, EStdKeyLeftShift, 0, 0};
- CCoeEnv::Static()->SimulateKeyEventL(shiftDown, EEventKeyDown);
- if((!iCandidatePopup) && (KeyboardLayout() != EPtiKeyboard12Key ))
- ResetShiftKeyMonitorL();
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- TransferFepStateToEditorL(EFalse); // ensure editor has up to date state
-#else
- TransferFepStateToEditorL(); // ensure editor has up to date state
-#endif
-
- iHashKeyMan->ResetIndicHashKeyStateL();
- ClearExtendedFlag(EExtendedFlagShortPressHashKey);
- }
-
-TInt CAknFepManager::ConfigureFepModeFromEditorMode(TInt aEditorMode)
- {
- TInt fepMode(aEditorMode);
-
- switch (aEditorMode)
- {
- case EAknEditorNumericInputMode:
- if( IsInputModeAvailable(ENativeNumber) &&
- ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) )
- {
- fepMode = ENativeNumber;
- }
- else
- {
- fepMode = ENumber;
- }
- iCharWidth = EHalfWidthChar;
- break;
- case EAknEditorSecretAlphaInputMode:
- case EAknEditorTextInputMode:
- case EAknEditorHalfWidthTextInputMode:
- fepMode = ELatin;
- iCharWidth = EHalfWidthChar;
- break;
- case EAknEditorKatakanaInputMode:
- fepMode = EKatakana;
- iCharWidth = EHalfWidthChar;
- break;
- case EAknEditorFullWidthTextInputMode:
- fepMode = ELatin;
- iCharWidth = EFullWidthChar;
- break;
- case EAknEditorFullWidthKatakanaInputMode:
- fepMode = EKatakana;
- iCharWidth = EFullWidthChar;
- break;
- case EAknEditorFullWidthNumericInputMode:
- if( IsInputModeAvailable(ENativeNumber) &&
- ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) )
- {
- fepMode = ENativeNumber;
- }
- else
- {
- fepMode = ENumber;
- }
- iCharWidth = EFullWidthChar;
- break;
- case EAknEditorHiraganaKanjiInputMode:
- fepMode = EHiraganaKanji;
- break;
- case EAknEditorHiraganaInputMode:
- fepMode = EHiragana;
- break;
- default:
- break;
- }
- return fepMode;
- }
-
-void CAknFepManager::LaunchHelpTextQueryL()
- {
- TUid fepUid = CCoeEnv::Static()->FepUid();
- ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
- iUiInterface->LaunchHelpTextQueryL(R_AKNFEP_HELP_TEXT);
- PrepareFepAfterDialogExitL(fepUid);
- }
-
-void CAknFepManager::UpdateEditorContext() const
- {
- if(EditingStateIndicator())
- {
- iUiInterface->UpdateEditorContext(*EditingStateIndicator(), *FepUI());
- }
- }
-
-TBool CAknFepManager::TextIsValidInEditor(const TDesC& aText)
- {
- TBool ret = ETrue;
- TUint length = aText.Length();
- TCoeInputCapabilities::MCoeFepSpecificExtensions* ipCapExt =
- iInputCapabilities.FepSpecificExtensions(TUid::Uid(EAknFepUid));
- if (ipCapExt)
- {
- while(length--)
- {
- if (!ipCapExt->IsValidCharacter(aText[length]))
- {
- ret = EFalse;
- }
- }
- }
- return ret;
- }
-
-TBool CAknFepManager::CharIsValidInEditor(TChar aChar)
- {
- TBool ret = ETrue;
- TCoeInputCapabilities::MCoeFepSpecificExtensions* ipCapExt =
- iInputCapabilities.FepSpecificExtensions(TUid::Uid(EAknFepUid));
- if (ipCapExt)
- {
- if (!ipCapExt->IsValidCharacter(aChar))
- {
- ret = EFalse;
- }
- }
- return ret;
- }
-
-void CAknFepManager::SetCursorType(TChineseFepCursorType aType)
- {
- TBool setToTrue = ETrue;
- TTextCursor newCursor;
-
- newCursor.iType=TTextCursor::ETypeRectangle;
- if (aType == EPassive)
- {
- newCursor.iType=TTextCursor::ETypeHollowRectangle;
- }
- if ( IsFepAwareTextEditor() )
- {
- iInputCapabilities.FepAwareTextEditor()->Extension1()->SetCursorType(setToTrue, newCursor);
- }
- }
-
-MAknEditingStateIndicator* CAknFepManager::EditingStateIndicator() const
- {
- MAknEditingStateIndicator* indicator = NULL;
-
- // First ask indicator from controls owning the editor.
- // For example CAknQueryControl and CAknSearchField implement
- // their own indicators.
-
- MObjectProvider* objectProvider = NULL;
-
- // First try through CAknEdwinState object.
- // It exists with CEikEdwin-derived editors.
-
- MCoeFepAwareTextEditor* editor = NULL;
- MCoeFepAwareTextEditor_Extension1* ext1 = NULL;
- CAknEdwinState* state = NULL;
-
- editor = iInputCapabilities.FepAwareTextEditor();
-
- if(editor)
- ext1 = editor->Extension1() ;
- if(ext1)
- state = (CAknEdwinState*)ext1->State( KNullUid ) ;
-
- if ( IsFepAwareTextEditor() && ( editor ) && ( ext1) && ( state ))
- {
- objectProvider = state->ObjectProvider();
- }
-
- // If not found, try to get object provider from input capabilities.
- // It is set there with CEikMfne-derived editors.
-
- if ( !objectProvider )
- {
- objectProvider = iInputCapabilities.ObjectProvider();
- }
-
- if ( objectProvider )
- {
- indicator = objectProvider->MopGetObject( indicator );
- }
-
- // If no indicator was supplied, get one from CAknEnv.
- // By default, this one is FEP's own indicator.
-
- if ( !indicator )
- {
- indicator = CAknEnv::Static()->EditingStateIndicator();
- if (indicator != iIndicator)
- {
- CAknEnv::Static()->SwapEditingStateIndicator(iIndicator);
- indicator = iIndicator;
- }
- }
-
- return indicator;
- }
-
-TBool CAknFepManager::TryHandleArrowRightEventL(TInt aDokumentLength)
- {
- TBool ret = EFalse;
- TBool thai = (iLanguageCapabilities.iInputLanguageCode == ELangThai);
- if ( iInputCapabilities.FepAwareTextEditor() &&
- (iSharedDataInterface->SpaceWithScrollRight() || thai ) &&
- (!(iAknEditorFlags & EAknEditorFlagNoLRNavigation)) &&
- iFepManState == EAknFepStateInitial &&
- (!IsFlagSet(EFlagInsideInlineEditingTransaction) ) &&
- (!IsFlagSet(EFlagShiftKeyDepressed)) &&
- iMode != EHiragana ) // Not supported in only Hiragana input mode
- {
- TInt cursorPos = DocPos().iPos;
- TCursorSelection cursorSel;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSel);
- if (( cursorPos == aDokumentLength)
- && !cursorSel.Length()
- && (IsFeatureSupportedJapanese() || (PreviousChar() != 0x0020)) )
- {
- // set to half-width space or full-width space by current input mode.
- // 0x0020 is unicode for half-width space
- // 0x3000 is unicode for full-width space
- TUint code(0);
- switch (iMode)
- {
- case EHiraganaKanji:
- code = 0x3000;
- break;
- case ELatin:
- code = (!WesternPredictive() && iCharWidth == EFullWidthChar)?
- 0x3000 : 0x0020;
- break;
- case EHiragana:
- // Not supported in only Hiragana input mode
- break;
- case EHangul:
- code = 0x0020;
- break;
- case ENumber:
- case ENativeNumber:
- case EKatakana:
- default:
- code = (iCharWidth == EFullWidthChar)? 0x3000 : 0x0020;
- break;
- }
- if (code)
- {
- SimulateKeyEventL(code); // add a space
- SimulateKeyEventL(EKeyF19); // Asyncronous case update
- ret = ETrue;
- }
- }
- }
- return ret;
- }
-
-TBool CAknFepManager::TryHandleArrowLeftEventL(TInt aDokumentLength)
- {
- TBool ret = EFalse;
- if (iInputCapabilities.FepAwareTextEditor() &&
- iSharedDataInterface->SpaceWithScrollRight() &&
- (!(iAknEditorFlags & EAknEditorFlagNoLRNavigation)) &&
- iFepManState == EAknFepStateInitial &&
- (!IsFlagSet(EFlagInsideInlineEditingTransaction) ) &&
- (!IsFlagSet(EFlagShiftKeyDepressed)) &&
- iMode != EHiragana ) // Not supported in only Hiragana input mode
- {
- TInt cursorPos = DocPos().iPos;
- TCursorSelection cursorSel;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSel);
- TText previousChar = PreviousChar();
- if (( cursorPos == aDokumentLength)
- && !cursorSel.Length()
- && (IsFeatureSupportedJapanese()
- && (previousChar == 0x3000 || previousChar == 0x0020) )) // full width or half-width space.
- {
- SimulateKeyEventL(EKeyBackspace);
- SimulateKeyEventL(EKeyF19); // Asyncronous case update
- ret = ETrue;
- }
- }
- return ret;
- }
-
-TBool CAknFepManager::TryHandleArrowDownEventL(TInt aDokumentLength)
- {
- TBool ret = EFalse;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- if ( iWesternPredictive &&
- IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) && !(iAknEditorFlags & EAknEditorFlagNoT9)
- && !IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) && !IsFlagSet(EFlagNoMatches))
- {
- LaunchCandidatePopupListL();
- ret = ETrue;
- }
- // Predictive QWERTY (XT9) changes <----
- else
-#endif //RD_INTELLIGENT_TEXT_INPUT
- if ( ( iAknEditorFlags & EAknEditorFlagAllowEntersWithScrollDown ) &&
- iInputCapabilities.FepAwareTextEditor() &&
- ( iSharedDataInterface->EntersWithScrollDown() ) &&
- iFepManState == EAknFepStateInitial &&
- !IsFlagSet(EFlagInsideInlineEditingTransaction) &&
- !IsFlagSet(EFlagShiftKeyDepressed) )
- {
- TInt cursorPos = DocPos().iPos;
- TCursorSelection cursorSel;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSel);
- if ( cursorPos == aDokumentLength &&
- !cursorSel.Length() )
- {
- SimulateKeyEventL(EKeyEnter); // add line feed
- SimulateKeyEventL(EKeyF19); // Asyncronous case update
- ret = ETrue;
- }
- }
- return ret;
- }
-
-TUint CAknFepManager::EditorModeFromFepMode(TInt aFepMode)
- {
- TUint editorMode(aFepMode);
- switch (aFepMode)
- {
- case ELatin:
- if (iPermittedInputModes & EAknEditorTextInputMode)
- {
- editorMode = EAknEditorTextInputMode;
- if (IsFeatureSupportedJapanese())
- {
- if (iCharWidth == EHalfWidthChar
- && (iPermittedInputModes & EAknEditorHalfWidthTextInputMode))
- {
- editorMode = EAknEditorHalfWidthTextInputMode;
- }
- else if (iCharWidth == EFullWidthChar
- && (iPermittedInputModes & EAknEditorFullWidthTextInputMode))
- {
- editorMode = EAknEditorFullWidthTextInputMode;
- }
- }
- }
- else if (iPermittedInputModes & EAknEditorHalfWidthTextInputMode)
- {
- editorMode = EAknEditorTextInputMode;
- if (IsFeatureSupportedJapanese())
- {
- editorMode = EAknEditorHalfWidthTextInputMode;
- if (iCharWidth == EFullWidthChar
- &&(iPermittedInputModes & EAknEditorFullWidthTextInputMode))
- {
- editorMode = EAknEditorFullWidthTextInputMode;
- }
- }
- }
- else if (iPermittedInputModes & EAknEditorFullWidthTextInputMode)
- {
- editorMode = EAknEditorTextInputMode;
- if (IsFeatureSupportedJapanese())
- {
- editorMode = EAknEditorFullWidthTextInputMode;
- }
- }
- else
- {
- editorMode = EAknEditorSecretAlphaInputMode;
- }
- break;
- case ENumber:
- case ENativeNumber:
- editorMode = EAknEditorNumericInputMode;
- if (iCharWidth == EFullWidthChar
- && (iPermittedInputModes & EAknEditorFullWidthNumericInputMode))
- {
- editorMode = EAknEditorFullWidthNumericInputMode;
- }
- break;
- case EHangul:
- editorMode = EAknEditorTextInputMode;
- break;
- default:
- if (IsFeatureSupportedJapanese())
- {
- editorMode = EditorMode(aFepMode, iCharWidth);
- }
- break;
- }
- return editorMode;
- }
-
-CAknKeySoundSystem* CAknFepManager::SoundSystem() const
- {
- CCoeEnv* coeEnv = CCoeEnv::Static();
- if (coeEnv->AppUi())
- {
- return iAvkonAppUiBase->KeySounds();
- }
- return NULL;
- }
-
-void CAknFepManager::SetHashKeyStyle()
- {
- CAknFepHashKeyManager::THashKeyStyle style = CAknFepHashKeyManager::EHashKeyStyleWestern;
-
- switch (iLanguageCapabilities.iInputLanguageCode)
- {
- case ELangPrcChinese:
- case ELangHongKongChinese:
- case ELangTaiwanChinese:
- style = CAknFepHashKeyManager::EHashKeyStyleChineseWithWestern;
- break;
- case ELangJapanese:
- style = CAknFepHashKeyManager::EHashKeyStyleJapanese;
- break;
- case ELangKorean:
- style = CAknFepHashKeyManager::EHashKeyStyleKoreanWithWestern;
- break;
- default:
- break;
- }
-
- iHashKeyMan->SetHashKeyStyle( style );
- }
-
-void CAknFepManager::ReadHashKeyLoopL()
- {
- iHashKeyLoop.Reset();
-
- CCoeEnv* coeEnv = CCoeEnv::Static();
- TResourceReader reader;
- coeEnv->CreateResourceReaderLC(reader, R_HASH_KEY_LOOP_ALL_INPUT_MODES);
-
- iVariantPermittedModes = 0;
- const TInt count = reader.ReadInt16();
- for (TInt ii=0; ii<count; ii++)
- {
- TInt mode = reader.ReadInt32();
- if ( IsInputModeAvailable(mode) )
- {
- if ( mode == EPRCFind)
- {
- mode = ELatin;
- }
- iHashKeyLoop.Append(mode);
- iVariantPermittedModes |= mode;
- }
- }
- CleanupStack::PopAndDestroy(); //reader
- }
-
-TBool CAknFepManager::IsValidInLineCharacter(TChar aCharacter) const
- {
- TBool validInlineCharacter = ETrue;
- TChar::TCategory category = aCharacter.GetCategory();
- TChar::TBdCategory bdCategory = aCharacter.GetBdCategory();
- switch (iLanguageCapabilities.iInputLanguageCode)
- {
- case ELangArabic:
- {
- // Needs more specific category
- validInlineCharacter = ( (category & TChar::ELetterOtherGroup) &&
- (bdCategory == TChar::ERightToLeftArabic) );
- break;
- }
- case ELangHebrew:
- {
- // Needs more specific category
- validInlineCharacter = ( (category & TChar::ELetterOtherGroup) &&
- (bdCategory == TChar::ERightToLeft) );
- break;
- }
- case ELangFarsi:
- case ELangUrdu:
- {
- // Needs more specific category
- validInlineCharacter = ( (category & TChar::ELetterOtherGroup) &&
- (bdCategory == TChar::ERightToLeftArabic) );
- break;
- }
- /*Hindi*/
- case ELangHindi:
-#ifdef RD_MARATHI
- /* Same for Marathi */
- case ELangMarathi:
-#endif
- {
- // Needs more specific category
- validInlineCharacter = IsValidInlineIndicCharacter(aCharacter);
-
- break;
- }
- case ELangVietnamese:
- {
- validInlineCharacter = (aCharacter.IsAlpha() &&
- !((category & TChar::ELetterOtherGroup))) ||
- ((category == TChar::EMarkGroup) &&
- (bdCategory == TChar::ENonSpacingMark));
- break;
- }
- case ELangThai:
- {
- validInlineCharacter = (!(aCharacter.IsSpace() || (aCharacter == 0x2029))) &&
- ((aCharacter.IsAlpha() &&
- !(category & TChar::ELetterOtherGroup)) ||
- ((category & TChar::EMarkGroup) &&
- (bdCategory == TChar::ENonSpacingMark)) ||
- ((category & TChar::ELetterModifierGroup) &&
- (bdCategory == TChar::ELeftToRight)) ||
- ((category & TChar::ESeparatorGroup ) &&
- (bdCategory == TChar::EWhitespace))||
- ((category & TChar::EMcCategory) &&
- (bdCategory == TChar::ELeftToRight)));
- break;
- }
- case ELangTaiwanChinese:
- case ELangHongKongChinese:
- case ELangPrcChinese:
- case ELangEnglish:
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // for qwerty special characters should not break the word
- if( iQwertyInputMode && ( KeyboardLayout() !=EPtiKeyboardHalfQwerty ))
- {
- validInlineCharacter = (!( aCharacter.IsSpace() || (aCharacter == 0x2029) ||
- ( aCharacter.IsAlpha() &&
- (category & TChar::ELetterOtherGroup))||
- ((category & TChar::EMarkGroup) &&
- (bdCategory == TChar::ENonSpacingMark)) ||
- ((category & TChar::ELetterModifierGroup) &&
- (bdCategory == TChar::ELeftToRight)) ||
- ((category & TChar::ESeparatorGroup ) &&
- (bdCategory == TChar::EWhitespace))));
- }
- else
-#endif // whereas for ITUT and Half Qwerty they should
- {
- validInlineCharacter = ( aCharacter.IsAlpha() && !(category & TChar::ELetterOtherGroup) );
- }
- break;
- }
- default:
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // for qwerty special characters should not break the word
-
- if( iQwertyInputMode && ( KeyboardLayout() !=EPtiKeyboardHalfQwerty ) )
- {
- validInlineCharacter = (!(aCharacter.IsSpace() || (aCharacter == 0x2029)));
- }
- else
-#endif // whereas for ITUT and Half Qwerty they should
- {
- validInlineCharacter = ( aCharacter.IsAlpha() && !(category & TChar::ELetterOtherGroup) );
- }
-
-
- break;
- }
- }
-
- TUint16 key = 0;
- if(validInlineCharacter)
- {
- validInlineCharacter = EFalse;
- ConvertCharToKey(aCharacter, key);
- if(0 != key)
- {
- validInlineCharacter = ETrue;
- }
- }
-
- return validInlineCharacter;
- }
-TBool CAknFepManager::IsValidInlineIndicCharacter(TChar aCharacter) const
- {
- TBool validInlineCharacter = ETrue;
- TChar::TCategory category = aCharacter.GetCategory();
- TChar::TBdCategory bdCategory = aCharacter.GetBdCategory();
-
- if(!((category == TChar::EPoCategory) || aCharacter == 0x0950 || aCharacter == 0x093D))
- {
- validInlineCharacter = ((( (category & TChar::ELetterOtherGroup)
- && (bdCategory == TChar::ELeftToRight) )
- ||( (category & TChar::EMcCategory)
- && (bdCategory == TChar::ELeftToRight) )
- ||( (category & TChar::EMarkGroup)
- && (bdCategory == TChar::ENonSpacingMark)) )
- &&( ! ( aCharacter.IsAlpha()
- && !(category & TChar::ELetterOtherGroup) )));
- }
- else
- {
- validInlineCharacter = EFalse;
- }
- return validInlineCharacter;
- }
-
-TInt CAknFepManager::WordConcatenationTimerTimeoutCallback(TAny* aObj)
- {
- TRAPD(err, static_cast<CAknFepManager*>(aObj)->WordConcatenationTimerTimeoutL());
- if (err)
- {
- static_cast<CAknFepManager*>(aObj)->CleanUpFep();
- return KErrNoMemory;
- }
- return KErrNone;
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-
-TBool CAknFepManager::IsHybridAplhaEditor() const
- {
- TBool phoneIdle = (EditorType() == CAknExtendedInputCapabilities::EHybridAlphaNumericEditor);
- return phoneIdle;
- }
-
-TBool CAknFepManager::IsHybridAlphaModeChangedtoAplhanumeric() const
- {
- return iHybridAplphaChangedToAlphanumeric;
- }
-
-TBool CAknFepManager::IsPhoneNumberEditor() const
- {
- TBool phoneEditor = (EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor);
- return phoneEditor;
- }
-CAknFepFnKeyManager::TFnKeyState CAknFepManager::FnKeyState()
- {
- return iFnKeyManager->FnKeyState();
- }
-void CAknFepManager::SetFnKeyState(CAknFepFnKeyManager::TFnKeyState aState)
- {
- iFnKeyManager->SetFnKeyState(aState);
- }
-#ifdef __REVERSE_FN_KEY_SUPPORTED
-TBool CAknFepManager::IsReverseFnkeyInput()
- {
- return iIsReverseFnkeyInput;
- }
-void CAknFepManager::SetReverseFnkeyInputMode(TBool iIsOn)
- {
- iIsReverseFnkeyInput = iIsOn;
- }
-TBool CAknFepManager::IsValidCharInNumericEditorL( TChar aChar ) const
- {
- if(!EditorState())
- {
- return EFalse;
- }
- TBool validChar = EFalse;
- if( aChar.IsDigit() )
- {
- return ETrue;
- }
- TBool phoneIdle = (EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor);
- if( (phoneIdle || (IsHybridAplhaEditor() && !IsHybridAlphaModeChangedtoAplhanumeric()))
- && aChar == '#')
- {
- return ETrue;
- }
- if( aChar == '.' && EAknEditorConverterNumberModeKeymap == iAknEditorNumericKeymap)
- {
- return ETrue;
- }
- if( IsAllowedKeymappingForNumberMode(aChar) )
- {
- return ETrue;
- }
-
- TInt resourceSCTId = EditorState()->SpecialCharacterTableResourceId();
- // No SCT table use default SCT
- if( resourceSCTId == KErrNotFound || !resourceSCTId ||
- (IsHybridAplhaEditor()&& !IsHybridAlphaModeChangedtoAplhanumeric()))
- {
- resourceSCTId = NumericModeSCTResourceId();
- }
-
- if( resourceSCTId )
- {
- TResourceReader reader;
- CEikonEnv::Static()->CreateResourceReaderLC(reader,resourceSCTId);
- reader.ReadInt32(); // skip sct id
- TPtrC chars=reader.ReadTPtrC(); // read special char
- validChar = ( chars.Locate(aChar)>=0 );
- CleanupStack::PopAndDestroy();
- }
- return validChar;
-
- }
-TInt CAknFepManager::GetNumericSCTResID()
- {
- if(!EditorState())
- {
- return NumericModeSCTResourceId();
- }
- TInt resourceSCTId = EditorState()->SpecialCharacterTableResourceId();
- if(resourceSCTId == KErrNotFound || !resourceSCTId )
- {
- resourceSCTId = NumericModeSCTResourceId();
- }
- return resourceSCTId;
- }
-
-TBool CAknFepManager::IsValidCharForNumericInFnReverseL(TInt aKey, TPtiTextCase aCase)
- {
- if(!EditorState())
- {
- return EFalse;
- }
- TBuf<32> keyMaps;
- iPtiEngine->MappingDataForKey( (TPtiKey)aKey, keyMaps, aCase);
-
- TBool validKey(EFalse);
- if( keyMaps.Length()<= 0 )
- {
- return validKey;
- }
- TChar chr =keyMaps[0];
- if( chr.IsDigit() )
- {
- return ETrue;
- }
-
- TInt resourceSCTId = EditorState()->SpecialCharacterTableResourceId();
- // No SCT table use default SCT
- if( resourceSCTId == KErrNotFound || !resourceSCTId )
- {
- resourceSCTId = NumericModeSCTResourceId();
- }
-
- if( resourceSCTId )
- {
- TResourceReader reader;
- CEikonEnv::Static()->CreateResourceReaderLC(reader,resourceSCTId);
- reader.ReadInt32(); // skip sct id
- TPtrC chars=reader.ReadTPtrC(); // read special char
-
- validKey = (chars.Locate(chr)>=0 );
- if(chr.IsAlpha())
- {
- chr.UpperCase();
- validKey |= (chars.Locate(chr)>=0 ) ;
- }
-
- CleanupStack::PopAndDestroy();
- }
-
- return validKey;
-
- }
-#endif //__REVERSE_FN_KEY_SUPPORTED
-void CAknFepManager::AddOneSpaceOrMoveCursorL()
- {
- if(static_cast<TChar>(NextChar()).IsSpace())
- {
- TCursorSelection sel;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(sel);
- sel.iCursorPos++;
- sel.iAnchorPos++;
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel);
- }
- else if(IsEditorHasFreeSpace())
- {
- SimulateKeyEventL(EKeySpace);
- }
- SimulateKeyEventL(EKeyF19);
- }
-#endif
-TBool CAknFepManager::IsOnlyNumericPermitted() const
- {
- if (IsFeatureSupportedJapanese())
- {
- return !(iPermittedInputModes & ~(EAknEditorNumericInputMode
- | EAknEditorFullWidthNumericInputMode) );
- }
- else
- {
- // Only non-japanese modes are considered.
- return !( iPermittedInputModes &
- (EAknEditorTextInputMode | EAknEditorSecretAlphaInputMode) );
- }
- }
-
-void CAknFepManager::TryIncrementModeL(TInt aCurrentMode)
- {
- //check that we are currently in the correct mode
- __ASSERT_DEBUG(IsModePermitted(iMode),
- AknFepPanic(EAknFepPanicNonPermittedEditorMode));
- __ASSERT_DEBUG(iInputCapabilities.FepAwareTextEditor(),
- AknFepPanic(EAknFepPanicNoHandleToFepAwareTextEditor));
-
- const TInt lastModePos = iHashKeyLoop.Count()-1 ;
- const TInt currentModePos = iHashKeyLoop.Find(aCurrentMode);
- TInt newModePos = currentModePos;
-
- __ASSERT_DEBUG(currentModePos != KErrNotFound ,
- AknFepPanic(EAknFepPanicNonPermittedEditorMode));
-
- do {
- if (newModePos == lastModePos)
- {
- //we've got to the end of the hash key loop, go back to the beginning
- newModePos = 0;
- }
- else
- {
- newModePos++;
- }
-
- if (TryChangeModeL(iHashKeyLoop[newModePos]))
- {
- return; //succeeded to move to next available mode
- }
- }
- while (newModePos != currentModePos);
- }
-
-void CAknFepManager::TryIncrementModeChineseQwertyL(TInt aCurrentMode)
- {
- __ASSERT_DEBUG(IsModePermitted(aCurrentMode),AknFepPanic(EAknFepPanicNonPermittedEditorMode));
-
- const TInt lastModePos = iHashKeyLoop.Count() - 1 ;
- const TInt currentModePos = iHashKeyLoop.Find(aCurrentMode);
- TInt newModePos = currentModePos;
-
- __ASSERT_DEBUG(currentModePos != KErrNotFound ,
- AknFepPanic(EAknFepPanicNonPermittedEditorMode));
-
- do
- {
- if (newModePos == lastModePos)
- {
- //we've got to the end of the hash key loop, go back to the beginning
- newModePos = 0;
- }
- else
- {
- newModePos++;
- }
- }while(iHashKeyLoop[newModePos] == ENumber && !IsOnlyNumericPermitted()); // no number mode in Chinese qwerty input, except those editors which only support number
-
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- if(TryChangeModeL(iHashKeyLoop[newModePos]))
- {
- return; //succeeded to move to next available mode
- }
- }
-
-void CAknFepManager::TryIncrementChineseModeForQwertyL( TInt aCurrentMode )
- {
- __ASSERT_DEBUG(IsModePermitted(aCurrentMode),AknFepPanic(EAknFepPanicNonPermittedEditorMode));
-
- const TInt lastModePos = iHashKeyLoop.Count() - 1;
- const TInt currentModePos = iHashKeyLoop.Find( aCurrentMode );
- TInt newModePos = currentModePos;
-
- __ASSERT_DEBUG(currentModePos != KErrNotFound ,
- AknFepPanic(EAknFepPanicNonPermittedEditorMode));
-
- do
- {
- if ( newModePos == lastModePos )
- {
- //we've got to the end of the hash key loop, go back to the beginning
- newModePos = 0;
- }
- else
- {
- newModePos++;
- }
- }
- while ( (iHashKeyLoop[newModePos] == ENumber
- && !IsOnlyNumericPermitted()) || (iHashKeyLoop[newModePos] == ELatin
- && IsChangeModeByShiftAndSpace() ) ); // no number mode and latin in Chinese qwerty input, except those editors which only support number
-
- SendEventsToPluginManL( EPluginCloseMode, EFalse );
- if ( TryChangeModeL( iHashKeyLoop[newModePos] ) )
- {
- return; //succeeded to move to next available mode
- }
- }
-
-void CAknFepManager::TryChangeToSharedDataModeL()
- {
- TInt sharedDataMode = iSharedDataInterface->InputMode();
- TryChangeModeL(sharedDataMode);
- }
-
-void CAknFepManager::TryChangeToModeBeforeL()
- {
- if (TryChangeModeL(iModeBefore))
- {
- if (iModeBefore==ELatin)
- {
- if ( iCaseBefore )
- {
- iCaseMan->SetCurrentCase(iCaseBefore);
- }
- else
- {
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- }
- }
- }
-
-#ifdef RD_HINDI_PHONETIC_INPUT
-
-TBool CAknFepManager::IsIndicPhoneticInputLanguage() const
- {
- MPtiLanguage* ptilang = iPtiEngine->CurrentLanguage();
- TInt currentPtiLang = (ptilang)? ptilang->LanguageCode() : 0;
- return (TAknFepUiIndicInputManager::IsIndicPhoneticLanguage(TLanguage(currentPtiLang)));
- }
-
-void CAknFepManager::TryChangePhoneticModeL()
- {
- MPtiLanguage* ptilang = iPtiEngine->CurrentLanguage();
- TInt currentPtiLang = (ptilang)? ptilang->LanguageCode() : 0;
- TInt lang = 0;
-
- (TAknFepUiIndicInputManager :: IsIndicPhoneticLanguage(TLanguage(currentPtiLang)))?
- lang = ELangEnglish : lang = iLanguageCapabilities.iInputLanguageCode;
-
- iPtiEngine->ActivateLanguageL(lang);
- iLangMan->SetInputLanguageL(lang);
- InternalFepUI()->SetMode(iMode, EFalse, iQwertyInputMode);
- iCaseMan->UpdateCase(ENullNaviEvent);
- UpdateIndicators();
- CommitInlineEditL();
- }
-
-TInt CAknFepManager::SetPhoneticIndicator(TLanguage aInputLanguage)
- {
- TInt newState = 0;
- TInt currentCase = iCaseMan->CurrentCase();
-
- switch(aInputLanguage)
- {
- case KLangHindiPhonetic:
- if(currentCase == EAknEditorUpperCase)
- {
- newState = EIndicatorStateHindiPhoneticUpper;
- }
- else
- {
- newState = EIndicatorStateHindiPhoneticLower;
- }
- break;
- default:
- break;
- }
- return newState;
- }
-#endif
-TBool CAknFepManager::TryChangeModeL(TInt aMode)
- {
- CAknEdwinState* editorState = EditorState();
- TInt sharedDataMode = iSharedDataInterface->InputMode();
-
- if (aMode == EStroke && iQwertyInputMode && sharedDataMode == ECangJie)
- {
- iEditorStateStrokeUsed = editorState;
- iStrokeUsedInQWERTY = ETrue;
- }
- else if (iEditorStateStrokeUsed == editorState)
- {
- iStrokeUsedInQWERTY = EFalse;
- }
-
- if (aMode == ECangJie && !iQwertyInputMode &&
- (iFepPluginManager->PluginInputMode() != EPluginInputModeVkb
- || iFepPluginManager->PluginInputMode() != EPluginInputModeFSQ))
- {
- aMode = EStroke;
- }
-
- if (aMode == ELatinText ||aMode == ELatinUpper || aMode == ELatinLower)
- {
- if (TryChangeModeL(ELatin))
- {
- if ( !(iAknEditorFlags & EAknEditorFlagFixedCase) )
- {
- if (aMode == ELatinText)
- {
- ClearFlag(EFlagSupressAutoUpdate);
- }
- else if (aMode == ELatinUpper)
- {
- //Modify for allow text case after entering a dot and space
- ClearFlag(EFlagSupressAutoUpdate);
- //Modify for allow text case after entering a dot and space
- iCaseMan->SetCurrentCase(EAknEditorUpperCase);
- }
- else //lower
- {
- //Modify for allow text case after entering a dot and space
- ClearFlag(EFlagSupressAutoUpdate);
- //Modify for allow text case after entering a dot and space
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- }
- UpdateIndicators();
- }
- return ETrue;
- }
- return EFalse;
- }
-
- if ( iQwertyInputMode && ( aMode == ENumber || aMode == ENativeNumber ) &&
- !IsOnlyNumericPermitted()
- // Add this condition to exclude all touch inputmethods.
- // When change to number range on touch inputmethods, fn key state can't be locked.
- && iFepPluginManager
- && iFepPluginManager->PluginInputMode() == EPluginInputModeNone )
- {
- if (TryChangeModeL(ELatin))
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // If editor should be launched in FnLock state, because in case of QWERTY keypad
- // Current numeric mode converted to alphanumeric mode.
- if( iFnKeyManager )
- {
- iFnKeyManager->SetFnKeyState(CAknFepFnKeyManager::EFnKeyLock);
- SetCase((TCase)EFnKeyLowerCase);
- }
-#endif // RD_INTELLIGENT_TEXT_INPUT
- return ETrue;
- }
- }
-
- if (IsModePermitted(aMode))
- {
- if (aMode == ELatin)
- {
- if (iAknEditorFlags & EAknEditorFlagNoT9)
- {
- SetWesternPredictive(EFalse);
- }
-
- if (iAknEditorFlags & EAknEditorFlagFixedCase)
- {
- iCaseMan->ConfigureCaseStateFromEditorState();
- }
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if (!iQwertyInputMode && WesternPredictive() && iFepManState == EAknFepStateUIActive)
-#else
- if (WesternPredictive() && iFepManState == EAknFepStateUIActive)
-#endif
- {
- TryRemoveNoMatchesIndicatorL();
- UpdateCbaL(NULL);
- }
- TryCloseUiL();
-
- // getting a new ui manager object corresponded in aMode.
- MAknFepManagerInterface* fepUI = iLangMan->GetFepUI(aMode, iCharWidth,
- IsPredictive(aMode));
- // getting the currect language id from ptiengine.
- MPtiLanguage* ptilang = iPtiEngine->CurrentLanguage();
- TInt currentPtiLang = (ptilang)? ptilang->LanguageCode() : 0;
- // getting the supported language id in current ui manager.
- TInt currentUiLang = fepUI->SupportLanguage(aMode);
-
- // changing language id both ptiengine and ui manager
- // 1. check the currect ui manager for input mode
- // 2. check the current ptiengine and ui manager
- if (iCurrentFepUI != fepUI
- || currentPtiLang != currentUiLang)
- {
- iCurrentFepUI = fepUI;
- TInt err = iPtiEngine->ActivateLanguageL(currentUiLang);
- if (err != KErrNone)
- {
-#ifdef _DEBUG
- RDebug::Print(_L("ActivateLanguageL error return code=[%d] language id=[%d]"),
- err, iLanguageCapabilities.iInputLanguageCode);
-#endif
- ChangeInputLanguageL(ELangEnglish);
- return ETrue;
- }
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef FF_DUAL_LANGUAGE_SUPPORT
- // Change secondary input
- iPtiEngine->SetSecondaryInputL(iSharedDataInterface->InputTextLanguageSecondary());
-#endif //FF_DUAL_LANGUAGE_SUPPORT
-#endif
-
-//#ifndef RD_INTELLIGENT_TEXT_INPUT
- TBuf<50> mapData;
- //Init Data
- for (TInt i = 0; i < 50; i++)
- {
- mapData.Append(0);
- }
-
- //Backup original input mode
- TPtiEngineInputMode oriMode = iPtiEngine->InputMode();
-
- //Change current input mode, since MappingDataForKey I/F only worked
- //when in EPtiEngineMultitapping mode
- iPtiEngine->SetInputMode(EPtiEngineMultitapping);
- iPtiEngine->MappingDataForKey(EPtiKey1, mapData, iPtiEngine->Case());
-
- //Restore
- iPtiEngine->SetInputMode(oriMode);
-
- //Get first three symbols
- if(mapData.Length() > 0)
- {
- iSymbolData.iSymbol1 = mapData[0];
-
- if (mapData.Length() > 1)
- iSymbolData.iSymbol2 = mapData[1];
- if (mapData.Length() > 2)
- iSymbolData.iSymbol3 = mapData[2];
- }
-
- //Write data to stream
- if (iFepPluginManager && iFepPluginManager->CurrentPluginInputFepUI())
- {
- iFepPluginManager->CurrentPluginInputFepUI()->HandleCommandL(
- ECmdPenInputSymbolOfHardKeyOne, reinterpret_cast<TInt>(&iSymbolData));
- }
-//#endif
- iMode = aMode;
-
-#ifdef RD_SCALABLE_UI_V2
- if ( IsChineseInputMode( aMode ) )
- {
- iLastChineseInputMode = aMode;
- }
-#endif // RD_SCALABLE_UI_V2
- if(iMode == ENumber || iMode == ENativeNumber )
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- ClearFlag(CAknFepManager::EFlagNewSharedDataInputLanguage);
- ClearFlag(CAknFepManager::EFlagNewSharedDataInputMode);
-#endif // RD_INTELLIGENT_TEXT_INPUT
- InternalFepUI()->SetNumberModeKeyMappingL(iAknEditorNumericKeymap);
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- InternalFepUI()->SetMode(iMode, IsPredictive(), iQwertyInputMode, KeyboardLayout());
-#else
- InternalFepUI()->SetMode(iMode, IsPredictive(), iQwertyInputMode);
-#endif
- iHashKeyMan->SetMode(iMode, IsPredictive());
- // ensure editor is aware of new fep mode
- if ( IsFepAwareTextEditor() )
- {
- EditorState()->SetCurrentInputMode(EditorModeFromFepMode(aMode));
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- AdjustCursorTypeForCurrentPosition();
- }
-
- // when cursor is in between two words and SCT is launched and
- // cancel key is pressed, dont move the cursor at the end of
- // second word.
- if (WesternPredictive(aMode) && !iUncommittedText.Length()
- && CursorInsideWord() && !IsCcpuFlagSet(ECcpuStateSupressCursorMoveToEnd)
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- && (!iSupressCursorMoveToEndChrKeyPressed)
-#endif //RD_INTELLIGENT_TEXT_INPUT
- )
- {
- MoveCursorToEndOfWordL();
- }
- else
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- iSupressCursorMoveToEndChrKeyPressed = EFalse;
-#endif //RD_INTELLIGENT_TEXT_INPUT
- ClearCcpuFlag(ECcpuStateSupressCursorMoveToEnd);
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Ensure that autocompletion state is updated
- if (WesternPredictive())
- {
- SetAutoCompletionState(iSharedDataInterface->PredictiveTextAutoCompleteOn());
- }
-#endif
- // Set multitap timer to PtiEngine for Japanese variant only
- if (IsFeatureSupportedJapanese())
- {
- TInt timeout = (iInputCapabilities.SupportsSecretText())?
- KSyncPasswdTimeout : iMultiTapTimer;
- iPtiEngine->HandleCommandL(EPtiCommandSetMultitapTimer, &timeout);
- iPtiEngine->HandleCommandL(EPtiCommandSetJapaneseQwertyFlags, &iJapaneseQwertyFlags);
- TInt clear = iSharedDataInterface->ClearDirection();
- iPtiEngine->HandleCommandL(EPtiCommandSetClearFunction, &clear);
- // Send PtiEngine the command whether Pictograph is allowed in Candidate list
- TInt allow = IsAbleToLaunchPCT();
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- iPtiEngine->HandleCommandL(EPtiCommandAllowPictographCandidate, &allow);
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
-
- UpdateIndicators(); // moved to bottom to avoid extra indicator updates
-
- return ETrue;
- }
- return EFalse;
- }
-
-void CAknFepManager::ChangeInputLanguageL(TInt aInputLanguage)
- {
- if(iLangMan)
- {
- iLangMan->SetInputLanguageL(aInputLanguage);
-
- SetInputLanguageCapabilities(aInputLanguage);
-
- ReadHashKeyLoopL();
- // we need to make sure that we commit the word to ptiengine,
- // so that the word gets added to the UWD
- SetCcpuFlag(ECcpuStataCommitPredictiveWord);
- // Addition for ITI on FSQ
- // When FSQ is opened with the ITI-supported input language,
- // if switch to another language which doesn't support ITI, such as Korean,
- // need to restore the previous configuration on FEP
- if ( iFepPluginManager )
- {
- iFepPluginManager->ResetItiStateL();
- }
- if ( !TryChangeModeL(NewInputModeAfterLanguageChange()) )
- {
- if ( !TryChangeModeL(ELatin) )
- {
- // If the editor does not support text input mode, we try number mode.
- if( IsInputModeAvailable(ENativeNumber) &&
- ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic ||
- iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) )
- {
- TryChangeModeL(ENativeNumber);;
- }
- else
- {
- TryChangeModeL(ENumber);
- }
- }
- }
-
- if (!iLanguageCapabilities.iLocalInputLanguageInUse)
- {
- 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;
- }
- }
-
- SetHashKeyStyle();
- UpdateEditorContext();
- }
- //add notify to phrase creation udbmanagement view
-
- if(iUserdbdlg)
- {
- iUserdbdlg->OnChangeLanguageL( aInputLanguage );
- if ( aInputLanguage != ELangPrcChinese &&
- aInputLanguage != ELangTaiwanChinese &&
- aInputLanguage != ELangHongKongChinese )
- {
- iUserdbdlg = NULL;
- }
- }
- }
-
-void CAknFepManager::RemovePreviousCharacterL()
- {
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- CommitInlineEditL();
- }
-
- // Set cursor span on previous character
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- if (iUncommittedText.iAnchorPos > 0)
- {
- iUncommittedText.iAnchorPos--;
- }
-
-
- // get text to replace
- TBuf<ESingleCharacter> charToReplace;
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(charToReplace,
- iUncommittedText.iAnchorPos,
- ESingleCharacter);
-
- // delete the character with an inline edit
- StartInlineEditL(iUncommittedText, charToReplace, ESingleCharacter, EFalse);
- UpdateInlineEditL(KNullDesC, 0);
- CommitInlineEditL();
- }
-
-void CAknFepManager::RemoveZWSCharacterL( TBool aIsViramaInputted,
- TBool aIsInMultitappingHalant,
- TBool aIsCharModifier,
- TBool aIsLigaturePresent /*= EFalse*/)
- {
- CTextLayout* textLayout = TextLayout();
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if(!textLayout && !docNavi)
- return;
-
- if( aIsLigaturePresent )
- {
- TTmDocPosSpec pos = DocPos();
- TTmPosInfo2 info;
- TTmLineInfo lineInfo;
- if (docNavi)
- {
- docNavi->FindDocPos(pos, info, lineInfo);
- }
- else
- {
- textLayout->TagmaTextLayout().FindDocPos(pos, info, lineInfo);
- }
-
- if( IsZWSCharacterPresent( ETrue ) )
- {
- TInt commitPoint = pos.iPos - 2;
- if( IsFlagSet( EFlagInsideInlineEditingTransaction ) )
- {
- CommitInlineEditL();
- }
-
- TCursorSelection sel( commitPoint, commitPoint );
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel);
- }
- }
- else
- {
- if ( IsFlagSet(EFlagInsideInlineEditingTransaction) && IsZWSCharacterPresent())
- {
- CommitInlineEditL();
- }
- }
-
- TTmDocPosSpec pos = DocPos();
- pos.iType = TTmDocPosSpec::ETrailing;
- TTmPosInfo2 info;
- TTmLineInfo lineInfo;
- if ( ! iInputCapabilities.SupportsSecretText() )
- {
- if (docNavi)
- {
- docNavi->FindDocPos(pos, info, lineInfo);
- }
- else
- {
- textLayout->TagmaTextLayout().FindDocPos(pos, info, lineInfo);
- }
- TBuf<2> previousCharacter;
- TBuf<1> zwsPrevChar;
- previousCharacter.FillZ();
- zwsPrevChar.FillZ();
- TBool found = EFalse;
-
- TCursorSelection curSel;
- if ( IsFepAwareTextEditor() )
- {
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(curSel);
- TInt lowerpos = curSel.LowerPos();
- if( lowerpos > 0)
- {
- if(lowerpos > 1)
- iInputCapabilities.FepAwareTextEditor()->
- GetEditorContentForFep(previousCharacter, lowerpos - 2, 2);
- else
- iInputCapabilities.FepAwareTextEditor()->
- GetEditorContentForFep(previousCharacter, lowerpos - 1, 1);
-
- if( lowerpos > 1 )
- {
- if(previousCharacter[1] == ZERO_WIDTH_SPACE)
- {
- zwsPrevChar.Append(previousCharacter[1]);
- if( aIsInMultitappingHalant )
- {
- curSel.iAnchorPos = lowerpos - 2;
- }
- else
- {
- curSel.iAnchorPos = lowerpos - 1;
- }
- found = ETrue;
- }
- else if( previousCharacter[0] == ZERO_WIDTH_SPACE )
- {
- zwsPrevChar.Append(previousCharacter[0]);
- curSel.iAnchorPos = lowerpos - 2;
- curSel.iCursorPos = lowerpos - 1;
- found = ETrue;
- }
- }
- else
- {
- if(previousCharacter[0] == ZERO_WIDTH_SPACE)
- {
- zwsPrevChar.Append(previousCharacter[0]);
- if( aIsInMultitappingHalant )
- {
- curSel.iAnchorPos = lowerpos - 2;
- }
- else
- {
- curSel.iAnchorPos = lowerpos - 1;
- }
- found = ETrue;
- }
- }
-
- }
- }
- if( found )
- {
- StartInlineEditL(curSel, zwsPrevChar, ESingleCharacter, ETrue);
- UpdateInlineEditL(KNullDesC, 0);
- CommitInlineEditL();
- if ( !aIsInMultitappingHalant && ! iInputCapabilities.SupportsSecretText() )
- {
- if ( aIsViramaInputted )
- {
- TTmDocPosSpec pos = DocPos();
- TTmPosInfo2 infotemp;
- if (docNavi)
- {
- docNavi->FindDocPos(pos, info, lineInfo);
- }
- else
- {
- textLayout->TagmaTextLayout().FindDocPos(pos, info, lineInfo);
- }
- if(NextChar() && TAknFepUiIndicInputManager::IsCharBaseConsonant(NextChar(),
- TLanguage(iLanguageCapabilities.iInputLanguageCode)))
- {
- TInt nextPos;
- if (docNavi)
- {
- nextPos = docNavi->FindNextPos(pos.iPos);
- }
- else
- {
- nextPos = textLayout->TagmaTextLayout().FindNextPos(pos.iPos);
- }
- info.iDocPos.iPos = nextPos;
- }
- else if((TAknFepUiIndicInputManager::IsCharAnVowel(NextChar(),
- TLanguage(iLanguageCapabilities.iInputLanguageCode)))
- &&(aIsCharModifier && TAknFepUiIndicInputManager::IsCharVirama(
- PreviousChar(), TLanguage(iLanguageCapabilities.iInputLanguageCode))))
- {
- bool posFound;
- if (docNavi)
- {
- posFound = docNavi->GetNextVisualCursorPos(pos, infotemp, EFalse);
- }
- else
- {
- posFound = textLayout->TagmaTextLayout().GetNextVisualCursorPos(pos,
- infotemp,
- EFalse);
- }
-
- if (posFound)
- {
- info.iDocPos.iPos = infotemp.iDocPos.iPos;
- }
- }
- TCursorSelection sel(info.iDocPos.iPos ,info.iDocPos.iPos );
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel);
- }
- else
- {
- TCursorSelection sel(info.iDocPos.iPos - 1,info.iDocPos.iPos - 1);
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel);
- }
-
- SendEventsToPluginManL( EPluginSyncFepAwareText );
- }
- }
- }
- }
-
-void CAknFepManager::TryChangePredictiveInputModeL(TBool aFlag)
- {
- if(Japanese() && iMode != ELatin)
- {
- if(aFlag)
- {
- if (!(iAknEditorFlags & EAknEditorFlagNoT9)
- && HasJapanesePredictionInputMode())
- {
- iJapanesePredictive = aFlag;
- iSharedDataInterface->SetJapanesePredictiveTextOn();
- }
- }
- else
- {
- iJapanesePredictive = aFlag;
- iSharedDataInterface->ResetJapanesePredictiveTextOn();
- }
- }
- else
- {
- SetWesternPredictive(aFlag);
- }
- TryChangeModeL(iMode);
- }
-
-MCoeFepAwareTextEditor* CAknFepManager::FepAwareTextEditor() const
- {
- return iInputCapabilities.FepAwareTextEditor();
- }
-
-TBool CAknFepManager::IsFepAwareTextEditor() const
- {
-#ifdef RD_SCALABLE_UI_V2
- return FullyFepAwareTextEditor();
-#else
- return ( iInputCapabilities.FepAwareTextEditor() ? ETrue : EFalse );
-#endif
- }
-
-TCursorSelection CAknFepManager::UncommittedText() const
- {
- return iUncommittedText;
- }
-
-void CAknFepManager::SetCase(TCase aCase)
- {
- // For QWERTY only keypad, extended input state like FnLock is applicable.
- // In case of ITU-T keypad, this flag should not be part of editor flag.
- // In case of numeric only editor Only FnReverse state is valid and editor will be on EFnReverse
- // State if FnKey is hold on state.
-
- //TODO: In case of other functionized input state like (FnNext), it should be stored in editor
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(EditorState())
- {
- if( iFnKeyManager && ( iFnKeyManager->FnKeyState()== CAknFepFnKeyManager::EFnKeyLock ) )
- {
- EditorState()->SetFlags( EditorState()->Flags() | EAknEditorFlagFnLock );
- }
- else
- {
- EditorState()->SetFlags( EditorState()->Flags() & ~EAknEditorFlagFnLock );
- }
- }
-#endif
-
- InternalFepUI()->SetCase(aCase);
- }
-
-CAknEdwinState* CAknFepManager::EditorState() const
- {
- if ( IsFepAwareTextEditor() )
- {
- MCoeFepAwareTextEditor* fepAvareTextEditor = iInputCapabilities.FepAwareTextEditor();
-
- if ( fepAvareTextEditor && fepAvareTextEditor->Extension1() )
- {
- return static_cast<CAknEdwinState*>( fepAvareTextEditor->Extension1()->State( KNullUid ) );
- }
- }
- return NULL;
- }
-
- void CAknFepManager::SetPredictiveIndicatorState(TAknEditingState& aState)
- {
-
- TInt currentCase = iCaseMan->CurrentCase();
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- if(iIsAutoCompleteOn && iLanguageCapabilities.iInputLanguageCode != ELangThai)
- {
- if (iLanguageCapabilities.iInputLanguageCode == ELangArabic)
- aState=EAutoCompleteArabic;
-
- else if (iLanguageCapabilities.iInputLanguageCode == ELangHebrew)
- aState=EAutoCompleteHebrew;
-
- else if (iLanguageCapabilities.iInputLanguageCode == ELangFarsi ||
- iLanguageCapabilities.iInputLanguageCode == ELangUrdu)
- aState=EAutoCompleteFarsiAndUrdu;
- /*Hindi*/
- else if ( (iLanguageCapabilities.iInputLanguageCode == ELangHindi) || (iLanguageCapabilities.iInputLanguageCode == ELangMarathi))
- aState = EAutoCompleteHindi;
-
- else if(iLanguageCapabilities.iInputLanguageCode == ELangVietnamese)
- {
- switch (currentCase)
- {
- case EAknEditorUpperCase:
- aState = EAutoCompleteUpperVietnamese;
- break;
- case EAknEditorLowerCase:
- aState = EAutoCompleteLowerVietnamese;
- break;
- case EAknEditorTextCase:
- aState = EAutoCompleteShiftedVietnamese;
- break;
- default:
- break;
- }
- }
- else
- {
- switch (currentCase)
- {
- case EAknEditorUpperCase:
- aState = EAutoCompleteUpper;
- break;
- case EAknEditorLowerCase:
- aState = EAutoCompleteLower;
- break;
- case EAknEditorTextCase:
- aState = EAutoCompleteShifted;
- break;
- default:
- break;
- }
- }
-
- }
- else
-#endif //RD_INTELLIGENT_TEXT_INPUT
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNone)
- {
- aState = EFnKeyPressed;
- if(iFnKeyManager->FnKeyState() == CAknFepFnKeyManager::EFnKeyLock)
- aState = EFnKeyLocked;
- }
- else
-#endif
- {
- if (iLanguageCapabilities.iInputLanguageCode == ELangArabic)
- aState = ET9Arabic;
-
- else if (iLanguageCapabilities.iInputLanguageCode == ELangHebrew)
- aState = ET9Hebrew;
-
- else if (iLanguageCapabilities.iInputLanguageCode == ELangFarsi ||
- iLanguageCapabilities.iInputLanguageCode == ELangUrdu)
- aState = ET9FarsiAndUrdu;
-
- else if (iLanguageCapabilities.iInputLanguageCode == ELangThai)
- aState = ET9Thai;
-
- /*Hindi*/
-#ifdef RD_MARATHI
- /*Marathi*/
- else if ( iLanguageCapabilities.iInputLanguageCode == ELangMarathi )
- aState = EIndicatorStatePredictiveMarathi;
-#endif // RD_MARATHI
-
- else if(iLanguageCapabilities.iInputLanguageCode == ELangVietnamese)
- {
- switch (currentCase)
- {
- case EAknEditorUpperCase:
- aState = ET9UpperVietnamese;
- break;
- case EAknEditorLowerCase:
- aState = ET9LowerVietnamese;
- break;
- case EAknEditorTextCase:
- aState = ET9ShiftedVietnamese;
- break;
- default:
- break;
- }
- }
-
- else if(iLanguageCapabilities.iInputLanguageCode == ELangGreek)
- {
- switch (currentCase)
- {
- case EAknEditorUpperCase:
- aState = ET9UpperGreek;
- break;
- case EAknEditorLowerCase:
- aState = ET9LowerGreek;
- break;
- case EAknEditorTextCase:
- aState = ET9ShiftedGreek;
- break;
- default:
- break;
- }
- }
-
- //Cyrillic alphabet is used for Russian, Bulgarian and
- //Ukranian languages
- else if(iLanguageCapabilities.iInputLanguageCode == ELangRussian ||
- iLanguageCapabilities.iInputLanguageCode == ELangBulgarian ||
- iLanguageCapabilities.iInputLanguageCode == ELangUkrainian )
- {
- switch (currentCase)
- {
- case EAknEditorUpperCase:
- aState = ET9UpperCyrillic;
- break;
- case EAknEditorLowerCase:
- aState = ET9LowerCyrillic;
- break;
- case EAknEditorTextCase:
- aState = ET9ShiftedCyrillic;
- break;
- default:
- break;
- }
- }
- else
- {
- switch (currentCase)
- {
- case EAknEditorUpperCase:
- aState = ET9Upper;
- break;
- case EAknEditorLowerCase:
- aState = ET9Lower;
- break;
- case EAknEditorTextCase:
- aState = ET9Shifted;
- break;
- default:
- break;
- }
- }
-
- }
- }
-void CAknFepManager::UpdateIndicators()
- {
- if(ELongKeyPress == iKeyRepeat)
- return;
- // If it is fepware editor update the Indicators
- // otherwise not need excute remainig part of code.
- if( !iInputCapabilities.FepAwareTextEditor() || !iFepFullyConstructed )
- {
- //Ensure, If no idicator is require, make indicator state None
- if (!IsFlagSet(EFlagForegroundUIComponentVisible | EFlagMenuPaneVisible))
- iIndicator->SetState(EStateNone);
- return;
- }
-
- TAknEditingState newState = EStateNone;
- MPtiLanguage* ptiLang = PtiEngine()->CurrentLanguage();
- MAknEditingStateIndicator* editingStateIndicator = EditingStateIndicator();
-
- TBool findPaneIndicator(
- iAknEditorFlags & EAknEditorFlagNoEditIndicators &&
- iAknEditorFlags & EAknEditorFlagForceTransparentFepModes &&
- editingStateIndicator != (MAknEditingStateIndicator*)iIndicator );
-
-#ifdef RD_SCALABLE_UI_V2
- TBool fingerItutIndicator = ( iFepPluginManager &&
- iFepPluginManager->PluginInputMode() == EPluginInputModeItut );
-#else
- TBool fingerItutIndicator = EFalse;
-
-#endif
- if ( IsHybridAplhaEditor() && !iHybridAplphaChangedToAlphanumeric )
- {
- newState = EHybridModeLatin;
- }
- else if (!(iAknEditorFlags & EAknEditorFlagNoEditIndicators)
- || findPaneIndicator || fingerItutIndicator)
- {
-
-#ifdef RD_SCALABLE_UI_V2
- if ( ( IsFlagSet(EFlagQwertyShiftMode) || IsFlagSet(EFlagLongShiftKeyPress)) &&
- ((iFepPluginManager && iFepPluginManager->PluginInputMode() == EPluginInputModeVkb) ||
- #ifndef RD_INTELLIGENT_TEXT_INPUT
- iQwertyInputMode
- #else
- ( iQwertyInputMode && (IsFlagSet(EFlagQwertyShiftMode) ||IsFlagSet(EFlagLongShiftKeyPress))
- && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNext)
- && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyLock)
- && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyForced)
- )
- #endif
- ))
-#else
- if ( iQwertyInputMode && IsFlagSet(EFlagQwertyShiftMode))
-
-#endif
- {
- newState = EQwertyShift;
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // To keep the shift key indicator in
- // Check if fn/shift both key are pressed
- if((iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNone) &&
- (IsFlagSet(EFlagQwertyShiftMode) || IsFlagSet(EFlagLongShiftKeyPress)))
- {
- newState = EFnKeyPressed;
- }
-#endif
-
- }
- else
- {
- switch (iMode)
- {
- case EHiraganaKanji:
- if (IsPredictive())
- {
- newState = EIndicatorStateJapanesePredictive;
- }
- else
- {
- newState = EIndicatorStateHiraganaKanji;
- }
- break;
- case EKatakana:
- if (iCharWidth == EHalfWidthChar)
- {
- newState = EIndicatorStateHalfKatakana;
- }
- else if (iCharWidth == EFullWidthChar)
- {
- newState = EIndicatorStateFullKatakana;
- }
- break;
- case EHiragana:
- {
- newState = EIndicatorStateHiragana;
- }
- break;
- case EPinyin:
- if (ptiLang->HasInputMode(EPtiEnginePinyinByPhrase))
- {
- newState = EIndicatorStatePinyinPhrase;
- }
- else
- {
- newState = EIndicatorStatePinyin;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if ( iFnKeyManager->FnKeyState()
- == CAknFepFnKeyManager::EFnKeyLock )
- newState = EFnKeyLocked;
- else if ( iFnKeyManager->FnKeyState()
- != CAknFepFnKeyManager::EFnKeyNone )
- newState = EFnKeyPressed;
-#endif
- break;
- case EZhuyin:
- if (ptiLang->HasInputMode(EPtiEngineZhuyinByPhrase))
- {
- newState = EIndicatorStateZhuyinPhrase;
- }
- else
- {
- newState = EIndicatorStateZhuyin;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if ( iFnKeyManager->FnKeyState()
- == CAknFepFnKeyManager::EFnKeyLock )
- newState = EFnKeyLocked;
- else if ( iFnKeyManager->FnKeyState()
- != CAknFepFnKeyManager::EFnKeyNone )
- newState = EFnKeyPressed;
-#endif
- break;
- case EStroke:
- {
- TBool flag = ptiLang->HasInputMode(EPtiEngineStrokeByPhrase);
- if (iLanguageCapabilities.iInputLanguageCode == ELangPrcChinese)
- {
- if (flag)
- {
- newState = EIndicatorStateStrokePhrase;
- }
- else
- {
- newState = EIndicatorStateStroke;
- }
- }
- else
- {
- if (flag)
- {
- newState = EIndicatorStateStrokeTradPhrase;
- }
- else
- {
- newState = EIndicatorStateStrokeTrad;
- }
- }
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if ( iFnKeyManager->FnKeyState()
- == CAknFepFnKeyManager::EFnKeyLock )
- newState = EFnKeyLocked;
- else if ( iFnKeyManager->FnKeyState()
- != CAknFepFnKeyManager::EFnKeyNone )
- newState = EFnKeyPressed;
-#endif
- break;
- case ECangJie:
- newState = EIndicatorStateCangJie;
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if ( iFnKeyManager->FnKeyState()
- == CAknFepFnKeyManager::EFnKeyLock )
- newState = EFnKeyLocked;
- else if ( iFnKeyManager->FnKeyState()
- != CAknFepFnKeyManager::EFnKeyNone )
- newState = EFnKeyPressed;
-#endif
- break;
- case EZhuyinFind:
- newState = EIndicatorStateZhuyinFind;
- break;
- case EStrokeFind:
- newState = EIndicatorStateStrokeFind;
- break;
- case ENumber:
- {
- newState = ENumeric;
- //iLanguageCapabilities.iLocalDigitType = EDigitTypeWestern;
- }
- break;
- case ENativeNumber:
- {
- UpdateNumberIndicator( newState );
- }
- break;
- case EHangul:
- {
- newState = EIndicatorStateHangul;
- }
- break;
- case ELatin:
- {
- UpdateLatinIndicator( newState );
- }
- break;
- case EHindi:
- {
- UpdateHindiIndicator( newState );
- }
- break;
- default:
- break;
- }
- }
- }
-
- if ( iFepPluginManager && iFepPluginManager->PluginInputMode() == EPluginInputModeVkb )
- {
- newState = iFepPluginManager->VKBIndicatorState( newState );
- }
-
- // Update indicators only if the state has been changed, or if the indicator has swapped
- if ((iPreviousEditingState != newState) || (editingStateIndicator != iEditIndicatorAtLastUpdate))
- {
- if (editingStateIndicator)
- {
- // because current avkon have not find chinese phrase indicator,
- // so change back to no-phrase
- if (findPaneIndicator || iAknEditorFlags & EAknEditorFlagFindPane )
- {
- switch(newState)
- {
- case EIndicatorStateStrokePhrase:
- {
- newState = EIndicatorStateStroke;
- }
- break;
- case EIndicatorStateStrokeTradPhrase:
- {
- newState = EIndicatorStateStrokeTrad;
- }
- break;
- case EIndicatorStatePinyinPhrase:
- {
- newState = EIndicatorStatePinyin;
- }
- break;
- case EIndicatorStateZhuyinPhrase:
- {
- newState = EIndicatorStateZhuyin;
- }
- break;
- default:
- {
- break;
- }
- }
- }
- // Add This condition for Fixing EYYE-7HHBWW: Phonebook, ReTe, PF52.50_2008_wk32:
- // Navigation bar disappears after tapping find pane and then returning back to Names list view.
- if (!(editingStateIndicator == (MAknEditingStateIndicator*)iIndicator &&
- ( iFepPluginManager && iFepPluginManager->PluginInputMode() == EPluginInputModeItut ) &&
- IsFindPaneEditor()))
- {
- editingStateIndicator->SetState(newState);
- }
-
- // Ensure that no indicator is shown in navi pane when other
- // indicator is changed in use.
- if ( editingStateIndicator != (MAknEditingStateIndicator*)iIndicator &&
- iPreviousEditingState == EStateNone &&
- (!IsFlagSet(EFlagForegroundUIComponentVisible | EFlagMenuPaneVisible)) )
-
- {
- iIndicator->SetState( EStateNone );
- }
-
- iPreviousEditingState = newState;
- iEditIndicatorAtLastUpdate=editingStateIndicator;
- }
- }
- }
-
-void CAknFepManager::UpdateNumberIndicator( TAknEditingState& aNewState )
- {
-
- // chnage for AIYR-6L7DGU; This problrm persist in all variants.
- // The fix is made only for Hindi
- UpdateNumericEditorDigitType();
- TBool supportsWesternNumericIntegerOrReal =
- ( iInputCapabilities.SupportsWesternNumericIntegerPositive() ||
- iInputCapabilities.SupportsWesternNumericIntegerNegative() ||
- iInputCapabilities.SupportsWesternNumericReal() );
-
-#ifdef RD_SCALABLE_UI_V2
- iFepPluginManager->SetPluginNativeRange( ETrue );
-#endif // RD_SCALABLE_UI_V2
- // In usual case digit mode is Arabic-Indic digits if local digit mode is
- // Arabic-Indic and current input language is Arabic.
- if ( (!supportsWesternNumericIntegerOrReal &&
- iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic /* &&
- iLanguageCapabilities.iInputLanguageCode == ELangArabic*/
- )
- ||
- // But digit mode is Arabic-Indic digit in MFNE and real number
- // editors if UI language is Arabic and global digit setting is
- // Arabic-Indic digits.
- ( !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) &&
- iLanguageCapabilities.iNumericEditorDigitType == EDigitTypeArabicIndic && // AknTextUtils::DigitModeQuery(AknTextUtils::EDigitModeShownToUser) &&
- supportsWesternNumericIntegerOrReal &&
- iUiLanguage == ELangArabic
- )
- )
- {
- aNewState=EArabicIndicNumeric;
-
- }
- else if ( (!supportsWesternNumericIntegerOrReal &&
- iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic /* &&
- iLanguageCapabilities.iInputLanguageCode == ELangUrdu,Farasi*/
- )
- ||
- // But digit mode is Arabic-Indic digit in MFNE and real number
- // editors if UI language is Arabic and global digit setting is
- // Arabic-Indic digits.
- ( !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) &&
- iLanguageCapabilities.iNumericEditorDigitType == EDigitTypeEasternArabicIndic && // AknTextUtils::DigitModeQuery(AknTextUtils::EDigitModeShownToUser) &&
- supportsWesternNumericIntegerOrReal &&
- (iUiLanguage == ELangUrdu || iUiLanguage == ELangFarsi)))
- {
- aNewState=EArabicIndicNumeric;
- }
- /* Devanagari Scripts */
- else if ( (!supportsWesternNumericIntegerOrReal &&
- iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari //&&
- //iLanguageCapabilities.iInputLanguageCode == ELangHindi
- )
- ||
- ( !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) &&
- iLanguageCapabilities.iNumericEditorDigitType == EDigitTypeDevanagari && // AknTextUtils::DigitModeQuery(AknTextUtils::EDigitModeShownToUser) &&
- supportsWesternNumericIntegerOrReal &&
- TAknFepUiIndicInputManager::IsScriptDevanagari( iUiLanguage )
- )
- )
- {
- aNewState= EDevanagariIndicNumeric;
- }
- else
- {
- if ( iLanguageCapabilities.iInputLanguageCode == ELangArabic )
- {
- //iLanguageCapabilities.iLocalDigitType = EDigitTypeArabicIndic;
- aNewState=EArabicIndicNumeric;
- }
- else if ( iLanguageCapabilities.iInputLanguageCode == ELangFarsi
- || iLanguageCapabilities.iInputLanguageCode == ELangUrdu )
- {
- //iLanguageCapabilities.iLocalDigitType = EDigitTypeEasternArabicIndic;
- aNewState=EArabicIndicNumeric;
- }
- else if ( iLanguageCapabilities.iInputLanguageCode == ELangHindi )
- {
- //iLanguageCapabilities.iLocalDigitType = EDigitTypeDevanagari;
- aNewState= EDevanagariIndicNumeric;
- }
- }
- }
-
-void CAknFepManager::UpdateLatinIndicator( TAknEditingState& aNewState )
- {
- if (IsPredictive())
- {
- //AutoComplete - Begin
- SetPredictiveIndicatorState( aNewState );
- //AutoComplete - End
-
- return;
- }
-
- TInt currentCase = iCaseMan->CurrentCase();
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(iFnKeyManager->FnKeyState() == CAknFepFnKeyManager::EFnKeyLock)
- aNewState = EFnKeyLocked;
- else if(iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNone)
- aNewState = EFnKeyPressed;
- else
-#endif //RD_INTELLIGENT_TEXT_INPUT
- {
-#ifdef RD_SCALABLE_UI_V2
- if( iFepPluginManager &&
- ( !iFepPluginManager->SyncWithPluginRange() || iFepPluginManager->PluginNativeRange() ) )
- {
- iFepPluginManager->SetPluginNativeRange( ETrue );
-#endif // RD_SCALABLE_UI_V2
- switch ( iLanguageCapabilities.iInputLanguageCode )
- {
- case ELangArabic:
- {
- aNewState=EMultitapArabic;
- }
- return;
- case ELangHebrew:
- {
- aNewState=EMultitapHebrew;
- }
- return;
- case ELangFarsi:
- case ELangUrdu:
- {
- aNewState=EMultitapFarsiAndUrdu;
- }
- return;
- case ELangThai:
- {
- aNewState = EMultitapThai;
- }
- return;
-
-#ifdef RD_MARATHI
- case ELangMarathi:
- {
- aNewState = EIndicatorStateMultitapMarathi;
- }
- return;
-#endif // RD_MARATHI
-
-#ifdef RD_HINDI_PHONETIC_INPUT
- case KLangHindiPhonetic:
- {
- TInt currentPtiLang = (ptiLang)? ptiLang->LanguageCode() : 0;
-
- if(TAknFepUiIndicInputManager::IsIndicPhoneticLanguage(TLanguage(currentPtiLang)))
- {
- aNewState = TAknEditingState(SetPhoneticIndicator(TLanguage(currentPtiLang)));
- }
- else
- {
- switch ( currentCase )
- {
- case EAknEditorUpperCase:
- aNewState=EMultitapUpper;
- if (iCharWidth == EFullWidthChar)
- {
- aNewState=EIndicatorStateFullLatinUpper;
- }
- break;
- case EAknEditorLowerCase:
- aNewState=EMultitapLower;
- if (iCharWidth == EFullWidthChar)
- {
- aNewState=EIndicatorStateFullLatinLower;
- }
- break;
- case EAknEditorTextCase:
- aNewState=EMultitapShifted;
- if (iCharWidth == EFullWidthChar)
- {
- aNewState=EIndicatorStateFullLatinText;
- }
- break;
- default:
- break;
- }
- }
-
- }
- return;
-#endif
- case ELangVietnamese:
- {
- switch (currentCase)
- {
- case EAknEditorUpperCase:
- aNewState = EMultitapUpperVietnamese;
- break;
- case EAknEditorLowerCase:
- aNewState = EMultitapLowerVietnamese;
- break;
- case EAknEditorTextCase:
- aNewState = EMultitapShiftedVietnamese;
- break;
- default:
- break;
- }
- return;
- }
-
- case ELangGreek:
- {
- switch (currentCase)
- {
- case EAknEditorUpperCase:
- aNewState = EMultitapUpperGreek;
- break;
- case EAknEditorLowerCase:
- aNewState = EMultitapLowerGreek;
- break;
- case EAknEditorTextCase:
- aNewState = EMultitapShiftedGreek;
- break;
- default:
- break;
- }
- return;
- }
-
- //Cyrillic alphabet is used for Russian, Bulgarian and
- //Ukranian languages. So fall through for all these languages -
- case ELangRussian:
- case ELangBulgarian:
- case ELangUkrainian:
- {
- switch (currentCase)
- {
- case EAknEditorUpperCase:
- aNewState = EMultitapUpperCyrillic;
- break;
- case EAknEditorLowerCase:
- aNewState = EMultitapLowerCyrillic;
- break;
- case EAknEditorTextCase:
- aNewState = EMultitapShiftedCyrillic;
- break;
- default:
- break;
- }
- return;
- }
- }
-#ifdef RD_SCALABLE_UI_V2
- }
- // if plugin is not native range
-
- if(iFepPluginManager && iLanguageCapabilities.iInputLanguageCode != ELangRussian &&
- iLanguageCapabilities.iInputLanguageCode != ELangBulgarian &&
- iLanguageCapabilities.iInputLanguageCode != ELangUkrainian &&
- iLanguageCapabilities.iInputLanguageCode != ELangGreek )
- {
- iFepPluginManager->SetPluginNativeRange( EFalse );
- }
-
-#endif // RD_SCALABLE_UI_V2
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(FnKeyState() == CAknFepFnKeyManager::EFnKeyNone)
-#endif //RD_INTELLIGENT_TEXT_INPUT
- {
- switch (currentCase)
- {
- case EAknEditorUpperCase:
- aNewState=EMultitapUpper;
- if (iCharWidth == EFullWidthChar)
- {
- aNewState=EIndicatorStateFullLatinUpper;
- }
- break;
- case EAknEditorLowerCase:
- aNewState=EMultitapLower;
- if (iCharWidth == EFullWidthChar)
- {
- aNewState=EIndicatorStateFullLatinLower;
- }
- break;
- case EAknEditorTextCase:
- aNewState=EMultitapShifted;
- if (iCharWidth == EFullWidthChar)
- {
- aNewState=EIndicatorStateFullLatinText;
- }
- break;
- default:
- break;
- }
- }
- }
-void CAknFepManager::UpdateHindiIndicator( TAknEditingState& aNewState )
- {
- if ( IsPredictive() )
- {
- if( iIsAutoCompleteOn )
- aNewState = EAutoCompleteHindi;
- else
- aNewState = EIndicatorStatePredictiveHindi;
- }
- else
- {
- aNewState = EIndicatorStateMultitapHindi;
- }
- }
-TBool CAknFepManager::GetIndicatorImgID(TInt& aIndicatorImgID, TInt& aIndicatorTextID)
- {
- if (iPreviousEditingState == EStateNone)
- {
- UpdateIndicators();
- if (iPreviousEditingState == EStateNone)
- {
- return EFalse;
- }
- }
-
- TBool predictiveMode = QueryPredictiveState(iPreviousEditingState);
- TBool predictiveAutoCompleteMode = EFalse;
- if(!predictiveMode)
- {
- predictiveAutoCompleteMode = QueryPredictiveAutoCompleteState(iPreviousEditingState);
- }
-
- if (predictiveMode)
- {
- aIndicatorImgID = EAknNaviPaneEditorIndicatorT9;
- }
- else if (predictiveAutoCompleteMode)
- {
- aIndicatorImgID = EAknNaviPaneEditorIndicatorAutoComplete;
- }
- else
- {
- aIndicatorImgID = EAknNaviPaneEditorIndicatorQuery;
- }
-
- aIndicatorTextID = EvaluateState(iPreviousEditingState);
-
- return ETrue;
- }
-
-TInt CAknFepManager::EvaluateState(const TAknEditingState aState)
-{
- TInt result = 0;
- switch(aState)
- {
- case EArabicIndicNumeric:
- result = EAknNaviPaneEditorIndicatorArabicIndicNumberCase;
- break;
-
- case ET9Thai:
- case EMultitapThai:
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- case EAutoCompleteThai:
-#endif
- result = EAknNaviPaneEditorIndicatorThai;
- break;
-
- case EIndicatorStatePredictiveHindi:
- case EIndicatorStateMultitapHindi:
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- case EAutoCompleteHindi:
-#endif
-#ifdef RD_MARATHI
- case EIndicatorStateMultitapMarathi:
- case EIndicatorStatePredictiveMarathi:
-#endif // RD_MARATHI
- result = EAknNaviPaneEditorIndicatorDevanagariCase;
- break;
-
- case ET9Arabic:
- case EMultitapArabic:
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- case EAutoCompleteArabic:
-#endif
- result = EAknNaviPaneEditorIndicatorArabicCase;
- break;
-
- case ET9Hebrew:
- case EMultitapHebrew:
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- case EAutoCompleteHebrew:
-#endif
- result = EAknNaviPaneEditorIndicatorHebrewCase;
- break;
-
- case ET9FarsiAndUrdu:
- case EMultitapFarsiAndUrdu:
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- case EAutoCompleteFarsiAndUrdu:
-#endif
- result = EAknNaviPaneEditorIndicatorFarsiAndUrduCase;
- break;
-
-
- case ET9Upper:
- case EMultitapUpper:
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- case EAutoCompleteUpper:
-#endif
- result = EAknNaviPaneEditorIndicatorUpperCase;
- break;
-
- case ET9Lower:
- case EMultitapLower:
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- case EAutoCompleteLower:
-#endif
- result = EAknNaviPaneEditorIndicatorLowerCase;
- break;
-
- case ET9Shifted:
- case EMultitapShifted:
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- case EAutoCompleteShifted:
-#endif
- result = EAknNaviPaneEditorIndicatorTextCase;
- break;
-
- case ENumeric:
- result = EAknNaviPaneEditorIndicatorNumberCase;
- break;
-
-
- case EIndicatorStatePinyin:
- result = EAknNaviPaneEditorIndicatorPinyin;
- break;
- case EIndicatorStatePinyinPhrase:
- result = EAknNaviPaneEditorIndicatorPinyinPhrase;
- break;
-
- case EIndicatorStateZhuyin:
- result = EAknNaviPaneEditorIndicatorZhuyin;
- break;
- case EIndicatorStateZhuyinPhrase:
- result = EAknNaviPaneEditorIndicatorZhuyinPhrase;
- break;
-
- case EIndicatorStateZhuyinFind:
- result = EAknNaviPaneEditorIndicatorZhuyinFind;
- break;
-
- case EDevanagariIndicNumeric :
- result = EAknNaviPaneEditorIndicatorDevanagariIndicNumberCase;
- break;
-
- case EIndicatorStateHiraganaKanji:
- case EIndicatorStateJapanesePredictive:
- result = EAknNaviPaneEditorIndicatorJapaneseHiraganaKanji;
- break;
-
- case EIndicatorStateFullKatakana:
- result = EAknNaviPaneEditorIndicatorJapaneseFullKatakana;
- break;
-
- case EIndicatorStateHalfKatakana:
- result = EAknNaviPaneEditorIndicatorJapaneseHalfKatakana;
- break;
-
- case EIndicatorStateFullLatinText:
- result = EAknNaviPaneEditorIndicatorJapaneseFullTextAlphabet;
- break;
-
- case EIndicatorStateFullLatinUpper:
- result = EAknNaviPaneEditorIndicatorJapaneseFullUpperAlphabet;
- break;
-
- case EIndicatorStateFullLatinLower:
- result = EAknNaviPaneEditorIndicatorJapaneseFullLowerAlphabet;
- break;
-
- case EIndicatorStateFullNumeric:
- result = EAknNaviPaneEditorIndicatorJapaneseFullNumeric;
- break;
-
- case EIndicatorStateHiragana:
- result = EAknNaviPaneEditorIndicatorJapaneseHiragana;
- break;
-
- case EIndicatorStateStroke:
- result = EAknNaviPaneEditorIndicatorStroke;
- break;
- case EIndicatorStateStrokePhrase:
- result = EAknNaviPaneEditorIndicatorStrokePhrase;
- break;
-
- case EIndicatorStateStrokeTrad:
- result = EAknNaviPaneEditorIndicatorStrokeTrad;
- break;
- case EIndicatorStateStrokeTradPhrase:
- result = EAknNaviPaneEditorIndicatorStrokeTradPhrase;
- break;
-
- case EQwertyShift:
- result = EAknNaviPaneEditorIndicatorQwertyShift;
- break;
-
- case EIndicatorStateStrokeFind:
- result = EAknNaviPaneEditorIndicatorStrokeFind;
- break;
-
- case EIndicatorStateCangJie:
- result = EAknNaviPaneEditorIndicatorCangJie;
- break;
-
- case ET9UpperVietnamese:
- case EMultitapUpperVietnamese:
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- case EAutoCompleteUpperVietnamese:
-#endif
- result = EAknNaviPaneEditorIndicatorVietnameseUpperCase;
- break;
-
- case ET9LowerVietnamese:
- case EMultitapLowerVietnamese:
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- case EAutoCompleteLowerVietnamese:
-#endif
- result = EAknNaviPaneEditorIndicatorVietnameseLowerCase;
- break;
-
- case ET9ShiftedVietnamese:
- case EMultitapShiftedVietnamese:
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- case EAutoCompleteShiftedVietnamese:
-#endif
- result = EAknNaviPaneEditorIndicatorVietnameseTextCase;
- break;
-#ifdef RD_HINDI_PHONETIC_INPUT
- case EIndicatorStateHindiPhoneticUpper:
- result = EAknNaviPaneEditorIndicatorDevanagariPhoneticUpperCase;
- break;
- case EIndicatorStateHindiPhoneticLower:
- result = EAknNaviPaneEditorIndicatorDevanagariPhoneticLowerCase;
- break;
-#endif
- case ET9UpperGreek:
- case EMultitapUpperGreek:
- result = EAknNaviPaneEditorIndicatorGreekUpperCase;
- break;
-
- case ET9LowerGreek:
- case EMultitapLowerGreek:
- result = EAknNaviPaneEditorIndicatorGreekLowerCase;
- break;
-
- case ET9ShiftedGreek:
- case EMultitapShiftedGreek:
- result = EAknNaviPaneEditorIndicatorGreekTextCase;
- break;
-
- case ET9UpperCyrillic:
- case EMultitapUpperCyrillic:
- result = EAknNaviPaneEditorIndicatorCyrillicUpperCase;
- break;
-
- case ET9LowerCyrillic:
- case EMultitapLowerCyrillic:
- result = EAknNaviPaneEditorIndicatorCyrillicLowerCase;
- break;
-
- case ET9ShiftedCyrillic:
- case EMultitapShiftedCyrillic:
- result = EAknNaviPaneEditorIndicatorCyrillicTextCase;
- break;
-
- case EHybridModeLatin:
- result = EAknNaviPaneEditorIndicatorHybridLatin;
- break;
- case EIndicatorStateHangul:
- result = EAknNaviPaneEditorIndicatorKoreanHangul;
- break;
-
- }
- return result;
-
-}
-
-TBool CAknFepManager::IsAbleToLaunchSCT() const
- {
- TBool ableToLaunchSCT = ETrue;
-
- if (ExtendedInputCapabilities() & CAknExtendedInputCapabilities::EDisableSCT &&
- PluginInputMode() == EPluginInputModeNone )
- {
- // The editor doesn't allow SCT.
- return EFalse;
- }
-
- if (iMode == ENumber || iMode == ENativeNumber)
- {
- if (iPermittedInputModes == EAknEditorNumericInputMode || !NumericModeSCTResourceId())
- {
- // SCT is not launched if the number mode is the only input mode or
- // if there is not keymap resource for the current numeric keymap mode.
- ableToLaunchSCT = EFalse;
- }
- if (iAknEditorFlags & EAknEditorFlagUseSCTNumericCharmap ||
- ( (iAknEditorNumericKeymap == EAknEditorAlphanumericNumberModeKeymap) &&
- (iPermittedInputModes != EAknEditorNumericInputMode) ))
- {
- // SCT is launched in the number mode if requested by editor flag
- // EAknEditorFlagUseSCTNumericCharmap or if also text input modes are
- // allowed and the keymap is EAknEditorAlphanumericNumberModeKeymap.
- ableToLaunchSCT = ETrue;
- }
- }
- if (!(EditorHasFreeSpace() && EditorState()
- && EditorState()->SpecialCharacterTableResourceId()))
- {
- ableToLaunchSCT = EFalse;
- }
-
- return ableToLaunchSCT;
- }
-
-TBool CAknFepManager::QueryPredictiveState(const TAknEditingState aState)
- {
- return (( aState == EIndicatorStatePinyin) ||
- ( aState == EIndicatorStatePinyinPhrase) ||
- ( aState == EIndicatorStateZhuyin) ||
- ( aState == EIndicatorStateZhuyinPhrase) ||
- ( aState == EIndicatorStateZhuyinFind) ||
- ( aState == EIndicatorStateStrokeFind) ||
- ( aState == EIndicatorStateStroke) ||
- ( aState == EIndicatorStateStrokePhrase) ||
- ( aState == EIndicatorStateCangJie) ||
- ( aState == EIndicatorStateStrokeTrad) ||
- ( aState == EIndicatorStateStrokeTradPhrase) ||
- ( aState == ET9Upper) ||
- ( aState == ET9Shifted) ||
- ( aState == ET9Lower) ||
- ( aState == ET9Arabic) ||
- ( aState == ET9Hebrew) ||
- ( aState == ET9FarsiAndUrdu) ||
- ( aState == ET9Thai) ||
- ( aState == EIndicatorStatePredictiveHindi) ||
-#ifdef RD_MARATHI
- ( aState == EIndicatorStatePredictiveMarathi) ||
-#endif // RD_MARATHI
- ( aState == EIndicatorStateJapanesePredictive) ||
- ( aState == ET9UpperVietnamese) ||
- ( aState == ET9LowerVietnamese) ||
- ( aState == ET9ShiftedVietnamese) ||
- ( aState == ET9UpperGreek) ||
- ( aState == ET9LowerGreek) ||
- ( aState == ET9ShiftedGreek) ||
- ( aState == ET9UpperCyrillic) ||
- ( aState == ET9LowerCyrillic) ||
- ( aState == ET9ShiftedCyrillic) );
- }
-
- TBool CAknFepManager::QueryPredictiveAutoCompleteState(TAknEditingState aState)
- {
-
- return (( aState == EAutoCompleteUpper ) ||
- ( aState == EAutoCompleteShifted ) ||
- ( aState == EAutoCompleteLower ) ||
- ( aState == EAutoCompleteHindi ) ||
- ( aState == EAutoCompleteArabic ) ||
- ( aState == EAutoCompleteHebrew ) ||
- ( aState == EAutoCompleteFarsiAndUrdu ) ||
- ( aState == EAutoCompleteThai ) ||
- ( aState == EAutoCompleteUpperVietnamese ) ||
- ( aState == EAutoCompleteLowerVietnamese ) ||
- ( aState == EAutoCompleteShiftedVietnamese ));
- }
-
-void CAknFepManager::LaunchSpecialCharacterTableL(TInt aResourceId, TBool aLaunchedByTouchWin, TBool aSmileyFirst)
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Set the iSupressCursorMoveToEndChrKeyPressed when cursor is in
- // between two words and SCT is launched
- iSupressCursorMoveToEndChrKeyPressed = ETrue;
-#endif //RD_INTELLIGENT_TEXT_INPUT
-#ifdef RD_SCALABLE_UI_V2
- if ( iStarKeyPressed && iFepPluginManager &&
- iFepPluginManager->PluginInputMode() == EPluginInputModeItut )
- {
- aLaunchedByTouchWin = ETrue;
- }
- iCancelPopupInQwerty = aLaunchedByTouchWin;
-#endif //RD_SCALABLE_UI_V2
- DoLaunchSctAndPctL(aResourceId, aSmileyFirst ? EShowSmileyFirst : EShowSctFirst );
-#ifdef RD_SCALABLE_UI_V2
- iCancelPopupInQwerty = EFalse;
-#endif //RD_SCALABLE_UI_V2
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- iSupressCursorMoveToEndChrKeyPressed = ETrue;
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
-
-TBool CAknFepManager::IsAbleToLaunchPCT() const
- {
- TBool isAbleToLaunch = EFalse;
- if (FeatureManager::FeatureSupported(KFeatureIdJapanesePicto)
- && (iAknEditorFlags & EAknEditorFlagEnablePictographInput))
- {
- isAbleToLaunch = ETrue;
- }
- return isAbleToLaunch;
- }
-
-TBool CAknFepManager::IsAbleToLaunchSmiley() const
- {
- TBool ableToLaunchSmiley(EFalse);
-
- CAknEdwinState* edwinState = EditorState();
- if(edwinState)
- {
- CAknEdwinFormAccessor* formAccessor = edwinState->FormAccessor();
- if(formAccessor)
- {
- CEikEdwin *edwin = static_cast<CEikEdwin*>(formAccessor->FormClientControl());
- if(edwin)
- {
- ableToLaunchSmiley = ((edwin->UserFlags()&CEikEdwin::EAvkonEnableSmileySupport) != 0);
- }
- }
- }
-
- return ableToLaunchSmiley;
- }
-
-TInt CAknFepManager::GetCurrentEditorSCTResId() const
- {
- if(!EditorState())
- {
- return NumericModeSCTResourceId();
- }
- TInt currentEditorSCTResId = EditorState()->SpecialCharacterTableResourceId();
- if ( FeatureManager::FeatureSupported(KFeatureIdChinese) )
- {
- if (currentEditorSCTResId == R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG)
- {
- if (iMode == EZhuyin)
- {
- currentEditorSCTResId =
- R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_FOR_ZHUYIN_SYMBOL_INPUT;
- }
- else
- {
- currentEditorSCTResId = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_CHINESE;
- }
- }
- }
- if (currentEditorSCTResId == EDefaultSCTResourceId) // -1 forces the default in SCT resource definition
- {
- if (iAknEditorFlags & EAknEditorFlagLatinInputModesOnly)
- {
- currentEditorSCTResId = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_LATIN_ONLY;
- }
- else
- {
- // only ITU-T and when Bopomofo symbol input mode is supported, we use new sct table
- TInt supportSCTToneMarks = EFalse;
- MPtiCoreInfo* ptiCoreInfo = iPtiEngine->CoreInfo(EPtiEngineZhuyin);
-
- if(ptiCoreInfo)
- {
- supportSCTToneMarks = ptiCoreInfo->CapsBits() & ESupportSCTToneMarks;
- }
-
- ptiCoreInfo = iPtiEngine->CoreInfo(EPtiEngineZhuyinByPhrase);
- if(ptiCoreInfo)
- {
- supportSCTToneMarks = supportSCTToneMarks ||
- (ptiCoreInfo->CapsBits() & ESupportSCTToneMarks);
- }
-
- if(!iQwertyInputMode && (iMode == EZhuyin) && supportSCTToneMarks)
- {
- currentEditorSCTResId =
- R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_FOR_ZHUYIN_SYMBOL_INPUT;
- }
- else
- {
- if ( FeatureManager::FeatureSupported(KFeatureIdChinese) )
- {
- currentEditorSCTResId = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_CHINESE;
- }
- else
- {
- currentEditorSCTResId = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG;
- }
- }
- }
- }
- return currentEditorSCTResId;
- }
-
-void CAknFepManager::LaunchPictographCharacterTableL()
- {
- DoLaunchSctAndPctL(NULL, EShowPctFirst);
- }
-
-
-void CAknFepManager::UpdateInlineEditL(const TDesC& aNewInlineText,
- TInt aPositionOfInsertionPointInInlineText)
- {
- if ( ! IsFlagSet ( EFlagInsideInlineEditingTransaction ) )
- {
- return;
- }
- // Japanese implementation needs to be merged with functionality of other languages. Now they are separate.
- if (iLanguageCapabilities.iInputLanguageCode == ELangJapanese)
- {
- iUncommittedText.iCursorPos = iUncommittedText.iAnchorPos +
- aPositionOfInsertionPointInInlineText;
-
- if (aNewInlineText.Length() == 1)
- {
- if (aNewInlineText[0] == KAknFEPLineFeedSymbol ||
- aNewInlineText[0] == KAknFEPMirroredLineFeedSymbol)
- {
- SetFlag(EFlagLineFeedCharacter);
- ClearFlag(EFlagSpaceCharacter | EFlagFullWidthSpaceCharacter);
- }
- else if (aNewInlineText[0] == iSpaceCharacterCode)
- {
- SetFlag(EFlagSpaceCharacter);
- ClearFlag(EFlagLineFeedCharacter | EFlagFullWidthSpaceCharacter);
- }
- else if (aNewInlineText[0] == iFullWidthSpaceCharacterCode)
- {
- SetFlag(EFlagFullWidthSpaceCharacter);
- ClearFlag(EFlagLineFeedCharacter | EFlagSpaceCharacter);
- }
- else
- {
- ClearFlag(EFlagLineFeedCharacter
- | EFlagSpaceCharacter
- | EFlagFullWidthSpaceCharacter);
- }
- if (iInputCapabilities.SupportsSecretText())
- {
- TBuf<1> buf;
- buf.Append(aNewInlineText[0]);
- NewCharacterL(buf);
- }
- else
- {
- SetFlag(EFlagInsideMultitapInlineEditingTransaction);
- iInputCapabilities.FepAwareTextEditor()->UpdateFepInlineTextL(aNewInlineText,
- aPositionOfInsertionPointInInlineText);
- }
- }
- else
- {
- ClearFlag(EFlagLineFeedCharacter | EFlagSpaceCharacter | EFlagFullWidthSpaceCharacter);
- iInputCapabilities.FepAwareTextEditor()->UpdateFepInlineTextL(aNewInlineText,
- aPositionOfInsertionPointInInlineText);
- }
-#ifdef _DEBUG
- RDebug::Print(_L("UpdateInlineEditL text=[%S] len=[%d] CurPos=[%d] AncPos=[%d] change=[%d]"),
- &aNewInlineText, iUncommittedText.Length(),
- iUncommittedText.iCursorPos, iUncommittedText.iAnchorPos,
- aPositionOfInsertionPointInInlineText);
-#endif
- }
- else
- {
- TInt curPos = iUncommittedText.iAnchorPos + aNewInlineText.Length();
-
- TInt deltaCur = curPos - iUncommittedText.iCursorPos;
-
- TInt maxEdSize = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep();
-
- TInt docLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
-
- HBufC* newInlineText=NULL;
-
- TBool syncLater = ETrue;
- // we have to restrict to a length that is permissible in the editor
- // this situation comes when we select the max length condition is reached
- // in the editor and we navigate to one of the words in the middle
- // and select a longer word from the candidate list
-
-
- if( (maxEdSize > 0) && ( deltaCur > 0 )
- && (( docLength + deltaCur) > maxEdSize ) )
- {
- newInlineText= aNewInlineText.Left( aNewInlineText.Length() - (docLength + deltaCur - maxEdSize )).AllocLC();
- aPositionOfInsertionPointInInlineText=newInlineText->Length();
- }
- else if((maxEdSize > 0) && (curPos > maxEdSize))
- {
- newInlineText= aNewInlineText.Left(maxEdSize - iUncommittedText.iAnchorPos).AllocLC();
- aPositionOfInsertionPointInInlineText=newInlineText->Length();
- }
- else
- {
- newInlineText=aNewInlineText.AllocLC();
- syncLater = EFalse;
- }
- // The Below code changes are made to sync iTextBuffer and the last word in the editor.When the
- // cursor position reaches more than the max length of editor, tail length is modified according
- // to truncated last word and Autocompletion bit length (Element count) value to display last
- // word in the editor properly.
- #ifdef RD_INTELLIGENT_TEXT_INPUT
- if(syncLater)
- {
- TBuf<CAknFepManager::EMaximumFepWordLength> currentText = iPtiEngine->CurrentWord();
- currentText.SetLength(newInlineText->Length());
- iPtiEngine->HandleCommandL( EPtiCommandSetCursorCrossedMaxLength );
- iPtiEngine->SetCurrentWord(currentText);
- TransferFepStateToEditorL();
- iPtiEngine->HandleCommandL( EPtiCommandResetCursorCrossedMaxLength );
- }
- #endif
- // CleanupStack::PushL(TCleanupItem(ClearFepStateOnLeave,this));
- iUncommittedText.iCursorPos = iUncommittedText.iAnchorPos + aPositionOfInsertionPointInInlineText;
-
- HBufC* decoratedInlineEdit = HBufC::NewLC(aNewInlineText.Length()*3);
- TPtr bufferPtr(decoratedInlineEdit->Des());
-
- if ( EditorSupportsNeutralProtection() )
- {
- if ( newInlineText->Length() > 0 )
- {
- iInlineTextDecorator->DecorateInlineText(
- newInlineText->Des(),
- bufferPtr,
- aPositionOfInsertionPointInInlineText,
- static_cast<TChar>(PreviousChar()),
- IsRightToLeftParagraph(DocPos() ),
- ( CurrentInputDirectionality() == TBidiText::ERightToLeft ) );
- }
-
- // Because the length of the new inline edit may bear no relation to the old inline edit,
- // the passed desired position of the cursor (which is hidden in S60 anyway) in the new
- // inline edit is restricted to its Length(). The input value of parameter
- // aPositionOfInsertionPointInInlineText is ignored, and its modified value
- // from the DecorateInlineText routine is also ignored.
-
- aPositionOfInsertionPointInInlineText = decoratedInlineEdit->Length();
-
- iInputCapabilities.FepAwareTextEditor()->UpdateFepInlineTextL(
- bufferPtr, aPositionOfInsertionPointInInlineText);
-
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- iUncommittedText.iAnchorPos-=decoratedInlineEdit->Length();
- }
-
- else
- {
- // Even without the issue of decoration, the length of the new inline edit may bear no
- // relation to the old inline edit. It is always set to length (the end) of the new inline edit
- aPositionOfInsertionPointInInlineText = newInlineText->Length();
-
- iInputCapabilities.FepAwareTextEditor()->UpdateFepInlineTextL(
- newInlineText->Des(), aPositionOfInsertionPointInInlineText);
-
- // This is needed here too because we should not insist that the new text is the same length
- // as the old, and so the iUncommitted text should be reset.
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- iUncommittedText.iAnchorPos-=newInlineText->Length();
- }
-
-
- CleanupStack::PopAndDestroy(decoratedInlineEdit);
- SendEventsToPluginManL( EPluginSyncFepAwareText, EPluginSyncUpdatedText );
- CleanupStack::PopAndDestroy(newInlineText);
- //Send info to engine to set EPtiXt9FlagAutoCompletionSetOnToOff flag as false
- TInt value = 0;
- TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandAutoCompletionOnToOff,&value));
- }
- }
-
-void CAknFepManager::StartInlineEditL()
- {
- if(iConcatenationTimer->IsActive())
- iConcatenationTimer->Cancel();
-
- //currently western only, would need to sort out flags if this were to be used
- //in multitap modes
- switch (iMode)
- {
- case ELatin:
- case EKatakana:
- case EHiragana:
- iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(KNullDesC, 0, EFalse,
- NULL, *this, *this);
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- break;
- default:
- iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(KNullDesC, 0, EFalse,
- NULL, *this, *this);
- break;
- }
-#ifdef _DEBUG
- RDebug::Print(_L("StartInlineEditL len=[%d] CurPos=[%d] AncPos=[%d]"),
- iUncommittedText.Length(),
- iUncommittedText.iCursorPos, iUncommittedText.iAnchorPos );
-#endif
-
- // have to calculate the number of free space on current EDITOR after StartFepInlineEditL().
- TInt maxEdSize = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep();
- TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- iFreeSpaceOfEditor = maxEdSize - edSize;
-
- SetFlag(EFlagInsideInlineEditingTransaction);
- }
-
-void CAknFepManager::StartInlineEditL(const TDesC& aText)
- {
- if(iConcatenationTimer->IsActive())
- iConcatenationTimer->Cancel();
-
- TInt textLength = aText.Length();
-
- // CleanupStack::PushL(TCleanupItem(ClearFepStateOnLeave,this));
-
- HBufC* decoratedInlineEdit = HBufC::NewLC(aText.Length()*3);
- TPtr bufferPtr(decoratedInlineEdit->Des());
-
- // decorate the inline edit
- if( aText.Length() > 0 && EditorSupportsNeutralProtection() )
- {
- iInlineTextDecorator->DecorateInlineText(
- aText,
- bufferPtr,
- textLength, // aPositionOfInsertionPointInInlineText,
- static_cast<TChar>(PreviousChar()),
- IsRightToLeftParagraph( DocPos() ),
- ( CurrentInputDirectionality() == TBidiText::ERightToLeft ) );
- }
- else
- {
-
- bufferPtr.Copy(aText);
- }
-
- // Before starting editor inline, we cancel editor inline if by any chance editor ends up in inline edit and fep does not
- TBool phoneIdle = (EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor);
-
- if(phoneIdle)
- {
- iInputCapabilities.FepAwareTextEditor()->CancelFepInlineEdit();
- }
-
- // operates at the current insertion point or selection
- iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(
-
- bufferPtr,
- textLength, // aPositionOfInsertionPointInInlineText,
- EFalse, // Cursor visibility
- 0, // MFormCustomDrawer*
- *this,
- *this);
-
- // CleanupStack::Pop(); // cleanupitem for FEP state.
-
- if (!iInputCapabilities.FepAwareTextEditor())
- {
- // In case while starting the inline edit, 3rd party app removes the focus out of editor before the transaction
- // completes, we return with an error.
- User::Leave(KErrCorrupt);
- }
- // cursor span needs to be updated following potential modification
- // of the inline edit content before it was started
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- iUncommittedText.iAnchorPos-=decoratedInlineEdit->Length();
- CleanupStack::PopAndDestroy(decoratedInlineEdit);
-
- SetFlag(EFlagInsideInlineEditingTransaction);
- }
-
-void CAknFepManager::StartInlineEditL(TCursorSelection aCursorSelection,
- const TDesC& aInitialInlineText,
- TInt aPositionOfInsertionPointInInlineText,
- TBool aCursorVisibility)
- {
-
- if(iConcatenationTimer->IsActive())
- iConcatenationTimer->Cancel();
-
- TBool setToTrue=EFalse;
-
- // setToTrue parameter forces use of selection hiding inline edit editor API -
- // this method also sets the cursor selection to the second parameter
- // CleanupStack::PushL(TCleanupItem(ClearFepStateOnLeave,this));
- iInputCapabilities.FepAwareTextEditor()->Extension1()->StartFepInlineEditL(
- setToTrue,
- aCursorSelection,
- aInitialInlineText,
- aPositionOfInsertionPointInInlineText,
- aCursorVisibility,
- 0, // MFormCustomDrawer* ?
- *this,
- *this);
- // CleanupStack::Pop(); // cleanupitem for FEP state.
- SetFlag(EFlagInsideInlineEditingTransaction);
- //This will suppress Edit submenu from poping up
- SetCcpuFlag(ECcpuStateIgnoreStarUp);
- }
-
-TBool CAknFepManager::CloseUiIfWordDeletedL()
- {
- if (iUncommittedText.Length()==0)
- {
- // word has been totally deleted
- ClearFlag(EFlagCompoundWord);
- TryCloseUiL();
- return ETrue;
- }
- return EFalse;
- }
-
-TBool CAknFepManager::TryGetTextToUncommitL(TDes& aText, TInt aCode, TBool& aComsumeKey)
- {
- TWesternNaviEvent naviEvent = ENullNaviEvent;
- if (aCode == EKeyLeftArrow)
- {
- naviEvent = ELeftNaviEvent;
- }
- else if (aCode == EKeyRightArrow)
- {
- naviEvent = ERightNaviEvent;
- }
- else if (aCode == EKeyBackspace)
- {
- naviEvent = EBackspaceEvent;
- }
-
- TInt nextCharPos = 0; // Character ordinal in logical memory (0 - n-1)
- TBool hindibackspace = 0 ;
- TBool nextPositionFound = EFalse;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- if ( naviEvent == ERightNaviEvent )
- {
- nextPositionFound = GetNextVisualRightCharacter( nextCharPos );
- if( (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) ||
- (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai))
- {
- FindStartOfWord(nextCharPos);
-
- if(nextCharPos < iUncommittedText.LowerPos())
- {
- nextCharPos = iUncommittedText.LowerPos();
- }
- }
- }
- else if ( naviEvent == ELeftNaviEvent )
- {
- nextPositionFound = GetNextVisualLeftCharacter( nextCharPos );
- if( nextPositionFound && (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) ||
- (nextPositionFound && (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai)))
- {
- FindEndOfWord(nextCharPos);
- if(nextCharPos > iUncommittedText.HigherPos())
- {
- nextCharPos = iUncommittedText.HigherPos();
- }
- }
-
- }
- else if ( naviEvent == EBackspaceEvent )
- {
- if (iLanguageCapabilities.iRightToLeftLanguage)
- {
- nextPositionFound = GetNextVisualRightCharacter( nextCharPos );
- }
- else
- {
- if( (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) ||
- (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai))
- {
- TCursorSelection curSel;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(curSel);
- nextCharPos = curSel.iCursorPos;
- hindibackspace = ETrue;
- }
- else
- {
- nextPositionFound = GetNextVisualLeftCharacter( nextCharPos );
- }
- }
- }
-
- if ( !nextPositionFound && !hindibackspace )
- {
- aComsumeKey = EFalse;
- return EFalse;
- }
-
- TInt anchorPos = 0;
- TInt cursorPos = 0;
- TTmDocPosSpec pos = DocPos();
- CTmTextLayout::TTmChunkDescription leftChunk;
- CTmTextLayout::TTmChunkDescription rightChunk;
- FindAdjacentChunks(pos, leftChunk, rightChunk);
-
- if (( naviEvent == ELeftNaviEvent && leftChunk.iRightToLeft ) ||
- ( naviEvent == ERightNaviEvent && !rightChunk.iRightToLeft ))
- {
- anchorPos = nextCharPos;
- cursorPos = nextCharPos;
- FindEndOfWord(cursorPos);
- }
- else
- {
- if( (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) ||
- (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai))
- {
- cursorPos = nextCharPos;
- }
- else
- {
- cursorPos = nextCharPos + 1;
- }
- anchorPos = nextCharPos;
- FindStartOfWord(anchorPos);
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- TCursorSelection curSel;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(curSel);
- // if selection happens dont consume the event pass it to editor
- if((naviEvent == EBackspaceEvent)
- && (!IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))
- && (curSel.iAnchorPos != curSel.iCursorPos))
- {
- aComsumeKey = EFalse;
- return EFalse;
- }
-#endif
-
- iUncommittedText.SetSelection(cursorPos, anchorPos);
-
- if (iUncommittedText.Length() <= EMaximumFepWordLength)
- {
- iInputCapabilities.FepAwareTextEditor()->
- GetEditorContentForFep(aText, iUncommittedText.iAnchorPos, iUncommittedText.Length());
- aComsumeKey = ETrue;
- return ETrue;
- }
- else
- {
- if (naviEvent == EBackspaceEvent)
- {
- // delete the last character
- cursorPos--;
- iUncommittedText.SetSelection(cursorPos, cursorPos);
- aComsumeKey = EFalse;
- }
- else
- {
- TInt newCursorPosition= (pos.iPos == cursorPos) ? anchorPos : cursorPos;
- iUncommittedText.SetSelection(newCursorPosition, newCursorPosition);
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText);
- aComsumeKey = ETrue;
- }
- // The word is longer than EMaximumFepWordLength. Ui is deactivated.
- TryCloseUiL();
- return EFalse;
- }
- }
-
-
-TBool CAknFepManager::TryGetTextToUncommitL(TDes& aText, TBool& aComsumeKey)
- {
- TInt nextCharRightPos = 0; // Character ordinal in logical memory (0 - n-1)
- TInt nextCharLeftPos = 0;
- TBool nextRightPosFound = EFalse;
- TBool nextLeftPosFound = EFalse;
-
- nextRightPosFound = GetNextVisualRightCharacter( nextCharRightPos );
- if( (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) ||
- (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai))
- {
- FindStartOfWord(nextCharRightPos);
-
- if(nextCharRightPos < iUncommittedText.LowerPos())
- {
- nextCharRightPos = iUncommittedText.LowerPos();
- }
- }
-
-
- nextLeftPosFound = GetNextVisualLeftCharacter( nextCharLeftPos );
- if( nextLeftPosFound && (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) ||
- (nextLeftPosFound && (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai)))
- {
- FindEndOfWord(nextCharLeftPos);
- if(nextCharLeftPos > iUncommittedText.HigherPos())
- {
- nextCharLeftPos = iUncommittedText.HigherPos();
- }
- }
-
-
-
-
- if ( !nextRightPosFound && !nextLeftPosFound )
- {
- aComsumeKey = EFalse;
- return EFalse;
- }
-
- TInt anchorPos = 0;
- TInt cursorPos = 0;
-
-
-
- TTmDocPosSpec pos = DocPos();
- CTmTextLayout::TTmChunkDescription leftChunk;
- CTmTextLayout::TTmChunkDescription rightChunk;
- FindAdjacentChunks(pos, leftChunk, rightChunk);
-
- /*
- if( (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) ||
- (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai))
- {
- cursorPos = pos.iPos;
- }
- else
- {
- cursorPos = pos.iPos + 1;
- }
- */
-
- anchorPos = pos.iPos;
- cursorPos = pos.iPos;
- FindEndOfWord(cursorPos);
- FindStartOfWord(anchorPos);
-
-
- if(cursorPos == pos.iPos || anchorPos == pos.iPos)
- {
- iUncommittedText.SetSelection(pos.iPos, pos.iPos);
- aComsumeKey = ETrue;
- return EFalse;
- }
- else
- {
- iUncommittedText.SetSelection(cursorPos, anchorPos);
- }
-
- if (iUncommittedText.Length() <= EMaximumFepWordLength)
- {
- iInputCapabilities.FepAwareTextEditor()->
- GetEditorContentForFep(aText, iUncommittedText.iAnchorPos, iUncommittedText.Length());
- aComsumeKey = ETrue;
- return ETrue;
- }
- else
- {
- /*
- TInt newCursorPosition= (pos.iPos == cursorPos) ? anchorPos : cursorPos;
- iUncommittedText.SetSelection(newCursorPosition, newCursorPosition);
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText);
- */
- aComsumeKey = ETrue;
- // The word is longer than EMaximumFepWordLength. Ui is deactivated.
- TryCloseUiL();
- return EFalse;
- }
- }
-
-void CAknFepManager::UpdateCbaL(TInt aResourceId)
- {
- if ( !IsFepAwareTextEditor() )
- {
- return;
- }
-
- if (IsCcpuFlagSet(ECcpuStateStartCopy | ECcpuStateCopy | ECcpuStateStartCut | ECcpuStateCut))
- {
- return;
- }
-
- //For bug ESSG-7RXC96
- if((iAknEditorFlags & EAknEditorFlagFindPane)&& IsChineseInputLanguage()&& aResourceId != NULL)
- {
- return;
- }
-
- iUiInterface->UpdateSoftkeysL(aResourceId, EditorState(), this,
- iSharedDataInterface->InputMode());
- }
-
-
-TBool CAknFepManager::TryRemoveNoMatchesIndicatorL()
- {
- __ASSERT_DEBUG(IsFlagSet(EFlagInsideInlineEditingTransaction),
- AknFepPanic(EAknFepPanicNotInsideInlineEdit));
-
- if (IsFlagSet(CAknFepManager::EFlagNoMatches))
- {
- ClearFlag(CAknFepManager::EFlagNoMatches);
- TBuf<EMaximumFepWordLength> newText;
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(newText,
- iUncommittedText.iAnchorPos,
- iUncommittedText.Length());
- iInputCapabilities.FepAwareTextEditor()->UpdateFepInlineTextL(newText,
- iUncommittedText.Length());
- SendEventsToPluginManL( EPluginSyncFepAwareText );
- return ETrue;
- }
- return EFalse;
- }
-
-TBool CAknFepManager::IsMoreGoodWordsComing(TInt aNewWordLength) const
- {
- return (aNewWordLength == iUncommittedText.Length() + 1);
- }
-#ifndef RD_INTELLIGENT_TEXT_INPUT
-TBool CAknFepManager::IsMoreGoodAutoCompleteWordsComing(TInt aInputMode,TInt aPreviousWordLength,
- TInt aNewWordLength) const
- {
- return ((aInputMode == EPtiEngineWordCompletion) && (aPreviousWordLength != aNewWordLength ));
- }
-#endif
-
-void CAknFepManager::TryStartCompoundWord()
- {
- // check if this word constitutes a 'compound' word
- // i.e. is either adjacent char is an alphabetic characeter
- TBuf<ESingleCharacter> ch;
- // check the previous character
- if(iUncommittedText.iAnchorPos>0)
- {
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(ch,
- iUncommittedText.iAnchorPos-1,
- ESingleCharacter);
- if (ch.Length()>0 && STATIC_CAST(TChar, IsValidInLineCharacter(ch[0])))
- {
- SetFlag(EFlagCompoundWord);
- }
- }
-
- // check the next character
- TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- if (!IsFlagSet(EFlagCompoundWord) && iUncommittedText.iAnchorPos < edSize)
- {
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(ch,
- iUncommittedText.iAnchorPos,
- ESingleCharacter);
- if (ch.Length()>0 && STATIC_CAST(TChar, IsValidInLineCharacter(ch[0])))
- {
- SetFlag(EFlagCompoundWord);
- }
- }
- }
-
-void CAknFepManager::AddCompoundWordToUdbL()
- {
- __ASSERT_DEBUG(WesternPredictive() , AknFepPanic(EAknFepPanicNonPermittedEditorMode));
-
- HBufC* compoundWordBuf =
- HBufC::NewLC(iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep()); // buffer for text
- TPtr compoundWord=compoundWordBuf->Des();
-
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
-
- // reset cursor span on word
- FindStartOfWord(iUncommittedText.iAnchorPos);
- FindEndOfWord(iUncommittedText.iCursorPos);
-
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(compoundWord,
- iUncommittedText.iAnchorPos,
- iUncommittedText.Length());
- FepUI()->AddTextToUserDictionaryL(compoundWord);
- CleanupStack::PopAndDestroy(); // compoundWordBuf
- }
-
-void CAknFepManager::SetWesternPredictive( const TBool aWesternPredictive )
- {
- const TInt previousValue = iWesternPredictive;
- iWesternPredictive = aWesternPredictive && !(iAknEditorFlags & EAknEditorFlagNoT9) &&
- // Predictive QWERTY (XT9) changes ---->
- (
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- (
-#endif //RD_INTELLIGENT_TEXT_INPUT
- iLanguageCapabilities.iSupportsWesternPredictive
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- && !iQwertyInputMode)
- || (iLanguageCapabilities.iSupportsWesternQwertyPredictive && iQwertyInputMode)
-#ifdef __HALF_QWERTY_KEYPAD
- || (iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive && iQwertyInputMode)
-#endif //__HALF_QWERTY_KEYPAD
-#endif //RD_INTELLIGENT_TEXT_INPUT
- );
- // Predictive QWERTY (XT9) changes <----
- if ( (previousValue != iWesternPredictive) && !(iAknEditorFlags & EAknEditorFlagNoT9) )
- {
- if (iWesternPredictive)
- {
- iSharedDataInterface->SetPredictiveTextOn();
- }
- else
- {
- iSharedDataInterface->ResetPredictiveTextOn();
- }
- }
- }
-
-void CAknFepManager::SetWesternAutoComplete( const TBool aWesternAutoComplete )
- {
- const TInt previousValue = iIsAutoCompleteOn;
- iIsAutoCompleteOn = aWesternAutoComplete && !(iAknEditorFlags & EAknEditorFlagNoT9);
- if ( (previousValue != iIsAutoCompleteOn) && !(iAknEditorFlags & EAknEditorFlagNoT9) )
- {
- if (iIsAutoCompleteOn)
- {
- iSharedDataInterface->SetPredictiveTextAutoCompleteOn();
- }
- else
- {
- iSharedDataInterface->ResetPredictiveTextAutoCompleteOn();
- }
- }
- }
-
-void CAknFepManager::SetJapanesePredictive(const TBool aJapanesePredictive)
- {
- if (iJapanesePredictive != aJapanesePredictive)
- {
- iJapanesePredictive = aJapanesePredictive;
- }
- if (iJapanesePredictive & iSharedDataInterface->PredictiveTextJapaneseOn()
- || !iJapanesePredictive & !iSharedDataInterface->PredictiveTextJapaneseOn())
- {
- if(iJapanesePredictive)
- {
- iSharedDataInterface->SetJapanesePredictiveTextOn();
- }
- else
- {
- iSharedDataInterface->ResetJapanesePredictiveTextOn();
- }
- }
- }
-
-void CAknFepManager::SetQwertyMode(const TBool aQwertyInputMode)
- {
-#ifdef RD_SCALABLE_UI_V2
- if( aQwertyInputMode && iFepPluginManager &&
- iSharedDataInterface->PluginInputMode() != EPluginInputModeNone
- // Add this condition for addtion of ITI features on FSQ.
- // iSharedDataInterface->QwertyInputMode() == 1, means that
- // hw keyboard is slided, then need to close touch inputmethods.
- && iSharedDataInterface->QwertyInputMode() )
- {
- iFepPluginManager->ResetMenuState(EFalse);
- ExitPluginSpellModeByCancel();
- TRAP_IGNORE(iFepPluginManager->ClosePluginInputModeL( ETrue ));
- if ( iCancelPopupInQwerty )
- {
- TRAP_IGNORE( SimulateKeyEventL( EKeyCBA2 ) );
- }
- }
- SetQwertyModeToInputcapbility();
-#endif//RD_SCALABLE_UI_V2
- if (!COMPARE_BOOLS(aQwertyInputMode, iQwertyInputMode))
- {
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- if(IsAutoCompleteOn())
- {
- TRAP_IGNORE(RemoveSuggestedCompletionL());
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
- iQwertyInputMode = aQwertyInputMode;
- if (!iQwertyInputMode)
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- SetTypingCorrectionLevel(EPtiErrorCorrectionLevelHigh);
- SetNumberCandidateState(ETrue); // ETrue
- SetPrimaryCandidate(EFalse); // Best prediction
-#endif
- ClearFlag(EFlagQwertyShiftMode | EFlagNoActionDuringChrKeyPress);
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- else
- {
- iSharedDataInterface->HandlePredictiveTextNumberCandidateSettingChange();
- iSharedDataInterface->HandlePredictiveTextTypingCorrectionLevelChange();
- iSharedDataInterface->HandlePredictiveTextPrimaryCandidateChange();
- }
-#endif
-
- if ( iFepManState != EAknFepStateNull && IsFepAwareTextEditor() )
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-
- // In case of layout remove the auto completion part
- // Before transfer fep state to editor state.
- if(IsAutoCompleteOn())
- {
-#ifdef RD_SCALABLE_UI_V2
- if( iFepPluginManager
- && iFepPluginManager->IsSupportITIOnFSQ()
- && !iQwertyInputMode )
- {
- TRAP_IGNORE( iPtiEngine->HandleCommandL( EPtiCommandLockCurrentCandidate ) );
- }
- else
-#endif //RD_SCALABLE_UI_V2
- {
- TInt tailLength = 0;
- TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength ));
- if(tailLength > 0)
- {
- TRAP_IGNORE(
- {
- RemoveSuggestedAdvanceCompletionL();
- iPtiEngine->HandleCommandL( EPtiCommandLockCurrentCandidate );
- });
- }
- }
- }
-#endif
- if ( !iFocusedItemDestroy )
- {
- TRAP_IGNORE(
- {
- TransferFepStateToEditorL();
- TryCloseUiL();
- ConfigureFEPFromEditorStateL();
- });
- }
- }
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(iFnKeyManager)
- iFnKeyManager->SetQwertyInputMode(aQwertyInputMode);
-#endif
- }
-
-TBool CAknFepManager::WesternPredictive(TInt aMode) const
- {
- TInt mode = iMode;
- if ( aMode )
- {
- mode = aMode;
- }
- return (mode == ELatin && iWesternPredictive &&
- // Predictive QWERTY (XT9) changes ---->
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- ((
-#endif //RD_INTELLIGENT_TEXT_INPUT
- iLanguageCapabilities.iSupportsWesternPredictive
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- && !iQwertyInputMode)
- || (iLanguageCapabilities.iSupportsWesternQwertyPredictive && iQwertyInputMode)
-#ifdef __HALF_QWERTY_KEYPAD
- || (iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive && iQwertyInputMode)
-#endif //__HALF_QWERTY_KEYPAD
- )
-#endif //RD_INTELLIGENT_TEXT_INPUT
- );
- // Predictive QWERTY (XT9) changes <----
- }
-
-TBool CAknFepManager::IsPredictive(TInt aMode) const
- {
- TBool isPredictive = EFalse;
- TInt mode = iMode;
- if ( aMode )
- {
- mode = aMode;
- }
- if (mode == EHiraganaKanji )
- {
- if ((iPermittedInputModes & EAknEditorHiraganaKanjiInputMode)
- && iJapanesePredictive
- && !(iAknEditorFlags & EAknEditorFlagNoT9)
- && HasJapanesePredictionInputMode())
- {
- isPredictive = ETrue;
- // Japanese predictive input is available on both Qwerty and not Qwerty
- return isPredictive;
- }
- }
- else if (mode == ELatin)
- {
- if ((iPermittedInputModes & (EAknEditorTextInputMode | EAknEditorHalfWidthTextInputMode))
- && !(iAknEditorFlags & EAknEditorFlagNoT9)
- && iWesternPredictive &&
- (iLanguageCapabilities.iSupportsWesternPredictive
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- ||iLanguageCapabilities.iSupportsWesternQwertyPredictive
-#ifdef __HALF_QWERTY_KEYPAD
- ||iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive
-#endif //__HALF_QWERTY_KEYPAD
-#endif //RD_INTELLIGENT_TEXT_INPUT
- )) // Predictive QWERTY (XT9) changes
- {
- isPredictive = ETrue;
- }
- }
-#ifdef RD_SCALABLE_UI_V2
- #ifdef RD_INTELLIGENT_TEXT_INPUT
- return isPredictive; //&& (iFepPluginManager->PluginInputMode() == EPluginInputModeNone);
- #else
- return isPredictive && !iQwertyInputMode
- && ((iFepPluginManager->PluginInputMode() == EPluginInputModeItut)
- || (iFepPluginManager->PluginInputMode() == EPluginInputModeNone));
- #endif //RD_INTELLIGENT_TEXT_INPUT
-#else
- #ifdef RD_INTELLIGENT_TEXT_INPUT
- return isPredictive;
- #else
- return isPredictive && !iQwertyInputMode;
- #endif //RD_INTELLIGENT_TEXT_INPUT
-#endif //RD_SCALABLE_UI_V2
- }
-
-TBool CAknFepManager::Japanese() const
- {
- TBool rtn = EFalse;
- switch (iMode)
- {
- case EHiraganaKanji:
- case EKatakana:
- case EHiragana:
- rtn = ETrue;
- break;
- case ELatin:
- if ((!WesternPredictive()) && iCharWidth == EFullWidthChar)
- {
- rtn = ETrue;
- }
- break;
- case ENumber:
- if (iCharWidth == EFullWidthChar)
- {
- rtn = ETrue;
- }
- break;
- default:
- break;
- }
- return rtn;
- }
-
-TBool CAknFepManager::IsOnlyFullWidthCharacterPermitted() const
- {
- CAknEdwinState* editorState = EditorState();
- TUint permittedInputModes = editorState->PermittedInputModes();
- TUint fullWidthPermitted = (EAknEditorFullWidthTextInputMode
- | EAknEditorFullWidthNumericInputMode
- | EAknEditorFullWidthKatakanaInputMode);
- TUint fullWidthNotPermitted = ~fullWidthPermitted;
- TBool isfullchar = ETrue;
- if (permittedInputModes & fullWidthNotPermitted)
- {
- isfullchar = EFalse;
- }
-
- if (!(permittedInputModes & fullWidthPermitted))
- {
- isfullchar = EFalse;
- }
-
- return isfullchar;
- }
-
-TBool CAknFepManager::IsOnlyHalfWidthCharacterPermitted() const
- {
- CAknEdwinState* editorState = EditorState();
- TUint permittedInputModes;
- if( editorState )
- {
- permittedInputModes= editorState->PermittedInputModes();
- }
- else
- {
- permittedInputModes = EAknEditorNumericInputMode;
- }
- TUint halfWidthNotPermitted = (EAknEditorFullWidthTextInputMode
- | EAknEditorFullWidthNumericInputMode
- | EAknEditorFullWidthKatakanaInputMode
- | EAknEditorHiraganaKanjiInputMode
- | EAknEditorHiraganaInputMode);
-
- TUint halfWidthPermitted = ~halfWidthNotPermitted;
- TBool ishalfchar = ETrue;
- if (permittedInputModes & halfWidthNotPermitted)
- {
- ishalfchar = EFalse;
- }
-
- if (!(permittedInputModes & halfWidthPermitted))
- {
- ishalfchar = EFalse;
- }
- if (permittedInputModes & EAknEditorTextInputMode)
- {
- ishalfchar = EFalse;
- }
- if (editorState && (editorState->Flags() & EAknEditorFlagLatinInputModesOnly))
- {
- ishalfchar = ETrue;
- }
- return ishalfchar;
- }
-
-TBool CAknFepManager::IsHalfAndFullKatakanaPermitted() const
- {
- CAknEdwinState* editorState = EditorState();
- TUint permittedInputModes = editorState->PermittedInputModes();
- TUint katakanaInputMode = (EAknEditorKatakanaInputMode
- | EAknEditorFullWidthKatakanaInputMode);
- TBool iskatakana = EFalse;
- if ((permittedInputModes & katakanaInputMode) == katakanaInputMode)
- {
- iskatakana = ETrue;
- }
- return iskatakana;
- }
-
-TBool CAknFepManager::IsHalfAndFullLatinPermitted() const
- {
- CAknEdwinState* editorState = EditorState();
- TUint permittedInputModes = editorState->PermittedInputModes();
- TUint latinInputMode = (EAknEditorHalfWidthTextInputMode
- | EAknEditorFullWidthTextInputMode);
- TBool islatin = EFalse;
-
- if ((permittedInputModes & latinInputMode) == latinInputMode)
- {
- islatin = ETrue;
- }
- return islatin;
- }
-
-TBool CAknFepManager::IsHalfAndFullNumberPermitted() const
- {
- CAknEdwinState* editorState = EditorState();
- TUint permittedInputModes = editorState->PermittedInputModes();
- TUint numInputMode = (EAknEditorNumericInputMode
- | EAknEditorFullWidthNumericInputMode);
- TBool isnum = EFalse;
- if ((permittedInputModes & numInputMode) == numInputMode)
- {
- isnum = ETrue;
- }
-
- return isnum;
- }
-
-TWidthChar CAknFepManager::CharacterWidth() const
- {
- return iCharWidth;
- }
-
-CPtiEngine* CAknFepManager::PtiEngine() const
- {
- return iPtiEngine;
- }
-
-void CAknFepManager::SetInlineEditingCursorVisibilityL(TBool aCursorVisibility)
- {
-#ifdef RD_SCALABLE_UI_V2
- if ( SemiFepAwareTextEditor( ETrue ) )
-#else
- if (iInputCapabilities.FepAwareTextEditor())
-#endif // RD_SCALABLE_UI_V2
- {
- iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL(aCursorVisibility);
- }
- }
-
-TInt CAknFepManager::InputMode() const
- {
- return iMode;
- }
-
-TInt CAknFepManager::CangJieMode() const
- {
- TInt shareMode = iSharedDataInterface->CangJieMode();
- TInt cangjieMode = shareMode + EPtiEngineNormalCangjieQwerty;
- return cangjieMode;
- }
-
-TBool CAknFepManager::InputLanguageSupportsCaseChanges() const
- {
- return iLanguageCapabilities.iSupportsCase;
- }
-
-TBool CAknFepManager::IsAbleScrollLatinPredictive() const
- {
- return iSharedDataInterface->ScrollLatinPredictiveCandidates();
- }
-
-TText CAknFepManager::PreviousChar( TBool /*aContextSensitive*/ )
- {
- TBuf<ESingleCharacter> previousCharacter(ESingleCharacter);
- previousCharacter.FillZ();
-
- TCursorSelection curSel;
- if ( IsFepAwareTextEditor() )
- {
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(curSel);
- TInt lowerpos = curSel.LowerPos();
- if(lowerpos > 0)
- {
- iInputCapabilities.FepAwareTextEditor()->
- GetEditorContentForFep(previousCharacter, lowerpos-1, ESingleCharacter);
- if (previousCharacter.Length())
- return previousCharacter[0];
- }
- }
- return NULL;
- }
-
-TBool CAknFepManager::IsZWSCharacterPresent( TBool aLigaturePresent /* = EFalse*/ )
- {
- TBuf<3> previousCharacter;
- previousCharacter.Zero();
- TBool found = EFalse;
- previousCharacter.FillZ();
-
- TCursorSelection curSel;
- if ( IsFepAwareTextEditor() )
- {
- MCoeFepAwareTextEditor* fepAwareTextEditor =
- iInputCapabilities.FepAwareTextEditor();
- fepAwareTextEditor->GetCursorSelectionForFep(curSel);
- TInt lowerpos = curSel.LowerPos();
- if( lowerpos > 1 )
- {
- if( aLigaturePresent && lowerpos > 3 )
- {
- fepAwareTextEditor->
- GetEditorContentForFep(previousCharacter,
- lowerpos - 4, 2);
- }
- else
- {
- fepAwareTextEditor->
- GetEditorContentForFep(previousCharacter,
- lowerpos - 2, 2);
- }
- if( previousCharacter[0] == ZERO_WIDTH_SPACE
- || previousCharacter[1] == ZERO_WIDTH_SPACE )
- {
- found = ETrue;
- }
- }
- }
- return found;
- }
-
-TText CAknFepManager::NextChar()
- {
- TBuf<ESingleCharacter> nextCharacter(ESingleCharacter);
- nextCharacter.FillZ();
-
- TCursorSelection curSel;
- if ( IsFepAwareTextEditor() )
- {
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(curSel);
- TInt higherpos = curSel.HigherPos();
- TInt maxLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- if ( higherpos >= 0 && higherpos <= maxLength && maxLength >= 1 )
- {
- iInputCapabilities.FepAwareTextEditor()->
- GetEditorContentForFep(nextCharacter, higherpos, ESingleCharacter);
- if( nextCharacter.Length() )
- return nextCharacter[0];
- }
- }
- return NULL;
- }
-
-void CAknFepManager::FindStartOfWord(TInt& aAnchorPos) const
- {
- TBuf<ESingleCharacter> characterBuffer;
- FOREVER
- {
- if (aAnchorPos<=0)
- {
- break; // start of editor
- }
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(characterBuffer,
- aAnchorPos-1,
- ESingleCharacter);
- if (!IsValidInLineCharacter(characterBuffer[0]))
- {
- break;
- }
- aAnchorPos--;
- }
- }
-
-void CAknFepManager::FindEndOfWord(TInt& aCursorPos) const
- {
- TBuf<ESingleCharacter> characterBuffer;
- FOREVER
- {
- if (aCursorPos>=iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep())
- {
- break; // end of editor
- }
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(characterBuffer,
- aCursorPos,
- ESingleCharacter);
- if (!IsValidInLineCharacter(characterBuffer[0]))
- {
- break;
- }
- aCursorPos++;
- }
- }
-
-TBool CAknFepManager::CursorInsideWord()
- {
- TBuf<ESingleCharacter> characterBuffer;
- TBool insideWord=ETrue;
-
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- TInt cursorPos=iUncommittedText.iCursorPos;
-
- if (cursorPos)
- {
- // check character before cursor
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(characterBuffer,
- cursorPos-1,
- ESingleCharacter);
- if (characterBuffer.Length())
- {
- if (!IsValidInLineCharacter(characterBuffer[0]))
- {
- insideWord=EFalse;
- }
- }
- }
- else // at start of editor
- {
- insideWord=EFalse;
- }
-
- if (insideWord && cursorPos<iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep())
- {
- // put character after cursor into buffer
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(characterBuffer, cursorPos,
- ESingleCharacter);
- if (characterBuffer.Length())
- {
- if (!IsValidInLineCharacter(characterBuffer[0]))
- {
- insideWord=EFalse;
- }
- }
- }
- else // at end of editor
- {
- insideWord=EFalse;
- }
-
- return insideWord;
- }
-
-void CAknFepManager::MoveCursorToStartOfWordL()
- {
- TInt anchorPos=iUncommittedText.iAnchorPos;
- FindStartOfWord(anchorPos);
- iUncommittedText.SetSelection(anchorPos, anchorPos);
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText);
- }
-
-void CAknFepManager::MoveCursorToEndOfWordL()
- {
- TInt cursorPos=iUncommittedText.iCursorPos;
-
- if(!IsExtendedFlagSet(EExtendedFlagOkKeyPressOnCandidatePopup))
- FindEndOfWord(cursorPos);
- iUncommittedText.SetSelection(cursorPos, cursorPos);
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText);
- }
-
-TKeyResponse CAknFepManager::HandleNaviEventOutsideInlineEditL(TUint aCode,
- TKeyPressLength aLength)
- {
- TKeyResponse response = EKeyWasNotConsumed;
-
- if (TryHandleCommonArrowAndBackspaceFunctionalityL(aCode, response))
- {
- return response;
- }
- if (WesternPredictive())
- {
- response = HandlePredictiveNaviEventOutsideInlineEditL(aCode, aLength);
- }
-
- return response;
- }
-
-TKeyResponse CAknFepManager::HandleWesternPredictiveArrowKeyL(TInt aCode, TKeyPressLength aLength)
- {
- TKeyResponse response = EKeyWasNotConsumed;
-
- if (IsFlagSet(EFlagLineFeedCharacter))
- {
- // This event will stop the multitapping timer for enter chr.
- // just return.
- return EKeyWasConsumed;
- }
-
- TCursorSelection selection;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(selection);
- if(!IsMfneEditor() &&
- ( iFepPluginManager->PluginInputMode() == EPluginInputModeItut) &&
- selection.Length() > 0)
- {
- // If open virtual ITUT and highlight some chars
- return EKeyWasConsumed;
- }
- if (aCode == EKeyUpArrow || aCode == EKeyDownArrow)
- {
- ClearFlag(EFlagCompoundWord);
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- // moving out of an inline edit
- TryRemoveNoMatchesIndicatorL();
- UpdateCbaL(NULL);
- // To rip off suggested word completion when user presses UP / DOWN arrow keys
- if(IsAutoCompleteOn())
- {
-#ifndef RD_INTELLIGENT_TEXT_INPUT
-
- RemoveSuggestedCompletionL();
-
-#else
- TInt tailLength = 0;
- iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength,
- &tailLength );
- if(tailLength > 0)
- {
- RemoveSuggestedAdvanceCompletionL();
- return EKeyWasConsumed;
- }
-#endif
- }
- if (IsFlagSet(EFlagShiftKeyDepressed) || IsCcpuFlagSet(ECcpuStateHashDown))
- {
- CommitInlineEditL();
- TryCloseUiL();
- SimulateKeyEventL(EKeyF19); // Asyncronous case update
- // pass to editor for text selection.
- response=EKeyWasNotConsumed;
- }
- }
- if ((iInputCapabilities.FepAwareTextEditor() && !TryHandleTextSelectedNaviEventL(aCode, response)) && !IsFlagSet(EFlagShiftKeyDepressed))
- {
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- ClearFlag(CAknFepManager::EFlagNoMatches);
- TryRemoveNoMatchesIndicatorL();
- CommitInlineEditL();
- }
- UpdateCbaL(NULL);
-
- // simulate a designated key event to catch and check if we're inside a word
- if (aCode == EKeyDownArrow)
- {
- SimulateKeyEventL(EKeyF22);
- }
- else
- {
- SimulateKeyEventL(EKeyF23);
- }
- // pass to editor for text selection.
- response=EKeyWasNotConsumed;
- }
- else if (IsFlagSet(EFlagShiftKeyDepressed) || IsCcpuFlagSet(ECcpuStateHashDown))
- {
- // Need to update case indicator if text selection is made upwards.
- SimulateKeyEventL(EKeyF19);
- }
- }
- else // right or left
- {
- if (IsFlagSet(EFlagInsideInlineEditingTransaction))
- {
- // moving out of an inline edit
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- if(IsAutoCompleteOn())
- {
- if((aCode == EKeyLeftArrow &&
- CurrentInputDirectionality() == TBidiText::ELeftToRight) ||
- (aCode == EKeyRightArrow &&
- CurrentInputDirectionality() == TBidiText::ERightToLeft))
- {
- RemoveSuggestedCompletionL();
- }
- }
-#else
- if(IsAutoCompleteOn())
- {
- TInt tailLength = 0;
- iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength );
- // In case the inline editing is ongoing and there is a word completion
- // currently shown, the first backwards tap will remove the suggested
- // completion.
- if(tailLength > 0)
- {
- if (((CurrentInputDirectionality()==TBidiText::ERightToLeft) && aCode == EKeyLeftArrow)
- || ((CurrentInputDirectionality()==TBidiText::ELeftToRight) && aCode == EKeyRightArrow ))
- {
- iPtiEngine->HandleCommandL( EPtiCommandLockCurrentCandidate);
- TPtrC selectedWord = iPtiEngine->CurrentWord();
- UpdateInlineEditL( selectedWord, selectedWord.Length() ); //selection.iAnchorPosition
- iPtiEngine->CommitCurrentWord();
- TryCloseUiL();
- // Asyncronous case update after the editor has handled the key
- SimulateKeyEventL(EKeyF19);
- response=EKeyWasConsumed;
- }
- else if(((CurrentInputDirectionality()== TBidiText::ERightToLeft ) && aCode == EKeyRightArrow)
- || ((CurrentInputDirectionality()== TBidiText::ELeftToRight) && aCode == EKeyLeftArrow ))
- {
- RemoveSuggestedAdvanceCompletionL();
- response=EKeyWasConsumed;
- }
- return response;
- }
- else if (!IsQwerty())
- {
- iPtiEngine->CommitCurrentWord();
- }
-
- }
-#endif // RD_INTELLIGENT_TEXT_INPUT
- TryRemoveNoMatchesIndicatorL();
- UpdateCbaL(NULL);
- if (IsFlagSet(EFlagShiftKeyDepressed) || IsCcpuFlagSet(ECcpuStateHashDown))
- {
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- if(IsAutoCompleteOn()) // To rip off suggested completion when shift key is pressed
- {
- RemoveSuggestedCompletionL();
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
- CommitInlineEditL();
- TryCloseUiL();
- SimulateKeyEventL(EKeyF19); // Asyncronous case update
- // pass to editor for text selection.
- response=EKeyWasNotConsumed;
- }
- else
- {
- TWesternNaviEvent naviEvent = ELeftNaviEvent;
- if (aCode == EKeyRightArrow)
- {
- naviEvent = ERightNaviEvent;
- }
- // Find the visual left/right end of the current word
- TTmDocPosSpec pos;
- GetAvkonDefinedVisualLimitsOfSelection(
- iUncommittedText, naviEvent, pos, NULL );
-
- if (IsCcpuFlagSet(ECcpuStateNewPredictiveWord))
- {
- // This is new predictive word which is being committed with arrow
- // key. Force ::TryCloseUiL to commit PtiEngie word to keep
- // frequency information in sync.
- SetCcpuFlag(ECcpuStataCommitPredictiveWord);
- }
-
- TryCloseUiL();
-
- // Position should be dis-ambiguated based on last navigation and direction of blocks.
- AdjustPosSpecForAmbiguityAfterLeftOrRightNavigation( pos, naviEvent );
-
- SetCursorPositionL( pos );
- if (CursorInsideWord() && naviEvent == ERightNaviEvent)
- {
- MoveCursorToEndOfWordL();
- }
-
- iCaseMan->UpdateCase(ENullNaviEvent);
- response=EKeyWasConsumed;
- }
- }
- else
- {
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- if ( iLanguageCapabilities.iInputLanguageCode == ELangThai ) // Without this, t9 goes inside words
- { // That is not allowed in Thai
- response = EKeyWasNotConsumed;
- }
- else
-#endif //RD_INTELLIGENT_TEXT_INPUT
- response = HandleNaviEventOutsideInlineEditL(aCode, aLength);
- if (response == EKeyWasNotConsumed)
- {
- // moving over a space
- if (aCode == EKeyLeftArrow && !IsFlagSet(EFlagShiftKeyDepressed))
- {
- iCaseMan->UpdateCase(ELeftNaviEvent);
- }
- else if (!IsFlagSet(EFlagShiftKeyDepressed)) // EKeyRightArrow
- {
- iCaseMan->UpdateCase(ERightNaviEvent);
- }
- }
- else
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- }
- return response;
- }
-
-TBool CAknFepManager::TryHandleTextSelectedNaviEventL(TInt aCode, TKeyResponse& response)
- {
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
-
- if (!IsFlagSet(EFlagShiftKeyDepressed) && iUncommittedText.Length())
- {
- if (aCode == EKeyBackspace)
- {
- iCaseMan->UpdateCase(EBackspaceEvent);
- response = EKeyWasNotConsumed;
- }
- else
- {
- TInt newCursorPos = iUncommittedText.HigherPos(); //default, right or down
- if (aCode == EKeyLeftArrow || aCode == EKeyUpArrow)
- {
- newCursorPos = iUncommittedText.LowerPos();
- }
- iUncommittedText.SetSelection(newCursorPos, newCursorPos);
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText);
-
- if (WesternPredictive())
- {
- if (CursorInsideWord())
- {
- if (aCode == EKeyLeftArrow || aCode == EKeyUpArrow)
- {
- MoveCursorToStartOfWordL();
- }
- else //right or down
- {
- MoveCursorToEndOfWordL();
- }
- }
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- response = EKeyWasConsumed;
- }
- return ETrue;
- }
- return EFalse;
- }
-
-TBool CAknFepManager::TryHandleCommonArrowAndBackspaceFunctionalityL(TInt aCode,
- TKeyResponse& aResponse)
- {
- TBool keyHandled = ETrue;
- if ( !IsFepAwareTextEditor() )
- {
- aResponse=EKeyWasNotConsumed;
- return keyHandled;
- }
-#ifdef RD_HINDI_PHONETIC_INPUT
- if(iLanguageCapabilities.iInputLanguageCode == KLangHindiPhonetic)
- {
- if (aCode == EKeyBackspace)
- {
- CommitInlineEditL();
- FepUI()->HandleKeyL(aCode, EShortKeyPress);
- }
- if(IsFlagSet(CAknFepManager::EFlagNoMatches))
- {
- if(PreviousChar() == 0x003F && aCode != EKeyBackspace)
- {
- RemovePreviousCharacterL();
- }
- ClearFlag(CAknFepManager::EFlagNoMatches);
- FepUI()->ExpireMultitapTimer();
- }
- iPtiEngine->HandleCommandL(EPtiCommandBreakSyllable, NULL );
- }
-#endif
- if (IsFlagSet(EFlagInsideMultitapInlineEditingTransaction))
- {
- FepUI()->ExpireMultitapTimer();
-
- if (aCode == EKeyBackspace)
- {
- aResponse = EKeyWasNotConsumed; // let editor handle the move
- }
- else
- {
- aResponse = EKeyWasConsumed;
- }
- }
- else
- {
- //selecting text
- if (IsFlagSet(EFlagShiftKeyDepressed) || IsCcpuFlagSet(ECcpuStateCopy | ECcpuStateCut))
- {
- if (iShiftKeypressMonitor->IsActive())
- {
- ResetShiftKeyMonitorL(); //don't want edit menu
- }
- ClearFlag(EFlagQwertyShiftMode);
- SimulateKeyEventL(EKeyF19); // Asyncronous case update
- aResponse = EKeyWasNotConsumed;
- return keyHandled;
- }
-
- TCursorSelection currentEditorSelection;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(currentEditorSelection);
-
- TWesternNaviEvent naviEvent = ENullNaviEvent;
-
- // Translate key code to internal navi-event
- switch( aCode )
- {
- case EKeyUpArrow:
- naviEvent = EUpNaviEvent;
- break;
- case EKeyDownArrow:
- naviEvent = EDownNaviEvent;
- break;
- case EKeyRightArrow:
- naviEvent = ERightNaviEvent;
- break;
- case EKeyLeftArrow:
- naviEvent = ELeftNaviEvent;
- break;
- default: // just leave it as NULL
- break;
- }
-
- if (currentEditorSelection.Length())
- {
- // we have text selected - set cursor to start/end of current selection
- TTmDocPosSpec newPos;
- aResponse = NavigateFromSelectionL( currentEditorSelection, naviEvent, newPos );
- if ( aCode != EKeyBackspace && WesternPredictive() )
- {
- if (CursorInsideWord())
- {
- TBool rightToleftParagraph = IsRightToLeftParagraph(newPos);
- if ( (rightToleftParagraph && naviEvent == ELeftNaviEvent) ||
- (!rightToleftParagraph && naviEvent == ERightNaviEvent) )
- {
- MoveCursorToEndOfWordL();
- }
- else
- {
- MoveCursorToStartOfWordL();
- }
- }
-
- }
- }
- else if (!(EditorState()->Flags() & EAknEditorFlagNoLRNavigation))
- {
- if ((naviEvent != ENullNaviEvent) && HandleLoopingInNaviEventL(naviEvent))
- {
- aResponse=EKeyWasConsumed;
- }
- else
- {
- if (iMode == ELatin)
- {
- // normal operation of Down/Up scroll keypress action.
- switch( aCode )
- {
- case EKeyUpArrow:
- case EKeyDownArrow:
- SimulateKeyEventL(EKeyF22);
- break;
- case EKeyRightArrow:
- case EKeyLeftArrow:
- {
- /*Hindi*/
- if( (TAknFepUiIndicInputManager :: IsIndicLangauge(
- TLanguage(iLanguageCapabilities.iInputLanguageCode)))
- && IsZWSCharacterPresent() )
- {
- RemoveZWSCharacterL(EKeyLeftArrow);
- }
- }
- break;
- default: // nothing
- break;
- }
- }
- keyHandled = EFalse;
- }
- }
- }
-
- return keyHandled;
- }
-
-/**
-* Routine handled navigation and also backspace events at "beginning" of document
-*
-*/
-TBool CAknFepManager::HandleLoopingInNaviEventL(TWesternNaviEvent aNaviEvent)
- {
- TBool looping = EFalse;
- TBool eventHandled = EFalse;
- TTmDocPosSpec newCursorPos;
-
- // This routine may handle Left, Right and Backspace and nothing else
- // Note that Up and Down cannot do any sort of document looping in FEP
- if ( aNaviEvent != ELeftNaviEvent
- && aNaviEvent != ERightNaviEvent
- && aNaviEvent != EBackspaceEvent )
- return eventHandled; // not consumed
-
- TTmDocPosSpec pos = DocPos();
- TBool rightToLeftParagraph = IsRightToLeftParagraph(pos);
-
- TWesternNaviEvent incrementingNaviEvent =
- rightToLeftParagraph ? ELeftNaviEvent : ERightNaviEvent;
- TWesternNaviEvent decrementingNaviEvent =
- rightToLeftParagraph ? ERightNaviEvent : ELeftNaviEvent;
-
- if (aNaviEvent == decrementingNaviEvent)
- {
- // Abandon early if we are not in the first line.
- if ( InFirstLineAndFormatted( pos ) )
- {
- TTmDocPosSpec startPos;
- GetVisualDocStart( startPos );
- if( AtVisualStart( pos, startPos ) )
- {
- TTmDocPosSpec endPos;
- if ( !GetVisualDocEnd( endPos ) )
- {
- // End of document is not formatted. Value returned is just pos at DocLength.
- // So actually move the cursor there (this is guranteed to format the last line)
- // and the end End position is found a 2nd time.
- newCursorPos = endPos;
- SetCursorPositionL( newCursorPos );
- GetVisualDocEnd( endPos );
- }
- newCursorPos = endPos;
- looping = ETrue;
- }
- }
- }
- else if (aNaviEvent == incrementingNaviEvent )
- {
- if ( InLastLineAndFormatted( pos ) )
- {
- TTmDocPosSpec endPos;
- GetVisualDocEnd( endPos );
- if( AtVisualEnd( pos, endPos,
- iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep() ) )
- {
- TTmDocPosSpec startPos;
- if ( !GetVisualDocStart( startPos ) )
- {
- // Document was not formatted at docPos(0). So actually move the cursor
- // to that line at least, and then ask for the start pos again.
- newCursorPos = startPos;
- SetCursorPositionL( newCursorPos );
- GetVisualDocStart( startPos );
- }
- newCursorPos = startPos;
- looping = ETrue;
- }
- }
- }
- else if ( aNaviEvent == EBackspaceEvent )
- {
- // Deletion is always logical, so the condition is simply to test the logical pos.
- if ( pos.iPos ==0 )
- {
- eventHandled = ETrue;
- }
- }
-
- if (looping)
- {
- // This takes language issues into account, adjusting the cursor position:
- AdjustPosSpecForInputLanguageAfterDocumentLoop( newCursorPos, aNaviEvent,
- (aNaviEvent == incrementingNaviEvent) );
- SetCursorPositionL( newCursorPos );
- eventHandled = ETrue;
- }
- return eventHandled;
- }
-
-void CAknFepManager::TransferFepStateToEditorL( TBool aFnLockSync )
- {
- // If editor in Fnlock state, need to set actual input mode
- // because, in case of qwerty keypad alphanumeric editor there is no numeric mode
- // numeric mode handle as FnLock
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-
- if( aFnLockSync && iQwertyInputMode && iFnKeyManager && iFnKeyManager->FnKeyState()==CAknFepFnKeyManager::EFnKeyLock)
- {
- EditorState()->SetCurrentInputMode(EditorModeFromFepMode(ENumber));
- // Indicator should not be reset, if menu is displaying from editor.
- if(!IsFlagSet(EFlagForegroundUIComponentVisible | EFlagMenuPaneVisible))
- iFnKeyManager->ClearFnKeyState();
- }
- else
- {
-#endif
- EditorState()->SetCurrentInputMode(EditorModeFromFepMode(iMode));
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- }
- if(iFnKeyManager && iFnKeyManager->FnKeyState()!=CAknFepFnKeyManager::EFnKeyLock)
- iFnKeyManager->ClearFnKeyState();
-
-#endif
-
-
- if ((iMode == ELatin && iWesternPredictive &&
- IsFlagSet(EFlagInsideInlineEditingTransaction))
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- ||(IsLanguageSupportPrediction() && IsFlagSet(EFlagInsideInlineEditingTransaction))
-#endif //RD_INTELLIGENT_TEXT_INPUT
- )
- {
- EditorState()->SetInlineEditSpan(iUncommittedText);
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if (IsFlagSet(CAknFepManager::EFlagNoMatches))
-#endif //RD_INTELLIGENT_TEXT_INPUT
- TryRemoveNoMatchesIndicatorL();
- UpdateCbaL(NULL);
- }
- else
- {
- EditorState()->SetInlineEditSpan(TCursorSelection(0,0));
- }
- EditorState()->SetCurrentCaseWithNoInitialisation(iCaseMan->CurrentCase());
- if ( IsFlagSet( EFlagSupressAutoUpdate ) )
- {
- EditorState()->SetFlags( EditorState()->Flags() | EFlagSupressAutoUpdate );
- }
- else
- {
- EditorState()->SetFlags( EditorState()->Flags() & ~EFlagSupressAutoUpdate );
- }
- SetQwertyModeToInputcapbility();
- }
-
-MAknFepManagerInterface* CAknFepManager::FepUI() const
- {
-#ifdef RD_SCALABLE_UI_V2
- if ( iFepFullyConstructed && ( iFepPluginManager->PluginInputMode() != EPluginInputModeNone ) )
- {
- if (iFepPluginManager->PluginInputMode() == EPluginInputModeItut)
- {
- return iFepPluginManager->CurrentFepInputUI() ?
- iFepPluginManager->CurrentFepInputUI() : iCurrentFepUI;
- }
- if ( iFepPluginManager->EnableITIOnFSQ() )
- {
- return iCurrentFepUI;
- }
- return iFepPluginManager->CurrentPluginInputFepUI();
- }
-#endif
- return iCurrentFepUI;
- }
-
-void CAknFepManager::LaunchLanguagesPopupListL(TBool aLaunchedByTouchWin)
- {
-#ifdef RD_SCALABLE_UI_V2
- if( iFepPluginManager->PluginInputMode() != EPluginInputModeNone &&
- iFepPluginManager->PluginInputMode() != EPluginInputModeItut
- // Add this condition for correction of dim features on FSQ
- && iFepPluginManager->PluginInputMode() != EPluginInputModeFSQ )
- {
- iFepPluginManager->LaunchPenInputLanguageSelectionL(aLaunchedByTouchWin);
- return;
- }
-#endif //RD_SCALABLE_UI_V2
-
- CArrayFixFlat<TInt>* languages =
- new( ELeave )CArrayFixFlat<TInt>( ELanguageArrayGranularity );
- CleanupStack::PushL( languages );
- iPtiEngine->GetAvailableLanguagesL( languages );
-
- // Create a list of languages for the dialog
- CDesCArrayFlat* languagesList =
- new( ELeave )CDesCArrayFlat( ELanguageArrayGranularity );
- CleanupStack::PushL( languagesList );
-
- // Item format should be "<icon_index>\t<item_text>"
- _LIT( KIconIndexSelected, "0\t" );
- _LIT( KIconIndexNotSelected, "\t" );// No icon
-
- MPtiLanguage* lang = NULL;
- TInt currentLanguage = iSharedDataInterface->InputTextLanguage();
- TInt selectedLanguageIndex = 0;
-
- for (TInt ii=0; ii < languages->Count(); ii++)
- {
- lang = iPtiEngine->GetLanguage( ( *languages )[ii] );
- if (!lang)
- {
- User::Leave( KErrCorrupt );
- }
- // Buffer should contain both tabulator string and localized name:
- HBufC* langStrBuf = HBufC::NewL( lang->LocalizedName().Length() + 3 );
- CleanupStack::PushL( langStrBuf );
-
- TPtr langStrPtr = langStrBuf->Des();
-
- // If language is current language - use selected icon in lbx:
- if( lang->LanguageCode() == currentLanguage )
- {
- langStrPtr.Append( KIconIndexSelected );
- selectedLanguageIndex = ii;
- }
- else
- {
- langStrPtr.Append( KIconIndexNotSelected );
- }
- langStrPtr.Append( lang->LocalizedName() );
- languagesList->AppendL( langStrPtr );
- CleanupStack::PopAndDestroy( langStrBuf );
- }
-
- // Add icons to the listbox:
- CArrayPtr<CGulIcon>* icons = new( ELeave ) CArrayPtrFlat<CGulIcon>(10);
- CleanupStack::PushL( icons );
- LoadIconL( icons, EMbmAvkonQgn_prop_sub_current,
- EMbmAvkonQgn_prop_sub_current_mask );
-
- TInt index = 0;
- SetFlag( EFlagForegroundUIComponentVisible );
- CleanupStack::Pop( icons ); // iUiInterface->LaunchListPopupL takes ownership immediately
-#ifdef RD_SCALABLE_UI_V2
- /* tp teleca fix 17.9.2009 to IKIM-7VK8GG*/
- /*if( iFepFullyConstructed && iFepPluginManager)
- {
- iFepPluginManager->SetMenuState();
- }*/
- // tp teleca fix end
-#endif
- // Fire up the dialog
-#ifdef RD_SCALABLE_UI_V2
- iCancelPopupInQwerty = aLaunchedByTouchWin;
-#endif //RD_SCALABLE_UI_V2
- TUid fepUid = CCoeEnv::Static()->FepUid();
- ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
- TInt returnValue = iUiInterface->LaunchListPopupL(R_AVKON_T9_LANGUAGES_QUERY, index,
- selectedLanguageIndex, languagesList, icons);
-#ifdef RD_SCALABLE_UI_V2
- iCancelPopupInQwerty = EFalse;
-#endif //RD_SCALABLE_UI_V2
- PrepareFepAfterDialogExitL(fepUid);
- CleanupStack::PopAndDestroy( languagesList );
-
- if(returnValue == EAknSoftkeyOk)
- {
- // Selected item index from the languages array
- HandleChangeInFocusL();
-
- // The user has changed language and the local language is not used any more.
- iLanguageCapabilities.iLocalInputLanguageInUse = EFalse;
- if (EditorState())
- {
- EditorState()->SetLocalLanguage( ELangTest );
- }
-
- TBool westernPredictiveInUse = WesternPredictive();
-
-// Truncate autocompletion portion on change of writing language
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- RemoveSuggestedAdvanceCompletionL();
-#endif // RD_INTELLIGENT_TEXT_INPUT
- //Hindi Change Bug Fix
- iSharedDataInterface->SetInputTextLanguage(languages->At(index));
- CAknEnv::Static()->SettingCache().Update(KEikInputLanguageChange);
- ChangeInputLanguageL(languages->At(index));
- SetFlag( EFlagNewSharedDataInputLanguage | EFlagNewSharedDataInputMode );
- // This pice of code TSW Fute error fixing.
- // Display the confirmation msg if the dictionary is not available for
- // Current language.
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Display the confirmation msg only for Western languages
- if (!IsChineseInputLanguage())
- {
- if (!IsLanguageSupportPrediction())
- {
- LaunchConfirmationNoteL(R_AVKON_T9_NOTE_NO_AVAILABLE);
- }
- }
-#endif
-
-
- }
- CleanupStack::PopAndDestroy( languages );
- }
-
-void CAknFepManager::LaunchRecognitionWithDictionaryPopupListL()
- {
-#ifdef RD_SCALABLE_UI_V2
- if( iFepPluginManager && (iFepPluginManager->PluginInputMode() == EPluginInputModeHwr) )
- {
- iFepPluginManager->LaunchPenInputRecognitionWithDictionarySelectionL();
- return;
- }
-#endif //RD_SCALABLE_UI_V2
- }
-
-void CAknFepManager::LoadIconL( CArrayPtr<CGulIcon>* aIcons,
- TInt aBitmapId,
- TInt aMaskId )
- {
- CGulIcon* icon = CGulIcon::NewLC();
- CFbsBitmap* bitmap = 0;
- CFbsBitmap* mask = 0;
- AknIconUtils::CreateIconL( bitmap, mask, KAvkonBitmapFile, aBitmapId, aMaskId );
- icon->SetBitmap( bitmap );
- icon->SetMask( mask );
- aIcons->AppendL( icon );
- CleanupStack::Pop( icon );
- }
-
-
-TBool CAknFepManager::IsInputModeAvailable(TInt aMode) const
- {
- TBool isAvailable = ETrue;
- const TInt inputLanguage = iLanguageCapabilities.iInputLanguageCode;
- switch (aMode)
- {
- case ELatin:
- isAvailable = !( ( inputLanguage == ELangPrcChinese ) &&
- (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes));
- break;
- case EPinyin:
- isAvailable = ( inputLanguage == ELangPrcChinese );
- break;
- case EStroke:
- isAvailable = ( inputLanguage == ELangPrcChinese ||
- inputLanguage == ELangHongKongChinese ||
- inputLanguage == ELangTaiwanChinese);
- break;
- case ECangJie:
- {
- isAvailable = ( ( inputLanguage == ELangHongKongChinese ) &&
- iQwertyInputMode );
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
- isAvailable = isAvailable && (EPtiKeyboardHalfQwerty != KeyboardLayout());
-#endif //__HALF_QWERTY_KEYPAD
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
-
- break;
- case EZhuyin:
- isAvailable = ( inputLanguage == ELangTaiwanChinese );
- break;
- case EPRCFind:
- isAvailable = ( ( inputLanguage == ELangPrcChinese ) &&
- (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes));
- break;
- case EZhuyinFind:
- isAvailable = ( ( inputLanguage == ELangTaiwanChinese ) &&
- (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes));
- break;
- case EStrokeFind:
- isAvailable = ( ( inputLanguage == ELangHongKongChinese ) &&
- (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes));
- break;
- case EHiraganaKanji:
- isAvailable = (inputLanguage == ELangJapanese);
- break;
- case EKatakana:
- isAvailable = (inputLanguage == ELangJapanese );
- break;
- case EHindi:
- isAvailable = (inputLanguage == ELangHindi );
- break;
- case EHangul:
- isAvailable = (inputLanguage == ELangKorean );
- break;
- case ENativeNumber:
- isAvailable = (inputLanguage == ELangHindi
- || inputLanguage == ELangArabic
- || inputLanguage == ELangUrdu
- || inputLanguage == ELangFarsi/*
- || ( inputLanguage == ELangThai && iFepPluginManager &&
- iFepPluginManager->PluginInputMode() != EPluginInputModeItut &&
- iFepPluginManager->PluginInputMode() != EPluginInputModeNone)*/ );
- default:
- break;
- }
- return isAvailable;
- }
-
-TInt CAknFepManager::NewInputModeAfterLanguageChange() const
- {
- TInt inputMode = 0;
- switch (iLanguageCapabilities.iInputLanguageCode)
- {
- case ELangPrcChinese:
- if ( iAknEditorFlags & EAknEditorFlagForceTransparentFepModes )
- {
- inputMode = ELatin; // EPRCFind from hashkey loop
- }
- else
- {
- inputMode = EPinyin;
- }
- break;
- case ELangHongKongChinese:
- if ( iAknEditorFlags & EAknEditorFlagForceTransparentFepModes )
- {
- inputMode = EStrokeFind;
- }
- else
- {
- TInt sharedDataMode = iSharedDataInterface->InputMode();
- if (iQwertyInputMode &&
- sharedDataMode == ECangJie)
- {
- inputMode = ECangJie;
- }
- else
- {
- inputMode = EStroke;
- }
- }
- break;
- case ELangTaiwanChinese:
- if ( iAknEditorFlags & EAknEditorFlagForceTransparentFepModes )
- {
- inputMode = EZhuyinFind;
- }
- else
- {
- inputMode = EZhuyin;
- }
- break;
- case ELangJapanese:
- inputMode = EHiraganaKanji;
- break;
- case ELangKorean:
- inputMode = EHangul;
- break;
- default:
- inputMode = ELatin;
- break;
- }
- return inputMode;
- }
-
-void CAknFepManager::SetInputLanguageCapabilities(const TInt aInputLanguage)
- {
- iLanguageCapabilities.iInputLanguageCode = aInputLanguage;
-
- if ( aInputLanguage == ELangArabic || aInputLanguage == ELangHebrew ||
- aInputLanguage == ELangFarsi || aInputLanguage == ELangUrdu )
- {
- iLanguageCapabilities.iSupportsCase = EFalse;
- iLanguageCapabilities.iRightToLeftLanguage = ETrue;
- SetCursorTypeForInputDirection(EFalse);
- }
- else
- {
- /*Hindi*/
- if ( aInputLanguage == ELangThai
- || (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(aInputLanguage)))
- )
- {
- iLanguageCapabilities.iSupportsCase = EFalse;
- }
- else
- {
- iLanguageCapabilities.iSupportsCase = ETrue;
- }
- iLanguageCapabilities.iRightToLeftLanguage = EFalse;
- SetCursorTypeForInputDirection(ETrue);
- }
-
- TLanguage uiLanguage = User::Language();
- iLanguageCapabilities.iArabicIndicDigitsAllowed =
- ( aInputLanguage == ELangArabic || uiLanguage == ELangArabic);
- iLanguageCapabilities.iEasternArabicIndicDigitsAllowed = (
- ( aInputLanguage == ELangUrdu || uiLanguage == ELangUrdu ) ||
- ( aInputLanguage == ELangFarsi|| uiLanguage == ELangFarsi ) );
- /*Hindi*/
- iLanguageCapabilities.iIndicDigitsAllowed =
- ( (TAknFepUiIndicInputManager :: IsIndicDigitsSupported(TLanguage(aInputLanguage))) );
- UpdateLocalDigitMode();
-
- MAknFepManagerInterface* fepUI = iLangMan->GetFepUI(ELatin, iCharWidth, ETrue);
- MPtiLanguage* ptiLanguage = iPtiEngine->GetLanguage(fepUI->SupportLanguage(ELatin));
- if (ptiLanguage) // can be NULL in some uncommon situations, see TAVN-6SWB4Z
- {
- iLanguageCapabilities.iSupportsWesternPredictive =
- ptiLanguage->HasInputMode(EPtiEnginePredictive);
- // tp teleca change Korean lang does not support predictive
- // and we want to disable predictive even with local editors
- if(/*IsKoreanInputLanguage()*/GetInputLanguageFromSharedDataInterface() == ELangKorean )
- {
- iLanguageCapabilities.iSupportsWesternPredictive = EFalse;
- }
-
-
- // tp teleca change end
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // Predictive QWERTY (XT9) changes ---->
- iLanguageCapabilities.iSupportsWesternQwertyPredictive =
- ptiLanguage->HasInputMode(EPtiEngineQwertyPredictive );
- if ( GetInputLanguageFromSharedDataInterface() == ELangKorean )
- {
- iLanguageCapabilities.iSupportsWesternQwertyPredictive = EFalse;
- }
-
- // Predictive QWERTY (XT9) changes <----
-#ifdef __HALF_QWERTY_KEYPAD
- iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive = ptiLanguage->HasInputMode(EPtiEngineHalfQwertyPredictive );
-#endif
-#endif //RD_INTELLIGENT_TEXT_INPUT
- }
-
- if (!iLanguageCapabilities.iSupportsWesternPredictive
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- && !iLanguageCapabilities.iSupportsWesternQwertyPredictive
- // Predictive QWERTY changes
-#ifdef __HALF_QWERTY_KEYPAD
- && !iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive
-#endif //__HALF_QWERTY_KEYPAD
-#endif //RD_INTELLIGENT_TEXT_INPUT
- ) // Predictive QWERTY changes
- {
- SetWesternPredictive(EFalse);
- }
- }
-
-TInt CAknFepManager::SubstituteSublanguageId(const TInt aUiLanguage) const
- {
- return DefaultInputLanguageFromUILanguage(aUiLanguage);
- }
-
-TTmDocPosSpec CAknFepManager::DocPos()
- {
- TTmDocPosSpec docPos = TTmDocPosSpec();
- TTmDocPos rawDocPos;
- TBool gotPos = EFalse;
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if (docNavi)
- {
- docNavi->GetDocPos(rawDocPos);
- gotPos = ETrue;
- }
- else
- {
- CTextView* textView = TextView();
- if (textView)
- {
- TextView()->GetCursorPos(rawDocPos);
- gotPos = ETrue;
- }
- }
- if (gotPos)
- {
- docPos.iPos = rawDocPos.iPos;
- TTmDocPosSpec::TType docPosType =
- rawDocPos.iLeadingEdge ? TTmDocPosSpec::ELeading : TTmDocPosSpec::ETrailing;
- docPos.iType = docPosType;
- }
- return docPos;
- }
-
-/**
-* This method needs EditorState() to exist
-*
-*/
-CTextView* CAknFepManager::TextView() const
- {
- if (EditorState())
- {
- CAknEdwinFormAccessor* formAccessor = EditorState()->FormAccessor();
- if (formAccessor)
- {
- return formAccessor->GetTextView();
- }
- }
- return NULL;
- }
-
-CTextLayout* CAknFepManager::TextLayout() const
- {
- if( EditorState() )
- {
- CAknEdwinFormAccessor* formAccessor = EditorState()->FormAccessor();
- if (formAccessor)
- {
- return formAccessor->GetTextLayout();
- }
- }
- return NULL;
- }
-
-CPlainText* CAknFepManager::PlainText() const
- {
- return iUiInterface->PlainText(EditorState());
- }
-
-/**
-* Checks if the paragraph containing aPos is Right to left.
-* This routine will return nonsense if
-* - TextLayout() does not return a pointer
-* - the position passed is not in the formatted region
-*
-* Note, the return value from FindDocPos is thrown away
-*/
-TBool CAknFepManager::IsRightToLeftParagraph(TTmDocPosSpec aPos) const
- {
- TTmPosInfo2 posInfo;
- TTmLineInfo lineInfo;
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if (docNavi)
- {
- docNavi->FindDocPos(aPos, posInfo, lineInfo);
- }
- else
- {
- CTextLayout* textLayout = TextLayout();
- if (textLayout)
- {
- textLayout->TagmaTextLayout().FindDocPos(aPos, posInfo, lineInfo);
- }
- }
-
- return lineInfo.iFlags & TTmLineInfo::EParRightToLeft;
- }
-
-
-void CAknFepManager::FindAdjacentChunks(const TTmDocPosSpec& aPos,
- CTmTextLayout::TTmChunkDescription& aLeft,
- CTmTextLayout::TTmChunkDescription& aRight) const
- {
- aLeft.iStart = -1;
- aLeft.iEnd = -1;
- aLeft.iRightToLeft = EFalse;
- aRight.iStart = -1;
- aRight.iEnd = -1;
- aRight.iRightToLeft = EFalse;
-
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if (docNavi)
- {
- docNavi->FindAdjacentChunks(aPos, aLeft, aRight);
- }
- else
- {
- CTextLayout* textLayout = TextLayout();
- if (textLayout)
- {
- textLayout->TagmaTextLayout().FindAdjacentChunks(aPos, aLeft, aRight);
- }
- }
- }
-
-
-TBool CAknFepManager::GetNextVisualRightCharacter( TInt& aPosition )
- {
- TTmDocPosSpec pos = DocPos();
- TTmPosInfo2 info;
- TBool nextPositionFound = EFalse;
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if (docNavi)
- {
- nextPositionFound = docNavi->GetNextVisualCursorPos(pos, info, EFalse);
- }
- else
- {
- CTextLayout* textLayout = TextLayout();
- if (textLayout)
- {
- nextPositionFound = textLayout->TagmaTextLayout().GetNextVisualCursorPos(pos,
- info,
- EFalse);
- }
- }
- if (nextPositionFound)
- {
- aPosition = info.iDocPos.iPos;
-
- CTmTextLayout::TTmChunkDescription leftChunk;
- CTmTextLayout::TTmChunkDescription rightChunk;
- FindAdjacentChunks(pos, leftChunk, rightChunk);
-
- if ( !rightChunk.iRightToLeft )
- {
- aPosition -= 1;
- }
- }
- return nextPositionFound;
- }
-
-TBool CAknFepManager::GetNextVisualLeftCharacter( TInt& aPosition )
- {
- TTmDocPosSpec pos = DocPos();
- TTmPosInfo2 info;
- TBool nextPositionFound = EFalse;
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if (docNavi)
- {
- nextPositionFound = docNavi->GetNextVisualCursorPos(pos, info, ETrue);
- }
- else
- {
- CTextLayout* textLayout = TextLayout();
- if (textLayout)
- {
- nextPositionFound = TextLayout()->TagmaTextLayout().GetNextVisualCursorPos(pos,
- info,
- ETrue);
- }
- }
- if (nextPositionFound)
- {
- aPosition = info.iDocPos.iPos;
- CTmTextLayout::TTmChunkDescription leftChunk;
- CTmTextLayout::TTmChunkDescription rightChunk;
- FindAdjacentChunks(pos, leftChunk, rightChunk);
-
- if ( leftChunk.iRightToLeft )
- {
- aPosition -= 1;
- }
- if (iLanguageCapabilities.iInputLanguageCode == ELangVietnamese)
- {
- aPosition = pos.iPos -1;
- }
- }
- return nextPositionFound;
- }
-
-void CAknFepManager::FindVisualRightOfWord(TInt& aPosition)
- {
- TTmDocPosSpec pos = DocPos();
- CTmTextLayout::TTmChunkDescription leftChunk;
- CTmTextLayout::TTmChunkDescription rightChunk;
- FindAdjacentChunks(pos, leftChunk, rightChunk);
-
- if ( rightChunk.iRightToLeft )
- {
- FindStartOfWord(aPosition);
- }
- else
- {
- FindEndOfWord(aPosition);
- }
- }
-
-void CAknFepManager::FindVisualLeftOfWord(TInt& aPosition)
- {
- TTmDocPosSpec pos = DocPos();
- CTmTextLayout::TTmChunkDescription leftChunk;
- CTmTextLayout::TTmChunkDescription rightChunk;
- FindAdjacentChunks(pos, leftChunk, rightChunk);
-
- if ( leftChunk.iRightToLeft)
- {
- FindEndOfWord(aPosition);
- }
- else
- {
- FindStartOfWord(aPosition);
- }
- }
-
-
-
-TBool CAknFepManager::GetVisualDocStart( TTmDocPosSpec& aPos) const
- {
- // Set up the initial try as leading to the first logical character
- // It is a requirement that this position is at least in the first line
- TTmDocPosSpec pos(0, TTmDocPosSpec::ELeading);
-
- // Need to record if we are in aleft to right paragraph or not
- TBool leftToRightParagraph = !IsRightToLeftParagraph(pos);
-
- TBool success(EFalse);
- CTextLayout* textLayout = TextLayout();
- TTmDocPosSpec docPos;
- if (AknFepDocumentNavigation() || textLayout)
- {
-// This was written because Tagma's LineExtreme() method did not seem to work
- success = GetAknFepLineExtreme( pos, !leftToRightParagraph, docPos );
- }
-
- if (success)
- aPos = docPos;
- else // Possible cleanup; action for when there is insufficient information
- {
- aPos.iPos = 0;
- aPos.iType = TTmDocPosSpec::ELeading;
- }
-
- return success;
- }
-
-TBool CAknFepManager::GetVisualDocEnd( TTmDocPosSpec& aPos) const
- {
- TInt docLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
-
- // Set up the initial try as trailing after the last logical character
- // It is a requirement that this position is at least in the last line
- TTmDocPosSpec pos(docLength, TTmDocPosSpec::ETrailing);
-
- // Need to record if we are in a left to right paragraph or not
- TBool leftToRightParagraph = !IsRightToLeftParagraph(pos);
-
- TBool success(EFalse);
- CTextLayout* textLayout = TextLayout();
- TTmDocPosSpec docPos;
- if (AknFepDocumentNavigation() || textLayout)
- {
- // This was written because Tagma's LineExtreme() method did not seem to work
- success = GetAknFepLineExtreme( pos, leftToRightParagraph, docPos );
- }
-
- if (success)
- aPos = docPos;
- else // Possible cleanup; action for when there is insufficient information
- {
- aPos.iPos = docLength;
- aPos.iType = TTmDocPosSpec::ETrailing;
- }
- return success;
- }
-
-
-TBool CAknFepManager::GetAknFepLineExtreme( const TTmDocPosSpec& aPos, TBool aToRight,
- TTmDocPosSpec& aExtreme) const
- {
- TBool success(EFalse);
-
- TTmPosInfo2 posInfo;
- TTmLineInfo lineInfo;
- TBool found = EFalse;
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if (docNavi)
- {
- found = docNavi->FindDocPos(aPos, posInfo, lineInfo);
- }
- else
- {
- CTextLayout* textLayout = TextLayout();
- if ( textLayout )
- {
- found = textLayout->TagmaTextLayout().FindDocPos(aPos, posInfo, lineInfo);
- }
- }
-
- if ( found )
- {
- // Make a selection of the line info. Cursor first, Anchar 2nd:
- TCursorSelection theWholeLine( lineInfo.iEnd-1, lineInfo.iStart );
-
- TWesternNaviEvent event;
- if ( aToRight )
- event = ERightNaviEvent;
- else
- event = ELeftNaviEvent;
-
- GetAvkonDefinedVisualLimitsOfSelection( theWholeLine, event, aExtreme, NULL );
- success = ETrue;
- }
-
- return success;
- }
-
-
-/**
-* This routine analyses a selection (Does not have to be a real selection, but the datastructure
-* is used as input) to find its visual start or end, according to the passed parameter
-* The algo used is:
-* - First find the top line of the selection.
-* - Then find the bottom line of the selection.
-* - Look at the two lines' directionality (from the paragraph they belong to) and decide what the overall
-* directionality of the selection is. Thus right/left can be translated to increment/decrement.
-* (Note that Up is always decrement; down is always increment). So that allows the key actions to be
-* correctly grouped, and allows it to be determined which keys act from the top or the bottom line
-* (Decrement always acts from the top line; Increment always acts from the bottom line)
-*
-* - When the keys are handled, the action is again translated back to right/left according to the key-
-* grouping and whether you are acting from the top line or from the bottom line. Eg, decrement in RTL
-* line is visually to the Right.
-* - the appropriate "ExtremePos" API is called passing in the position on the line in which we are acting
-*
-*/
-void CAknFepManager::GetAvkonDefinedVisualLimitsOfSelection(
- const TCursorSelection& aSelection,
- TWesternNaviEvent aEvent,
- TTmDocPosSpec& aLimitPos,
- TWesternNaviEvent* aEffectiveRightOrLeftEvent ) const
- {
- // in case an irrelvant event is sent, initialize aLimitPos to something safe
- aLimitPos.iPos = 0;
- aLimitPos.iType = TTmDocPosSpec::ELeading;
-
- TTmDocPosSpec lowLogicalPos( aSelection.LowerPos(), TTmDocPosSpec::ELeading );
- TTmDocPosSpec highLogicalPos( aSelection.HigherPos(), TTmDocPosSpec::ETrailing );
-
- // this records what the resulting Right/left direction (for optional return)
- TWesternNaviEvent effectiveEvent = aEvent;
-
- // Get line and paragraph of the lower limit of the selection:
- TTmPosInfo2 posInfo;
- TTmLineInfo lineInfo;
- TBool lowIsRightToLeft;
- TBool highIsRightToLeft;
- TBool layoutExists = EFalse;
-
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if (docNavi)
- {
- docNavi->FindDocPos(lowLogicalPos, posInfo, lineInfo);
- lowIsRightToLeft = lineInfo.iFlags & TTmLineInfo::EParRightToLeft;
- docNavi->FindDocPos(highLogicalPos, posInfo, lineInfo);
- highIsRightToLeft = lineInfo.iFlags & TTmLineInfo::EParRightToLeft;
- layoutExists = ETrue;
- }
- else
- {
- CTextLayout* textLayout = TextLayout();
- if (textLayout)
- {
- textLayout->TagmaTextLayout().FindDocPos(lowLogicalPos, posInfo, lineInfo);
- lowIsRightToLeft = lineInfo.iFlags & TTmLineInfo::EParRightToLeft;
- textLayout->TagmaTextLayout().FindDocPos(highLogicalPos, posInfo, lineInfo);
- highIsRightToLeft = lineInfo.iFlags & TTmLineInfo::EParRightToLeft;
- layoutExists = ETrue;
- }
- }
-
- if (layoutExists)
- {
- // Decide on the net directionality. This if looks a bit laboured, but it
- // exhibits the Averell policy.
- TBool netDirectionIsRightToLeft(EFalse);
- if ( lowIsRightToLeft == highIsRightToLeft )
- netDirectionIsRightToLeft = lowIsRightToLeft;
- else
- netDirectionIsRightToLeft = lowIsRightToLeft;// ambiguous - Take first paragraph
-
- if ( netDirectionIsRightToLeft )
- switch ( aEvent )
- {
- case ELeftNaviEvent:
- case EDownNaviEvent:
- effectiveEvent = ELeftNaviEvent;
- aLimitPos = LeftVisualExtremePos( highLogicalPos, lowLogicalPos.iPos,
- highLogicalPos.iPos );
- break;
- case ERightNaviEvent:
- case EUpNaviEvent:
- effectiveEvent = ERightNaviEvent;
- aLimitPos = RightVisualExtremePos(lowLogicalPos, lowLogicalPos.iPos,
- highLogicalPos.iPos );
- break;
- default:
- // No action. Only the events above are handled.
- break;
- }
- else
- switch (aEvent)
- {
- case ELeftNaviEvent:
- case EUpNaviEvent:
- effectiveEvent = ELeftNaviEvent;
- aLimitPos = LeftVisualExtremePos( lowLogicalPos, lowLogicalPos.iPos,
- highLogicalPos.iPos);
- break;
- case ERightNaviEvent:
- case EDownNaviEvent:
- effectiveEvent = ERightNaviEvent;
- aLimitPos = RightVisualExtremePos( highLogicalPos, lowLogicalPos.iPos,
- highLogicalPos.iPos );
- break;
- default:
- // No action. Only the events above are handled.
- break;
- }
- }
-
- else
- {
- // No text layout: Left or Up naviEvent gives low end; Right or down give high end
- switch ( aEvent )
- {
- case ELeftNaviEvent:
- case EUpNaviEvent:
- effectiveEvent = ELeftNaviEvent;
- aLimitPos = lowLogicalPos;
- break;
- case ERightNaviEvent:
- case EDownNaviEvent:
- effectiveEvent = ERightNaviEvent;
- aLimitPos = highLogicalPos;
- break;
- default:
- // No action. Only the events above are handled.
- break;
- }
- }
- // return the effective direction (Right or Left)
- if ( aEffectiveRightOrLeftEvent )
- *aEffectiveRightOrLeftEvent = effectiveEvent;
-
- }
-
-
-TTmDocPosSpec CAknFepManager::LeftVisualExtremePos( const TTmDocPosSpec& aStartPos,
- TInt aMinPos, TInt aMaxPos ) const
- {
- // Start at start and find adjacent left chunks repeatedly until we find no more chunks, or our max or min
- // is within a chunk
- TTmDocPosSpec currentPos = aStartPos;
- CTextLayout* textLayout = TextLayout();
- if (AknFepDocumentNavigation() || textLayout)
- {
- CTmTextLayout::TTmChunkDescription leftChunk;
- CTmTextLayout::TTmChunkDescription rightChunk;
-
- TInt iterations(0);
- TBool endFound(EFalse);
-
- while( !endFound && iterations < KMaxChunkWalkIterations )
- {
- iterations++;
- FindAdjacentChunks(currentPos, leftChunk, rightChunk);
- // Try to move to left end of left chunk
- endFound = LeftEndOfChunkWithinRange( leftChunk, aMinPos, aMaxPos, currentPos );
- }
- }
- return currentPos;
- }
-
-TTmDocPosSpec CAknFepManager::RightVisualExtremePos( const TTmDocPosSpec& aStartPos,
- TInt aMinPos, TInt aMaxPos ) const
- {
- // Start at start and find adjacent right chunks repeatedly until we find no more chunks, or our max or min
- // is within a chunk
- TTmDocPosSpec currentPos = aStartPos;
- CTextLayout* textLayout = TextLayout();
- if (AknFepDocumentNavigation() || textLayout)
- {
- CTmTextLayout::TTmChunkDescription leftChunk;
- CTmTextLayout::TTmChunkDescription rightChunk;
-
- TInt iterations(0);
- TBool endFound(EFalse);
-
- while( !endFound && iterations < KMaxChunkWalkIterations )
- {
- iterations++;
- FindAdjacentChunks(currentPos, leftChunk, rightChunk);
- // Try to move to left end of left chunk
- endFound = RightEndOfChunkWithinRange( rightChunk, aMinPos, aMaxPos, currentPos );
- }
- }
- return currentPos;
- }
-
-TBool CAknFepManager::LeftEndOfChunkWithinRange( const CTmTextLayout::TTmChunkDescription& aChunk,
- TInt aMinPos, TInt aMaxPos, TTmDocPosSpec& aNewPos) const
- {
- TBool constrained = EFalse;
- TInt leftEnd;
- if ( !ChunkIsValid( aChunk ) )
- {
- constrained = ETrue; // leave the aNewPos as it is
- }
- else if ( aChunk.iStart >= iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep() )
- {
- constrained = ETrue; // That chunk was a ficticious one:
- }
- else if ( aChunk.iEnd <= aMinPos || aChunk.iStart >= aMaxPos )
- {
- constrained = ETrue; // That chunk found does not actually overlap with valid range. Don't go there
- }
- else
- {
- if ( aChunk.iRightToLeft )
- {
- leftEnd = aChunk.iEnd;
- if ( leftEnd >= aMaxPos )
- {
- constrained = ETrue;
- aNewPos.iPos = aMaxPos;
- }
- else
- {
- aNewPos.iPos = leftEnd;
- }
- aNewPos.iType = TTmDocPosSpec::ETrailing;
- }
- else
- {
- leftEnd = aChunk.iStart;
- if ( leftEnd <= aMinPos )
- {
- constrained = ETrue;
- aNewPos.iPos = aMinPos;
- }
- else
- {
- aNewPos.iPos = leftEnd;
- }
- aNewPos.iType = TTmDocPosSpec::ELeading;
- }
- }
- return constrained;
- }
-
-TBool CAknFepManager::RightEndOfChunkWithinRange( const CTmTextLayout::TTmChunkDescription& aChunk,
- TInt aMinPos, TInt aMaxPos, TTmDocPosSpec& aNewPos) const
- {
- TBool constrained = EFalse;
- TInt rightEnd;
- if ( !ChunkIsValid( aChunk ) )
- {
- constrained = ETrue; // leave the aNewPos as it is
- }
- else if ( aChunk.iStart >= iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep() )
- {
- constrained = ETrue; // That chunk was a ficticious one:
- }
- else if ( aChunk.iEnd <= aMinPos || aChunk.iStart >= aMaxPos )
- {
- constrained = ETrue; // That chunk found does not actually overlap with valid range. Don't go there
- }
- else
- {
- if ( aChunk.iRightToLeft )
- {
- rightEnd = aChunk.iStart;
- if ( rightEnd <= aMinPos )
- {
- constrained = ETrue;
- aNewPos.iPos = aMinPos;
- }
- else
- {
- aNewPos.iPos = rightEnd;
- }
- aNewPos.iType = TTmDocPosSpec::ELeading;
- }
- else
- {
- rightEnd = aChunk.iEnd;
- if ( rightEnd >= aMaxPos )
- {
- constrained = ETrue;
- aNewPos.iPos = aMaxPos;
- }
- else
- {
- aNewPos.iPos = rightEnd;
- }
- aNewPos.iType = TTmDocPosSpec::ETrailing;
- }
- }
- return constrained;
- }
-
-/**
-* This method handles the attachment to the chunk being navigated toward.
-* Should only be used for Right and Left navigation.
-* The actual direction of that chunk does not need to be looked at. Even if
-* is the same direction as the one being moved from, you still attach to it, as it may not
-* be logically contiguous.
-*/
-void CAknFepManager::AdjustPosSpecForAmbiguityAfterLeftOrRightNavigation( TTmDocPosSpec& aPos,
- TWesternNaviEvent aEvent ) const
- {
-
- CTmTextLayout::TTmChunkDescription leftChunk;
- CTmTextLayout::TTmChunkDescription rightChunk;
- FindAdjacentChunks(aPos, leftChunk, rightChunk);
-
- TBool inputDirectionIsRTL = ( CurrentInputDirectionality() == TBidiText::ERightToLeft );
-
- switch (aEvent)
- {
- case ELeftNaviEvent:
- {
- // Do not attach to the left chunk if its directionality is not the same as aDirection
- if ( ChunkIsValid( leftChunk ) )
- if ( COMPARE_BOOLS(inputDirectionIsRTL, leftChunk.iRightToLeft) )
- AttachToLeftChunk( aPos, leftChunk );
- break;
- }
- case ERightNaviEvent:
- {
- if ( ChunkIsValid( rightChunk ) )
- if ( COMPARE_BOOLS(inputDirectionIsRTL, rightChunk.iRightToLeft) )
- AttachToRightChunk( aPos, rightChunk );
- break;
- }
- default:
- break;
- }
-
- }
-
-
-void CAknFepManager::AttachToRightChunk( TTmDocPosSpec& aPos,
- const CTmTextLayout::TTmChunkDescription& aRightChunk )
- {
- if ( aRightChunk.iRightToLeft )
- {
- aPos.iPos = aRightChunk.iEnd;
- aPos.iType = TTmDocPosSpec::ETrailing;
- }
- else
- {
- aPos.iPos = aRightChunk.iStart;
- aPos.iType = TTmDocPosSpec::ELeading;
- }
- }
-
-void CAknFepManager::AttachToLeftChunk( TTmDocPosSpec& aPos,
- const CTmTextLayout::TTmChunkDescription& aLeftChunk )
- {
- if ( aLeftChunk.iRightToLeft )
- {
- aPos.iPos = aLeftChunk.iStart;
- aPos.iType = TTmDocPosSpec::ELeading;
- }
- else
- {
- aPos.iPos = aLeftChunk.iEnd;
- aPos.iType = TTmDocPosSpec::ETrailing;
- }
- }
-
-/**
-* This routine ensures that the cursor position is not attached to a chunk of opposite direction.
-* For end of document, the normal routine can be used.
-* For the start, usually do nothing, but there is the possibility of forcing position 0/Trailing, when
-* the edge chunk and the input directionality are opposite.
-*/
-void CAknFepManager::AdjustPosSpecForInputLanguageAfterDocumentLoop( TTmDocPosSpec& aPos,
- TWesternNaviEvent /*aNaviEvent*/, TBool aLoopToTop ) const
- {
-
- // Looping based on a Left event should adjust the cursor position as if that point had
- // been reached by navigation to that same visual position outwards from the body
- // Define this as the effective navigation that has just happened:
- TWesternNaviEvent effectiveEvent(ELeftNaviEvent);
-
- // Rule for this effective navigation is
- // move to top of document : if paradirection is LTR then treat it as a LEFT navi
- // move to top of document : if paradirection is RTL then treat it as RIGHT navi
- // move to bottom of document : if paradirection is LTR then treat is as RIGHT navi
- // move to bottom of document : if paradirection is RTL then treat as LEFT navi
- // However, NOTE that decrementing events leads to looping to the END! (and vice versa)
- TBool newParaIsRTL = IsRightToLeftParagraph(aPos);
- if ( aLoopToTop && newParaIsRTL ) // move to top; RTL
- effectiveEvent = ERightNaviEvent;
- else if ( !aLoopToTop && !newParaIsRTL ) // move to bottom; LTR
- effectiveEvent = ERightNaviEvent;
-
- if ( aLoopToTop )
- {
- // There is no ficticious block of the paragraph direction at -1 to 0. So we have to
- // behave as if there is one:
- //
- CTmTextLayout::TTmChunkDescription leftChunk;
- CTmTextLayout::TTmChunkDescription rightChunk;
- CTmTextLayout::TTmChunkDescription& edgeChunk = leftChunk;
-
- FindAdjacentChunks(aPos, leftChunk, rightChunk);
-
- // Get input language direction
- TBool inputDirectionIsRTL = ( CurrentInputDirectionality() == TBidiText::ERightToLeft );
- if ( effectiveEvent == ELeftNaviEvent )
- edgeChunk = leftChunk;
- else
- edgeChunk = rightChunk;
-
- // Check edgechunk for its direction
- if ( !COMPARE_BOOLS( edgeChunk.iRightToLeft, inputDirectionIsRTL ) )
- {
- // Input language disagrees with the chunk that we are on,
- aPos.iPos = 0;
- aPos.iType = TTmDocPosSpec::ETrailing;
- }
-
- }
- else // Looping to the end of document
- {
- // There IS a ficticious block at the doc end, so use the usual routine.
- AdjustPosSpecForAmbiguityAfterLeftOrRightNavigation( aPos, effectiveEvent );
- }
-
- }
-
-TBool CAknFepManager::ChunkIsValid( const CTmTextLayout::TTmChunkDescription& aChunk )
- {
- TBool isValid(ETrue);
-
- const TInt KNotValid = -1;
- if ( aChunk.iRightToLeft == KNotValid )
- isValid = EFalse;
- else if (aChunk.iStart == KNotValid )
- isValid = EFalse;
- else if (aChunk.iEnd == KNotValid )
- isValid = EFalse;
-
-#ifdef _DEBUG
- if (isValid)
- __ASSERT_DEBUG( aChunk.iStart <= aChunk.iEnd,
- AknFepPanic( EAknFepPanicBadCursorNavigationState ) );
-#endif
-
- return isValid;
- }
-/**
-* Finds the current input direction. This is determined as best as it can using
-* - T9Interface as the preferred source of information
-* - shared data (via AknTextUtils) if that fails
-* - localLanguage overrides the above sources of information
-* - when fep is in numeric mode it returns LTR
-* - if FEP is in an irelevant mode, then LTR is returned
-*
-* @return TDirectionality::ELeftToRight for LTR alpha mode or numeric mode
-*/
-TBidiText::TDirectionality CAknFepManager::CurrentInputDirectionality() const
- {
- TBidiText::TDirectionality directionality(TBidiText::ELeftToRight);
-
- // See if we are in a mode where the directionality is defined:
- TBool checkForRTLValid(EFalse);
-
- switch (iMode )
- {
- case ELatin:
- case ENumber:
- checkForRTLValid = ETrue;
- break;
- default:
- break;
- }
-
- if ( checkForRTLValid )
- {
- MPtiLanguage* ptilang = iPtiEngine->CurrentLanguage(); // No need to get language from PtiEngine ?
- TInt inputLanguage = (ptilang)? ptilang->LanguageCode() : 0;
- if ( inputLanguage )
- {
- directionality = TBidiText::ScriptDirectionality( (TLanguage)inputLanguage );
- checkForRTLValid = EFalse;
- }
- }
-
- // if no T9 interface information is available, then go for other sources
- // Note that you have to check for local language in this case (belt-and-braces)
- if ( checkForRTLValid )
- {
- TLanguage localLanguage = ELangTest;
- if ( GetLocalLanguage( localLanguage ) )
- directionality = TBidiText::ScriptDirectionality( localLanguage );
- else
- directionality = AknTextUtils::CurrentScriptDirectionality();
- }
-
- return directionality;
- }
-
-
-TBool CAknFepManager::GetLocalLanguage( TLanguage& aLanguage ) const
- {
- TBool result(EFalse);
- // Check for a local language override
- if ( IsFepAwareTextEditor() )
- {
- // For ITU-T keyboard we always use english in latin-only editors.
- // In case of qwerty keyboard, some languages can be used in latin
- // only-editors, some require that english is used instead. That
- // is decided here.
- const TInt globalLang = iSharedDataInterface->InputTextLanguage();
- TBool allowTest =
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- !iQwertyInputMode ||
-#endif
- globalLang == ELangPrcChinese ||
- globalLang == ELangHongKongChinese ||
- globalLang == ELangTaiwanChinese ||
- globalLang == ELangThai ||
- globalLang == ELangGreek ||
- globalLang == ELangArabic ||
- globalLang == ELangFarsi ||
- globalLang == ELangUrdu ||
- globalLang == ELangHebrew ||
- globalLang == ELangRussian ||
- globalLang == ELangUkrainian ||
- globalLang == ELangHindi ||
-#ifdef RD_MARATHI
- globalLang == ELangMarathi ||
-#endif // RD_MARATHI
-
-#ifdef RD_HINDI_PHONETIC_INPUT
- globalLang == KLangHindiPhonetic ||
-#endif
- globalLang == ELangBulgarian ||
- globalLang == ELangVietnamese;
-
- if (allowTest && iAknEditorFlags & EAknEditorFlagLatinInputModesOnly &&
- iLanguageCapabilities.iInputLanguageCode != ELangJapanese)
- {
- aLanguage = ELangEnglish;
- }
- else
- {
- aLanguage = EditorState()->LocalLanguage();
- }
-
- if ( aLanguage != ELangTest )
- {
- MPtiLanguage* languageObject = NULL;
- languageObject = iPtiEngine->GetLanguage(aLanguage);
- if (languageObject) // Check if the input language is supported.
- {
- result = ETrue;
- }
- else
- {
- aLanguage = ELangTest;
- }
- }
- }
- return result;
- }
-
-
-TBool CAknFepManager::GetExposedDirectionOfText( TInt aPos, TBool aForward,
- TBool& aIsRightToLeft ) const
- {
- TBool hasStrongCharacter(EFalse);
-
- // Access the plain text from the editor, getting a little bit at a time.
-
- TInt docLen = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
-
- // Init with defaults for aForward = ETrue
- TInt limit = docLen;
- TInt increment = 1;
- if ( !aForward )
- {
- limit = -1; // Loop does not execute if == limit
- increment = -1;
- }
-
- for ( TInt index = aPos; index != limit ; index += increment )
- {
- TChar ch = CharAt(index);
- if ( iInlineTextDecorator->CharacterIsStrongRightToLeft( (TText)ch ) )
- {
- hasStrongCharacter = ETrue;
- aIsRightToLeft = ETrue;
- break;
- }
- else if ( iInlineTextDecorator->CharacterIsStrongLeftToRight( (TText)ch ) )
- {
- hasStrongCharacter = ETrue;
- aIsRightToLeft = EFalse;
- break;
- }
- }
-
- return hasStrongCharacter;
- }
-
-TBool CAknFepManager::GetExposedDirectionOfTextInDescriptor( const TDesC& aText, TBool aForward,
- TBool& aIsRightToLeft ) const
- {
- TBool hasStrongCharacter(EFalse);
-
- TInt textLen = aText.Length();
-
- TInt start = 0;
- TInt limit = textLen;
- TInt increment = 1;
- if ( !aForward )
- {
- start = textLen-1;
- limit = -1; // Loop does not execute if == limit
- increment = -1;
- }
-
- for ( TInt index = start; index != limit ; index += increment )
- {
- if ( iInlineTextDecorator->CharacterIsStrongRightToLeft( (TText)aText[index] ) )
- {
- hasStrongCharacter = ETrue;
- aIsRightToLeft = ETrue;
- break;
- }
- else if ( iInlineTextDecorator->CharacterIsStrongLeftToRight( (TText)aText[index] ) )
- {
- hasStrongCharacter = ETrue;
- aIsRightToLeft = EFalse;
- break;
- }
- }
-
- return hasStrongCharacter;
- }
-
-TChar CAknFepManager::CharAt( TInt aPos ) const
- {
- TBuf<ESingleCharacter> chDes;
-#ifdef RD_SCALABLE_UI_V2
- if ( SemiFepAwareTextEditor( ETrue ) )
-#else
- if ( iInputCapabilities.FepAwareTextEditor() )
-#endif // RD_SCALABLE_UI_V2
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep( chDes, aPos,
- ESingleCharacter);
- if( chDes.Length() > 0 )
- return chDes[0];
- else
- return TChar(0);
- }
-
-
-/**
-* Navigate off of selected text using an Up/Down/Right/Left navigation event
-*
-* The code takes account of the paragraph directionality that the passed selection is
-* found in.
-*
-* The new cursor position is resolved for ambuguity and set using SetCursorPosition and
-* so it has the same side-effects:
-* iUncommittedText is set to the zero-width "cursor" state with the new cursor position
-* iUncommittedText is set into the FepAwareTextEditor state
-* iCaseManager is updated with a ENullNaviEvent
-* the doc pos is set in TextView object if present
-*/
-TKeyResponse CAknFepManager::NavigateFromSelectionL(
- const TCursorSelection& aSelection,
- TWesternNaviEvent aNaviEvent,
- TTmDocPosSpec& aPos)
- {
- if (IsCcpuFlagSet(ECcpuStateCopy | ECcpuStateCut | ECcpuStateHashDown))
- {
- return EKeyWasNotConsumed;
- }
-
- switch( aNaviEvent )
- {
- case EUpNaviEvent:
- case EDownNaviEvent:
- case ERightNaviEvent:
- case ELeftNaviEvent:
- // Carry on. Handle this event
- break;
- default: // just leave it as NULL
- return EKeyWasNotConsumed;
- }
- // Find the visual end of the selection
- TWesternNaviEvent effectiveEvent; // used to return either Right or Left event from next call:
- GetAvkonDefinedVisualLimitsOfSelection( aSelection, aNaviEvent, aPos, &effectiveEvent );
- AdjustPosSpecForAmbiguityAfterLeftOrRightNavigation( aPos, effectiveEvent );
-
- // Set this as the current position
- SetCursorPositionL( aPos );
-
- return EKeyWasConsumed;
- }
-
-
-void CAknFepManager::SetCursorPositionL( const TTmDocPosSpec& aNewCursorPos, TBool aDragSelectOn )
- {
- if ( !iInputCapabilities.FepAwareTextEditor() )
- return;
-
- TInt newAnchorPos = aNewCursorPos.iPos;
-
- if ( aDragSelectOn )
- {
- TCursorSelection selection;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(selection);
- if ( selection.Length() > 0 ) // there is a selection. Keep the anchor
- newAnchorPos = selection.iAnchorPos;
- }
-
- iUncommittedText.SetSelection( aNewCursorPos.iPos, newAnchorPos );
-
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText);
- iCaseMan->UpdateCase(ENullNaviEvent);
-
- // This is able to set the directional attachment of the cursor in a way that the FepAwareTextEditor interface cannot
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if (docNavi)
- {
- docNavi->SetDocPosL(aNewCursorPos, aDragSelectOn);
- }
- else
- {
- CAknEdwinFormAccessor* formAccessor = EditorState()->FormAccessor();
- if (formAccessor)
- {
- CEikEdwin *edwin = static_cast<CEikEdwin *>( formAccessor->FormClientControl() );
- if (edwin)
- edwin->SetCursorPosL( aNewCursorPos.iPos, aDragSelectOn );
- }
- }
- }
-
-
-
-TBool CAknFepManager::InFirstLineAndFormatted( const TTmDocPosSpec& aPos ) const
- {
- return DocPosInFirstOrLastLineAndFormatted( aPos, ETrue);
- }
-
-TBool CAknFepManager::InLastLineAndFormatted( const TTmDocPosSpec& aPos ) const
- {
- return DocPosInFirstOrLastLineAndFormatted( aPos, EFalse );
- }
-
-TBool CAknFepManager::DocPosInFirstOrLastLineAndFormatted( const TTmDocPosSpec& aPos,
- TBool aCheckFirstLine ) const
- {
- TBool success(EFalse);
- TTmLineInfo lineInfo;
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if (docNavi)
- {
- success = docNavi->DocPosToLine( aPos, lineInfo);
- }
- else
- {
- CTextLayout* textLayout = TextLayout();
- if ( textLayout )
- {
- success = textLayout->TagmaTextLayout().DocPosToLine( aPos, lineInfo);
- }
- }
-
- if ( success )
- {
- if ( aCheckFirstLine )
- success = (lineInfo.iLineNumber == 0 );
- else
- {
- // Current position has yielded line information. But how to tell if it is the last line?
- // Use the fact that the docpos of the last character will be in the last line.
- // Also account for the fact that these APIs report a character at docLength itself, a
- // ficticious end of paragraph character. So use a >= docLength
- success = (lineInfo.iEnd >=
- iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep() );
- }
- }
-
- return success;
- }
-
-TBool CAknFepManager::AtVisualStart( const TTmDocPosSpec& aCurrentPos,
- const TTmDocPosSpec& aLimitPos ) const
- {
- TBool positionsAreTheSame(EFalse);
- if ( aCurrentPos.iPos == aLimitPos.iPos && aCurrentPos.iType == aLimitPos.iType )
- positionsAreTheSame = ETrue;
- else if ( aCurrentPos.iPos == 0 && aCurrentPos.iType == TTmDocPosSpec::ETrailing )
- positionsAreTheSame = ETrue;
-
- return positionsAreTheSame;
- }
-
-TBool CAknFepManager::AtVisualEnd( const TTmDocPosSpec& aCurrentPos,
- const TTmDocPosSpec& aLimitPos, TInt aDocLength ) const
- {
- TBool positionsAreTheSame(EFalse);
- if ( aCurrentPos.iPos == aLimitPos.iPos && aCurrentPos.iType == aLimitPos.iType )
- positionsAreTheSame = ETrue;
- else if ( aCurrentPos.iPos == aDocLength && aCurrentPos.iType == TTmDocPosSpec::ELeading )
- positionsAreTheSame = ETrue;
- else if ( aCurrentPos.iPos > aDocLength )
- positionsAreTheSame = ETrue;
-
- return positionsAreTheSame;
- }
-
-
-void CAknFepManager::SetCursorType(TBool aIsLeftToRight)
- {
- if ( !BidiCursorRequired() )
- return;
-
- // Optimization to prevent excessive Wserv communication:
- if ( IsFlagSet( EFlagBidiCursorIsInitialized )
- && COMPARE_BOOLS( !aIsLeftToRight, IsFlagSet( EFlagCursorPointsRightToLeft ) ) )
- return;
-
- SetFlag( EFlagBidiCursorIsInitialized );
-
- MCoeFepAwareTextEditor* editor = iInputCapabilities.FepAwareTextEditor();
- if (editor && editor->Extension1())
- {
- TCharFormat format;
- TInt docPos = DocPos().iPos;
- editor->GetFormatForFep(format, docPos);
-
- // Use Avkon routine to make all the layout decisions. It returns a TTextCursor object
- TTextCursor newCursor;
- AknCustomCursorSupport::GetBidiTextCursorFromFontSpec( format.iFontSpec,
- !aIsLeftToRight, newCursor );
- TBool setToTrue(ETrue);
- editor->Extension1()->SetCursorType(setToTrue, newCursor);
-
- // Keep flag in step for optimization
- if ( aIsLeftToRight )
- ClearFlag( EFlagCursorPointsRightToLeft );
- else
- SetFlag( EFlagCursorPointsRightToLeft );
- }
- }
-
-TBool CAknFepManager::DeviceSupportsRTLLanguageL()
- {
- CArrayFixFlat<TInt>* languages = new (ELeave) CArrayFixFlat<TInt>(ELanguageArrayGranularity);
- CleanupStack::PushL(languages);
- iPtiEngine->GetAvailableLanguagesL(languages);
-
- TBool bidiCursorSuppressed(EFalse);
-#if defined(__WINS__)
- bidiCursorSuppressed = ETrue;
- // Test (Disabled) mode (fake) UID, key and its value
- const TInt KTestModeValue = 1; // 1 = show Bidi cursor
-
- CRepository* repository = NULL;
- TRAPD(ret, repository = CRepository::NewL(KCRUidAknFep));
- if (ret == KErrNone)
- {
- TInt modeValue = 0;
- if (repository->Get(KAknFepTestModeKey, modeValue) == KErrNone)
- {
- if (modeValue == KTestModeValue)
- {
- bidiCursorSuppressed = EFalse; // show bidi cursor
- }
- }
- }
- delete repository;
-#endif
-
- TBool result = EFalse;
- if (!bidiCursorSuppressed)
- {
- for (TInt jj = 0; jj < languages->Count(); jj++)
- {
- if (languages->At(jj) == ELangArabic ||
- languages->At(jj) == ELangHebrew ||
- languages->At(jj) == ELangFarsi ||
- languages->At(jj) == ELangUrdu )
- // + others...
- {
- result = ETrue;
- break;
- }
- }
- }
-
- CleanupStack::PopAndDestroy(); // languages
- return result;
- }
-
-void CAknFepManager::CalculateEditorDigitType(TDigitType& aDestination)
- {
- TBool ASCIIDigits = EFalse;
- MObjectProvider* mop = iInputCapabilities.ObjectProvider();
-
- if ( mop )
- {
- CAknExtendedInputCapabilities* extendedInputCapabilities =
- mop->MopGetObject( extendedInputCapabilities );
-
- if ( extendedInputCapabilities )
- {
- if ( extendedInputCapabilities->SupportsCapabilities(
- CAknExtendedInputCapabilities::ESupportsOnlyASCIIDigits ) )
- {
- // If this is true, then the inputcaps wants only ascii
- // digits -> you can, when the editor is seen as numeric,
- // be sure that only latin indicator is then wanted.
- ASCIIDigits = ETrue;
- }
- }
- }
-
- if (iAknEditorFlags & EAknEditorFlagLatinInputModesOnly)
- {
- // use of only latin characters implies that numbers are also western
- ASCIIDigits = ETrue;
- }
-
- AknTextUtils::TDigitModeQueryType editorType = AknTextUtils::EDigitModeEditorDefault;
- TBool numberOnlyEditor = iPermittedInputModes == EAknEditorNumericInputMode;
- if ( numberOnlyEditor )
- {
- editorType = AknTextUtils::EDigitModeNumberEditor;
- if (ASCIIDigits)
- {
- editorType = AknTextUtils::EDigitModeLatinNumberEditor;
- }
- }
-
- if (iLanguageCapabilities.iArabicIndicDigitsAllowed &&
- AknTextUtils::DigitModeQuery(editorType) &&
- !ASCIIDigits)
- {
- aDestination = EDigitTypeArabicIndic;
- }
- else if (iLanguageCapabilities.iEasternArabicIndicDigitsAllowed &&
- AknTextUtils::DigitModeQuery(editorType)&&
- !ASCIIDigits)
- {
- aDestination = EDigitTypeEasternArabicIndic;
- }
- /*Hindi*/
- else if ( iLanguageCapabilities.iIndicDigitsAllowed &&
- AknTextUtils::DigitModeQuery(editorType) &&
- !ASCIIDigits)
- {
- aDestination = EDigitTypeDevanagari;
- }
- else
- {
- aDestination = EDigitTypeWestern;
- }
- }
-
-
-void CAknFepManager::UpdateNumericEditorDigitType()
- {
- if (iLanguageCapabilities.iNumericEditorDigitType == EDigitTypeUnknown)
- {
- CalculateEditorDigitType(iLanguageCapabilities.iNumericEditorDigitType);
- }
- }
-
-void CAknFepManager::UpdateLocalDigitMode()
- {
- TInt oldLocalDigitType = iLanguageCapabilities.iLocalDigitType;
- CalculateEditorDigitType(iLanguageCapabilities.iLocalDigitType);
-
- if (oldLocalDigitType != iLanguageCapabilities.iLocalDigitType &&
- iCaseMan) // happens in destructor
- {
- UpdateIndicators();
- }
- }
-
-/**
-* This routine should be called if the flag is set that says that the last navigation was to an
-* ambiguous point.
-* The routine checks to see if the event passed is
-* - Right or Left Arrow
-* - Would be the event to "jump" across the ambiguity. That is
-* - if at the "left" side of a LTR | RTL point, you need a Right arrow
-* - if at the "right" side of a LTR | RTL point, you need a Left arrow.
-* - if at the "left" side of a RTL | LTR point, you need a Right arrow
-* - if at the "right" side of a RTL | LTR point, you need a Left arrow.
-*
-*/
-// TKeyResponse CAknFepManager::AttemptCursorFlipAtAmbiguousPointL( const TKeyEvent& aKeyEvent, TEventCode aEventCode )
-TKeyResponse CAknFepManager::AttemptCursorFlipAtAmbiguousPointL( const TUint aCode )
- {
- TKeyResponse response = EKeyWasNotConsumed;
-
- if ( IsFlagSet(EFlagAtDirectionallyAmbiguousPoint) // only perform if already at ambi-point?
- && !IsFlagSet(EFlagInsideInlineEditingTransaction) ) // do not flip if inside inline edit
- {
- if ( aCode == EKeyRightArrow || aCode == EKeyLeftArrow )
- {
- if ( iInputCapabilities.FepAwareTextEditor() && EditorState()
- && (AknFepDocumentNavigation() || TextView()) )
- {
- TTmDocPosSpec docPos = DocPos();
- TTextDirectionalInfo status = LocalTextDirectionalStatus( docPos );
-
- CTmTextLayout::TTmChunkDescription leftChunk;
- CTmTextLayout::TTmChunkDescription rightChunk;
- FindAdjacentChunks(docPos, leftChunk, rightChunk);
-
- if ( status.iBlockEnvironment ==
- TTextDirectionalInfo::EAtRightEndOfBlockFacingOppositeDirectionalBlock
- && aCode == EKeyRightArrow )
- {
- response = EKeyWasConsumed;
- // Set cursor to new directionality ( opposite to current )
- SetCursorTypeForTextDirection( status.iDirectionalStatus ==
- TTextDirectionalInfo::ERightToLeft );
- // Must actually change the docpos!
- AttachToRightChunk( docPos, rightChunk );
- SetCursorPositionL( docPos, ETrue ); // Drag any existing selection
- }
- else if ( status.iBlockEnvironment ==
- TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock
- && aCode == EKeyLeftArrow )
- {
- response = EKeyWasConsumed;
- // Effectively this toggles the direction of the cursor
- SetCursorTypeForTextDirection( status.iDirectionalStatus ==
- TTextDirectionalInfo::ERightToLeft );
- // Must actually change the docpos!
- AttachToLeftChunk( docPos, leftChunk );
- SetCursorPositionL( docPos, ETrue ); // Drag any existing selection
- }
- }
- }
- }
- return response;
- }
-
-
-TInt CAknFepManager::PostEventCheckCallback(TAny* aObj)
- {
- TRAP_IGNORE(static_cast<CAknFepManager*>(aObj)->DoCursorDirectionCheckL());
- return KErrNone;
- }
-
-TBool CAknFepManager::BidiCursorRequired() const
- {
- return iDeviceSupportsRtlLanguage;
- }
-
-void CAknFepManager::DoCursorDirectionCheckL()
- {
- iPostEventCheck->Cancel();
- if(BidiCursorRequired())
- {
- AdjustCursorTypeForCurrentPosition();
- }
-
- if ( !BidiCursorRequired()
- || (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode)) ))
- {
- /*Hindi*/
- if( ( !WesternPredictive() ) &&
- ( TAknFepUiIndicInputManager::IsIndicLangauge(
- TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) ) &&
- ( ( TAknFepUiIndicInputManager::IsCharVirama(
- PreviousChar( ETrue ), TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) )
-#ifdef RD_MARATHI
- || ( IsEyeLashRaPresentL() &&
- TAknFepUiIndicInputManager::IsCharVirama(
- PreviousToPreviousChar( ETrue ), TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) )
-#endif
- )
- && !( iInputCapabilities.SupportsSecretText() )
- )
- {
- TTmDocPosSpec pos = DocPos();
- pos.iType = TTmDocPosSpec::ETrailing;
- TTmPosInfo2 info;
- TTmLineInfo lineInfo;
- TBool findAvailable = EFalse;
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if (docNavi)
- {
- docNavi->FindDocPos(pos, info, lineInfo);
- findAvailable = ETrue;
- }
- else
- {
- CTextLayout* textLayout = TextLayout();
- if ( textLayout )
- {
- textLayout->TagmaTextLayout().FindDocPos(pos, info, lineInfo);
- findAvailable = ETrue;
- }
- }
- if (findAvailable)
- {
- TCursorSelection sel(info.iDocPos.iPos ,info.iDocPos.iPos );
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel);
- }
- }
- }
- }
-
-void CAknFepManager::AdjustCursorTypeForCurrentPosition()
- {
- if ( iInputCapabilities.FepAwareTextEditor() && EditorState()
- && (AknFepDocumentNavigation() || TextView()) )
- AdjustCursorTypeForPosition( DocPos() );
- }
-
-void CAknFepManager::SchedulePostEventCheckL( TUint aCode )
- {
-
- TBool isToPostEvent = EFalse;
- TBool isIndicLanguage = TAknFepUiIndicInputManager ::
- IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode));
-
- if ( BidiCursorRequired() )
- {
- switch ( aCode )
- {
- // Navigation cases:
- case EKeyDownArrow:
- case EKeyUpArrow:
- case EPtiKey1:
- case EPtiKey2:
- case EPtiKey3:
- case EPtiKey4:
- case EPtiKey5:
- case EPtiKey6:
- case EPtiKey7:
- case EPtiKey8:
- case EPtiKey9:
- case EPtiKey0:
- {
- isToPostEvent = ETrue;
- }
- break;
- case EKeyBackspace:
- case EKeyDelete:
- {
- if(!isIndicLanguage)
- {
- isToPostEvent = ETrue;
- }
- }
- break;
- case EKeyLeftArrow:
- case EKeyRightArrow:
- {
- if(!isIndicLanguage)
- {
- isToPostEvent = ETrue;
- }
- }
- break;
- default:
- break;
- }
-
- // If Repha has been inserted then do not post event.
- if( isIndicLanguage )
- {
- if( aCode == EPtiKey1 && ( !iQwertyInputMode ) )
- {
- if( IsRephaPresent()
-#ifdef RD_MARATHI
- || IsEyeLashRaPresentL()
-#endif
- )
- {
- isToPostEvent = EFalse;
- }
- }
- }
- }
-
- if(isIndicLanguage) // iQwertyInputMode check is added so as to ensure that the event is not posted for Qwerty mode.
- {
- if((aCode == EKeyBackspace || aCode == EKeyDelete) && (!iQwertyInputMode))
- {
- isToPostEvent = ETrue;
- }
- }
-
- if(isToPostEvent)
- {
- if ( iPostEventCheck->IsActive() )
- iPostEventCheck->Cancel();
- iPostEventCheck->Start( TCallBack(PostEventCheckCallback, this) );
- }
- }
-
-void CAknFepManager::AdjustCursorTypeForPosition( const TTmDocPosSpec& aDocPos )
- {
-
- TTextDirectionalInfo dirInfo = LocalTextDirectionalStatus( aDocPos );
- // default clearing of this flag
- ClearFlag( EFlagAtDirectionallyAmbiguousPoint );
-
- switch ( dirInfo.iBlockEnvironment )
- {
- case TTextDirectionalInfo::EUndefined:
- // Set according to input direction
- SetCursorTypeForTextDirection( CurrentInputDirectionality() ==
- TBidiText::ELeftToRight );
- break; // do nothing
-
- // All unambiguous cases
- case TTextDirectionalInfo::EInsideBlock:
- case TTextDirectionalInfo::EAtRightEndOfLine:
- case TTextDirectionalInfo::EAtLeftEndOfLine:
- case TTextDirectionalInfo::EAtRightEndOfBlockFacingSameDirectionBlock:
- case TTextDirectionalInfo::EAtLeftEndOfBlockFacingSameDirectionBlock:
- SetCursorTypeForTextDirection( dirInfo.iDirectionalStatus ==
- TTextDirectionalInfo::ELeftToRight );
- break;
-
- // Ambiguous. Navigation has resulted in an ambiguous visual position. Set cursor according
- // to current direction
- case TTextDirectionalInfo::EAtRightEndOfBlockFacingOppositeDirectionalBlock:
- case TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock:
- SetCursorTypeForTextDirection( dirInfo.iDirectionalStatus ==
- TTextDirectionalInfo::ELeftToRight );
- SetFlag( EFlagAtDirectionallyAmbiguousPoint );
- break;
- default:
- // Do nothing
- break;
- }
- }
-
-void CAknFepManager::SetCursorTypeForTextDirection( TBool aLeftToRight )
- {
- SetCursorType( aLeftToRight );
- }
-
-void CAknFepManager::SetCursorTypeForInputDirection( TBool /*aLeftToRight*/ )
- {
- // Do nothing
- }
-
-CAknFepManager::TTextDirectionalInfo CAknFepManager::
- LocalTextDirectionalStatus( const TTmDocPosSpec& aDocPos ) const
- {
- TTextDirectionalInfo directionalInfo;
-
- MCoeFepAwareTextEditor* fepAwareTextEditor = iInputCapabilities.FepAwareTextEditor();
- if ( !fepAwareTextEditor )
- return directionalInfo;
-
- if ( aDocPos.iPos < 0 ) // somehow, we are before the first character
- directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ENotInDocument;
- else if ( aDocPos.iPos > fepAwareTextEditor->DocumentLengthForFep() ) // (iPos = docLen still is within document)
- directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ENotInDocument;
- else if ( fepAwareTextEditor->DocumentLengthForFep() == 0 ) // zero length; no document
- directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ENotInDocument;
-
- if ( directionalInfo.iDirectionalStatus == TTextDirectionalInfo::EUnknown )
- {
- CTmTextLayout::TTmChunkDescription leftChunk;
- CTmTextLayout::TTmChunkDescription rightChunk;
- FindAdjacentChunks(aDocPos, leftChunk, rightChunk);
-
- // Cases:
- // position is within a chunk (chunks are continuous in logical index and same directionality.
- // ->Return directionality
- // position is betweeen two chunks of opposite directionality
- // -> return simple ambiguity
- // position is between two chnks of same directionality, but logical index is not contiguous
- // -> return complex ambiguity ; return directionality
-
- if ( leftChunk.iStart == -1 && rightChunk.iStart == -1 ) // 2 chunks invalid; direction stays EUnkonwn
- {
- directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ENoDirectionalChunks;
- }
- else if ( leftChunk.iStart == -1 ) // no left block
- {
- directionalInfo.iBlockEnvironment = TTextDirectionalInfo::EAtLeftEndOfLine;
- directionalInfo.SetDirectionFromChunk( rightChunk );
- }
- else if ( rightChunk.iStart == -1 ) // no right block
- {
- directionalInfo.iBlockEnvironment = TTextDirectionalInfo::EAtRightEndOfLine;
- directionalInfo.SetDirectionFromChunk( leftChunk );
- }
- // Both chunks are the same direction.
- // We are either nicely inside a block or the two blocks are at +/- 2, 4, etc levels
- else if ( COMPARE_BOOLS( leftChunk.iRightToLeft, rightChunk.iRightToLeft ) )
- {
- // Can set direction from either chunk; use left one
- directionalInfo.SetDirectionFromChunk( leftChunk );
-
- if (leftChunk.iRightToLeft )
- {
- if ( leftChunk.iStart == rightChunk.iEnd ) // chunks are continguous
- directionalInfo.iBlockEnvironment = TTextDirectionalInfo::EInsideBlock;
- else // Chunks are separated by 2, 4 etc. levels
- directionalInfo.iBlockEnvironment = ( aDocPos.iPos == leftChunk.iStart ) ?
- TTextDirectionalInfo::EAtRightEndOfBlockFacingSameDirectionBlock :
- TTextDirectionalInfo::EAtLeftEndOfBlockFacingSameDirectionBlock;
- }
- else
- {
- if ( leftChunk.iEnd == rightChunk.iStart ) // chunks are continguous
- directionalInfo.iBlockEnvironment = TTextDirectionalInfo::EInsideBlock;
- else // Chunks are separated by 2, 4 etc. levels
- directionalInfo.iBlockEnvironment = ( aDocPos.iPos == leftChunk.iEnd ) ?
- TTextDirectionalInfo::EAtRightEndOfBlockFacingSameDirectionBlock :
- TTextDirectionalInfo::EAtLeftEndOfBlockFacingSameDirectionBlock;
- }
- }
- else // Blocks are in opposite direction. Have to deal with all the values of the iType enum
- {
- TInt charPos;
- switch( aDocPos.iType )
- {
- case TTmDocPosSpec::ETrailing: // position follows a block End
- {
- charPos = aDocPos.iPos - 1; // attachment is to character[iPos-1] - now find it
- if ( leftChunk.iStart <= charPos && charPos < leftChunk.iEnd ) // pos is in left chunk
- {
- directionalInfo.SetDirectionFromChunk( leftChunk );
- directionalInfo.iBlockEnvironment =
- TTextDirectionalInfo::EAtRightEndOfBlockFacingOppositeDirectionalBlock;
- }
- else if( rightChunk.iStart <= charPos && charPos < rightChunk.iEnd ) // pos is in right chunk
- {
- directionalInfo.SetDirectionFromChunk( rightChunk );
- directionalInfo.iBlockEnvironment =
- TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock;
- }
- else // Probably impossible situation. Supply reasonable defaults rather than panicking
- {
- directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ELeftToRight;
- directionalInfo.iBlockEnvironment =
- TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock;
- }
- break;
- }
- case TTmDocPosSpec::ELeading: // position precedes a block start
- {
- charPos = aDocPos.iPos; // attachment is to character[iPos] - now find it
- if ( leftChunk.iStart <= charPos && charPos < leftChunk.iEnd ) // pos is in left chunk
- {
- directionalInfo.SetDirectionFromChunk( leftChunk );
- directionalInfo.iBlockEnvironment =
- TTextDirectionalInfo::EAtRightEndOfBlockFacingOppositeDirectionalBlock;
- }
- else if( rightChunk.iStart <= charPos && charPos < rightChunk.iEnd ) // pos is in right chunk
- {
- directionalInfo.SetDirectionFromChunk( rightChunk );
- directionalInfo.iBlockEnvironment =
- TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock;
- }
- else // Probably impossible situation. Supply reasonable defaults rather than panicking
- {
- directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ELeftToRight;
- directionalInfo.iBlockEnvironment =
- TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock;
- }
- break;
- }
- case TTmDocPosSpec::ELeftToRight: // Is attached to a Left to right block
- {
- directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ELeftToRight;
- // If left chunk is RTL, then we are NOT attached to that left block
- // (ie. we are at left end of the right block)
- directionalInfo.iBlockEnvironment = leftChunk.iRightToLeft ?
- TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock : // must be in right chunk then (left end of it)
- TTextDirectionalInfo::EAtRightEndOfBlockFacingOppositeDirectionalBlock; // else in left chunk (right end of it)
- break;
- }
- case TTmDocPosSpec::ERightToLeft:
- {
- directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ERightToLeft;
- // If left chunk if RTL, then we are attached to that left block (ie. at right end of it)
- directionalInfo.iBlockEnvironment = leftChunk.iRightToLeft ? // is it in left chunk?
- TTextDirectionalInfo::EAtRightEndOfBlockFacingOppositeDirectionalBlock : // right end of left chunk
- TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock;
- break;
- }
- }
-
- }
- }
- return directionalInfo;
- }
-
-
-/**
-* Redecoration is carried out if a neutral is exposed by the deletion to a directionality
-* different to that which is was already marked.
-*
-* The routine leaves iUncommittedText again set to the (possibly new) cursor position.
-*
-*/
-void CAknFepManager::RedecorateAfterDeletionL( const TDesC& aTextThatWasDeleted )
- {
- if (!EditorSupportsNeutralProtection())
- return;
-
- if ( aTextThatWasDeleted.Length() == 0 )
- return;
-
- TBool protect = ETrue;
-
- // Set up iUncommittedText with the current cursor position so that PreviousChar will work:
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
-
- TTmDocPosSpec docPos = DocPos();
- TInt docLen = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
-
- TInt previousPos = docPos.iPos;
- // Trailing iType actually points to character at index iPos - 1
- if( docPos.iType == TTmDocPosSpec::ETrailing )
- previousPos = previousPos -= 1;
- TInt nextPos = previousPos + 1;
-
- // Perform no neutral protection if the beginning of the text is deleted.
- // Note that there MAY be protection occuring if the delete is from the end so there is
- // no corresponding test on DocLength. That is handled later where the paragraph direction
- // is used for the "forward" directionality.
- if ( previousPos < 0 )
- return;
-
- // Up to 2 protection characters, one RTL and one LTR
- TBuf<2> textToInsert;
-
- TBool adjacentPrecedingIsNeutral(EFalse);
- TBool adjacentTrailingIsNeutral(EFalse);
-
- // See if either preceding or next is neutral
- adjacentPrecedingIsNeutral = iInlineTextDecorator->CharacterIsNeutral( CharAt(previousPos) );
- if ( nextPos < docLen )
- adjacentTrailingIsNeutral = iInlineTextDecorator->CharacterIsNeutral( CharAt(nextPos) );
-
- if ( !adjacentPrecedingIsNeutral && !adjacentTrailingIsNeutral )
- protect = EFalse;
-
- // Inits actually correspond to LTR, but they are only used if the bools indicating
- // strong directionality found get set
- TBool directionPrecedingDeleteIsRTL(EFalse);
- TBool directionTrailingDeleteIsRTL(EFalse);
- if ( protect )
- {
- TBool strongPreceding = GetExposedDirectionOfText( previousPos, EFalse,
- directionPrecedingDeleteIsRTL );
- TBool strongTrailing = GetExposedDirectionOfText( nextPos, ETrue,
- directionTrailingDeleteIsRTL );
- if (!strongTrailing)
- {
- TBool isRTLPara = IsRightToLeftParagraph(docPos);
- directionTrailingDeleteIsRTL = isRTLPara;
- strongTrailing = ETrue;
- }
- if ( !strongPreceding || !strongTrailing) // Must have strong in both directions
- protect = EFalse;
- else if ( COMPARE_BOOLS( directionPrecedingDeleteIsRTL, directionTrailingDeleteIsRTL ) ) // Must differ
- protect = EFalse;
- }
-
- TBool forwardProtection(EFalse);
-
- if ( protect )
- {
- protect = EFalse;
- TBool deletedWasRTL;
-
- // Check for and do reverse protection
- if ( adjacentPrecedingIsNeutral )
- {
- TBool deletedTextIsStrong = GetExposedDirectionOfTextInDescriptor( aTextThatWasDeleted,
- ETrue,
- deletedWasRTL ); // search forward into deleted stuff
- if ( deletedTextIsStrong && (directionPrecedingDeleteIsRTL == deletedWasRTL))
- {
- protect = ETrue;
- forwardProtection = EFalse;
- if ( deletedWasRTL )
- textToInsert.Append( CAknFepInlineTextDecorator::ERightToLeftMark );
- else
- textToInsert.Append( CAknFepInlineTextDecorator::ELeftToRightMark );
- }
- }
-
- // Check for and do forward protection
- // Note it is possible to have both forward and reverse redecoration.
- if ( adjacentTrailingIsNeutral )
- {
- TBool deletedTextIsStrong = GetExposedDirectionOfTextInDescriptor( aTextThatWasDeleted,
- EFalse,
- deletedWasRTL ); // search backward in deleted stuff
- if (deletedTextIsStrong && (directionTrailingDeleteIsRTL == deletedWasRTL) )
- {
- protect = ETrue;
- forwardProtection = ETrue;
- if ( deletedWasRTL )
- textToInsert.Append( CAknFepInlineTextDecorator::ERightToLeftMark );
- else
- textToInsert.Append( CAknFepInlineTextDecorator::ELeftToRightMark );
- }
- }
- }
-
-
- if ( protect )
- {
- StartInlineEditL(textToInsert);
- CommitInlineEditWithoutResolutionL(*(iInputCapabilities.FepAwareTextEditor()), ETrue);
- // iUncommittedText is now set to correct value by the Commitxxxx method
- // Document position is adjusted to as to keep the cursor stable.
- // Make a docPos. If reverse protection, then the position should trail
- TTmDocPosSpec docPos( iUncommittedText.LowerPos() , TTmDocPosSpec::ETrailing );
- // But if there has been forward Protection, then we have to back up the cursor by 1
- // and lead. (This is OK too, if there is simultaneous reversse and forward protection)
- if ( forwardProtection )
- {
- docPos.iPos = Max(docPos.iPos - 1, 0 );
- docPos.iType = TTmDocPosSpec::ELeading;
- }
- SetCursorPositionL( docPos );
- }
- }
-
-TBool CAknFepManager::EditorSupportsNeutralProtection()
- {
- TBool ret = ETrue;
- if ( !IsFepAwareTextEditor() )
- ret = EFalse;
-
- else if (iInputCapabilities.SupportsSecretText())
- ret = EFalse;
-
- else if ( iAknEditorFlags & EAknEditorFlagLatinInputModesOnly )
- ret = EFalse;
-
- else if (iPermittedInputModes == EAknEditorNumericInputMode)
- ret = EFalse;
-
- else if ( !CharIsValidInEditor( CAknFepInlineTextDecorator::ERightToLeftMark ) )
- ret = EFalse;
-
- return ret;
- }
-
-void CAknFepManager::CommitInlineEditWithoutResolutionL(MCoeFepAwareTextEditor& aFepAwareTextEditor,
- TBool aCursorVisibility , TBool aClearPti )
- {
- aFepAwareTextEditor.SetInlineEditingCursorVisibilityL(aCursorVisibility);
- /*
- On any call to CommitFepInlineEditL, the mode will change
- even when a leave event occurs.
- */
- ClearFlag(EFlagInsideInlineEditingTransaction | EFlagInsideMultitapInlineEditingTransaction);
- ClearCcpuFlag(ECcpuStateNewPredictiveWord);
-
- if(aClearPti)
- {
- iPtiEngine->CommitCurrentWord();
- }
- CCoeEnv* coeEnv = CCoeEnv::Static();
- aFepAwareTextEditor.CommitFepInlineEditL(*coeEnv);
- aFepAwareTextEditor.GetCursorSelectionForFep(iUncommittedText);
- // iMatchState=EWordMatchFirst;
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
-
-void CAknFepManager::WordConcatenationTimerTimeoutL()
- {
- iConcatenationTimer->Cancel();
-
- // add concatenated word to the UDB (a concatenated word is a compound word)
- AddCompoundWordToUdbL();
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- MoveCursorToEndOfWordL();
-#endif
- }
-
-
-TKeyResponse CAknFepManager::HandlePredictiveNaviEventOutsideInlineEditL(TUint aCode,
- TKeyPressLength aLength)
- {
- TKeyResponse response = EKeyWasNotConsumed;
-
- TWesternNaviEvent naviEvent = ENullNaviEvent;
- if (aCode == EKeyLeftArrow)
- {
- naviEvent = ELeftNaviEvent;
- }
- else if (aCode == EKeyRightArrow)
- {
- naviEvent = ERightNaviEvent;
- }
- else if (aCode == EKeyBackspace)
- {
- naviEvent = EBackspaceEvent;
- }
-
- TInt nextCharPos = 0; // Character ordinal in logical memory (0 - n-1)
- TBool nextPositionFound = EFalse;
- if ( naviEvent == ERightNaviEvent )
- {
- nextPositionFound = GetNextVisualRightCharacter( nextCharPos );
- }
- else if ( naviEvent == ELeftNaviEvent )
- {
- nextPositionFound = GetNextVisualLeftCharacter( nextCharPos );
- }
- else if ( naviEvent == EBackspaceEvent )
- {
- if (iLanguageCapabilities.iRightToLeftLanguage)
- {
- TChar character = PreviousChar();
- TChar::TBdCategory bdCategory = character.GetBdCategory();
- // In case last character in buffer is number or Latin characters, needs to delete
- // character from left.
- if (TChar::EEuropeanNumber == bdCategory || TChar::EArabicNumber == bdCategory ||
- TChar::ELeftToRight == bdCategory )
- {
- nextPositionFound = GetNextVisualLeftCharacter( nextCharPos );
- }
- else
- {
- nextPositionFound = GetNextVisualRightCharacter( nextCharPos );
- }
- }
- else
- {
- nextPositionFound = GetNextVisualLeftCharacter( nextCharPos );
- }
- }
-
- if ( !nextPositionFound )
- {
- response = EKeyWasNotConsumed;
- }
- else // not looping - lets see what to do
- {
- TBuf<ESingleCharacter> characterBuffer;
- iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(characterBuffer,
- nextCharPos,
- ESingleCharacter);
-
- if ( !IsValidInLineCharacter( STATIC_CAST(TChar, characterBuffer[0])) )
- {
- // if the character is a non-alpha character; let it go
- response=EKeyWasNotConsumed;
- if (IsFlagSet(EFlagCompoundWord))
- {
- if (STATIC_CAST(TChar, characterBuffer[0]).IsSpace())
- // we are navigating over a space so add any current compond word to the udb
- AddCompoundWordToUdbL();
- ClearFlag(EFlagCompoundWord);
- }
- //allow to popup editsubmenu
- ClearCcpuFlag(ECcpuStateIgnoreStarUp);
- }
- else
- {
- if (FepUI()->HandleKeyL(aCode, aLength))
- {
- response=EKeyWasConsumed;
- }
- }
- }
- return response;
- }
-
-/**
- * Call back function:
- */
-TInt CAknFepManager::DoSimulateKey(TAny* aThisPtr)
- {
- CAknFepManager* myobj = static_cast<CAknFepManager*>(aThisPtr);
- TRAPD(error, myobj->HandleOwnedSimulateKeyL());
- return error;
- }
-
-void CAknFepManager::HandleOwnedSimulateKeyL()
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
- if( KeyboardLayout() == EPtiKeyboardHalfQwerty )
- {
- CCoeEnv::Static()->SimulateKeyEventL( iHalfQwertyLastKeyEvent, EEventKey );
- }
- else
-#endif //__HALF_QWERTY_KEYPAD
-#endif //RD_INTELLIGENT_TEXT_INPUT
- if (iSimulateKey > 0)
- {
- HandleKeyEventL(iSimulateKey, EShortKeyPress);
- iSimulateKey = 0;
- }
- }
-
-/**
- * This method is that the label of CBA is updated by aTextResId.
- * @param aPosition CBA position, either ELeftSoftkeyIndex or ERightSoftkeyIndex
- * @param aCommandId command id for softkey
- * @param aTextResId resource id to set string on label.
- * @return TBool The return value is ETrue in case it is necessary to update CBA.
- */
-TBool CAknFepManager::UpdateCBALabelL(TInt aPosition, TInt aCommandId, TInt aTextResId)
- {
- return iUiInterface->UpdateSoftkeyLabelL(aPosition, aCommandId, aTextResId);
- }
-
-void CAknFepManager::DoLaunchSctAndPctL(TInt aResourceId, TShowSctMode aShowSctMode)
- {
- TBool replace = EFalse;
- TBool disableRecentItemRow = EFalse;
-
- if (ExtendedInputCapabilities() & CAknExtendedInputCapabilities::EDisableSCT)
- {
- // The editor doesn't allow SCT.
- return;
- }
- if ( EditorType() == CAknExtendedInputCapabilities::EEikSecretEditorBased )
- {
-
- disableRecentItemRow = ETrue;
- }
-
- if (IsCcpuFlagSet(ECcpuStateCbaSymbol) &&
- iMode == ELatin && WesternPredictive(ELatin) &&
- iPtiEngine->LastEnteredKey() == EPtiKey1)
- {
- // User is entering special character as result of pressing key '1' and
- // cycling through candidates until left softkey turns into "Symbol". In
- // that case we want to replace last cahracter instead of adding new one.
- replace = ETrue;
- }
-
- //Commit characters in latin multitap as some editors may call CancelFepTransaction()
- //which will be received before the focus change notification.
- if (IsFeatureSupportedJapanese())
- {
- TryCloseUiL();
- }
- else
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(!(WesternPredictive()))
-#endif
- CommitInlineEditL();
- }
-
- if (!EditorHasFreeSpace())
- {
- return;
- }
-
- // get the SCT resource id from editor default settings
- TInt currentEditorSCTResId = GetCurrentEditorSCTResId();
- TInt charMap = aResourceId;
- if ( FeatureManager::FeatureSupported(KFeatureIdChinese) )
- {
- if (charMap == R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG)
- {
- charMap = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_CHINESE;
- }
- }
- if (!charMap)
- {
- // override numeric keymap if necessary. flag is for non standard charmaps
- TInt standardNumericCharMap = EDefaultNumericCharMapResId;
- if ((iMode == ENumber || iMode == ENativeNumber) &&
- !(iAknEditorFlags & EAknEditorFlagUseSCTNumericCharmap) &&
- (iCharWidth == EHalfWidthChar) &&
- ( (iAknEditorNumericKeymap != EAknEditorAlphanumericNumberModeKeymap) ||
- (iPermittedInputModes == EAknEditorNumericInputMode) ))
- {
- standardNumericCharMap = NumericModeSCTResourceId();
- }
- charMap = standardNumericCharMap;
- }
-
- if ( charMap == ENoCharacters && !IsAbleToLaunchSCT())
- {
- currentEditorSCTResId = charMap;
- }
-
- if (currentEditorSCTResId)
- {
- TBuf<32> specialChars;
-
- TInt sctChars = EAknSCTChiChineseInputModes;
- TInt afterSctChars = EAknSCTHalfCase;
-
- if (iCharWidth == EFullWidthChar)
- {
- sctChars = EAknSCTFullCase;
- if (iMode == ELatin)
- {
- afterSctChars = EAknSCTUpperCase;
- if (iCaseMan->CurrentCase() == EAknEditorLowerCase)
- {
- afterSctChars = EAknSCTLowerCase;
- }
- }
- else if (iMode == ENumber||iMode == ENativeNumber)
- {
- afterSctChars = EAknSCTLowerCase;
- }
- }
- else
- {
- if (iMode == ELatin)
- {
- if ( FeatureManager::FeatureSupported(KFeatureIdChinese) )
- {
- sctChars = EAknSCTChiLatinInputModes;
- }
- else
- {
- if (iQwertyInputMode)
- {
- sctChars = EAknSCTQwerty;
- afterSctChars = EAknSCTFullCase;
- }
- else
- {
- sctChars = EAknSCTUpperCase;
- afterSctChars = EAknSCTFullCase;
- if (iCaseMan->CurrentCase() == EAknEditorLowerCase)
- {
- sctChars = EAknSCTLowerCase;
- }
- }
- }
- }
- else if (iMode == ENumber||iMode == ENativeNumber)
- {
- sctChars = EAknSCTNumeric;
- if ( ((iAknEditorFlags & EAknEditorFlagUseSCTNumericCharmap) ||
- (iAknEditorNumericKeymap == EAknEditorAlphanumericNumberModeKeymap)) &&
- !IsOnlyHalfWidthCharacterPermitted() )
- {
- sctChars = EAknSCTLowerCase;
- afterSctChars = EAknSCTFullCase;
- }
- }
- else if (iMode == EHiraganaKanji)
- {
- sctChars = EAknSCTFullCase;
- }
- else if(iMode == EKatakana)
- {
- sctChars = EAknSCTHalfCase;
- afterSctChars = EAknSCTFullCase;
- }
- }
-
- SetFlag(EFlagForegroundUIComponentVisible);
-
- TBool showAnotherTable = EFalse;
- if (IsFeatureSupportedJapanese())
- {
- if (sctChars == EAknSCTFullCase)
- {
- if (!IsOnlyFullWidthCharacterPermitted())
- {
- showAnotherTable = ETrue;
- }
- }
- else if (sctChars == EAknSCTHalfCase || sctChars == EAknSCTUpperCase
- || sctChars == EAknSCTLowerCase)
- {
- if (!IsOnlyHalfWidthCharacterPermitted()
- && !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly))
- {
- showAnotherTable = ETrue;
- }
- }
- }
-#ifdef RD_SCALABLE_UI_V2
- if( iFepFullyConstructed && !iFepPluginManager->IsGlobleNotes())
- {
- if (iFepPluginManager->PluginInputMode() == EPluginInputModeItut ||
- iFepPluginManager->PluginInputMode() == EPluginInputModeFSQ ||
- iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr)
- {
- SetStopProcessFocus(ETrue, EFalse);
- iFepPluginManager->SetMenuState();
- }
- else if (!iFepPluginManager->IsGlobleNotes())
- {
- iFepPluginManager->ClosePluginInputUiL( ETrue );
- }
- }
-#endif
-
- TBool lockNumericKeys = ( iPtiEngine->IsQwertyBasedMode(iPtiEngine->InputMode()))
- #ifdef RD_INTELLIGENT_TEXT_INPUT
- || ( iPtiEngine->InputMode() == EPtiEngineHalfQwerty ) ||
- ( iPtiEngine->InputMode() == EPtiEngineHalfQwertyPredictive )
- #endif
- ;
- TUid fepUid = CCoeEnv::Static()->FepUid();
-
- if(IsAbleToLaunchSmiley())
- {
- if(aShowSctMode == EShowSmileyFirst)
- {
- sctChars |= EAknCharMapEmotionFirst;
- }
- else
- {
- sctChars |= EAknCharMapEmotionUse;
- }
- }
- ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
-
- if (iUiInterface->CharMapDialogL(
- sctChars,
- specialChars,
- charMap,
- lockNumericKeys,
- aShowSctMode==EShowPctFirst,
- !IsAbleToLaunchPCT(),
- showAnotherTable,
- afterSctChars,
- currentEditorSCTResId,
- disableRecentItemRow))
- {
- PrepareFepAfterDialogExitL(fepUid);
- SetCcpuFlag(ECcpuStateSupressCursorMoveToEnd);
-
-#ifdef RD_SCALABLE_UI_V2
-
- if( iFepFullyConstructed && iFepPluginManager)
- {
- if (iFepPluginManager->PluginInputMode() == EPluginInputModeItut ||
- iFepPluginManager->PluginInputMode() == EPluginInputModeFSQ ||
- iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr)
- {
- SetStopProcessFocus(EFalse);
- }
- else
- {
- HandleChangeInFocus();
- }
- }
- else
- {
- HandleChangeInFocus();
- }
- // Set the flag, not change focus for next.
- iDisalbleFocusChangeForSCT = ETrue;
-#endif
-
- //Removes auto-complition part if SCT is launched and any special character is selected
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if( specialChars.Length() > 0 )
- {
- RemoveSuggestedAdvanceCompletionL();
- }
-#endif // RD_INTELLIGENT_TEXT_INPUT
- TBuf<ESingleCharacter> charAsDesc(ESingleCharacter);
- for ( TInt ii = 0; ii < specialChars.Length(); ii++)
- {
- charAsDesc[0]=(TText)specialChars[ii];
-
- if (iInputCapabilities.SupportsSecretText())
- {
- TChar ch = charAsDesc[0];
- if (ch == TText(0x000A) || ch == TText(CEditableText::EParagraphDelimiter))
- // 0x000A is ascii, EParagraphDelimiter is unicode - future
- // proofs against sct changing to unicode
- ch = EKeyEnter;
- if (CharIsValidInEditor(ch))
- {
- //we receive an extra key press if we simulate a key that is also a device key
- if (ch.IsDigit() || TUint(ch) == EStarKeyUnicodeValue
- || TUint(ch) == EHashKeyUnicodeValue)
- SetFlag(EFlagPassNextKey);
- SimulateKeyEventL(ch);
- }
- }
- else
- {
- if (charAsDesc[0] == TText(0x000A)) // 0x000A is line feed
- {
- charAsDesc[0] = CEditableText::EParagraphDelimiter;
- }
-
- if (CharIsValidInEditor(charAsDesc[0]))
- {
- TCursorSelection cursorSelection(0,0);
- if ((iAknEditorFlags & EAknEditorFlagMTAutoOverwrite) && iMode == ELatin
- && !WesternPredictive())
- {
- TInt edSize =
- iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep();
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- if (iUncommittedText.iCursorPos < edSize
- && iUncommittedText.Length() == 0)
- {
- cursorSelection = TCursorSelection(iUncommittedText.iCursorPos + 1,
- iUncommittedText.iAnchorPos);
- }
- }
- if (EditorState())
- {
- if (charAsDesc[0] == CEditableText::EParagraphDelimiter)
- {
- // This is line feed character. Post it to editor and let it decide
- // if it is valid.
- if (!(iAknEditorFlags & EAknEditorFlagFindPane)
- && specialChars.Length() == 1)
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- CommitInlineEditL();
-#endif
-
- SimulateKeyEventL(EKeyEnter);
- SimulateKeyEventL(EKeyF19); // Asyncronous case update
- }
- }
- else
- {
- if (replace)
- {
- TKeyEvent delKey = {8, EStdKeyBackspace, 1, 0};
- CCoeEnv::Static()->SimulateKeyEventL(delKey, EEventKey);
- }
- InsertTextFromDialogL(charAsDesc, cursorSelection);
-//There may be several char to be inserted, need disable Focus change to avoid multi-focus change.
-#ifdef RD_SCALABLE_UI_V2
- iDisalbleFocusChangeForSCT = ETrue;
-#endif
- }
- // Clear dead key, vowel sequence and vietnamese tone mark states.
- iPtiEngine->HandleCommandL(EPtiCommandGetAndClearLastVietnameseChar,
- NULL);
- iPtiEngine->HandleCommandL(EPtiCommandClearVowelSeq,
- NULL);
- iPtiEngine->HandleCommandL(EPtiCommandGetAndClearDeadKeyRootChar,
- NULL);
- }
- }
- }
- }
- }
- else
- {
- iClosePeninputUi = EFalse;
- iStopProcessFocus = EFalse;
- }
-
- PrepareFepAfterDialogExitL(fepUid);
- }
- }
-
-/**
- * Queries supportting of SecretText
- *
- * @since 2.6
- * @return ETrue if SecretText was supported
- */
-TBool CAknFepManager::IsSupportsSecretText() const
- {
- TBool bSecret = iInputCapabilities.SupportsSecretText();
- if( !bSecret )
- {
- //test java editor
- MObjectProvider* mop = iInputCapabilities.ObjectProvider();
- if ( mop )
- {
- CAknExtendedInputCapabilities* extendedInputCapabilities;
- extendedInputCapabilities = mop->MopGetObject( extendedInputCapabilities );
- if ( extendedInputCapabilities )
- {
- TUint constraints = extendedInputCapabilities->MIDPConstrainst();
- if( constraints & 0x10000 )
- {
- bSecret = ETrue;
- }
- }
- }
- }
-
- return bSecret;
- }
-
-void CAknFepManager::SendEventsToPluginManL( TInt aEventType, TInt aEventData )
- {
-#ifdef RD_SCALABLE_UI_V2
- if ( iFepFullyConstructed )
- {
- iFepPluginManager->HandleEventsFromFepL( aEventType, aEventData );
- }
-#endif //RD_SCALABLE_UI_V2
- }
-
-void CAknFepManager::UpdateCangJieState(TInt aNewMode)
- {
- CAknFepUIManagerChinese* fepUiMgr = STATIC_CAST(CAknFepUIManagerChinese*,
- iLangMan->GetFepUI(ECangJie, ENoneWidthChar, EFalse));
-
- if (aNewMode >= 0)
- {
- if ( fepUiMgr )
- {
- fepUiMgr->UpdateCangJieState();
- }
-
- // Store CangJie settings into the sharedata
- iSharedDataInterface->SetCangJieMode(aNewMode);
- }
- }
-
-TInt CAknFepManager::LaunchCangJieOptionDlgL()
- {
- // Get the CangJie level from the GS
- TInt currentLevel = iSharedDataInterface->CangJieMode();
-
- if ((currentLevel != ECangJieNormal)
- && (currentLevel != ECangJieEasy)
- && (currentLevel != ECangJieAdvanced))
- return KErrGeneral;
-
- // Launch the CangJie setting menu
- CDesCArrayFlat* items = CCoeEnv::Static()->ReadDesC16ArrayResourceL(R_AVKON_CANGJIE_OPTIONS_LBX);
- CleanupStack::PushL(items);
-
- TUid fepUid = CCoeEnv::Static()->FepUid();
- ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
- TInt ret = iUiInterface->LaunchCangJieOptionDlgL(
- R_AVKON_CANGJIE_MODE_OPTIONS_SETTING_PAGE,
- currentLevel,
- items
- );
- PrepareFepAfterDialogExitL(fepUid);
-
- CleanupStack::PopAndDestroy(items);
-
- return ret ? currentLevel : KErrGeneral;
- }
-
-GLDEF_C void AknFepPanic(TAknFepPanic aPanic)
- {
- User::Panic(_L("AKNFEP"),aPanic);
- }
-
-/**
- * Set Multitap timer value.
- *
- * @since 3.0
- * @param Value of KAknFepMultiTapTimer setting
- */
-void CAknFepManager::SetMultiTapTimer(const TInt aMultiTapTimer)
- {
- if (iMultiTapTimer != aMultiTapTimer)
- {
- iMultiTapTimer = aMultiTapTimer;
- }
- }
-
-/**
- * Set Japanese Qwerty Flags value.
- *
- * @since 3.0
- * @param Value of KAknFepJapaneseSpecialCharFlag setting
- */
-void CAknFepManager::SetJapaneseQwertyFlags(const TInt aJapaneseQwertyFlags)
- {
- if (iJapaneseQwertyFlags != aJapaneseQwertyFlags)
- {
- iJapaneseQwertyFlags = aJapaneseQwertyFlags;
- }
- }
-
-/**
- * Handle the Chr Key Monitor
- * for Japanese variant only.
- *
- * @since 3.0
- * @return KErrNone if succeed, KErrDied if failed
- */
-TInt CAknFepManager::HandleChrKeyMonitorCallback(TAny* aObj)
- {
- TRAPD(err, static_cast<CAknFepManager*>(aObj)->HandleChrKeyMonitorL());
- if (err)
- {
- static_cast<CAknFepManager*>(aObj)->CleanUpFep();
- return KErrDied;
- }
- return KErrNone;
- }
-
-/**
- * Handle the Chr Key Monitor
- * for Japanese variant only.
- *
- * @since 3.0
- */
-void CAknFepManager::HandleChrKeyMonitorL()
- {
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __HALF_QWERTY_KEYPAD
- if ( IsFlagSet(EFlagQwertyChrKeyDepressed) &&
- IsFlagSet(EFlagNoActionDuringChrKeyPress) &&
- (EPtiKeyboardHalfQwerty == KeyboardLayout() ) &&
- ( iWesternPredictive || iMode == EPinyin ||
- iMode == EStroke || iMode == EZhuyin ) )
- {
- // Clear the chr key depressed flag
- TBool validchr = FepUI()->IsValidLongChrKeyPress();
-
- if(!validchr || !IsAbleToLaunchSCT() )
- {
- FepUI()->HandleKeyL( EStdKeyLeftFunc, EShortKeyPress );
- ClearFlag( EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress);
- }
- else
- {
- // will launch SCT later
- iChrLongKeyPress = ETrue;
- }
-
- }
- else
-#endif
-#endif
- if (IsFlagSet(EFlagQwertyChrKeyDepressed) && IsFlagSet(EFlagNoActionDuringChrKeyPress)
- && iCurrentFepUI->IsValidShiftKeyPress())
- {
- // Timer cancel
- iChrKeypressMonitor->Cancel();
- // Commit characters
- HandleChangeInFocus();
- // Clear flags
- ClearFlag(EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress);
- // Open editting menu
- LaunchSelectModeMenuL();
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CAknFepManager::SetCursorSelectionL
-// Set editor cursor selection.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CAknFepManager::SetCursorSelectionL(const TCursorSelection& /*aCurSel*/, TBool /*aSyncCursor*/)
- {
- }
-
- TInt CAknFepManager::HandleResourceChangedCallback(TAny* aObj)
- {
- TRAPD(err, static_cast<CAknFepManager*>(aObj)->ResourceChangedTimeroutL());
- if (err)
- {
- static_cast<CAknFepManager*>(aObj)->CleanUpFep();
- return KErrNoMemory;
- }
- return KErrNone;
- }
-
-void CAknFepManager::ResourceChangedTimeroutL()
- {
- if(iCurrentFepUI)
- {
- iCurrentFepUI->ResourceChanged(1);
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// pen related inplementation
-// -----------------------------------------------------------------------------
-#ifdef RD_SCALABLE_UI_V2
-
-// -----------------------------------------------------------------------------
-// CAknFepManager::HandleLayoutChange
-// Update plugin UI case mode.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CAknFepManager::HandleResourceChange(TInt aType)
- {
- if(iCurrentFepUI)
- {
- iAsyncResouceChanged.CallBack();
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(iCandidatePopup && iPtiEngine && (aType == KEikDynamicLayoutVariantSwitch))
- {
- //When there is a change of layout, the inline text position changes and hence the candidate
- //list position also needs to change accordingly.
- //We need the editor to be brought back to focus, this is because we need the position of
- //the inline text.
- iCandidatePopup->UnFocus();
- //Need to get the editor state back after it is brought back to focus.
- TRAP_IGNORE( HandleChangeInFocusL());
-
- // Add candidate list control stack to get the layout change event
- // after dialog control......
- TRAP_IGNORE( iCandidatePopup->SetFocusAddStackReducePriorityL() );
-
- }
-#endif
- TRAP_IGNORE(SendEventsToPluginManL( EPluginResourceChanged, aType ));
- }
-void CAknFepManager::HandlePointerEventL(const TPointerEvent& aPointerEvent)
- {
- if (IsFlagSet(CAknFepManager::EFlagNoMatches))
- {
- ClearFlag(CAknFepManager::EFlagNoMatches);
- }
-
- if(aPointerEvent.iType == TPointerEvent::EDrag)
- {
- SetExtendedFlag(EExtendedFlagPointerEventTypeEDrag);
- }
- if (aPointerEvent.iType == TPointerEvent::EButton1Up)
- {
- ClearExtendedFlag(EExtendedFlagPointerEventTypeEDrag);
-
- // Remember last up-click in case it is needed for displaying
- // stylus ccpu-menu.
- iClickPoint = aPointerEvent.iPosition;
- }
- }
-
-// -----------------------------------------------------------------------------
-// CAknFepManager::HandleSelModeArrowKeyEventL
-// Set text selection when tap on the arrow keys.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TBool CAknFepManager::HandleSelModeArrowKeyEventL(const TKeyEvent& aKeyEvent,
- TEventCode aEventCode,
- TKeyResponse& aRetCode)
- {
- TCursorSelection currentEditorSelection(0,0);
- if(iInputCapabilities.FepAwareTextEditor())
- {
- iInputCapabilities.FepAwareTextEditor()->
- GetCursorSelectionForFep(currentEditorSelection);
- }
-
- if(!IsMfneEditor() &&
- (PluginInputMode() == EPluginInputModeItut ||
- PluginInputMode() == EPluginInputModeFSQ) &&
- currentEditorSelection.Length() != 0)
- {
-
- if ((aKeyEvent.iScanCode == EStdKeyLeftArrow) || (aKeyEvent.iScanCode == EStdKeyRightArrow))
- {
- if (!(aKeyEvent.iModifiers & EModifierShift))
- {
- TKeyEvent ccpuStart = aKeyEvent;
- ccpuStart.iModifiers |= EModifierShift;
- ccpuStart.iModifiers |= EModifierRightShift;
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, aEventCode);
-
- aRetCode = EKeyWasConsumed;
- return ETrue;
- }
- else
- {
- aRetCode = EKeyWasNotConsumed;
- return ETrue;
- }
- }
- }
- aRetCode = EKeyWasNotConsumed;
- return EFalse;
- }
-
-#else // !RD_SCALABLE_UI_V2
-// -----------------------------------------------------------------------------
-// CAknFepManager::HandleResourceChange
-// Update plugin UI case mode.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CAknFepManager::HandleResourceChange(TInt aType)
- {
- if (iFepFullyConstructed && Japanese() )
- {
- // Japaneseinput should handle the event of changing layout or screen.
- FepUI()->ResourceChanged(aType);
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- if(iCandidatePopup && iPtiEngine && (aType == KEikDynamicLayoutVariantSwitch))
- {
- //When there is a change of layout, the inline text position changes and hence the candidate
- //list position also needs to change accordingly.
- //We need the editor to be brought back to focus, this is because we need the position of
- //the inline text.
- iCandidatePopup->UnFocus();
- //Need to get the editor state back after it is brought back to focus.
- TRAP_IGNORE(HandleChangeInFocusL());
- //Can not do anything if FEP is not constructed fully
- if(iFepFullyConstructed)
- {
- //Now we read the position of the inline text
- TPoint inlineEditorTl;
- TPoint inlineEditorBr;
- TInt height;
- TInt ascent;
- TInt documentOffset = iPtiEngine->CurrentWord().Length();
- // Popup Position for RTL
- if(iLanguageCapabilities.iRightToLeftLanguage)
- documentOffset = 0;
- // Popup Position for RTL
- TRAP_IGNORE( GetScreenCoordinatesL( inlineEditorTl, height, ascent, documentOffset ));
- inlineEditorTl.iY -= height;
- TRAP_IGNORE( GetScreenCoordinatesL( inlineEditorBr, height, ascent ));
-
- //Let the candidate list know about a change of resource and update the
- //inline text rectangle.
- //Now show the candidate list at the re-calculated position
- iCandidatePopup->ShowAtNewPosition(TRect(inlineEditorTl,inlineEditorBr));
- }
- }
-#endif
- }
-
-#endif //RD_SCALABLE_UI_V2
-
-TDigitType CAknFepManager::LocalDigit()
- {
- return iLanguageCapabilities.iLocalDigitType;
- }
-
-/**
-* Returns ETrue if arabic indic digit setting is on.
-*
-* @since 3.0
-*/
-TBool CAknFepManager::ArabicIndicDigitsInUse() const
- {
- return (iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic);
- }
-
-TBool CAknFepManager::EasternArabicIndicDigitsInUse() const
- {
- return (iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic);
- }
-
-/**
- * Sets delayed commit on (predicitve word will be commited in
- * next call to TryCloseUiL. This is needed because of Japanese ReadingTextL).
- *
- * @since 3.1
- */
-void CAknFepManager::SetDelayedCommit()
- {
- iCcpuMode |= ECcpuStataCommitPredictiveWord;
- }
-
-// -----------------------------------------------------------------------------
-// CAknFepManager::SetDefaultNumberMode
-//
-// Set default number mode for non-latin languagues
-//
-// Copied from CGSLangModel::SetDefaultNumberMode
-// -----------------------------------------------------------------------------
-//
-void CAknFepManager::SetDefaultNumberMode( TInt aMode, TInt aNbrModeType )
- {
- //As aMode comes from the UI, it can either be 0 or 1. This needs
- //special handling for Indic mode as it has been defined as an enum
- //constant and has a value of 2. This applies to any values defined
- //in the enum and have a value > 1.
- if ( aNbrModeType == ENbrModeTypeArabic ||
- aNbrModeType == ENbrModeTypeEasternArabic )
- {
- iSharedDataInterface->SetDefaultNumberMode( KSettingsDefaultNumberMode, aMode );
- }
- else
- {
- iSharedDataInterface->SetDefaultNumberMode( KSettingsIndicDefaultNumberMode, aMode );
- }
-
- TLocale locale;
- if ( aMode == ENbrModeLatin )
- {
- locale.SetDigitType( EDigitTypeWestern );
- }
- else
- {
- //if aMode != EGSNbrModeLatin, then it should be either latin or arabic. However
- //as EGSNbrModeArabic and EGsNbrModeIndic both have a value = 1, we can't use
- //that constant for below comparison. Hence, need to depend on the 2nd param.
- switch ( aNbrModeType )
- {
- case ENbrModeTypeArabic:
- locale.SetDigitType( EDigitTypeArabicIndic );
- break;
- case ENbrModeTypeIndic:
- locale.SetDigitType( EDigitTypeDevanagari );
- break;
- case ENbrModeTypeEasternArabic:
- locale.SetDigitType( EDigitTypeEasternArabicIndic );
- break;
- default:
- break;
- }
- }
-
- locale.Set();
- }
-
-// -----------------------------------------------------------------------------
-// CAknFepManager::ResolveCurrentCandidateListIndex
-//
-// Calculates correct selection index for matches popup list.
-// -----------------------------------------------------------------------------
-//
-TInt CAknFepManager::ResolveCurrentCandidateListIndex(CDesCArrayFlat* aCandList)
- {
- if (iPtiEngine && aCandList)
- {
- TBuf<EMaximumFepWordLength> currentCand;
-
- currentCand.Copy(iPtiEngine->CurrentWord());
- for (TInt i = 0; i < aCandList->Count(); i++)
- {
- if (currentCand == aCandList->MdcaPoint(i))
- {
- if (i == aCandList->Count() - 1)
- {
- return 0;
- }
- return i + 1;
- }
- }
- }
-
- return 0;
- }
-
-void CAknFepManager::AlignLogicalAndVisualCursorL( TTmDocPosSpec::TType aType,
- TBool aToLeft )
- {
- if( !( iInputCapabilities.SupportsSecretText() ) )
- {
- if( IsFlagSet( EFlagInsideInlineEditingTransaction ) &&
- IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ) )
- {
- CommitInlineEditL();
- }
-
- MCoeFepAwareTextEditor* fepAwareTextEditor =
- iInputCapabilities.FepAwareTextEditor();
-
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
- if( (docNavi || TextLayout()) && fepAwareTextEditor )
- {
- TTmDocPosSpec pos = DocPos();
- pos.iType = aType;
- TTmPosInfo2 info;
- if (docNavi)
- {
- docNavi->GetNextVisualCursorPos( pos, info, aToLeft );
- }
- else
- {
- TextLayout()->TagmaTextLayout().GetNextVisualCursorPos( pos, info, aToLeft );
- }
- TCursorSelection curSel( info.iDocPos.iPos, info.iDocPos.iPos );
- fepAwareTextEditor->SetCursorSelectionForFepL( curSel );
- }
- }
- }
-
-void CAknFepManager::RemoveRephaCharacterL()
- {
- MCoeFepAwareTextEditor* fepAwareTextEditor =
- iInputCapabilities.FepAwareTextEditor();
-
- if( fepAwareTextEditor )
- {
- TInt previousCharPos = 0;
- TBool leftFlag = GetNextVisualLeftCharacter( previousCharPos );
-
- if( !leftFlag )
- {
- return;
- }
-
- TCursorSelection curSel;
- fepAwareTextEditor->GetCursorSelectionForFep( curSel );
-
- TInt lowerPos = curSel.LowerPos();
- if( lowerPos > 1 )
- {
- const TInt rephaLength( 2 );
- TBuf<rephaLength> previousCharacter;
- previousCharacter.FillZ();
-
- fepAwareTextEditor->
- GetEditorContentForFep( previousCharacter,
- previousCharPos, rephaLength );
-
- if (rephaLength == previousCharacter.Length())
- {
- if( previousCharacter[0] == TAknFepUiIndicInputManager::RaCharacter(
- TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) &&
- previousCharacter[1] == TAknFepUiIndicInputManager::Virama(
- TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) )
- {
- curSel.iAnchorPos = previousCharPos;
- curSel.iCursorPos = previousCharPos + rephaLength;
-
- // Remove the repha
-
- if( IsFlagSet( EFlagInsideInlineEditingTransaction ) &&
- IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ) )
- {
- CommitInlineEditL();
- }
- StartInlineEditL( curSel, previousCharacter, rephaLength, ETrue );
- UpdateInlineEditL( KNullDesC, 0 );
- CommitInlineEditL();
-
- // Go to the visual right position of current ligature as the
- // repha has been deleted.
- AlignLogicalAndVisualCursorL( TTmDocPosSpec::ELeading, EFalse );
- }
- }
- }
- }
- }
-
-TBool CAknFepManager::IsRephaPresent()
- {
- TBool result = EFalse;
-
- MCoeFepAwareTextEditor* fepAwareTextEditor =
- iInputCapabilities.FepAwareTextEditor();
-
- if( fepAwareTextEditor )
- {
- TCursorSelection curSel;
-
- fepAwareTextEditor->GetCursorSelectionForFep( curSel );
-
- TInt previousCharPos = 0;
- TBool leftFlag = GetNextVisualLeftCharacter( previousCharPos );
-
- if( !leftFlag )
- {
- return result;
- }
-
- TInt lowerPos = curSel.LowerPos();
- if( lowerPos > 1 )
- {
- const TInt rephaLength( 2 );
- TBuf<rephaLength> previousCharacter;
- previousCharacter.FillZ();
-
- fepAwareTextEditor->
- GetEditorContentForFep( previousCharacter,
- previousCharPos, rephaLength );
-
- // Verify whether the length of the string is equal to the length
- // of repha before doing further checks.
- if( previousCharacter.Length() == rephaLength )
- {
- if( previousCharacter[0] == TAknFepUiIndicInputManager::RaCharacter(
- TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) &&
- previousCharacter[1] == TAknFepUiIndicInputManager::Virama(
- TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) )
- {
- result = ETrue;
- }
- }
- }
- }
-
- return result;
- }
-
-TText CAknFepManager::PreviousToPreviousChar( TBool aContextSensitive )
- {
- TBuf<ESingleCharacter> prevToPrevChar( ESingleCharacter );
- prevToPrevChar.FillZ();
-
- if( !aContextSensitive )
- {
- TTmDocPosSpec pos = DocPos();
-
- // Pos=0 means it is before the first character and there is no previous character
- if (pos.iPos > 0 )
- {
- if( iInputCapabilities.FepAwareTextEditor() )
- {
- iInputCapabilities.FepAwareTextEditor()->
- GetEditorContentForFep( prevToPrevChar, pos.iPos - 1, ESingleCharacter );
- }
- }
- }
- else
- {
- TCursorSelection curSel;
-
- MCoeFepAwareTextEditor* fepAwareTextEditor =
- iInputCapabilities.FepAwareTextEditor();
-
- if( fepAwareTextEditor )
- {
- fepAwareTextEditor->GetCursorSelectionForFep( curSel );
- TInt lowerpos = curSel.LowerPos();
-
- if( lowerpos > 1 )
- {
- fepAwareTextEditor->
- GetEditorContentForFep( prevToPrevChar, lowerpos - 2, ESingleCharacter );
- }
- }
- }
- if (prevToPrevChar.Length())
- return prevToPrevChar[0];
- else
- return NULL;
- }
-
-void CAknFepManager::RemoveRakarCharacterL()
- {
- MCoeFepAwareTextEditor* fepAwareTextEditor =
- iInputCapabilities.FepAwareTextEditor();
-
- if( fepAwareTextEditor )
- {
- TCursorSelection curSel;
-
- fepAwareTextEditor->GetCursorSelectionForFep( curSel );
-
- TInt lowerpos = curSel.LowerPos();
-
- if( lowerpos > 1 )
- {
- const TInt rakarLength( 2 );
- TBuf<rakarLength> buffer;
- buffer.FillZ();
-
- fepAwareTextEditor->
- GetEditorContentForFep( buffer, lowerpos - rakarLength, rakarLength );
-
- if (rakarLength == buffer.Length())
- {
- if( buffer[0] == TAknFepUiIndicInputManager::Virama(
- TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) &&
- buffer[1] == TAknFepUiIndicInputManager::RaCharacter(
- TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) )
- {
- curSel.iAnchorPos = lowerpos - rakarLength;
- curSel.iCursorPos = lowerpos;
-
- // Remove the repha
-
- if( IsFlagSet( EFlagInsideInlineEditingTransaction ) &&
- IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ) )
- {
- CommitInlineEditL();
- }
- StartInlineEditL( curSel, buffer, rakarLength, ETrue );
- UpdateInlineEditL( KNullDesC, 0 );
- CommitInlineEditL();
- }
- }
- }
- }
- }
-
-/**
- * Returns the status of predictive input.
- *
- * @since 3.2
- * @return ETrue is available predictive input.
- */
-TBool CAknFepManager::IsAbleToChangePrediction() const
- {
- TBool ret = EFalse;
- if (!(iAknEditorFlags & EAknEditorFlagNoT9))
- {
- if (iMode == EHiraganaKanji)
- {
- if (HasJapanesePredictionInputMode())
- {
- ret = ETrue;
- }
- }
- else
- {
- ret = ETrue;
- }
- }
- return ret;
- }
-
-TLanguage CAknFepManager :: GetInputLanguageFromSharedDataInterface()
-{
- return ((TLanguage)(iSharedDataInterface->InputTextLanguage()));
-}
-
-
-void CAknFepManager::DeactivatePredicitveWordAndMoveCursorL()
- {
- if (WesternPredictive())
- {
- TWesternNaviEvent naviEvent = ERightNaviEvent;
-
- if (iLanguageCapabilities.iRightToLeftLanguage)
- {
- naviEvent = ELeftNaviEvent;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- // This function is called at time of Cut/Copy command
- // TryCloseUiL will remove the auto completion part
- // To adjust the visual cursor position commit the text with
- // auto completion part.
- if( IsAutoCompleteOn())
- {
- TInt tailLength = 0;
- iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength );
-
- if( tailLength > 0)
- {
- // Sync the key sequence and editor text.
- iPtiEngine->HandleCommandL( EPtiCommandLockCurrentCandidate );
- }
- }
-#endif
-
- // Find the visual left/right end of the current word
- TTmDocPosSpec pos;
- GetAvkonDefinedVisualLimitsOfSelection(
- iUncommittedText, naviEvent, pos, NULL );
-
- TryCloseUiL();
-
- // Position should be dis-ambiguated based on last navigation and direction of blocks.
- AdjustPosSpecForAmbiguityAfterLeftOrRightNavigation( pos, naviEvent );
-
- SetCursorPositionL( pos );
-
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CAknFepManager::EditorCcpuStatus
-//
-// Returns the Ccpu status of given editor state as a flag combination.
-// -----------------------------------------------------------------------------
-//
-TInt CAknFepManager::EditorCcpuStatus(CAknEdwinState* aEdwinState)
- {
- TInt ret = 0;
-
- if (aEdwinState && aEdwinState->CcpuState())
- {
- if (aEdwinState->CcpuState()->CcpuCanCopy())
- {
- ret |= ECcpuStatusFlagCanCopy;
- }
- if (aEdwinState->CcpuState()->CcpuCanCut())
- {
- ret |= ECcpuStatusFlagCanCut;
- }
- if (aEdwinState->CcpuState()->CcpuCanPaste())
- {
- ret |= ECcpuStatusFlagCanPaste;
- }
- }
- return ret;
- }
-
-void CAknFepManager::NewLigatureL( const TDesC& aText )
- {
- if( !iInputCapabilities.SupportsSecretText() &&
- ( EditorHasFreeSpace() ||
- IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ) ) )
- {
- if ( iFepManState == EAknFepStateInitial ) //multitapping
- {
- if ( !IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ) )
- {
- ClearFlag( EFlagLineFeedCharacter );
- StartInlineEditL( aText );
- SetFlag( EFlagInsideMultitapInlineEditingTransaction );
- SetFlag( EFlagInsideInlineEditingTransaction );
- }
- }
- }
- }
-
-
-
-// -----------------------------------------------------------------------------
-// CAknFepManager::CancelCcpuMode
-//
-// Cancels the copy / cut mode initiated from editing options -submenu.
-// -----------------------------------------------------------------------------
-//
-void CAknFepManager::CancelCcpuMode()
- {
- iIndicator->SetCopyMode(EFalse);
- if (IsCcpuFlagSet(ECcpuStateStartCopy | ECcpuStateCopy | ECcpuStateStartCut | ECcpuStateCut))
- {
- iUiInterface->DeleteSoftkeys();
- }
-
- ResetCcpuFlags();
- }
-
-// -----------------------------------------------------------------------------
-// CAknFepManager::CancelShiftKeyTimer
-//
-// Cancels shift key timer.
-// -----------------------------------------------------------------------------
-//
-void CAknFepManager::CancelShiftKeyTimer()
- {
- ClearFlag(EFlagShiftKeyDepressed);
- if (iShiftKeypressMonitor)
- {
- iShiftKeypressMonitor->Cancel();
- }
- }
-
-void CAknFepManager::RemoveTextFromEditorL( TInt aNumOfCharacters,
- TInt aPos /*= 0*/,
- TBool aIsToAlignCursor /* = ETrue */)
- {
- if( IsFlagSet( EFlagInsideInlineEditingTransaction ) &&
- IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ) )
- {
- // Update the inline buffer with NULL descriptor.
- // Inline buffer can be only at position 0, i.e.
- // where the cursor stands.
- if( aNumOfCharacters == UncommittedText().Length()
- && aPos == 0 )
- {
- UpdateInlineEditL( KNullDesC, 0 );
- }
- CommitInlineEditL();
- }
- else
- {
- MCoeFepAwareTextEditor* fepAwareTextEditor =
- iInputCapabilities.FepAwareTextEditor();
-
- if( fepAwareTextEditor && aPos >= 0 )
- {
- // Get the previous cursor position.
- TCursorSelection cursorSelPrevious;
- fepAwareTextEditor->GetCursorSelectionForFep( cursorSelPrevious );
-
- // Place the cursor at the desired position.
- TCursorSelection sel( cursorSelPrevious.iCursorPos - aPos,
- cursorSelPrevious.iCursorPos - aPos );
- fepAwareTextEditor->SetCursorSelectionForFepL( sel );
-
- // Set cursor span on previous N characters
- if ( sel.iAnchorPos >= aNumOfCharacters )
- {
- sel.iAnchorPos -= aNumOfCharacters;
-
- // get text to clear
- TBuf<EMaximumFepWordLength> bufToClear;
- fepAwareTextEditor->GetEditorContentForFep( bufToClear, sel.iAnchorPos,
- aNumOfCharacters );
-
- // delete the character with an inline edit
- StartInlineEditL( sel, bufToClear, aNumOfCharacters, EFalse );
- UpdateInlineEditL( KNullDesC, 0 );
- CommitInlineEditL();
-
- if( aIsToAlignCursor )
- {
- // Move the cursor to the original position considering the
- // aNumOfCharacters
- cursorSelPrevious.iCursorPos -= aNumOfCharacters;
- cursorSelPrevious.iAnchorPos = cursorSelPrevious.iCursorPos;
- fepAwareTextEditor->SetCursorSelectionForFepL( cursorSelPrevious );
- }
- }
- }
- }
- }
-
-#ifdef RD_MARATHI
-
-TBool CAknFepManager::IsChandraAPresentL()
- {
- TBool result = EFalse;
-
- MCoeFepAwareTextEditor* fepAwareTextEditor =
- iInputCapabilities.FepAwareTextEditor();
-
- if( fepAwareTextEditor )
- {
- TCursorSelection curSel;
-
- fepAwareTextEditor->GetCursorSelectionForFep( curSel );
-
- TInt lowerpos = curSel.LowerPos();
-
- TInt chandraALength = 2;
- TBuf<2> buf;
- TAknFepUiIndicInputManager::GetChandraA( buf );
-
- if( lowerpos > ( chandraALength - 1 ) )
- {
- TBuf<2>previousCharacter;
-
- fepAwareTextEditor->GetEditorContentForFep(
- previousCharacter, lowerpos-chandraALength, chandraALength );
-
- if( buf.CompareC( previousCharacter ) == 0 )
- {
- // Chandra-A found
- result = ETrue;
- }
- }
- }
- return result;
- }
-
-TBool CAknFepManager::IsEyeLashRaPresentL()
- {
- TBool result = EFalse;
-
- MCoeFepAwareTextEditor* fepAwareTextEditor =
- iInputCapabilities.FepAwareTextEditor();
-
- if( fepAwareTextEditor )
- {
- TCursorSelection curSel;
-
- fepAwareTextEditor->GetCursorSelectionForFep( curSel );
-
- TInt lowerpos = curSel.LowerPos();
-
-
- TBuf<3> buf;
- TAknFepUiIndicInputManager::GetEyeLashRa( buf,
- (TLanguage)iLanguageCapabilities.iInputLanguageCode );
- TInt eyeLashRaLength = buf.Length();
-
- if( ( lowerpos - eyeLashRaLength ) >= 0 )
- {
- TBuf<3>previousCharacter;
-
- fepAwareTextEditor->GetEditorContentForFep(
- previousCharacter, lowerpos-eyeLashRaLength, eyeLashRaLength );
-
- if( previousCharacter.Length() >=2 &&
- buf.CompareC( previousCharacter ) == 0 )
- {
- // EyeLashRa found
- result = ETrue;
- }
- }
- }
- return result;
- }
-
-#endif // RD_MARATHI
-#ifndef RD_INTELLIGENT_TEXT_INPUT
-void CAknFepManager::RemoveSuggestedCompletionL()
-{
- if(iPtiEngine->InputMode() == EPtiEngineWordCompletion &&
- IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))
- {
- TBuf<CAknFepManager::EMaximumFepWordLength> currentText = iPtiEngine->CurrentWord();
- if(currentText.Length() > iPtiEngine->CurrentInputSequence().Length())
- {
- currentText.SetLength(iPtiEngine->CurrentInputSequence().Length());
- iPtiEngine->SetCurrentWord(currentText);
- UpdateInlineEditL(currentText,currentText.Length());
- TransferFepStateToEditorL();
- }
-
- }
-}
-#endif //RD_INTELLIGENT_TEXT_INPUT
-
-
-// -----------------------------------------------------------------------------
-// CAknFepManager::ExtendedInputCapabilities
-//
-// Returns the extended input bapabilities bitvector.
-// -----------------------------------------------------------------------------
-//
-TUint CAknFepManager::ExtendedInputCapabilities() const
- {
- MObjectProvider* mop = iInputCapabilities.ObjectProvider();
-
- if ( mop && iInputCapabilities.FepAwareTextEditor() )//IsFepAwareTextEditor()
- {
- CAknExtendedInputCapabilities* extendedInputCapabilities =
- mop->MopGetObject( extendedInputCapabilities );
-
- if ( extendedInputCapabilities )
- {
- return extendedInputCapabilities->Capabilities();
- }
- }
-
- return 0;
- }
-
-
-#ifdef RD_SCALABLE_UI_V2
-// -----------------------------------------------------------------------------
-// CAknFepManager::LaunchStylusCcpuMenuL
-//
-// Displays stylus ccpu-menu.
-// -----------------------------------------------------------------------------
-//
-void CAknFepManager::LaunchStylusCcpuMenuL(TPoint &aClickPoint)
- {
- const TInt KItemCopy = 0x01;
- const TInt KItemCut = 0x02;
- const TInt KItemPaste = 0x04;
-
- delete iStylusCcpuMenu;
- iStylusCcpuMenu = NULL;
-
- // It is assume that this method is called only if there is selected
- // text in suitable editor, ie. there will be at least "copy"-item available.
- TInt items = KItemCopy;
-
- CAknEdwinState* editorState = EditorState();
- if (editorState && editorState->CcpuState())
- {
- if (editorState->CcpuState()->CcpuCanCut())
- {
- items |= KItemCut;
- }
- if (editorState->CcpuState()->CcpuCanPaste())
- {
- items |= KItemPaste;
- }
- }
-
- if (items)
- {
- TBuf<CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength> itemStr;
- iStylusCcpuMenu = iUiInterface->NewStylusPopUpMenuL(this, aClickPoint);
-
- if (items & KItemCopy)
- {
- StringLoader::Load(itemStr, R_AKNFEP_SOFTKEY_COPY);
- iStylusCcpuMenu->AddMenuItemL(itemStr.Mid(1, itemStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength), EEikCmdEditCopy);
- }
- if (items & KItemCut)
- {
- itemStr.Zero();
- StringLoader::Load(itemStr, R_AKNFEP_SOFTKEY_CUT);
- iStylusCcpuMenu->AddMenuItemL(itemStr.Mid(1, itemStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength), EEikCmdEditCut);
- }
- if (items & KItemPaste)
- {
- itemStr.Zero();
- StringLoader::Load(itemStr, R_AKNFEP_STYLUS_CCPU_MENU_PASTE);
- iStylusCcpuMenu->AddMenuItemL(itemStr.Mid(1, itemStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength), EEikCmdEditPaste);
- }
-
- SetCcpuFlag(ECcpuStateCopy); // This forces ProcessCommandL to handle the events.
- iStylusCcpuMenu->SetPosition(aClickPoint);
- iStylusCcpuMenu->ShowMenu();
- }
- }
-#endif
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
- TBool CAknFepManager::IsFnKeyMappedL(TPtiKeyboardType aKeyboardType)
- {
- MPtiLanguage *lang = NULL;
- RArray < TPtiNumericKeyBinding > keybinding;
- TBool ret = EFalse;
- if(iPtiEngine)
- {
- lang = iPtiEngine->CurrentLanguage();
- if(lang)
- {
- iPtiEngine->GetNumericModeKeysForQwertyL(lang->LanguageCode(), keybinding, aKeyboardType);
- TInt numericKeysCount = keybinding.Count();
- while ( numericKeysCount-- )
- {
- TPtiNumericKeyBinding numKeyBind = keybinding[numericKeysCount];
- if ( numKeyBind.iCase == EPtiCaseFnLower || numKeyBind.iCase == EPtiCaseFnUpper)
- {
- ret = ETrue;
- break;
- }
- }
- }
- }
- keybinding.Reset();
- return ret;
- }
-TBool CAknFepManager::IsFnKeyMapped()
- {
- return iIsFnKeyMapped;
- }
-
-void CAknFepManager::SetFnKeyMappingState()
- {
- TRAP_IGNORE(iIsFnKeyMapped = IsFnKeyMappedL());
- }
-
-TBool CAknFepManager::KeyMapsDifferentCharacterWithFn( TPtiKey aKey ) const
- {
- // we are interested only about the first mapped character => buffer length 1 is adequate
- TBuf<1> lowerMapping;
- TBuf<1> upperMapping;
- TBuf<1> lowerFnMapping;
- TBuf<1> upperFnMapping;
- iPtiEngine->MappingDataForKey( aKey, lowerMapping, EPtiCaseLower );
- iPtiEngine->MappingDataForKey( aKey, upperMapping, EPtiCaseUpper );
- iPtiEngine->MappingDataForKey( aKey, lowerFnMapping, EPtiCaseFnLower );
- iPtiEngine->MappingDataForKey( aKey, upperFnMapping, EPtiCaseFnUpper );
-
- if ( lowerFnMapping.Length() )
- {
- if ( !lowerMapping.Length() || // < key maps character only with Fn
- lowerMapping[0] != lowerFnMapping[0] ) // < Fn changes the character of the key
- {
- return ETrue;
- }
- }
- else if ( upperFnMapping.Length() )
- {
- if ( !upperMapping.Length() || // < key maps character only with Fn
- upperMapping[0] != upperFnMapping[0] ) // < Fn changes the character of the key
- {
- return ETrue;
- }
- }
-
- return EFalse; // The key doesn't have symbol behind Fn or the symbol is the same as without Fn
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
-MAknFepDocumentNavigation* CAknFepManager::AknFepDocumentNavigation() const
- {
- MAknFepDocumentNavigation* navi = NULL;
-
- MObjectProvider* mop = iInputCapabilities.ObjectProvider();
- if ( mop )
- {
- mop->MopGetObject( navi );
- }
-
- return navi;
- }
-
-CAknFepUIInterface* CAknFepManager::UiInterface()
- {
- return iUiInterface;
- }
-
-void CAknFepManager::AlignLogicalAndVisualCursorL()
- {
- TBool isIndicLang =
- TAknFepUiIndicInputManager::
- IsIndicLangauge( TLanguage( iLanguageCapabilities.iInputLanguageCode ) );
-
- if( isIndicLang )
- {
- TTmDocPosSpec pos = DocPos();
- pos.iType = TTmDocPosSpec::ETrailing;
- TTmPosInfo2 info;
- TTmLineInfo lineInfo;
-
- TBool findAvailable = EFalse;
-
- MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation();
-
- if ( docNavi )
- {
- docNavi->FindDocPos( pos, info, lineInfo );
- findAvailable = ETrue;
- }
- else
- {
- CTextLayout* textLayout = TextLayout();
- if ( textLayout )
- {
- textLayout->TagmaTextLayout().FindDocPos( pos, info, lineInfo );
- findAvailable = ETrue;
- }
- }
-
- if ( findAvailable )
- {
- TCursorSelection sel( info.iDocPos.iPos, info.iDocPos.iPos );
- iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel);
- }
- }
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-TKeyResponse CAknFepManager::HandleFnKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aEventCode )
- {
- TKeyResponse ret;
-
-#ifdef __HALF_QWERTY_KEYPAD
- if ( IsFlagSet( EFlagShiftKeyDepressed ) &&
- ( EPtiKeyboardHalfQwerty == KeyboardLayout() )&&
- ( aEventCode != EEventKeyUp ) )
- {
- return EKeyWasNotConsumed;
- }
-#endif
-
- if (!iCurrentFepUI->IsValidFnKeyPress() && EStdKeyRightFunc == aKeyEvent.iScanCode)
- {
- TBool Uiret = ETrue;
- if (EEventKeyDown == aEventCode )
- {
- Uiret = FepUI()->HandleKeyL(EKeyRightFunc, EShortKeyPress);
- }
-
- if (Uiret)
- {
- ret = EKeyWasConsumed;
- }
- else
- {
- ret = iFnKeyManager->HandleFnKeyEventL( aKeyEvent, aEventCode,
- iInputCapabilities ) ;
- }
- }
- else
- {
-
- ret = iFnKeyManager->HandleFnKeyEventL( aKeyEvent, aEventCode,
- iInputCapabilities ) ;
- }
- if(IsHybridAplhaEditor() && !iHybridAplphaChangedToAlphanumeric)
- {
- if(FnKeyState() != CAknFepFnKeyManager::EFnKeyLock)
- iHybridAplphaChangedToAlphanumeric = ETrue;
- }
-
- return ret;
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
-
-// -----------------------------------------------------------------------------
-// CAknFepManager::HasJapanesePredictionInputMode
-// Has Japanese prediction input mode in PtiEngine
-// -----------------------------------------------------------------------------
-//
-TBool CAknFepManager::HasJapanesePredictionInputMode() const
- {
- // Is it supported Japanese predictive input
- TBool ret = EFalse;
- MPtiLanguage* ptilang = iPtiEngine->GetLanguage(ELangJapanese);
- if ( ptilang
- && ( (!iQwertyInputMode && ptilang->HasInputMode(EPtiEngineHiraganaKanjiPredictive))
- ||(iQwertyInputMode && ptilang->HasInputMode(EPtiEngineHiraganaKanjiPredictiveQwerty)) ) )
- {
- ret = ETrue;
- }
- return ret;
- }
-#ifdef RD_HINDI_PHONETIC_INPUT
-void CAknFepManager::HandleIndicCaseL()
- {
- iHashKeyMan->HandleSetIndicStateL();
- }
-#endif
-
-// -----------------------------------------------------------------------------
-// CAknFepManager::IsCursorAtEndOfWord
-//
-// -----------------------------------------------------------------------------
-//
-TBool CAknFepManager::IsCursorAtEndOfWord()
- {
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText);
- TInt origPos = iUncommittedText.iCursorPos;
-
- FindEndOfWord(iUncommittedText.iCursorPos);
-
- if (origPos != iUncommittedText.iCursorPos)
- {
- return EFalse;
- }
-
- return ETrue;
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-TInt CAknFepManager::GetCurrentCase()
- {
- TCase returnCase;
-
- switch( iCaseMan->CurrentCase() )
- {
- case EAknEditorUpperCase:
- case EAknEditorTextCase:
- {
- returnCase = EUpperCase;
- }
- break;
-
- case EAknEditorLowerCase:
- {
- returnCase = ELowerCase;
- }
- break;
-
- default:
- returnCase = ELowerCase;
- break;
- }
- return returnCase;
- }
-// Predictive QWERTY changes (XT9) ---->
-
-void CAknFepManager::GetCandidatesL( CDesCArray& aArray, TInt& aActiveIdx )
- {
- iPtiEngine->GetCandidateListL(aArray);
- iPtiEngine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates, &aActiveIdx );
- }
-
-void CAknFepManager::GetUpdateCandidatePositionL(TRect& aRect)
- {
- if(iCandidatePopup && iFepFullyConstructed && iPtiEngine)
- {
- //Now we read the position of the inline text
- TPoint inlineEditorTl;
- TPoint inlineEditorBr;
- TInt height;
- TInt ascent;
- TInt documentOffset = iPtiEngine->CurrentWord().Length();
- // Popup Position for RTL
- if(iLanguageCapabilities.iRightToLeftLanguage)
- documentOffset = 0;
- // Popup Position for RTL
- GetScreenCoordinatesL(inlineEditorTl, height, ascent, documentOffset);
- inlineEditorTl.iY -= height;
- GetScreenCoordinatesL(inlineEditorBr, height, ascent);
- aRect.iTl = inlineEditorTl;
- aRect.iBr = inlineEditorBr;
- }
- }
-
-TBool CAknFepManager::IsRightToLeftLanguage()
- {
- return iLanguageCapabilities.iRightToLeftLanguage ;
- }
-
-/**
-* Setter for the advanced predictive typing correction.
-* @param aLevel The level to be set.
-*/
-void CAknFepManager::SetTypingCorrectionLevel(TInt aLevel)
- {
- iTypingCorrectionLevel = aLevel;
-
- if(iFepFullyConstructed)
- {
- TPtiErrorCorrectionLevel correctionLevel = (TPtiErrorCorrectionLevel)aLevel;
- TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandSetCorrectionLevel, &correctionLevel ));
- }
- }
-
-/**
-* Resetter for the advanced predictive Number Candidate setting.
-* @param aValue The value to be set.
-*/
-void CAknFepManager::SetNumberCandidateState(TInt aValue)
- {
- if(aValue == 0)
- iIsNumberCandidateShown = EFalse;
- else if(aValue == 1)
- iIsNumberCandidateShown = ETrue;
-
- if(iFepFullyConstructed)
- {
- TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandSetNumberCandidateStatus,
- &iIsNumberCandidateShown ));
- }
- }
-
-void CAknFepManager::RemoveSuggestedAdvanceCompletionL()
- {
- if( IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) &&
- iPtiEngine->CurrentWord().Length() )
- {
- TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandUserActionShorten ));
- TPtrC currentText = iPtiEngine->CurrentWord();
- UpdateInlineEditL( currentText, currentText.Length() );
- }
- }
-/**
-* Setes the current state from GS to the local state
-*/
-
-void CAknFepManager::SetAutoCompletionState(TInt aValue)
- {
- if(aValue == 0)
- {
- iIsAutoCompleteOn = EFalse;
- }
- else if(aValue == 1)
- {
- iIsAutoCompleteOn = ETrue;
- }
-
- if(iFepFullyConstructed)
- {
- if(iIsAutoCompleteOn)
- {
- TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandEnableAutoCompletion ));
- }
- else
- {
- TInt tailLength = 0;
- TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength ));
- if(tailLength > 0)
- {
- // send an update to engine to signify change in autocompletion from on to off while tail exists
- // This will set EPtiXt9FlagAutoCompletionSetOnToOff flag as true in engine
- TInt value = 1;
- TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandAutoCompletionOnToOff,&value));
- }
-
-
- TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandDisableAutoCompletion ));
- }
- }
- }
-
-/**
-* Sets the primary candidate from GS to the local state
-*/
-
-void CAknFepManager::SetPrimaryCandidate(TInt aValue)
- {
- if(aValue == 0)
- iPrimaryCandidate = ETrue;
- else if(aValue == 1)
- iPrimaryCandidate = EFalse;
- if(iFepFullyConstructed)
- {
- TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandSetProactiveCorrection,
- &iPrimaryCandidate ));
- }
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
-
-CAknFepPluginManager* CAknFepManager::PluginUIManager()
- {
-#ifdef RD_SCALABLE_UI_V2
-
- return iFepPluginManager;
-#else
- return NULL;
-#endif //RD_SCALABLE_UI_V2
- }
-
-// add for phrase creation
-MZhuyinKeyHandler* CAknFepManager::ZhuyinKeyHandler()
- {
- return iZhuyinKeyHandler;
- }
-// add for phrase creation
-CAknFepZhuyinAnalyser* CAknFepManager::ZhuyinAnalyser()
- {
- return iZhuyinAnalyser;
- }
-
-#ifdef RD_SCALABLE_UI_V2
-void CAknFepManager::UpdateTouchCaseMode()
- {
- if (iFepFullyConstructed &&
- iFepPluginManager
- // case should be updated even if current input mode is none because iPreviousCoseMode
- // still need to be updated.
- /*&&
- iFepPluginManager->PluginInputMode() != EPluginInputModeNone*/)
- {
- iFepPluginManager->UpdateCaseMode();
- }
- }
-#endif// RD_SCALABLE_UI_V2
-
-void CAknFepManager::SetStopProcessFocus(TBool aStop, TBool aClose)
- {
- iClosePeninputUi = aClose;
- iStopProcessFocus = aStop;
- if (!aStop)
- {
- HandleChangeInFocus();
- }
- }
-
-TBool CAknFepManager::StopProcessFocus()
- {
- return iStopProcessFocus;
- }
-
-TBool CAknFepManager::CloseUiOnFocusChange()
- {
- return iClosePeninputUi;
- }
-void CAknFepManager::HandleCopyCutStateL()
-{
- if (IsCcpuFlagSet(ECcpuStateCopy | ECcpuStateCut))
- {
- TCursorSelection selection;
- iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(selection);
- TBool update;
- if (selection.Length() > 0)
- {
- if (!IsCcpuFlagSet(ECcpuStateButton))
- {
- __ASSERT_DEBUG(iUiInterface->SoftkeysExist(),
- AknFepPanic(EAknFepPanicNoHandleToFepAwareTextEditor));
- if (IsCcpuFlagSet(ECcpuStateCopy))
- {
- update = UpdateCBALabelL(ELeftSoftkeyIndex, EEikCmdEditCopy, R_AKNFEP_SOFTKEY_COPY);
- update |= UpdateCBALabelL( EMiddleSoftkeyIndex, EEikCmdEditCopy, R_AVKON_SOFTKEY_SELECT_TEXT );
- }
- else
- {
- update = UpdateCBALabelL(ELeftSoftkeyIndex, EEikCmdEditCut, R_AKNFEP_SOFTKEY_CUT);
- update |= UpdateCBALabelL( EMiddleSoftkeyIndex, EEikCmdEditCut, R_AVKON_SOFTKEY_SELECT_TEXT );
- }
- if (update)
- {
- iUiInterface->DrawSoftkeysNow();
- }
- SetCcpuFlag(ECcpuStateButton);
- }
- }
- else if (IsCcpuFlagSet(ECcpuStateButton))
- {
- ClearCcpuFlag(ECcpuStateButton);
- update = EFalse;
- update = UpdateCBALabelL(ELeftSoftkeyIndex, KNullCommandId, R_TEXT_SOFTKEY_EMPTY);
- update |= UpdateCBALabelL( EMiddleSoftkeyIndex, KNullCommandId, R_TEXT_SOFTKEY_EMPTY );
- if (update)
- {
- iUiInterface->DrawSoftkeysNow();
- }
- }
- }
-}
-#ifdef RD_SCALABLE_UI_V2
-TInt GetForegroundTaskAppWgId()
- {
- TApaTaskList tList(CCoeEnv::Static()->WsSession());
-
- TApaTask task = tList.FindByPos(0);
- return task.WgId();
- }
-
-void CAknFepManager::DimInputmodeTouchMenuItems(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- DimEditMenuModeItems(aMenuPane);
-
- if ( IsChineseInputLanguage() )
- {
- DoChineseTouchMenu(aMenuPane);
- }
- else if ( iLanguageCapabilities.iInputLanguageCode == ELangJapanese)
- {
- DoJapaneseMenu(aMenuPane);
- }
- else
- {
- DoWesternTouchMenu(aMenuPane);
- }
- }
-#endif
-
-void CAknFepManager::DimInputmodeMenuItems(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- DimEditMenuModeItems(aMenuPane);
-
- if ( IsChineseInputLanguage() )
- {
- DoChineseMenu(aMenuPane);
- }
- else if ( iLanguageCapabilities.iInputLanguageCode == ELangJapanese)
- {
- DoJapaneseMenu(aMenuPane);
- }
- else
- {
- DoWesternMenu(aMenuPane);
- }
- }
-
-void CAknFepManager::HandleCopyCutEventL(TInt aCommandId)
- {
- if (iCcpuMode != ECcpuStateNone)
- {
- ResetCcpuFlags();
- iUiInterface->DeleteSoftkeys();
-
- SetCcpuFlag(ECcpuStatePosted);
-
-#ifdef RD_SCALABLE_UI_V2
- if (aCommandId == EEikCmdEditCopy)
- {
- // Send copy event to AknCcpuSupport.
- CCoeEnv::Static()->SimulateKeyEventL(KAknCcpuCopyEvent, EEventKey);
- }
- else
- {
- // Send cut event to AknCcpuSupport.
- CCoeEnv::Static()->SimulateKeyEventL(KAknCcpuCutEvent, EEventKey);
- }
-#else
-/*As part of build warnings commenting this perticular code it might require when touch is enabled.
- if (aCommandId == EEikCmdEditCopy)
- {
- // Send copy-event to editor.
- CCoeEnv::Static()->SimulateKeyEventL(KEditorCopyEvent, EEventKey);
- }
- else
- {
- // send cut-event to editor.
- CCoeEnv::Static()->SimulateKeyEventL(KEditorCutEvent, EEventKey);
- }
- */
-#endif // RD_SCALABLE_UI_V2
-
- if (iInputCapabilities.FepAwareTextEditor())
- {
- // update indicators only if this is editable component.
- iIndicator->SetCopyMode(EFalse);
- UpdateIndicators();
- }
-#ifdef RD_SCALABLE_UI_V2
- HandleChangeInFocus();
-#endif
-
- }
-
- }
-
-TInt CAknFepManager::FepShowVkbPreviewStatus()
- {
- return iSharedDataInterface->FepShowVkbPreviewStatus();
- }
-
-void CAknFepManager::InitPreviewMenuPane(CAknFepUiInterfaceMenuPane* aMenuPane)
- {
- if (FepShowVkbPreviewStatus() > 0)
- {
- aMenuPane->GetMenuPane()->SetItemButtonState(EPenInputCmdPreviewOn,
- EEikMenuItemSymbolOn );
- }
- else
- {
- aMenuPane->GetMenuPane()->SetItemButtonState(EPenInputCmdPreviewOff,
- EEikMenuItemSymbolOn );
- }
- }
-
-void CAknFepManager::SynCCPSoftKey()
- {
- TRAP_IGNORE(HandleCopyCutStateL());
- }
-
-TInt CAknFepManager::PluginInputMode() const
-{
-#ifdef RD_SCALABLE_UI_V2
- return iFepPluginManager ? iFepPluginManager->PluginInputMode() : EPluginInputModeNone;
-#else
- return EPluginInputModeNone;
-#endif
-}
-
-void CAknFepManager::HandleEndKeyL()
- {
-#ifdef RD_SCALABLE_UI_V2
-
- if (iFepPluginManager)
- {
- return;
- }
-
- RWsSession &ws = CCoeEnv::Static()->WsSession();
- //TInt wgId =ws.GetFocusWindowGroup();
- CApaWindowGroupName* wg = CApaWindowGroupName::NewLC(ws,
- CCoeEnv::Static()->WsSession().GetFocusWindowGroup());
-
- TUid id = wg->AppUid();
- CleanupStack::PopAndDestroy(wg);
-
- if (0x10207218 == id.iUid ||
- 0x10281EF2 == id.iUid)
- {
- RPeninputServer iPenInputServer;
-
- TInt err = iPenInputServer.Connect();
- if(err == KErrNone)
- {
- iPenInputServer.SetForeground(ETrue);
- iPenInputServer.ActivateLayout( EFalse );
- iPenInputServer.HandleCommand(ECmdPenInputWindowClose);
-
- iPenInputServer.ClearServerEvent();
- iPenInputServer.LoseForeground();
- iPenInputServer.Close();
- }
- }
-#endif //RD_SCALABLE_UI_V2
- }
-void CAknFepManager::NeedDisableKeySound(const TKeyEvent& aKeyEvent, TEventCode aEventCode)
- {
-#ifdef RD_SCALABLE_UI_V2
- TInt keyCode = aKeyEvent.iScanCode;
- TBool interestKey = EFalse;
- if ( keyCode == EPtiKey0 ||
- keyCode == EPtiKey1 ||
- keyCode == EPtiKey2 ||
- keyCode == EPtiKey3 ||
- keyCode == EPtiKey4 ||
- keyCode == EPtiKey5 ||
- keyCode == EPtiKey6 ||
- keyCode == EPtiKey7 ||
- keyCode == EPtiKey8 ||
- keyCode == EPtiKey9 ||
- keyCode == EStdKeyDownArrow ||
- keyCode == EStdKeyRightArrow ||
- keyCode == EStdKeyLeftArrow ||
- keyCode == EStdKeyUpArrow ||
- keyCode == EStdKeyBackspace
- )
- {
- interestKey = ETrue;
- }
- if( interestKey && iFepPluginManager &&
- iFepPluginManager->PluginInputMode() == EPluginInputModeItut)
- {
- if( aEventCode == EEventKeyDown )
- {
- static_cast<CAknAppUi*>(CEikonEnv::Static()->EikAppUi())->
- DisableNextKeySound( keyCode );
- }
- else if( aEventCode == EEventKey )
- {
- #ifdef RD_TACTILE_FEEDBACK
- MTouchFeedback::Instance()->
- InstantFeedback(ETouchFeedbackSensitive);
- #endif
- }
- }
-#endif
- }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-void CAknFepManager::SetComposChrFlag( TBool aFlag )
- {
- iComposChrFlag = aFlag;
- }
-TBool CAknFepManager::GetComposChrFlag( )
- {
- return iComposChrFlag;
- }
-#endif
-
-// add for phrase creation User db view
-void CAknFepManager::AddUserDBDlgItemL( CAknFepUiInterfaceMenuPane* aMenuPane, TInt aIndex )
- {
- CAknFepUiInterfaceMenuPane::SItemData mData;
-
- TBuf<KMaxFileName> langStr;
- TInt Inputlangindex;
- if (!aMenuPane->MenuItemExists(EAknCmdUserDBDlg, Inputlangindex))
- {
- StringLoader::Load(langStr, R_AKNFEP_OPTIONS_USER_DB_DLG);
-
- mData.iCommandId = EAknCmdUserDBDlg;
- mData.iCascadeId = 0;
- mData.iFlags = 0;
- mData.iText.Copy(langStr.Mid(1, langStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength));
-
- aMenuPane->InsertMenuItemL(mData, aIndex);
- }
- }
-// add for phrase creation
-void CAknFepManager::LaunchUserDBDlgL( )
- {
- TInt itemIndex = 0;
-
- //Change title text
- CEikStatusPane* statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane();
- CAknTitlePane* title = static_cast< CAknTitlePane* >(
- statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle) ) );
-
- //Save the old title tet
- HBufC* Oldtitletext = title->Text()->AllocLC();
- //Load the new title text
- HBufC* titletext = StringLoader::LoadLC( R_AKNFEP_USER_DB_MANAGEMENT_TITLE );
- //Set title to the new text
- title->SetTextL( *titletext );
-
- CDesCArray* items = new( ELeave ) CDesCArrayFlat( KSelectItemSize );
- CleanupStack::PushL( items );
- CArrayFix<TInt>* selectedItems = new( ELeave ) CArrayFixFlat<TInt>( KSelectItemSize );
- CleanupStack::PushL( selectedItems );
-
- CAknToolbar* toolbar = iAvkonAppUi->CurrentFixedToolbar();
-
- if( toolbar && toolbar->IsShown() && toolbar->CountComponentControls()>0 )
- {
- toolbar->SetDimmed( ETrue );
- toolbar->DrawDeferred();
- }
-
- TUid naviPaneUid;
- naviPaneUid.iUid = EEikStatusPaneUidNavi;
-
- CEikStatusPaneBase::TPaneCapabilities subPane =
- statusPane->PaneCapabilities(naviPaneUid);
- // if we can access the navigation pane
- if (subPane.IsPresent() && subPane.IsAppOwned())
- {
- CAknNavigationControlContainer
- * naviPane =
- (CAknNavigationControlContainer *) statusPane->ControlL(naviPaneUid);
- iTapGroup = naviPane->CreateTabGroupL();
- iTapGroup->MakeVisible( EFalse );
- naviPane->PushL( *iTapGroup );
- }
-
- iUserdbdlg = CAknFepUserdbDlg::NewL( itemIndex,
- selectedItems, items, R_AKNFEP_USERDB_DLG_MENUBAR, iPtiEngine, this );
-
- iIsUserdbdlgActive = 1;
-
- iUserdbdlg->RunLD();
-
- iIsUserdbdlgActive = 0;
-
- // if we can access the navigation pane
- if (subPane.IsPresent() && subPane.IsAppOwned())
- {
-
- CAknNavigationControlContainer
- * naviPane =
- (CAknNavigationControlContainer *) statusPane->ControlL(naviPaneUid);
- naviPane->Pop();
- delete iTapGroup;
- iTapGroup = NULL;
- }
-
- //Set the title to old text
- title->SetTextL( *Oldtitletext );
-
- if( toolbar )
- {
- toolbar->SetDimmed( EFalse );
- toolbar->DrawNow();
- }
-
- CleanupStack::PopAndDestroy( selectedItems );
- CleanupStack::PopAndDestroy( items );
- CleanupStack::PopAndDestroy( titletext );
- CleanupStack::PopAndDestroy( Oldtitletext );
- iUserdbdlg = NULL;
- }
-// add for phrase creation
-TBool CAknFepManager::IsPinyinPhraseCreation() const
- {
- return iPinyinPhraseCreation;
- }
-
-void CAknFepManager::PinyinPhraseCreation( TBool aPinyinPhraseCreation )
- {
- if ( iPinyinPhraseCreation != aPinyinPhraseCreation )
- {
- iPinyinPhraseCreation = aPinyinPhraseCreation;
- }
- }
-// add for phrase creation
-TBool CAknFepManager::IsPhraseCreation() const
- {
- return iPhraseCreation;
- }
-// add for phrase creation
-void CAknFepManager::PhraseCreation( TBool aPhraseCreation )
- {
- if ( iPhraseCreation != aPhraseCreation )
- {
- iPhraseCreation = aPhraseCreation;
- }
- }
-// add for phrase creation
-TBool CAknFepManager::IsEntryPhrase() const
- {
- return iEntryPhrase;
- }
-// add for phrase creation
-void CAknFepManager::EntryPhrase( TBool aEntryPhrase )
- {
- if ( iEntryPhrase != aEntryPhrase )
- {
- iEntryPhrase = aEntryPhrase;
- }
- }
-// add for phrase creation
-void CAknFepManager::EnableKeyStar( TBool aEnable )
- {
- if ( iKeyStar != aEnable )
- {
- iKeyStar = aEnable;
- }
- }
-// add for phrase creation
-TBool CAknFepManager::IsEnableKeyStar( ) const
- {
- return iKeyStar;
- }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-
-
-#ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
-/**
-* @return ETrue If the number entry with long key press is supported on QWERTY keyboard.
-*/
-TBool CAknFepManager::LongPressNumberEntryOnQwerty() const
- {
- TBool value = EFalse;
- if ( iSharedDataInterface )
- {
- value = iSharedDataInterface->LongPressNumberEntryOnQwerty();
- }
- return value;
- }
-
-#endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
-
-
-void CAknFepManager::MultitapThroughSCTCharL(TCallBack aCallBack)
- {
-
- TInt res = GetNumericSCTResID();
-
- if(!res)
- {
- return;
- }
-
- if(!iNumericResourceTimer)
- {
- iNumericResourceTimer = CChrMultiTapTimer::NewL(aCallBack);
- }
-
- if(!iResourceString || iNumericResourceId !=res )
- {
- // either the resource string has not be created or the resource ID has changed
- if(iResourceString)
- {
- delete iResourceString;
- iResourceString = NULL;
- }
- iNumericResourceId = res;
- TResourceReader reader;
- CEikonEnv::Static()->CreateResourceReaderLC(reader,iNumericResourceId);
- reader.ReadInt32(); // skip sct id
- iResourceString = reader.ReadHBufC16L();
- CleanupStack::PopAndDestroy();
- }
- if(!iResourceString)
- {
- return;
- }
- if(iNumericResourceTimer->IsActive())
- {
- if( iChrCharIndex == iResourceString->Length() )
- {
- iChrCharIndex = 0;
- }
-
- iNumericResourceTimer->Cancel();
- iNumericResourceTimer->After(KChrKeyMultitapTimeout);
- }
- else
- {
- iChrCharIndex = 0;
- iNumericResourceTimer->After(KChrKeyMultitapTimeout);
- }
- TBuf<1> buf;
- buf.Append((*iResourceString)[iChrCharIndex]);
- NewCharacterL(buf);
- iChrCharIndex++;
- if (iResourceString->Length() == 1)
- {
- NumericResourceMultiTapTimerTimeoutL();
- }
-
- }
-TBool CAknFepManager::NumericResourceMultiTapTimerTimeoutL()
- {
- if(iNumericResourceTimer->IsActive())
- {
- iNumericResourceTimer->Cancel();
- if(IsFlagSet(CAknFepManager::EFlagInsideMultitapInlineEditingTransaction))
- {
- CommitInlineEditL();
- return ETrue;
- }
- }
- return EFalse;
- }
-
-//-------------------------------------------------------------------
-
-//
-// CChrMultiTapTimer
-//
-
-// ---------------------------------------------------------------------------
-// CChrMultiTapTimer::NewL
-//
-// ---------------------------------------------------------------------------
-//
-CChrMultiTapTimer* CChrMultiTapTimer::NewL(TCallBack aCallback)
- {
- CChrMultiTapTimer* self = new(ELeave)CChrMultiTapTimer(aCallback);
- CleanupStack::PushL(self);
- self->ConstructL();
- CleanupStack::Pop(); // self
- return self;
- }
-
-
-// ---------------------------------------------------------------------------
-// CChrMultiTapTimer::CChrMultiTapTimer
-//
-// ---------------------------------------------------------------------------
-//
-CChrMultiTapTimer::CChrMultiTapTimer(TCallBack aCallback)
-:CTimer(EPriorityStandard), iCallback(aCallback)
- {
- }
-
-// ---------------------------------------------------------------------------
-// CChrMultiTapTimer::ConstructL
-//
-// ---------------------------------------------------------------------------
-//
-void CChrMultiTapTimer::ConstructL()
- {
- CTimer::ConstructL();
- CActiveScheduler::Add(this);
- }
-
-// ---------------------------------------------------------------------------
-// CChrMultiTapTimer::After
-//
-// ---------------------------------------------------------------------------
-//
-void CChrMultiTapTimer::After(TTimeIntervalMicroSeconds32 aInterval)
- {
- if (IsActive())
- {
- Cancel();
- }
- CTimer::After(aInterval);
- }
-
-// ---------------------------------------------------------------------------
-// CChrMultiTapTimer::RunL
-//
-// ---------------------------------------------------------------------------
-//
-void CChrMultiTapTimer::RunL()
- {
- iCallback.CallBack();
- }
-
-TBool CAknFepManager::IsLanguageSupportPrediction()
- {
- TBool isLanguagugeSupportsPrediction = EFalse;
- switch(iKeyboardType)
- {
- case EPtiKeyboardHalfQwerty:
-#ifdef __HALF_QWERTY_KEYPAD
- isLanguagugeSupportsPrediction = (iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive);
-#endif
- break;
- case EPtiKeyboardQwerty4x12:
- case EPtiKeyboardQwerty4x10:
- case EPtiKeyboardQwerty3x11:
- case EPtiKeyboardCustomQwerty:
- isLanguagugeSupportsPrediction = (iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternQwertyPredictive);
- break;
- case EPtiKeyboardNone:
- case EPtiKeyboard12Key:
- isLanguagugeSupportsPrediction = (!iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternPredictive);
- break;
- default:
- isLanguagugeSupportsPrediction = (!iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternPredictive);
- break;
- }
- return isLanguagugeSupportsPrediction;
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
-
-TBool CAknFepManager::IsAllowedKeymappingForNumberMode(TChar aChar) const
- {
- TBool response = EFalse;
-
-
- switch ( iAknEditorNumericKeymap )
- {
- case EAknEditorStandardNumberModeKeymap:
- case EAknEditorFixedDiallingNumberModeKeymap:
- case EAknEditorSATNumberModeKeymap:
- case EAknEditorSATHiddenNumberModeKeymap:
- {
- response = (aChar == '#');
- }
- break;
- case EAknEditorCalculatorNumberModeKeymap:
- case EAknEditorConverterNumberModeKeymap:
- {
- TLocale tLoc;
- response = (aChar == tLoc.DecimalSeparator());
- }
- break;
- case EAknEditorToFieldNumberModeKeymap:
- {
- response = (aChar == ';');
- }
- break;
- case EAknEditorPlainNumberModeKeymap:
- case EAknEditorReservedInternalUseKeymap:
- default:
- break;
- }
-
- return response;
- }
-/**
- * Return wether ipnut mode is change by press shift+space.
- * This is for half-qwerty.
- */
-TBool CAknFepManager::IsChangeModeByShiftAndSpace()
- {
- return iShiftAndSpace;
- }
-
-/**
- * Set wether ipnut mode is change by press shift+space.
- * This is for half-qwerty.
- */
-void CAknFepManager::SetChangeModeByShiftAndSpace( TBool aFlag )
- {
- iShiftAndSpace = aFlag;
- }
-
-void CAknFepManager::HideExactWordPopUp()
- {
- iExactWordPopupContent->HidePopUp();
- }
-
-TBool CAknFepManager::IsExactWordPopUpShown()
- {
-return iExactWordPopupContent->IsPopUpVisible();
- }
-void CAknFepManager::StopDisplayingMenuBar()
- {
- if (iEditMenuBar)
- {
- iEditMenuBar->StopDisplayingMenuBar();
- iEditMenuBar = NULL;
- }
-#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__
- if (iOptionsMenuBar)
- {
- iOptionsMenuBar->StopDisplayingMenuBar();
- iOptionsMenuBar = NULL;
- }
-#endif //__ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__
- }
-
-void CAknFepManager::SetQwertyModeToInputcapbility()
- {
- if ( iSharedDataInterface->QwertyInputMode() )
- {
- SetExtendedInputCapabilities( ExtendedInputCapabilities() |
- CAknExtendedInputCapabilities::EInputEditorQwertyInputActive );
- }
- else
- {
- SetExtendedInputCapabilities( ExtendedInputCapabilities() &
- ~CAknExtendedInputCapabilities::EInputEditorQwertyInputActive );
- }
- }
-void CAknFepManager::SetExtendedInputCapabilities( TUint aCapabilities)
- {
- MObjectProvider* mop = iInputCapabilities.ObjectProvider();
-
- if ( mop && iInputCapabilities.FepAwareTextEditor() )//IsFepAwareTextEditor()
- {
- CAknExtendedInputCapabilities* extendedInputCapabilities =
- mop->MopGetObject( extendedInputCapabilities );
-
- if ( extendedInputCapabilities )
- {
- extendedInputCapabilities->SetCapabilities( aCapabilities );
- }
- }
-
- return;
- }
-
-void CAknFepManager::PrepareFepAfterDialogExitL(TUid aFepUid)
- {
- // This ensures that on 3rd party fep change we do not have access to other fep variables
- if (aFepUid != CCoeEnv::Static()->FepUid())
- {
- // In case the fep has changed, then leave
- User::Leave(KErrNone);
- }
- // Once the editor which launches a dialog is destroyed, this flag is set
- // In case we have any dialog launched we leave as the underneath editor is
- // destroyed
- if (IsExtendedFlagSet(EExtendedFlagEdwinEditorDestroyed))
- {
- if(!iFepAwareDialogParentEditor)
- {
- // For Eg: Messaging editor launches spell query which inturn launches
- // SCT. Then don't clear the flag once we dismiss SCT because we even
- // need to dismiss spell query dialog.
- ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
- }
- User::Leave(KErrNone);
- }
- if(!iFepAwareDialogParentEditor)
- {
- ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed);
- }
- }
-
-void CAknFepManager::PrepareFepForFepAwareDialogLaunch()
- {
- iFepAwareDialogParentEditor = EditorState();
- SetExtendedFlag(EExtendedFlagFepAwareDialogLaunched);
- }
-
-void CAknFepManager::PrepareFepAfterFepAwareDialogExitL(TUid aFepUid)
- {
- // This ensures that on 3rd party fep change we do not have access to other fep variables
- if (aFepUid != CCoeEnv::Static()->FepUid())
- {
- // In case the fep has changed, then leave
- User::Leave(KErrNone);
- }
- iFepAwareDialogParentEditor = NULL;
- ClearExtendedFlag(EExtendedFlagFepAwareDialogLaunched);
- }
-
-void CAknFepManager::ConvertCharToKey(TChar aChar, TUint16& aKey) const
- {
- aKey = 0;
-
- if (!iPtiEngine)
- return;
-
- CPtiCoreLanguage* lang = (CPtiCoreLanguage*)iPtiEngine->GetLanguage(iLanguageCapabilities.iInputLanguageCode);
- TPtiEngineInputMode inputMode = iPtiEngine->InputMode();
-
- if (!lang)
- return;
-
- const TBool vietnamese = (iLanguageCapabilities.iInputLanguageCode == ELangVietnamese);
-
- MPtiKeyMappings* map;
- if (inputMode == EPtiEngineQwerty || inputMode == EPtiEngineQwertyPredictive)
- {
- map = lang->GetQwertyKeymappings();
- }
- else if( inputMode == EPtiEngineHalfQwerty || inputMode == EPtiEngineHalfQwertyPredictive )
- {
- map = lang->GetHalfQwertyKeymappings();
- }
- else
- {
- map = lang->GetKeymappings();
- }
-
- if (!map)
- {
- return;
- }
-
- TUint16 ch;
- ch = (TUint16)map->KeyForCharacter(aChar);
- if (!ch && vietnamese)
- {
- // This may be Vietnamese tone mark or an accented character which isn't listed
- // in keymappings.
- ch = RemapVietnameseAccentedCharacter(aChar);
- }
-
- aKey = ch;
- }
-
-// ---------------------------------------------------------------------------
-// LOCAL METHODS
-//
-// ---------------------------------------------------------------------------
-//
-const TInt KVietKeyMarker = 0xffff;
-const TUint16 vietnameseAccents[] =
- {
- KVietKeyMarker, EPtiKey2, // For key 2, a-based
- 0x00c1, 0x00c0, 0x1ea2, 0x00c3, 0x1ea0,
- 0x00e1, 0x00e0, 0x1ea3, 0x00e3, 0x1ea1,
- 0x0102, 0x1eae, 0x1eb0, 0x1eb2, 0x1eb4, 0x1eb6,
- 0x0103, 0x1eaf, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eb7,
- 0x00c2, 0x1ea4, 0x1ea6, 0x1ea8, 0x1eaa, 0x1eac,
- 0x00e2, 0x1ea5, 0x1ea7, 0x1ea9, 0x1eab, 0x1ead,
-
- KVietKeyMarker, EPtiKey3, // For key 3, e-based
- 0x00c9, 0x00c8, 0x1eba, 0x1ebc, 0x1eb8,
- 0x00e9, 0x00e8, 0x1ebb, 0x1ebd, 0x1eb9,
- 0x00ca, 0x1ebe, 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6,
- 0x00ea, 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7,
-
- KVietKeyMarker, EPtiKey4, // For key 4, i-based
- 0x00cd, 0x00cc, 0x1ec8, 0x0128, 0x1eca,
- 0x00ed, 0x00ec, 0x1ec9, 0x0129, 0x1ecb,
-
- KVietKeyMarker, EPtiKey6, // For key 6, o-based
- 0x00d3, 0x00d2, 0x1ece, 0x00d5, 0x1ecc,
- 0x00f3, 0x00f2, 0x1ecf, 0x00f5, 0x1ecd,
- 0x00d4, 0x1ed0, 0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8,
- 0x00f4, 0x1ed1, 0x1ed3, 0x1ed5, 0x1ed7, 0x1ed9,
- 0x01a0, 0x1eda, 0x1edc, 0x1ede, 0x1ee0, 0x1ee2,
- 0x01a1, 0x1edb, 0x1edd, 0x1edf, 0x1ee1, 0x1ee3,
- 0
- };
-
-
-// ---------------------------------------------------------------------------
-// RemapVietnameseAccentedCharacter
-//
-// ---------------------------------------------------------------------------
-//
-LOCAL_C TInt RemapVietnameseAccentedCharacter(TUint16 aChr)
- {
- // Check tone marks first.
- switch (aChr)
- {
- case 0x0301:
- return EPtiKey2;
- case 0x0300:
- return EPtiKey3;
- case 0x0309:
- return EPtiKey4;
- case 0x0303:
- return EPtiKey5;
- case 0x0323:
- return EPtiKey6;
- default:
- break;
- }
-
- TInt ret = 0;
-
- for (const TUint16* ptr = vietnameseAccents; *ptr != 0; ptr++)
- {
- if (*ptr == KVietKeyMarker)
- {
- ret = ptr[1];
- ptr++;
- }
- else
- {
- if (*ptr == aChr)
- {
- break;
- }
- }
- }
-
- return ret;
- }
-
-// End of file