|
1 /* |
|
2 * Copyright (c) 2002-2008 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0"" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: |
|
15 * Provides the CAknFepManager methods. |
|
16 * |
|
17 */ |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 #ifdef SYMBIAN_ENABLE_SPLIT_HEADERS |
|
30 #include <uikon/eikdefmacros.h> |
|
31 #endif |
|
32 #include "AknFepManager.h" |
|
33 #include "AknFepManagerInterface.h" // MAknFepManagerInterface |
|
34 #include "aknfepindicator.h" |
|
35 #include "AknFepPanic.h" |
|
36 #include "AknFepKeyCatcher.h" |
|
37 #include "AknFepGlobalEnums.h" |
|
38 #include "AknFepCaseManager.h" |
|
39 #include "AknFepHashKeyManager.h" |
|
40 #include "AknFepSharedDataInterface.h" |
|
41 #include "AknFepInlineTextDecorator.h" |
|
42 #include "AknFepUiManagerBase.h" |
|
43 #include "AknFepUiManagerChinese.h" |
|
44 #include "AknFepUiManagerWestern.h" |
|
45 |
|
46 #include "AknFepPluginManager.h" |
|
47 #include "AknFepUiIndicInputManager.h" |
|
48 #include "AknFepUiIndicEnums.h" |
|
49 #include <AknFepUIStylusPopupMenu.h> |
|
50 #include "aknfepuispellinputpane.h" |
|
51 |
|
52 #include <bautils.h> |
|
53 #include <coeaui.h> //CCoeAppUi |
|
54 #include <aknedsts.h> //CAknEdwinState |
|
55 #include <uikon.hrh> //keys |
|
56 #include <aknenv.h> //CAknEnv |
|
57 #include <PtiEngine.h> //CPtiEngine |
|
58 #include <AknJapaneseReading.h> //CAknJapaneseReading |
|
59 #include <featmgr.h> //FeatureManager |
|
60 #include <e32base.h> //CPeriodic |
|
61 #include <PtiDefs.h> //keys |
|
62 #include <fepipext.h> //MCoeFepSpecificExtensions |
|
63 |
|
64 #include <aknsoundsystem.h> |
|
65 #include <avkon.rsg> |
|
66 #include <avkon.hrh> |
|
67 |
|
68 #include <tagma.h> |
|
69 #include <frmtview.h> |
|
70 #include <aknedformaccessor.h> |
|
71 |
|
72 #include <aknfep.rsg> |
|
73 #include <avkon.mbg> |
|
74 |
|
75 #include "aknconsts.h" |
|
76 #include <aknfeppeninputenums.h> |
|
77 #include <eikproc.h> // User Dictionary |
|
78 #include <eikapp.h> // User Dictionary |
|
79 |
|
80 #include <StringLoader.h> |
|
81 |
|
82 #include <centralrepository.h> |
|
83 #include <AknFepInternalCRKeys.h> |
|
84 #include <settingsinternalcrkeys.h> |
|
85 #include <AknUtils.h> |
|
86 #include <AknCustomCursorSupport.h> |
|
87 #include <PtiKeyMappings.h> |
|
88 #include <aknfeppeninputimeplugin.h> |
|
89 #include <peninputcmd.h> |
|
90 |
|
91 #include <AknSettingCache.h> |
|
92 #include <peninputgsinterface.h> |
|
93 #include <aknextendedinputcapabilities.h> |
|
94 #include <AvkonInternalCRKeys.h> |
|
95 #include <hlplch.h> |
|
96 #include <aknfepdocumentnavigation.h> |
|
97 |
|
98 #include <eikcolib.h> |
|
99 #include <akntoolbar.h> |
|
100 |
|
101 #include <eikfrlbd.h> |
|
102 #include <eikccpu.h> |
|
103 #include <aknappui.h> |
|
104 #include <apgwgnam.h> |
|
105 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
106 #include "AknFepUiWordPopupContent.h" |
|
107 #include "AknFepFnKeyManager.h" |
|
108 #include <csxhelp/cp.hlp.hrh> |
|
109 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
110 |
|
111 #ifdef RD_TACTILE_FEEDBACK |
|
112 #include <touchfeedback.h> |
|
113 #endif //RD_TACTILE_FEEDBACK |
|
114 #include "AknFepThaiSCTSelector.h" |
|
115 |
|
116 //the follow 10 filse include for phrase creation |
|
117 #include <bamdesca.h> |
|
118 #include <eikspane.h> //CEikStatusPane |
|
119 #include <akntitle.h> //CAknTitlePane |
|
120 #include <akntoolbar.h> //CAknToolBar |
|
121 #include <aknappui.h> |
|
122 #include "AknFep.hrh" |
|
123 #include "aknfepuserdbdlg.h" |
|
124 #include "aknfepzhuyinkeyhandler.h" |
|
125 #include "AknFepZhuyinAnalyser.h" |
|
126 #include "AknFepZhuyinAnalyserDb.h" |
|
127 |
|
128 #include <aknnavi.h> |
|
129 #include <aknnavide.h> |
|
130 |
|
131 #include <eikedwin.h> |
|
132 #include <aknCharMap.h> |
|
133 |
|
134 #include <AknFepInternalPSKeys.h> |
|
135 #include <e32property.h> |
|
136 #include <AknDef.h> |
|
137 |
|
138 const TInt KSelectItemSize(10); |
|
139 _LIT(KAknFepResourceFileName, "z:\\resource\\fep\\aknfep.rsc"); |
|
140 |
|
141 #define text_to_field_mode_hash_key ';' |
|
142 #define iAvkonAppUi ((CAknAppUi*)CEikonEnv::Static()->EikAppUi()) |
|
143 #define __SHIFT_KEY_LOOP |
|
144 |
|
145 // EAknEditorNativeKeysNumberModeKeymap is used for example in MFNE editors. |
|
146 #define EAknEditorNativeKeysNumberModeKeymap EAknEditorReservedInternalUseKeymap |
|
147 |
|
148 // UID of user dictionary application |
|
149 const TUid KUidUserDictApp = {0x101F8645}; |
|
150 |
|
151 const TText KAknFEPLineFeedSymbol = 0x21B2; |
|
152 const TText KAknFEPMirroredLineFeedSymbol = 0x21B3; |
|
153 const TText KAknFEPZeroKey = 0x30; |
|
154 |
|
155 // inline text decoration potentially adds 2 directional markers for every "real" character. Buffer needs to be 3 x predictive engine bufsize |
|
156 const TInt KMaxInlineEditSize( 3 * CAknFepManager::EMaximumFepWordLength ); |
|
157 |
|
158 // Maximum number of chunks to navigate throught attempting to get to the visual end of a selection. |
|
159 // Since chunks are arranged only within a line, this should be more than the number of chunks likely in |
|
160 // a single line of text |
|
161 const TInt KMaxChunkWalkIterations(20); |
|
162 |
|
163 // This command is is used for setting empty CBA. |
|
164 const TInt KNullCommandId = 0; |
|
165 |
|
166 _LIT_SECURE_ID(KPhoneSecureId, 0x100058b3); |
|
167 |
|
168 #ifdef RD_HINDI_PHONETIC_INPUT |
|
169 |
|
170 const TUint KQuestionMark = 0x003F; |
|
171 |
|
172 #endif |
|
173 |
|
174 // Ccpu key events. |
|
175 /*As part of build warnings commenting this perticular code it might require when touch is enabled. |
|
176 const TKeyEvent KEditorCopyEvent = {3, 67, 161, 0}; // Ctrl + C |
|
177 const TKeyEvent KEditorCutEvent = {24, 88, 161, 0}; // Ctrl + X |
|
178 */ |
|
179 |
|
180 const TInt KTouchInputPreviewOn = 1; |
|
181 const TInt KTouchInputPreviewOff = 0; |
|
182 |
|
183 #ifdef RD_SCALABLE_UI_V2 |
|
184 const TKeyEvent KAknCcpuCopyEvent = {EKeyF18, EEikCmdEditCopy, EModifierCtrl, 1}; // Copy event for AknCcpuSupport |
|
185 const TKeyEvent KAknCcpuCutEvent = {EKeyF18, EEikCmdEditCut, EModifierCtrl, 1}; // Cut event for AknCcpuSupport |
|
186 |
|
187 const TInt KMaxMenuSize = 28; |
|
188 const TInt KEditorMenuPermitedSend[KMaxMenuSize] = |
|
189 { |
|
190 EJapanFepCmdModeHiragana, |
|
191 EJapanFepCmdModeKatakana, |
|
192 EJapanFepCmdEditModeAlpha, |
|
193 EJapanFepCmdEditModeNumber, |
|
194 EJapanFepCmdModeFullWidth, |
|
195 EJapanFepCmdModeHalfWidth, |
|
196 EChinFepCmdModePinyin, |
|
197 EChinFepCmdModeZhuyin, |
|
198 EChinFepCmdModeStroke, |
|
199 EChinFepCmdModePinyinPhrase, |
|
200 EChinFepCmdModeZhuyinPhrase, |
|
201 EChinFepCmdModeStrokePhrase, |
|
202 EAknCmdT9PredictiveT9Off, |
|
203 EAknCmdMultitapPredictiveT9On, |
|
204 EJapanFepCmdMultitapPredictiveT9On, |
|
205 EChinFepCmdModeZhuyinFind, |
|
206 EChinFepCmdModeStrokeFind, |
|
207 EAknCmdEditModeAlpha, |
|
208 EAknCmdEditModeLatinText, |
|
209 EChinFepCmdModeLatinUpper, |
|
210 EChinFepCmdModeLatinLower, |
|
211 EAknCmdEditModeNumber, |
|
212 EChinFepCmdModeNumber, |
|
213 EAknCmdEditModeArabicIndicNumber, |
|
214 EAknCmdEditModeEasternArabicIndicNumber, |
|
215 EAknCmdEditModeIndicNumber, |
|
216 EAknCmdEditModeKorean, |
|
217 EAknCmdEditModeEnglish |
|
218 }; |
|
219 |
|
220 #endif // RD_SCALABLE_UI_V2 |
|
221 |
|
222 |
|
223 // Number modes used by Arabic or Hindi. |
|
224 enum TNonLatinNumberModes |
|
225 { |
|
226 ENbrModeLatin, |
|
227 ENbrModeArabic = 1, |
|
228 ENbrModeIndic = 1 |
|
229 }; |
|
230 |
|
231 // Number mode type |
|
232 enum TNonLatinNumberModeType |
|
233 { |
|
234 ENbrModeTypeArabic, |
|
235 ENbrModeTypeIndic, |
|
236 ENbrModeTypeEasternArabic //for Urdu & Farsi languages |
|
237 }; |
|
238 |
|
239 // The passwd timeout is same as defined on CEikSecretEditor. |
|
240 const TInt KSyncPasswdTimeout = 1000000; |
|
241 |
|
242 #ifdef RD_SCALABLE_UI_V2 |
|
243 TUid AppUidFromWndGroupId(TInt aWndGrpId); |
|
244 extern TUid GetCurAppUid(); |
|
245 extern TBool IsGlobalNotesApp(TUid& aUid); |
|
246 TInt GetForegroundTaskAppWgId(); |
|
247 #endif |
|
248 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
249 const TInt KWordToFocusInCandidateList = 1; |
|
250 #endif |
|
251 |
|
252 LOCAL_C TInt RemapVietnameseAccentedCharacter(TUint16 aChr); |
|
253 |
|
254 // |
|
255 // Class TTextDirectionalInfo |
|
256 // |
|
257 /** |
|
258 * The implementation inializes with well-defined "null" state |
|
259 */ |
|
260 CAknFepManager::TTextDirectionalInfo::TTextDirectionalInfo() : |
|
261 iDirectionalStatus(EUnknown), iBlockEnvironment(EUndefined) |
|
262 {} |
|
263 |
|
264 void CAknFepManager::TTextDirectionalInfo::SetDirectionFromChunk( |
|
265 const CTmTextLayout::TTmChunkDescription& aChunk ) |
|
266 { |
|
267 if ( aChunk.iStart >= 0 ) // Condition for valid block. Does nothing otherwise |
|
268 iDirectionalStatus = aChunk.iRightToLeft ? ERightToLeft : ELeftToRight; |
|
269 } |
|
270 |
|
271 |
|
272 void TFepLanguageTranslation::ReadFromResource(TResourceReader& aReader) |
|
273 { |
|
274 iName.Set(aReader.ReadTPtrC()); |
|
275 iLanguageId = aReader.ReadInt16(); |
|
276 iCommandId = aReader.ReadInt16(); |
|
277 } |
|
278 |
|
279 |
|
280 CAknFepManager::CAknFepManager(CCoeEnv& aConeEnvironment) |
|
281 :CCoeFep(aConeEnvironment), |
|
282 iAsyncResouceChanged(EActivePriorityDefault), |
|
283 iPreviousEditingState(EStateNone), |
|
284 iInputCapabilities(TCoeInputCapabilities::ENone), |
|
285 iModeBefore(ELatin), |
|
286 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
287 iKeyPressedDuringShift(EFalse), |
|
288 #endif |
|
289 iCharWidth(EHalfWidthChar), |
|
290 iAsyncOwnSimulateKey(EActivePriorityDefault), |
|
291 iLongThai0Key(EFalse), |
|
292 iEditCharsPtr(0,0), |
|
293 iComposChrFlag(0), |
|
294 iIsUserdbdlgActive(0), |
|
295 iLongClearAfterCloseUI(EFalse), |
|
296 // phrase creation |
|
297 iPhraseCreation(0), |
|
298 iPinyinPhraseCreation(0), |
|
299 iEntryPhrase(0) |
|
300 |
|
301 |
|
302 { |
|
303 } |
|
304 |
|
305 void CAknFepManager::ConstructL(const CCoeFepParameters& aFepParameters) |
|
306 { |
|
307 BaseConstructL(aFepParameters); |
|
308 iUiInterface = CAknFepUIInterface::NewL(); |
|
309 iIndicator = iUiInterface->NewIndicatorL(); |
|
310 iPreviousIndicator = CAknEnv::Static()->SwapEditingStateIndicator(iIndicator); |
|
311 |
|
312 // Set up resources |
|
313 TFileName resourceName(KAknFepResourceFileName); |
|
314 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
315 BaflUtils::NearestLanguageFile(coeEnv->FsSession(), resourceName); |
|
316 iResId = coeEnv->AddResourceFileL(resourceName); |
|
317 |
|
318 // Save Japanese Feature support to a member variable |
|
319 iFeatureSupportedJapanese = FeatureManager::FeatureSupported(KFeatureIdJapanese); |
|
320 |
|
321 iUiLanguage = User::Language(); |
|
322 |
|
323 // Shared Data |
|
324 iSharedDataInterface = CAknFepSharedDataInterface::NewL(this); |
|
325 |
|
326 TInt previUiLanguage = iSharedDataInterface->PluginUILanguage(); |
|
327 |
|
328 if (iUiLanguage != previUiLanguage) |
|
329 { |
|
330 |
|
331 // if UI language has changed we need to set text input language according to UI language |
|
332 iSharedDataInterface->SetPluginUILanguage(iUiLanguage); |
|
333 iSharedDataInterface->SetInputTextLanguage(0); // signals that it needs to be updated |
|
334 } |
|
335 |
|
336 if (!iSharedDataInterface->InputMode()) //not initialised yet - first time device is switched on |
|
337 { |
|
338 switch (iUiLanguage) |
|
339 { |
|
340 case ELangPrcChinese: |
|
341 iSharedDataInterface->SetInputMode(EPinyin); |
|
342 break; |
|
343 case ELangTaiwanChinese: |
|
344 iSharedDataInterface->SetInputMode(EZhuyin); |
|
345 break; |
|
346 case ELangHongKongChinese: |
|
347 iSharedDataInterface->SetInputMode(EStroke); |
|
348 iSharedDataInterface->SetCangJieMode(ECangJieNormal); |
|
349 break; |
|
350 case ELangJapanese: |
|
351 iSharedDataInterface->SetInputMode(EHiraganaKanji); |
|
352 break; |
|
353 case ELangKorean: |
|
354 iSharedDataInterface->SetInputMode(EHangul); |
|
355 break; |
|
356 case ELangHindi: |
|
357 iSharedDataInterface->SetInputMode(EHindi); |
|
358 break; |
|
359 default: |
|
360 iSharedDataInterface->SetInputMode(ELatin); |
|
361 break; |
|
362 } |
|
363 } |
|
364 |
|
365 iUiInterface->SetFepMenuObserver(this); |
|
366 |
|
367 TInt inputLanguage = iSharedDataInterface->InputTextLanguage(); |
|
368 |
|
369 // A process instantiating Fep may miss ECapabilityWriteDeviceData capability, |
|
370 // which is needed for updating locale repository. |
|
371 // A workaround is to delay change up to a process that has the capability |
|
372 TSecurityInfo info; |
|
373 info.Set(RProcess()); |
|
374 |
|
375 TBool hasCapability = info.iCaps.HasCapability(ECapabilityWriteDeviceData); |
|
376 |
|
377 if (!inputLanguage && hasCapability) |
|
378 { |
|
379 // set correct input language |
|
380 inputLanguage = SubstituteSublanguageId(iUiLanguage); |
|
381 |
|
382 // If Ptiengine is not initialize, initialize it |
|
383 if (!iPtiEngine) |
|
384 { |
|
385 iPtiEngine = CPtiEngine::NewL(ETrue); |
|
386 } |
|
387 // If still not found, default to english. |
|
388 if (!iPtiEngine->GetLanguage(inputLanguage)) |
|
389 { |
|
390 inputLanguage = ELangEnglish; |
|
391 } |
|
392 |
|
393 // Set the current input language |
|
394 iSharedDataInterface->SetInputTextLanguage(inputLanguage); |
|
395 |
|
396 // update numeric input |
|
397 if ( iUiLanguage == ELangArabic ) |
|
398 { |
|
399 SetDefaultNumberMode( ENbrModeArabic, |
|
400 ENbrModeTypeArabic ); |
|
401 } |
|
402 else if ( ( iUiLanguage == ELangUrdu ) || |
|
403 ( iUiLanguage == ELangFarsi ) ) |
|
404 { |
|
405 SetDefaultNumberMode( ENbrModeArabic, |
|
406 ENbrModeTypeEasternArabic ); |
|
407 } |
|
408 else if ( TAknFepUiIndicInputManager::IsScriptDevanagari( iUiLanguage ) ) |
|
409 { |
|
410 SetDefaultNumberMode( ENbrModeLatin, |
|
411 ENbrModeTypeIndic ); |
|
412 } |
|
413 else |
|
414 { |
|
415 SetDefaultNumberMode( ENbrModeLatin, ENbrModeTypeArabic ); |
|
416 } |
|
417 } |
|
418 |
|
419 iSctEditChars = HBufC::NewL( 10 ); |
|
420 |
|
421 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
422 // Predictive QWERTY (XT9) changes ----> |
|
423 if(CCoeEnv::Static()->AppUi()) |
|
424 iExactWordPopupContent = iUiInterface->CreateWordPopupContentL(); |
|
425 // Predictive QWERTY (XT9) changes <---- |
|
426 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
427 // If the following line is uncommented, the FEP is fully constructed |
|
428 // for all applications at application startup. |
|
429 // ConstructFullyL(); |
|
430 iShiftKeypressMonitor = CPeriodic::NewL(CActive::EPriorityStandard); |
|
431 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
432 iFnKeyManager = CAknFepFnKeyManager::NewL( *this,iSharedDataInterface ); |
|
433 #endif |
|
434 TRAPD(result,iKeyCatcher = CAknFepKeyCatcher::NewL(*this)); |
|
435 if(result == KErrNone) |
|
436 { |
|
437 iKeyCatcher->ActivateL(); |
|
438 } |
|
439 // the follow 3 objects for phrase creation |
|
440 iZhuyinKeyHandler = CZhuyinKeyHandler::NewL(); |
|
441 iZhuyinAnalyserDb = CZhuyinAnalyserDbFeed::NewL(EPinyinAnalyserTypeZhuyin); |
|
442 iZhuyinAnalyser = CAknFepZhuyinAnalyser::NewL(iZhuyinAnalyserDb); |
|
443 iAknFepThaiSCTSelector = CAknFepThaiSCTSelector::NewL(); |
|
444 iHybridAplphaChangedToAlphanumeric = EFalse; |
|
445 iLastFocusedEditor = NULL; |
|
446 iFepAwareDialogParentEditor = NULL; |
|
447 |
|
448 // Fep manager should have both read and write privilege. |
|
449 // Known case: Auto-completion cannot be changed in setting dialog. |
|
450 RProperty::Define( KPSUidAknFep, KAknFepSettingDialogState, RProperty::EInt ); |
|
451 } |
|
452 |
|
453 void CAknFepManager::ConstructFullyL() |
|
454 { |
|
455 if (!iPtiEngine) |
|
456 { |
|
457 iPtiEngine = CPtiEngine::NewL(ETrue); |
|
458 } |
|
459 |
|
460 if ( !(iPtiEngine->GetLanguage(iSharedDataInterface->InputTextLanguage())) ) |
|
461 { |
|
462 // If input language cenrep value is set to language unknown to PtiEngine, |
|
463 // try to reset based on UI-language. |
|
464 TInt inputLang = SubstituteSublanguageId(iUiLanguage); |
|
465 |
|
466 // If still not found, default to english. |
|
467 if (!iPtiEngine->GetLanguage(inputLang)) |
|
468 { |
|
469 inputLang = ELangEnglish; |
|
470 } |
|
471 iSharedDataInterface->SetInputTextLanguage(inputLang); |
|
472 } |
|
473 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
474 #ifdef FF_DUAL_LANGUAGE_SUPPORT |
|
475 if (iPtiEngine->GetLanguage(iSharedDataInterface->InputTextLanguageSecondary()) == NULL) |
|
476 { |
|
477 // If secondary input language is unknown to PtiEngine, set it to none |
|
478 iSharedDataInterface->SetInputTextLanguageSecondary(0); |
|
479 } |
|
480 #endif //FF_DUAL_LANGUAGE_SUPPORT |
|
481 #endif |
|
482 |
|
483 if(NULL == iKeyCatcher) |
|
484 { |
|
485 iKeyCatcher = CAknFepKeyCatcher::NewL(*this); |
|
486 iKeyCatcher->ActivateL(); |
|
487 } |
|
488 |
|
489 iConcatenationTimer=CPeriodic::NewL(CActive::EPriorityStandard); |
|
490 iPostEventCheck=CIdle::NewL(CActive::EPriorityStandard); |
|
491 iChrKeypressMonitor = CPeriodic::NewL(CActive::EPriorityStandard); |
|
492 |
|
493 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
494 TInt inputLanguage = iSharedDataInterface->InputTextLanguage(); |
|
495 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
496 #ifdef FF_DUAL_LANGUAGE_SUPPORT |
|
497 TInt inputLanguageSecondary = iSharedDataInterface->InputTextLanguageSecondary(); |
|
498 #endif //FF_DUAL_LANGUAGE_SUPPORT |
|
499 #endif |
|
500 SetWesternPredictive(iSharedDataInterface->PredictiveTextOn()); |
|
501 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
502 iIsAutoCompleteOn = iSharedDataInterface->PredictiveTextAutoCompleteOn(); // AutoCompletion disabled by Default |
|
503 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
504 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
505 iIsAutoCompleteOn = iSharedDataInterface->PredictiveTextAutoCompleteOn(); // AutoCompletion disabled by Default |
|
506 iTypingCorrectionLevel = iSharedDataInterface->PredictiveTextTypingCorrectionLevel(); |
|
507 iIsNumberCandidateShown = iSharedDataInterface->PredictiveTextNumberCandidateShown(); |
|
508 TInt primaryCandidateValue = iSharedDataInterface->PredictiveTextPrimaryCandidate(); |
|
509 if( primaryCandidateValue == 0) |
|
510 iPrimaryCandidate = ETrue; |
|
511 else if(primaryCandidateValue == 1) |
|
512 iPrimaryCandidate = EFalse; |
|
513 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
514 iJapanesePredictive = iSharedDataInterface->PredictiveTextJapaneseOn(); |
|
515 iQwertyInputMode = iSharedDataInterface->QwertyInputMode(); |
|
516 iMultiTapTimer = iSharedDataInterface->MultiTapTimer(); |
|
517 iJapaneseQwertyFlags = iSharedDataInterface->JapaneseQwertyFlags(); |
|
518 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
519 if(!iFnKeyManager) |
|
520 { |
|
521 iFnKeyManager = CAknFepFnKeyManager::NewL( *this,iSharedDataInterface ); |
|
522 } |
|
523 #endif |
|
524 iCaseMan = CAknFepCaseManager::NewL(*this); |
|
525 iLangMan = CAknFepLanguageManager::NewL( this, iCaseMan, iSharedDataInterface ); |
|
526 iPtiEngine->ActivateLanguageL(inputLanguage); |
|
527 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
528 #ifdef FF_DUAL_LANGUAGE_SUPPORT |
|
529 iPtiEngine->SetSecondaryInputL(inputLanguageSecondary); |
|
530 #endif //FF_DUAL_LANGUAGE_SUPPORT |
|
531 #endif |
|
532 iLangMan->SetInputLanguageL(inputLanguage); |
|
533 SetInputLanguageCapabilities(inputLanguage); |
|
534 iCurrentFepUI = iLangMan->GetFepUI(ELatin, iCharWidth, IsPredictive(ELatin)); |
|
535 |
|
536 iLastKeyPressedWasHashKey = EFalse; |
|
537 iDeviceSupportsRtlLanguage = DeviceSupportsRTLLanguageL(); |
|
538 |
|
539 TResourceReader reader; |
|
540 // get character from resource to represent an 'enter' character |
|
541 coeEnv->CreateResourceReaderLC(reader, R_AVKON_SCT_SPACE_SYMBOL); |
|
542 iSpaceCharacterCode = reader.ReadUint16(); |
|
543 coeEnv->CreateResourceReaderLC(reader, R_AVKON_SCT_FULLWIDTHSPACE_SYMBOL); |
|
544 iFullWidthSpaceCharacterCode = reader.ReadUint16(); |
|
545 CleanupStack::PopAndDestroy(2); //reader |
|
546 |
|
547 //initialise states |
|
548 iMode = EAknEditorNullInputMode; //Force a sync of mode... |
|
549 SyncStates(EAknFepStateNull); |
|
550 ResetFlags(); |
|
551 ResetExtendedFlags(); |
|
552 |
|
553 ReadHashKeyLoopL(); |
|
554 iHashKeyMan = CAknFepHashKeyManager::NewL(*this, iCaseMan); |
|
555 SetHashKeyStyle(); |
|
556 iInlineTextDecorator = new (ELeave) CAknFepInlineTextDecorator; |
|
557 if (IsFeatureSupportedJapanese()) |
|
558 { |
|
559 CAknJapaneseReading::CreateL(iPtiEngine); |
|
560 } |
|
561 // setting call back |
|
562 TCallBack callback(DoSimulateKey, this); |
|
563 iAsyncOwnSimulateKey.Set(callback); |
|
564 |
|
565 TCallBack resourcechangedcallback(HandleResourceChangedCallback,this); |
|
566 iAsyncResouceChanged.Set(resourcechangedcallback); |
|
567 #ifdef RD_SCALABLE_UI_V2 |
|
568 iFepPluginManager = CAknFepPluginManager::NewL |
|
569 ( *this, *iSharedDataInterface, *iLangMan, *iCaseMan); |
|
570 iNotifyPlugin = ETrue; |
|
571 #endif //RD_SCALABLE_UI_V2 |
|
572 |
|
573 iFepFullyConstructed = ETrue; |
|
574 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
575 iIsFnKeyMapped = IsFnKeyMappedL(); |
|
576 iKeyboardType = (TPtiKeyboardType)iSharedDataInterface->KeyboardLayout(); |
|
577 #endif |
|
578 |
|
579 iFnKeypressMonitor = CPeriodic::NewL(CActive::EPriorityStandard); |
|
580 } |
|
581 |
|
582 CAknFepManager::~CAknFepManager() |
|
583 { |
|
584 #ifdef RD_PF_SEC_APPARC |
|
585 delete iNullService; |
|
586 #else |
|
587 //Embedding - removing created document |
|
588 if ( iEmbedded ) |
|
589 { |
|
590 CEikonEnv::Static()->Process()->DestroyDocument(iEmbedded); // User dictionary |
|
591 iEmbedded = NULL; |
|
592 } |
|
593 #endif |
|
594 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
595 { |
|
596 SetFlag(CAknFepManager::EFlagSupressAutoUpdate); |
|
597 TRAPD(err, CommitInlineEditL()) |
|
598 if (err) |
|
599 { |
|
600 CleanUpFep(); |
|
601 } |
|
602 } |
|
603 |
|
604 if ( EditorState() ) |
|
605 { |
|
606 EditorState()->SetObserver(NULL); |
|
607 } |
|
608 if (iLastFocusedEditor) |
|
609 { |
|
610 iLastFocusedEditor->SetObserver(NULL); |
|
611 iLastFocusedEditor = NULL; |
|
612 } |
|
613 if (iFepAwareDialogParentEditor) |
|
614 { |
|
615 iFepAwareDialogParentEditor->SetObserver(NULL); |
|
616 iFepAwareDialogParentEditor = NULL; |
|
617 } |
|
618 |
|
619 delete iSharedDataInterface; |
|
620 MAknEditingStateIndicator* indicator = CAknEnv::Static()->EditingStateIndicator(); |
|
621 if (indicator == iIndicator) |
|
622 { |
|
623 CAknEnv::Static()->SwapEditingStateIndicator(NULL); |
|
624 } |
|
625 |
|
626 |
|
627 delete iIndicator; |
|
628 iIndicator = NULL; |
|
629 CCoeEnv::Static()->DeleteResourceFile(iResId); |
|
630 |
|
631 // Everything that is constructed in ConstructFullyL() method |
|
632 // needs to be deleted in CommonDestroyFep() method. |
|
633 CommonDestroyFep(); |
|
634 |
|
635 if (iUiInterface) |
|
636 iUiInterface->SetFepMenuObserver(NULL); |
|
637 |
|
638 delete iPtiEngine; |
|
639 delete iSctEditChars; |
|
640 |
|
641 #ifdef RD_SCALABLE_UI_V2 |
|
642 if ( FepAwareTextEditor() ) |
|
643 { |
|
644 UnregisterObserver(); |
|
645 } |
|
646 delete iFepPluginManager; |
|
647 delete iStylusCcpuMenu; |
|
648 |
|
649 delete iSpellInitText; |
|
650 #endif // RD_SCALABLE_UI_V2 |
|
651 delete iUiInterface; |
|
652 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
653 // Predictive QWERTY (XT9) changes ----> |
|
654 delete iExactWordPopupContent; |
|
655 iExactWordPopupContent = 0; |
|
656 delete iCandidatePopup; |
|
657 iCandidatePopup = 0; |
|
658 delete iResourceString; |
|
659 iResourceString = 0; |
|
660 // Predictive QWERTY (XT9) changes <---- |
|
661 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
662 // the follow objects for phrase creation |
|
663 delete iZhuyinKeyHandler; |
|
664 delete iZhuyinAnalyser; |
|
665 delete iAknFepThaiSCTSelector; |
|
666 } |
|
667 |
|
668 void CAknFepManager::CommonDestroyFep() |
|
669 { |
|
670 iFepFullyConstructed = EFalse; |
|
671 |
|
672 // This method is called both from destructor and CleanUpFep methods. |
|
673 iAsyncOwnSimulateKey.Cancel(); |
|
674 iAsyncResouceChanged.Cancel(); |
|
675 delete iShiftKeypressMonitor; |
|
676 iShiftKeypressMonitor = NULL; |
|
677 delete iConcatenationTimer; |
|
678 iConcatenationTimer = NULL; |
|
679 delete iChrKeypressMonitor; |
|
680 iChrKeypressMonitor = NULL; |
|
681 delete iLangMan; |
|
682 iLangMan = NULL; |
|
683 iCurrentFepUI = NULL; |
|
684 delete iKeyCatcher; |
|
685 iKeyCatcher = NULL; |
|
686 |
|
687 delete iPostEventCheck; |
|
688 iPostEventCheck = NULL; |
|
689 delete iHashKeyMan; |
|
690 iHashKeyMan = NULL; |
|
691 delete iCaseMan; |
|
692 iCaseMan = NULL; |
|
693 delete iInlineTextDecorator; |
|
694 iInlineTextDecorator = NULL; |
|
695 iHashKeyLoop.Close(); |
|
696 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
697 if(iFnKeyManager) |
|
698 { |
|
699 delete iFnKeyManager; |
|
700 iFnKeyManager = NULL; |
|
701 } |
|
702 if( iNumericResourceTimer ) |
|
703 { |
|
704 delete iNumericResourceTimer; |
|
705 iNumericResourceTimer = NULL; |
|
706 } |
|
707 #endif |
|
708 delete iFnKeypressMonitor; |
|
709 iFnKeypressMonitor = NULL; |
|
710 } |
|
711 |
|
712 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
713 void CAknFepManager::SetKeyboardLayout(TPtiKeyboardType aType) |
|
714 { |
|
715 |
|
716 if(iQwertyInputMode && iFnKeyManager |
|
717 && (iFnKeyManager->FnKeyState()== CAknFepFnKeyManager::EFnKeyLock |
|
718 ||iFnKeyManager->FnKeyState()== CAknFepFnKeyManager::EFnKeyNext)) |
|
719 { |
|
720 iMode = ENumber; |
|
721 } |
|
722 |
|
723 if(iFnKeyManager) |
|
724 { |
|
725 iFnKeyManager->ClearFnKeyState(); |
|
726 } |
|
727 |
|
728 if(iPtiEngine) |
|
729 { |
|
730 iPtiEngine->SetKeyboardType(aType); |
|
731 } |
|
732 iKeyboardType = aType; |
|
733 } |
|
734 |
|
735 TPtiKeyboardType CAknFepManager::KeyboardLayout() const |
|
736 { |
|
737 return iKeyboardType; |
|
738 } |
|
739 #endif |
|
740 TBool CAknFepManager::TryCloseUiL() |
|
741 { |
|
742 #ifdef RD_HINDI_PHONETIC_INPUT |
|
743 if ((iSharedDataInterface->InputTextLanguage() == KLangHindiPhonetic) && |
|
744 IsFlagSet(CAknFepManager::EFlagNoMatches)) |
|
745 { |
|
746 ClearFlag(CAknFepManager::EFlagNoMatches); |
|
747 if (PreviousChar() == KQuestionMark) |
|
748 RemovePreviousCharacterL(); |
|
749 } |
|
750 #endif |
|
751 if (iFepManState == EAknFepStateUIActive) |
|
752 { |
|
753 // In Japanese input, |
|
754 // commit inline editing at only the western predictive mode. |
|
755 if (!IsFeatureSupportedJapanese() || WesternPredictive()) |
|
756 { |
|
757 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
758 { |
|
759 TryRemoveNoMatchesIndicatorL(); |
|
760 UpdateCbaL(NULL); |
|
761 } |
|
762 |
|
763 |
|
764 |
|
765 //#ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ |
|
766 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
767 if ( iFepPluginManager && |
|
768 (iFepPluginManager->PluginInputMode() == EPluginInputModeNone)) |
|
769 { |
|
770 RemoveSuggestedAdvanceCompletionL(); |
|
771 } |
|
772 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
773 //#endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ |
|
774 |
|
775 #ifdef RD_SCALABLE_UI_V2 |
|
776 |
|
777 if ( iFepPluginManager != NULL && |
|
778 iFepPluginManager->BeforeSpell() ) |
|
779 { |
|
780 iFepPluginManager->SetBeforeSpell(EFalse); |
|
781 } |
|
782 else |
|
783 #endif |
|
784 |
|
785 { |
|
786 CommitInlineEditL(); |
|
787 } |
|
788 } |
|
789 if (IsCcpuFlagSet(ECcpuStataCommitPredictiveWord)) |
|
790 { |
|
791 // Word commiting must be done after CommitInlineEditL call (because |
|
792 // of Japanese ReadingTextL funtionality), hence the delayed commit here. |
|
793 iPtiEngine->CommitCurrentWord(); |
|
794 ClearCcpuFlag(ECcpuStataCommitPredictiveWord); |
|
795 } |
|
796 InternalFepUI()->CloseUI(); |
|
797 SyncStates(EAknFepStateInitial); |
|
798 if (iMode == EPinyin || iMode == EZhuyin || iMode == EStroke || iMode == ECangJie) |
|
799 { |
|
800 SetCursorType(EActive); |
|
801 if ( EditorState() ) |
|
802 { |
|
803 EditorState()->SetFlags( EditorState()->Flags() & ~EAknEditorFlagChinesePopup ); |
|
804 } |
|
805 } |
|
806 |
|
807 // EFalse in case of latin input in Japanese variant |
|
808 if (IsFeatureSupportedJapanese() |
|
809 && iMode == ELatin && !WesternPredictive()) |
|
810 { |
|
811 return EFalse; |
|
812 } |
|
813 |
|
814 return ETrue; |
|
815 } |
|
816 else |
|
817 { |
|
818 if (IsKoreanInputLanguage()) |
|
819 { |
|
820 if (IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) |
|
821 { |
|
822 CommitInlineEditL(); |
|
823 PtiEngine()->ClearCurrentWord(); |
|
824 } |
|
825 } |
|
826 |
|
827 //in initial state characters should either: |
|
828 //1. not be consumed by the FEP. |
|
829 //2. be committed immediately by the Input State. |
|
830 //3. be multitap chars, in which case they may need to be committed |
|
831 // here. It is best to let the engine deal with this. |
|
832 if ( IsFlagSet( EFlagInsideInlineEditingTransaction ) ) |
|
833 { |
|
834 InternalFepUI()->ExpireMultitapTimer(); |
|
835 } |
|
836 return EFalse; |
|
837 } |
|
838 } |
|
839 |
|
840 void CAknFepManager::SendUIActivatedNotification() |
|
841 { |
|
842 SyncStates(EAknFepStateUIActive); |
|
843 } |
|
844 |
|
845 void CAknFepManager::SendUIDeActivatedNotification() |
|
846 { |
|
847 SyncStates(EAknFepStateInitial); |
|
848 } |
|
849 |
|
850 void CAknFepManager::PlaySound(TAvkonSystemSID aSound) const |
|
851 { |
|
852 if (SoundSystem()) |
|
853 { |
|
854 SoundSystem()->PlaySound(aSound); |
|
855 } |
|
856 } |
|
857 |
|
858 void CAknFepManager::SetLongClearAfterCloseUI(TBool aLongClear) |
|
859 { |
|
860 iLongClearAfterCloseUI = aLongClear; |
|
861 } |
|
862 |
|
863 TKeyResponse CAknFepManager::HandleKeyEventL(TUint aCode, TKeyPressLength aLength,TEventCode aEventCode) |
|
864 { |
|
865 TKeyResponse response = EKeyWasNotConsumed; |
|
866 |
|
867 TInt documentLength = -1; |
|
868 if (iInputCapabilities.FepAwareTextEditor()) |
|
869 { |
|
870 documentLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
871 } |
|
872 |
|
873 if (iFepFullyConstructed && iConcatenationTimer->IsActive()) |
|
874 { |
|
875 if (!( aCode == EKeyRightArrow || |
|
876 aCode == EKeyLeftArrow || |
|
877 aCode == EKeyUpArrow || |
|
878 aCode == EKeyDownArrow )) |
|
879 { |
|
880 iConcatenationTimer->Cancel(); |
|
881 } |
|
882 } |
|
883 |
|
884 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
885 |
|
886 if(iKeyBackSpaceHit && aCode != EKeyBackspace) |
|
887 iKeyBackSpaceHit = 0; |
|
888 |
|
889 if (aCode != EPtiKeyStar && iNumericResourceTimer) |
|
890 { |
|
891 // return with EKeyWasConsumed if any of the arrow keys are pressed with |
|
892 // iNumericResourceTimer is active |
|
893 if(NumericResourceMultiTapTimerTimeoutL()&& |
|
894 (aCode == EKeyRightArrow || aCode == EKeyLeftArrow || aCode == EKeyUpArrow || aCode ==EKeyDownArrow)) |
|
895 return EKeyWasConsumed; |
|
896 } |
|
897 #endif |
|
898 |
|
899 |
|
900 |
|
901 // This method is implemented independent of all modes, so it can be called by anyone, anywhere |
|
902 if ( BidiCursorRequired() ) |
|
903 { |
|
904 response = AttemptCursorFlipAtAmbiguousPointL( aCode ); |
|
905 if ( response == EKeyWasConsumed ) |
|
906 { |
|
907 return response; |
|
908 } |
|
909 } |
|
910 |
|
911 if ( aCode != EPtiKeyHash |
|
912 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
913 #ifdef __HALF_QWERTY_KEYPAD |
|
914 #ifdef __SHIFT_KEY_LOOP |
|
915 && ( aCode != EPtiKeyQwertyLeftShift |
|
916 || EPtiKeyboardHalfQwerty != KeyboardLayout() ) |
|
917 #endif //__SHIFT_KEY_LOOP |
|
918 #endif //__HALF_QWERTY_KEYPAD |
|
919 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
920 ) |
|
921 |
|
922 { |
|
923 |
|
924 SetLastPressedHashKeyStatus(EFalse); |
|
925 |
|
926 if(iHashKeyMan) |
|
927 { |
|
928 iHashKeyMan->CancelHashKeyTimer(); |
|
929 if (aCode != EKeyOK) |
|
930 { |
|
931 iHashKeyMan->ClearSelectionModeHashKeyLoop(); |
|
932 } |
|
933 } |
|
934 } |
|
935 // Always commit the text before handling arrow keys |
|
936 if (iMode == EHangul && IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) |
|
937 { |
|
938 if ( aCode == EKeyRightArrow || |
|
939 aCode == EKeyLeftArrow || |
|
940 aCode == EKeyUpArrow || |
|
941 aCode == EKeyDownArrow ) |
|
942 { |
|
943 CommitInlineEditL(); |
|
944 iPtiEngine->ClearCurrentWord(); |
|
945 } |
|
946 } |
|
947 TBool isPassNext = IsFlagSet(EFlagPassNextKey); |
|
948 |
|
949 switch (aCode) |
|
950 { |
|
951 case EKeyEscape: |
|
952 |
|
953 #ifdef RD_SCALABLE_UI_V2 |
|
954 if( iFepFullyConstructed && iFepPluginManager) |
|
955 { |
|
956 iFepPluginManager->ResetMenuState(EFalse); |
|
957 } |
|
958 #endif |
|
959 if (TryCloseUiL()) |
|
960 { |
|
961 response = EKeyWasConsumed; |
|
962 // phrase creation |
|
963 PhraseCreation(EFalse); |
|
964 // phrase creation |
|
965 PinyinPhraseCreation(EFalse); |
|
966 } |
|
967 break; |
|
968 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
969 #ifdef __HALF_QWERTY_KEYPAD |
|
970 #ifdef __SHIFT_KEY_LOOP |
|
971 case EPtiKeyQwertyLeftShift: |
|
972 if( EPtiKeyboardHalfQwerty == KeyboardLayout() ) |
|
973 { |
|
974 response = HandleHashKeyL(aLength); |
|
975 (aLength == ELongKeyPress)? SetLastPressedHashKeyStatus(EFalse):SetLastPressedHashKeyStatus(ETrue); |
|
976 } |
|
977 break; |
|
978 #endif //__SHIFT_KEY_LOOP |
|
979 #endif //__HALF_QWERTY_KEYPAD |
|
980 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
981 case EPtiKeyHash: |
|
982 if(InputMode() == EHangul) |
|
983 { |
|
984 if (aLength == EShortKeyPress) |
|
985 { |
|
986 FepUI()->HandleKeyL(aCode, aLength); |
|
987 response = EKeyWasConsumed; |
|
988 } |
|
989 else |
|
990 { |
|
991 //PhraseCreation(EFalse); |
|
992 response = HandleHashKeyL(aLength); |
|
993 (aLength == ELongKeyPress)? SetLastPressedHashKeyStatus(EFalse): |
|
994 SetLastPressedHashKeyStatus(ETrue); |
|
995 } |
|
996 } |
|
997 else if (InputMode()!= EZhuyin) |
|
998 { |
|
999 if (IsPinyinPhraseCreation() ) |
|
1000 { |
|
1001 ClearCcpuFlag( ECcpuStateHashDown ); |
|
1002 response = EKeyWasConsumed; |
|
1003 } |
|
1004 else |
|
1005 { |
|
1006 response = HandleHashKeyL(aLength); |
|
1007 (aLength == ELongKeyPress) |
|
1008 ? SetLastPressedHashKeyStatus(EFalse) |
|
1009 : SetLastPressedHashKeyStatus(ETrue); |
|
1010 } |
|
1011 } |
|
1012 else |
|
1013 { |
|
1014 PhraseCreation(EFalse); |
|
1015 response = HandleHashKeyL(aLength); |
|
1016 (aLength == ELongKeyPress) |
|
1017 ? SetLastPressedHashKeyStatus(EFalse) |
|
1018 : SetLastPressedHashKeyStatus(ETrue); |
|
1019 } |
|
1020 break; |
|
1021 case EKeyCBA1: |
|
1022 if(Japanese()) |
|
1023 { |
|
1024 if (FepUI()->HandleKeyL(aCode, aLength)) |
|
1025 { |
|
1026 response = EKeyWasConsumed; |
|
1027 } |
|
1028 break; |
|
1029 } |
|
1030 // phrase creation the key CBA2 need to solve. |
|
1031 if ( IsEntryPhrase() ) |
|
1032 { |
|
1033 if ( FepUI()->HandleKeyL( aCode, aLength ) ) |
|
1034 { |
|
1035 response = EKeyWasConsumed; |
|
1036 break; |
|
1037 } |
|
1038 } |
|
1039 |
|
1040 if (!WesternPredictive()) |
|
1041 { |
|
1042 if (TryCloseUiL()) |
|
1043 { |
|
1044 response = EKeyWasConsumed; |
|
1045 } |
|
1046 } |
|
1047 break; |
|
1048 case EKeyCBA2: |
|
1049 if(Japanese()) |
|
1050 { |
|
1051 if (FepUI()->HandleKeyL(aCode, aLength)) |
|
1052 { |
|
1053 response = EKeyWasConsumed; |
|
1054 } |
|
1055 break; |
|
1056 } |
|
1057 if (!WesternPredictive()) |
|
1058 { |
|
1059 if (TryCloseUiL()) |
|
1060 { |
|
1061 // phrase creation the key CBA2 need to solve. |
|
1062 PhraseCreation( EFalse ); |
|
1063 response = EKeyWasConsumed; |
|
1064 } |
|
1065 } |
|
1066 else |
|
1067 { |
|
1068 if ( IsFlagSet( EFlagInsideInlineEditingTransaction ) ) |
|
1069 { |
|
1070 InternalFepUI()->ExpireMultitapTimer(); |
|
1071 } |
|
1072 } |
|
1073 // phrase creation the key CBA2 need to solve. |
|
1074 EntryPhrase( EFalse ); |
|
1075 break; |
|
1076 case EPtiKeyStar: |
|
1077 if (IsFlagSet(EFlagPassNextKey)) |
|
1078 { |
|
1079 ClearFlag(EFlagPassNextKey); |
|
1080 } |
|
1081 else if ( !IsFepAwareTextEditor() ) |
|
1082 { |
|
1083 // The editor is MFNE or other non FEP aware text editor. |
|
1084 // Pass the key to the editor to handle. |
|
1085 response = EKeyWasNotConsumed; |
|
1086 } |
|
1087 else if (IsFlagSet(EFlagShiftKeyDepressed)) |
|
1088 { |
|
1089 response = EKeyWasConsumed; |
|
1090 } |
|
1091 else |
|
1092 { |
|
1093 #ifdef RD_SCALABLE_UI_V2 |
|
1094 iStarKeyPressed = ETrue; |
|
1095 #endif // RD_SCALABLE_UI_V2 |
|
1096 if (FepUI()->HandleKeyL(aCode, aLength, aEventCode)) |
|
1097 { |
|
1098 response = EKeyWasConsumed; |
|
1099 } |
|
1100 #ifdef RD_SCALABLE_UI_V2 |
|
1101 iStarKeyPressed = EFalse; |
|
1102 #endif // RD_SCALABLE_UI_V2 |
|
1103 } |
|
1104 break; |
|
1105 case EKeyRightArrow: |
|
1106 if (TryHandleArrowRightEventL(documentLength)) |
|
1107 { |
|
1108 response = EKeyWasConsumed; |
|
1109 break; |
|
1110 } |
|
1111 // fall through |
|
1112 case EKeyLeftArrow: |
|
1113 if (aCode == EKeyLeftArrow && TryHandleArrowLeftEventL(documentLength)) |
|
1114 { |
|
1115 response = EKeyWasConsumed; |
|
1116 break; |
|
1117 } |
|
1118 |
|
1119 if (IsCcpuFlagSet(ECcpuStateCopy | ECcpuStateCut)) |
|
1120 { |
|
1121 response = EKeyWasNotConsumed; |
|
1122 break; |
|
1123 } |
|
1124 else if (IsCcpuFlagSet(ECcpuStateStartCopy | ECcpuStateStartCut)) |
|
1125 { |
|
1126 TryHandleCommonArrowAndBackspaceFunctionalityL(aCode, response); |
|
1127 break; |
|
1128 } |
|
1129 |
|
1130 if (iLanguageCapabilities.iInputLanguageCode == ELangJapanese && iMode != ELatin) |
|
1131 { |
|
1132 if(FepUI()->HandleKeyL(aCode, aLength)) |
|
1133 { |
|
1134 response = EKeyWasConsumed; |
|
1135 } |
|
1136 } |
|
1137 else |
|
1138 { |
|
1139 if (WesternPredictive()) |
|
1140 { |
|
1141 response = HandleWesternPredictiveArrowKeyL(aCode, aLength); |
|
1142 } |
|
1143 else |
|
1144 { |
|
1145 if (iFepManState == EAknFepStateUIActive) |
|
1146 { |
|
1147 FepUI()->HandleKeyL(aCode, aLength); |
|
1148 response = EKeyWasConsumed; |
|
1149 } |
|
1150 else |
|
1151 { |
|
1152 /* |
|
1153 TCursorSelection currentEditorSelection(0,0); |
|
1154 if(iInputCapabilities.FepAwareTextEditor()) |
|
1155 { |
|
1156 iInputCapabilities.FepAwareTextEditor()-> |
|
1157 GetCursorSelectionForFep(currentEditorSelection); |
|
1158 } |
|
1159 |
|
1160 if(!IsMfneEditor() && |
|
1161 (PluginInputMode() == EPluginInputModeItut || |
|
1162 PluginInputMode() == EPluginInputModeFSQ) && |
|
1163 currentEditorSelection.Length() != 0) |
|
1164 { |
|
1165 response = EKeyWasConsumed; |
|
1166 break; |
|
1167 } |
|
1168 */ |
|
1169 |
|
1170 response = HandleNaviEventOutsideInlineEditL(aCode, aLength); |
|
1171 if (response == EKeyWasConsumed) |
|
1172 { |
|
1173 iCaseMan->UpdateCase(ENullNaviEvent); |
|
1174 } |
|
1175 else if (aCode == EKeyLeftArrow && !IsFlagSet(EFlagShiftKeyDepressed)) |
|
1176 { |
|
1177 iCaseMan->UpdateCase(ELeftNaviEvent); |
|
1178 } |
|
1179 else if (!IsFlagSet(EFlagShiftKeyDepressed)) |
|
1180 { |
|
1181 iCaseMan->UpdateCase(ERightNaviEvent); |
|
1182 } |
|
1183 } |
|
1184 } |
|
1185 } |
|
1186 break; |
|
1187 case EKeyDownArrow: |
|
1188 if( iWesternPredictive && IsFlagSet(EFlagInsideInlineEditingTransaction) && |
|
1189 ( EPtiKeyboard12Key == KeyboardLayout() ) && ( IsFlagSet(EFlagShiftKeyDepressed) || |
|
1190 HashKeySelectionInUse()&& IsCcpuFlagSet(ECcpuStateHashDown) ) ) |
|
1191 { |
|
1192 iPtiEngine->CommitCurrentWord(); |
|
1193 CommitInlineEditL(); |
|
1194 response = EKeyWasConsumed; |
|
1195 break; |
|
1196 } |
|
1197 |
|
1198 if (TryHandleArrowDownEventL(documentLength) || IsFlagSet(EFlagNoMatches)) |
|
1199 { |
|
1200 response = EKeyWasConsumed; |
|
1201 break; |
|
1202 } |
|
1203 |
|
1204 case EKeyUpArrow: |
|
1205 if (iLanguageCapabilities.iInputLanguageCode == ELangJapanese && iMode != ELatin) |
|
1206 { |
|
1207 if ( (iAknEditorFlags & EAknEditorFlagNoLRNavigation) && |
|
1208 IsFlagSet(EFlagShiftKeyDepressed) ) |
|
1209 { |
|
1210 // Up or down key is pressed during shift key press. |
|
1211 ClearFlag(EFlagNoActionDuringShiftKeyPress); |
|
1212 return EKeyWasNotConsumed; |
|
1213 } |
|
1214 |
|
1215 if(FepUI()->HandleKeyL(aCode, aLength)) |
|
1216 { |
|
1217 response = EKeyWasConsumed; |
|
1218 } |
|
1219 else |
|
1220 { |
|
1221 TryHandleCommonArrowAndBackspaceFunctionalityL(aCode, response); |
|
1222 } |
|
1223 } |
|
1224 else |
|
1225 { |
|
1226 if (iLanguageCapabilities.iInputLanguageCode == ELangThai && |
|
1227 iFepManState == EAknFepStateUIActive && |
|
1228 WesternPredictive() ) |
|
1229 { |
|
1230 if (FepUI()->HandleKeyL(aCode, aLength)) |
|
1231 { |
|
1232 ClearFlag(EFlagChangeInputMode); |
|
1233 response = EKeyWasConsumed; |
|
1234 } |
|
1235 break; |
|
1236 } |
|
1237 else if ( (iAknEditorFlags & EAknEditorFlagNoLRNavigation) && |
|
1238 IsFlagSet(EFlagShiftKeyDepressed) ) |
|
1239 { |
|
1240 // Up or down key is pressed during shift key press. |
|
1241 ClearFlag(EFlagNoActionDuringShiftKeyPress); |
|
1242 return EKeyWasNotConsumed; |
|
1243 } |
|
1244 if (WesternPredictive()) |
|
1245 { |
|
1246 // For customizabal of Down/Up scroll keypress action. |
|
1247 // If it need to custom it, the function of HandleKeyL returns EFalse. |
|
1248 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
1249 // Predictive QWERTY (XT9) changes ----> |
|
1250 if ( IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) ) |
|
1251 { |
|
1252 TInt wordIndexToSelect = 0; |
|
1253 |
|
1254 if(iQwertyInputMode && EPtiKeyboardHalfQwerty != KeyboardLayout()) |
|
1255 { |
|
1256 if(!iPrimaryCandidate) |
|
1257 iPtiEngine->HandleCommandL( EPtiCommandUserActionGetIndexOfSecondaryCandidate, |
|
1258 &wordIndexToSelect ); |
|
1259 |
|
1260 if( iQwertyInputMode |
|
1261 && IsExactWordPopUpShown() |
|
1262 && aCode == EKeyUpArrow ) |
|
1263 { |
|
1264 iExactWordPopupContent->HidePopUp(); |
|
1265 |
|
1266 // When press up, if FSQ is opened, |
|
1267 // also need to check and close tooltip on it. |
|
1268 SendEventsToPluginManL( EPluginHideTooltip ); |
|
1269 |
|
1270 iPtiEngine->HandleCommandL( |
|
1271 EPtiCommandUserActionSetCurrentIndexOfCandidates, |
|
1272 &wordIndexToSelect ); |
|
1273 iPtiEngine->HandleCommandL( EPtiCommandLockCurrentCandidate ); |
|
1274 /* Update the Candidate List in case of Exact Typing as best predicted word is |
|
1275 selected from the tooltip to the editor */ |
|
1276 if(!iPrimaryCandidate) |
|
1277 iPtiEngine->HandleCommandL(EPtiCommandSetFlagToUpdateCandidates); |
|
1278 |
|
1279 TPtrC selectedWord = iPtiEngine->CurrentWord(); |
|
1280 UpdateInlineEditL( selectedWord, selectedWord.Length() ); |
|
1281 response = EKeyWasConsumed; |
|
1282 |
|
1283 } |
|
1284 else |
|
1285 { |
|
1286 LaunchCandidatePopupListL( wordIndexToSelect ); |
|
1287 response = EKeyWasConsumed; |
|
1288 } |
|
1289 } |
|
1290 else |
|
1291 { |
|
1292 if (!IsFlagSet(EFlagInsideMultitapInlineEditingTransaction)) |
|
1293 { |
|
1294 TInt lastCandidateIndex = iPtiEngine->NumberOfCandidates() -1; |
|
1295 if( EPtiKeyboard12Key == KeyboardLayout() && ( IsFlagSet(EFlagShiftKeyDepressed) || |
|
1296 HashKeySelectionInUse()&& IsCcpuFlagSet(ECcpuStateHashDown) ) ) |
|
1297 { |
|
1298 if (response != EKeyWasConsumed) |
|
1299 { |
|
1300 response = HandleWesternPredictiveArrowKeyL(aCode, aLength); |
|
1301 } |
|
1302 } |
|
1303 else if(aCode == EKeyUpArrow && lastCandidateIndex >= 0) |
|
1304 { |
|
1305 // Get last word on list |
|
1306 LaunchCandidatePopupListL( lastCandidateIndex ); |
|
1307 response = EKeyWasConsumed; |
|
1308 } |
|
1309 else |
|
1310 { |
|
1311 // Get next word on list (wrap around if at end) |
|
1312 iPtiEngine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates, |
|
1313 &wordIndexToSelect ); |
|
1314 wordIndexToSelect < lastCandidateIndex ? wordIndexToSelect++ : wordIndexToSelect = 0; |
|
1315 LaunchCandidatePopupListL( wordIndexToSelect ); |
|
1316 response = EKeyWasConsumed; |
|
1317 } |
|
1318 } |
|
1319 else |
|
1320 response = EKeyWasConsumed; |
|
1321 } |
|
1322 } |
|
1323 else |
|
1324 { |
|
1325 // Predictive QWERTY (XT9) changes <---- |
|
1326 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
1327 if(iFepManState == EAknFepStateUIActive && |
|
1328 FepUI()->HandleKeyL(aCode, aLength)) |
|
1329 { |
|
1330 response = EKeyWasConsumed; |
|
1331 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
1332 |
|
1333 // When press up, if FSQ is opened, |
|
1334 // also need to check and close tooltip on it. |
|
1335 SendEventsToPluginManL( EPluginHideTooltip ); |
|
1336 |
|
1337 // Predictive QWERTY (XT9) changes ----> |
|
1338 // Exact word popup is hidden when the exact word is selected |
|
1339 iExactWordPopupContent->HidePopUp(); |
|
1340 // Predictive QWERTY (XT9) changes <---- |
|
1341 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
1342 } |
|
1343 // normal operation of Down/Up scroll keypress action. |
|
1344 if (response != EKeyWasConsumed) |
|
1345 { |
|
1346 response = HandleWesternPredictiveArrowKeyL(aCode, aLength); |
|
1347 } |
|
1348 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
1349 } // Predictive QWERTY (XT9) changes |
|
1350 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
1351 } |
|
1352 else |
|
1353 { |
|
1354 if (iFepManState == EAknFepStateUIActive) |
|
1355 { |
|
1356 FepUI()->HandleKeyL(aCode, aLength); |
|
1357 response = EKeyWasConsumed; |
|
1358 } |
|
1359 else |
|
1360 { |
|
1361 TryHandleCommonArrowAndBackspaceFunctionalityL(aCode, response); |
|
1362 } |
|
1363 } |
|
1364 } |
|
1365 break; |
|
1366 case EKeyBackspace: |
|
1367 if (iLanguageCapabilities.iInputLanguageCode == ELangJapanese && |
|
1368 !(iMode == ELatin || iMode == ENumber)) |
|
1369 { |
|
1370 if (FepUI()->HandleKeyL(aCode, aLength)) |
|
1371 { |
|
1372 response = EKeyWasConsumed; |
|
1373 } |
|
1374 } |
|
1375 else if (iLanguageCapabilities.iInputLanguageCode == ELangVietnamese) |
|
1376 { |
|
1377 TCursorSelection cursorSelection; |
|
1378 if ( !IsFepAwareTextEditor() ) |
|
1379 { |
|
1380 response = EKeyWasNotConsumed; |
|
1381 } |
|
1382 else |
|
1383 { |
|
1384 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSelection); |
|
1385 if (cursorSelection.Length() != 0) |
|
1386 { |
|
1387 response = EKeyWasNotConsumed; |
|
1388 } |
|
1389 #ifdef RD_SCALABLE_UI_V2 |
|
1390 else if ( !documentLength |
|
1391 && ( iFepPluginManager->PluginInputMode() == EPluginInputModeItut |
|
1392 || iFepPluginManager->PluginInputMode() == EPluginInputModeVkb ) ) |
|
1393 { |
|
1394 response = EKeyWasConsumed; |
|
1395 } |
|
1396 #endif |
|
1397 else |
|
1398 { |
|
1399 if (FepUI()->HandleKeyL(aCode, aLength)) |
|
1400 { |
|
1401 response = EKeyWasConsumed; |
|
1402 } |
|
1403 else |
|
1404 { |
|
1405 if( WesternPredictive() ) |
|
1406 { |
|
1407 // We need to start the autoconcatination timer |
|
1408 SimulateKeyEventL(EKeyF24); |
|
1409 } |
|
1410 } |
|
1411 } |
|
1412 } |
|
1413 |
|
1414 } |
|
1415 else if (IsKoreanInputLanguage() && iMode == EHangul) |
|
1416 { |
|
1417 if (FepUI()->HandleKeyL(aCode, aLength)) |
|
1418 { |
|
1419 response = EKeyWasConsumed; |
|
1420 } |
|
1421 } |
|
1422 else |
|
1423 { |
|
1424 if (iFepManState == EAknFepStateInitial) |
|
1425 { |
|
1426 #ifdef RD_SCALABLE_UI_V2 |
|
1427 if ( iFepPluginManager->PluginInputMode() == EPluginInputModeItut ) |
|
1428 { |
|
1429 if ( iFepPluginManager->CurrentFepInputUI() && |
|
1430 FepUI()->HandleKeyL(aCode, aLength)) |
|
1431 { |
|
1432 response = EKeyWasConsumed; |
|
1433 break; |
|
1434 } |
|
1435 } |
|
1436 if ( !documentLength |
|
1437 && ( iFepPluginManager->PluginInputMode() == EPluginInputModeItut |
|
1438 || iFepPluginManager->PluginInputMode() == EPluginInputModeVkb ) ) |
|
1439 { |
|
1440 response = EKeyWasConsumed; |
|
1441 break; |
|
1442 |
|
1443 } |
|
1444 #endif |
|
1445 if (IsFlagSet(EFlagLineFeedCharacter)) |
|
1446 { |
|
1447 // restore cursor visibility |
|
1448 if (IsFlagSet(EFlagInsideMultitapInlineEditingTransaction)) |
|
1449 { |
|
1450 iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL(ETrue); |
|
1451 } |
|
1452 |
|
1453 iInputCapabilities.FepAwareTextEditor()->CancelFepInlineEdit(); |
|
1454 ClearFlag(EFlagInsideMultitapInlineEditingTransaction | |
|
1455 EFlagInsideInlineEditingTransaction | |
|
1456 EFlagLineFeedCharacter); |
|
1457 response = EKeyWasConsumed; |
|
1458 } |
|
1459 else |
|
1460 { |
|
1461 response = HandleNaviEventOutsideInlineEditL(aCode, aLength); |
|
1462 if (WesternPredictive() && response == EKeyWasNotConsumed) |
|
1463 { |
|
1464 // if we're passing a backspace to the editor simulate any old keypress |
|
1465 // to catch and check the state of play after the deletion |
|
1466 SimulateKeyEventL(EKeyF24); |
|
1467 } |
|
1468 if (response == EKeyWasNotConsumed) |
|
1469 { |
|
1470 if(iMode == EZhuyinFind) |
|
1471 { |
|
1472 SetFlag(EFlagSupressAutoUpdate); |
|
1473 } |
|
1474 if (iLongClearAfterCloseUI && |
|
1475 aLength == ELongKeyPress) |
|
1476 { |
|
1477 response = EKeyWasConsumed; |
|
1478 } |
|
1479 |
|
1480 iCaseMan->UpdateCase(EBackspaceEvent); |
|
1481 } |
|
1482 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
1483 if(IsAutoCompleteOn()) |
|
1484 { |
|
1485 TInt tailLength = 0; |
|
1486 iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, |
|
1487 &tailLength ); |
|
1488 if(tailLength > 0) |
|
1489 { |
|
1490 RemoveSuggestedAdvanceCompletionL(); |
|
1491 } |
|
1492 } |
|
1493 #endif |
|
1494 } |
|
1495 |
|
1496 // Clear the star key flag. |
|
1497 if( FepUI() ) |
|
1498 { |
|
1499 FepUI()->SetStarKeyFlag( EFalse ); |
|
1500 } |
|
1501 } |
|
1502 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
1503 else if (IsAutoCompleteOn()) |
|
1504 { |
|
1505 if(FepUI()->HandleKeyL(aCode, aLength)) |
|
1506 { |
|
1507 if( EPtiKeyboardHalfQwerty == KeyboardLayout() |
|
1508 && iWesternPredictive |
|
1509 && iCaseMan->CurrentCase() != EAknEditorUpperCase ) |
|
1510 { |
|
1511 ClearFlag(CAknFepManager::EFlagChangeInputMode); |
|
1512 } |
|
1513 TInt tailLength = 0; |
|
1514 iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength ); |
|
1515 if(tailLength > 0) |
|
1516 { |
|
1517 RemoveSuggestedAdvanceCompletionL(); |
|
1518 } |
|
1519 response = EKeyWasConsumed; |
|
1520 } |
|
1521 } |
|
1522 else if(FepUI()->HandleKeyL(aCode, aLength)) |
|
1523 { |
|
1524 response = EKeyWasConsumed; |
|
1525 } |
|
1526 SendEventsToPluginManL( EPluginHideTooltip ); |
|
1527 iExactWordPopupContent->HidePopUp(); |
|
1528 #else |
|
1529 else if (FepUI()->HandleKeyL(aCode, aLength)) |
|
1530 { |
|
1531 response = EKeyWasConsumed; |
|
1532 } |
|
1533 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
1534 } |
|
1535 break; |
|
1536 case EKeyDelete: |
|
1537 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
1538 if(IsAutoCompleteOn()) |
|
1539 { |
|
1540 TInt tailLength = 0; |
|
1541 iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, |
|
1542 &tailLength ); |
|
1543 if(tailLength > 0) |
|
1544 { |
|
1545 RemoveSuggestedAdvanceCompletionL(); |
|
1546 } |
|
1547 } |
|
1548 |
|
1549 // When press delete key, if FSQ is opened, |
|
1550 // also need to check and close tooltip on it. |
|
1551 SendEventsToPluginManL( EPluginHideTooltip ); |
|
1552 |
|
1553 iExactWordPopupContent->HidePopUp(); |
|
1554 if ( IsFlagSet( EFlagInsideInlineEditingTransaction ) ) |
|
1555 { |
|
1556 TryRemoveNoMatchesIndicatorL(); |
|
1557 UpdateCbaL(NULL); |
|
1558 CommitInlineEditL(); |
|
1559 } |
|
1560 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
1561 break; |
|
1562 case EKeyF19: // Fep simulated event to asynchronously update the case. |
|
1563 iCaseMan->UpdateCase(ENullNaviEvent); |
|
1564 response=EKeyWasConsumed; |
|
1565 ClearExtendedFlag(EExtendedFlagOkKeyPressOnCandidatePopup ); |
|
1566 break; |
|
1567 case EKeyF22: |
|
1568 if (WesternPredictive()) |
|
1569 { |
|
1570 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
1571 if (CursorInsideWord()) |
|
1572 { |
|
1573 MoveCursorToEndOfWordL(); |
|
1574 } |
|
1575 if (iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep()) |
|
1576 { |
|
1577 iCaseMan->UpdateCase(ENullNaviEvent); |
|
1578 } |
|
1579 } |
|
1580 else if (iMode == ELatin) |
|
1581 { |
|
1582 iCaseMan->UpdateCase(ENullNaviEvent); |
|
1583 } |
|
1584 ClearCcpuFlag(ECcpuStateIgnoreStarUp); |
|
1585 response=EKeyWasConsumed; |
|
1586 break; |
|
1587 case EKeyF23: |
|
1588 if (WesternPredictive()) |
|
1589 { |
|
1590 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
1591 if (CursorInsideWord()) |
|
1592 { |
|
1593 MoveCursorToStartOfWordL(); |
|
1594 } |
|
1595 if (iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep()) |
|
1596 { |
|
1597 iCaseMan->UpdateCase(ENullNaviEvent); |
|
1598 } |
|
1599 } |
|
1600 else if (iMode == ELatin) |
|
1601 { |
|
1602 iCaseMan->UpdateCase(ENullNaviEvent); |
|
1603 } |
|
1604 ClearCcpuFlag(ECcpuStateIgnoreStarUp); |
|
1605 response=EKeyWasConsumed; |
|
1606 break; |
|
1607 case EKeyF24: |
|
1608 if (WesternPredictive() && CursorInsideWord()) |
|
1609 { |
|
1610 // word concatenation - start the timer; add concatenated word |
|
1611 // to UDB on timer expiry |
|
1612 iConcatenationTimer->Start(EWordConcatenationTimeout, EWordConcatenationTimeout, |
|
1613 TCallBack(WordConcatenationTimerTimeoutCallback, this)); |
|
1614 } |
|
1615 response=EKeyWasConsumed; |
|
1616 break; |
|
1617 case EPtiKey0: //fall through |
|
1618 case EPtiKey1: |
|
1619 case EPtiKey2: |
|
1620 case EPtiKey3: |
|
1621 case EPtiKey4: |
|
1622 case EPtiKey5: |
|
1623 case EPtiKey6: |
|
1624 case EPtiKey7: |
|
1625 case EPtiKey8: |
|
1626 case EPtiKey9: |
|
1627 #ifdef RD_SCALABLE_UI_V2 |
|
1628 if ( aLength == ELongKeyPress && !isPassNext && (aCode == EPtiKey0) ) |
|
1629 { |
|
1630 if( !IsQwerty() && |
|
1631 !IsFlagSet(CAknFepManager::EFlagPassNextKey)&& |
|
1632 iFepPluginManager->PluginInputMode() != EPluginInputModeItut ) |
|
1633 { |
|
1634 iFepPluginManager->ClosePluginInputModeL( ETrue ); |
|
1635 } |
|
1636 } |
|
1637 #endif |
|
1638 if (IsFlagSet(EFlagLineFeedCharacter) && aCode != EPtiKey0) |
|
1639 { |
|
1640 // There is line feed character waiting. Pospone this event and handle |
|
1641 // line feed first. |
|
1642 CancelInlineEdit(); |
|
1643 if (!(iAknEditorFlags & EAknEditorFlagFindPane) || iQwertyInputMode) |
|
1644 { |
|
1645 SimulateKeyEventL(EKeyEnter); |
|
1646 SimulateKeyEventL(EKeyF19); // Asyncronous case update |
|
1647 } |
|
1648 SimulateKeyEventL((TPtiKey)aCode); |
|
1649 ClearFlag(EFlagLineFeedCharacter); |
|
1650 return EKeyWasConsumed; |
|
1651 } |
|
1652 if (iLanguageCapabilities.iInputLanguageCode == ELangJapanese && iMode != ELatin) |
|
1653 { |
|
1654 if (EditorHasFreeSpace() || iFepManState == EAknFepStateUIActive) |
|
1655 { |
|
1656 if (FepUI()->HandleKeyL(aCode, aLength)) |
|
1657 { |
|
1658 ClearFlag(EFlagChangeInputMode); |
|
1659 response = EKeyWasConsumed; |
|
1660 } |
|
1661 // response is EKeyWasNotConsumed |
|
1662 } |
|
1663 } |
|
1664 else |
|
1665 { |
|
1666 //pass extra key received when doing secret text edit |
|
1667 if (IsFlagSet(EFlagPassNextKey)) |
|
1668 { |
|
1669 ClearFlag(EFlagPassNextKey); |
|
1670 } |
|
1671 else if (IsFlagSet(EFlagShiftKeyDepressed) || IsCcpuFlagSet(ECcpuStateHashDown)) |
|
1672 { |
|
1673 response = EKeyWasConsumed; |
|
1674 } |
|
1675 |
|
1676 // The key event is passed to the editor to handle in case of |
|
1677 // MFNE and other non FEP aware editors (response = EKeyWasNotConsumed). |
|
1678 else if ( IsFepAwareTextEditor() ) |
|
1679 { |
|
1680 if ( ( iMode != ENumber && iMode != ENativeNumber ) || |
|
1681 ( ( iMode == ENumber || iMode == ENativeNumber ) && aLength == ELongKeyPress)) |
|
1682 { |
|
1683 // Be default the key event is handled by FEP for FEP aware editors. |
|
1684 response = EKeyWasConsumed; |
|
1685 } |
|
1686 |
|
1687 // New character can be entered to the editor if there is |
|
1688 // space left in the editor. Editor can be modified also |
|
1689 // is the last character is multitapped or last character |
|
1690 // in inline state is replaced with a digit. |
|
1691 /*Hindi*/ |
|
1692 //This condition is added for Hindi language in case of multitapping of EKey1 to get |
|
1693 //a numeral value "1" because of a clasical case of Halant and ZWS getting added |
|
1694 //before numeral 1 which may affect incase of limited space in editor |
|
1695 |
|
1696 if (( EditorHasFreeSpace() |
|
1697 || (!WesternPredictive() && !EditorHasFreeSpace() && |
|
1698 (TAknFepUiIndicInputManager::IsIndicLangauge( |
|
1699 TLanguage(iLanguageCapabilities.iInputLanguageCode)))) |
|
1700 || IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) |
|
1701 || (IsFlagSet(EFlagInsideInlineEditingTransaction) && aLength == ELongKeyPress))) |
|
1702 { |
|
1703 ClearFlag(EFlagEditorFull); |
|
1704 |
|
1705 if (aLength == ELongKeyPress && |
|
1706 (iMode != ELatin && iMode != ENumber && iMode != ENativeNumber && iMode != EStrokeFind && iMode != EHangul) && |
|
1707 FepUI()->IsValidNumericLongKeyPress(aCode)) |
|
1708 { |
|
1709 if (iFepManState == EAknFepStateInitial) // Multitapping |
|
1710 { |
|
1711 #ifdef RD_SCALABLE_UI_V2 |
|
1712 if (iFepFullyConstructed && |
|
1713 iFepPluginManager->CurrentFepInputUI() ) |
|
1714 { |
|
1715 if (iFepPluginManager->CurrentFepInputUI()->HandleKeyL(aCode, |
|
1716 aLength)) |
|
1717 { |
|
1718 response = EKeyWasConsumed; |
|
1719 break; |
|
1720 } |
|
1721 } |
|
1722 #endif |
|
1723 // Current multitabbed character is replaced with a number. |
|
1724 TChar ch(aCode); |
|
1725 TBuf<1> buf; |
|
1726 buf.Append(ch); |
|
1727 NewCharacterL(buf); |
|
1728 CommitInlineEditL(); |
|
1729 iPtiEngine->ClearCurrentWord(); |
|
1730 } |
|
1731 else |
|
1732 { |
|
1733 // Long number key press is given to the editor. |
|
1734 TryCloseUiL(); |
|
1735 response = EKeyWasNotConsumed; |
|
1736 } |
|
1737 } |
|
1738 else if (FepUI()->HandleKeyL(aCode, aLength)) |
|
1739 { |
|
1740 if ( (iMode == EPinyin || iMode == EZhuyin || iMode == EStroke || iMode == ECangJie) |
|
1741 && iFepManState == EAknFepStateUIActive ) |
|
1742 { |
|
1743 if ( EditorState() ) |
|
1744 { |
|
1745 EditorState()->SetFlags( EditorState()->Flags() | EAknEditorFlagChinesePopup ); |
|
1746 } |
|
1747 } |
|
1748 ClearFlag(EFlagChangeInputMode); |
|
1749 // for japanese variant |
|
1750 if (IsFeatureSupportedJapanese() |
|
1751 && iMode == ENumber) |
|
1752 { |
|
1753 response = EKeyWasConsumed; |
|
1754 } |
|
1755 } |
|
1756 else |
|
1757 { |
|
1758 //By default, pass long keypress to an editor for inserting number. |
|
1759 response = EKeyWasNotConsumed; |
|
1760 //No need to handle long key press in dialer |
|
1761 if ( RProcess().SecureId().iId != KPhoneSecureId ) |
|
1762 { |
|
1763 |
|
1764 if ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic ) |
|
1765 { |
|
1766 SimulateKeyEventL( aCode + KLatinToArabicIndicDigitsDelta ); |
|
1767 response = EKeyWasConsumed; |
|
1768 } |
|
1769 else if( iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic ) |
|
1770 { |
|
1771 SimulateKeyEventL( aCode + KLatinToEasternArabicIndicDigitsDelta ); |
|
1772 response = EKeyWasConsumed; |
|
1773 } |
|
1774 /*Hindi*/ |
|
1775 else if ( iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari |
|
1776 || iPreviousEditingState == EDevanagariIndicNumeric ) |
|
1777 { |
|
1778 |
|
1779 SimulateKeyEventL( aCode + KLatinToDevanagariDigitsDelta ); |
|
1780 |
|
1781 response = EKeyWasConsumed; |
|
1782 } |
|
1783 } |
|
1784 } |
|
1785 } |
|
1786 } |
|
1787 } |
|
1788 break; |
|
1789 case EKeyOK: |
|
1790 { |
|
1791 if (iUiInterface->SoftkeysExist() && EditSubmenuInUse()) |
|
1792 { |
|
1793 if (iUiInterface->SoftkeyCommandId(ELeftSoftkeyIndex) == EAknFepSoftkeyStartCopy) |
|
1794 { |
|
1795 ProcessCommandL(EAknFepSoftkeyStartCopy); |
|
1796 response = EKeyWasConsumed; |
|
1797 break; |
|
1798 } |
|
1799 else if (iUiInterface->SoftkeyCommandId(ELeftSoftkeyIndex) == EAknFepSoftkeyStartCut) |
|
1800 { |
|
1801 ProcessCommandL(EAknFepSoftkeyStartCut); |
|
1802 response = EKeyWasConsumed; |
|
1803 break; |
|
1804 } |
|
1805 else if (iUiInterface->SoftkeyCommandId(ELeftSoftkeyIndex) == EEikCmdEditCopy) |
|
1806 { |
|
1807 ProcessCommandL(EEikCmdEditCopy); |
|
1808 response = EKeyWasConsumed; |
|
1809 break; |
|
1810 } |
|
1811 else if (iUiInterface->SoftkeyCommandId(ELeftSoftkeyIndex) == EEikCmdEditCut) |
|
1812 { |
|
1813 ProcessCommandL(EEikCmdEditCut); |
|
1814 response = EKeyWasConsumed; |
|
1815 break; |
|
1816 } |
|
1817 } |
|
1818 |
|
1819 if ( (iAknEditorFlags & EAknEditorFlagNoLRNavigation) && |
|
1820 IsFlagSet(EFlagShiftKeyDepressed) ) |
|
1821 { |
|
1822 // Selection key is pressed during shift key press. |
|
1823 ClearFlag(EFlagNoActionDuringShiftKeyPress); |
|
1824 return EKeyWasNotConsumed; |
|
1825 } |
|
1826 if (iLanguageCapabilities.iInputLanguageCode == ELangJapanese && iMode != ELatin) |
|
1827 { |
|
1828 if (FepUI()->HandleKeyL(aCode, aLength)) |
|
1829 { |
|
1830 response = EKeyWasConsumed; |
|
1831 } |
|
1832 } |
|
1833 else |
|
1834 { |
|
1835 if (IsFlagSet(EFlagShiftKeyDepressed) && |
|
1836 !(iAknEditorFlags & EAknEditorFlagSupressShiftMenu)) |
|
1837 { |
|
1838 response = EKeyWasConsumed; |
|
1839 } |
|
1840 else if (iFepManState == EAknFepStateUIActive) |
|
1841 { |
|
1842 if (FepUI()->HandleKeyL(aCode, aLength)) |
|
1843 { |
|
1844 response = EKeyWasConsumed; |
|
1845 } |
|
1846 } |
|
1847 else if (iMode == ELatin && !WesternPredictive() && |
|
1848 IsFlagSet(EFlagInsideMultitapInlineEditingTransaction)) |
|
1849 { |
|
1850 CommitInlineEditL(); |
|
1851 } |
|
1852 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
1853 // Predictive QWERTY (XT9) changes ----> |
|
1854 // Accept current candidate (including possible auto-completed part) and insert space after the word |
|
1855 // if selection key pressed while inline editing (on Qwerty only!) |
|
1856 // this is not the expected behavior for half qwerty |
|
1857 |
|
1858 TBool isQwertyMode = iQwertyInputMode && |
|
1859 !( EPtiKeyboardHalfQwerty == KeyboardLayout() ); |
|
1860 if ( response == EKeyWasNotConsumed && iWesternPredictive && isQwertyMode && |
|
1861 IsFlagSet(EFlagInsideInlineEditingTransaction) |
|
1862 // For addition of ITI features on FSQ. |
|
1863 // If FSQ is opened with ITI features activated, don't commit as HW's action |
|
1864 && !( iFepPluginManager && iFepPluginManager->EnableITIOnFSQ() ) ) |
|
1865 { |
|
1866 |
|
1867 // If the primary candidate setting is exact typing, The tooltip/bubble always shows the best prediction. |
|
1868 // Word on the typing line is accepted into editor on selection key event.. |
|
1869 |
|
1870 iPtiEngine->CommitCurrentWord(); |
|
1871 CommitInlineEditL(); |
|
1872 TryCloseUiL(); |
|
1873 if(!static_cast<TChar>(NextChar()).IsSpace()) |
|
1874 { |
|
1875 SimulateKeyEventL(EKeySpace); |
|
1876 } |
|
1877 else |
|
1878 { |
|
1879 TCursorSelection sel; |
|
1880 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(sel); |
|
1881 sel.iCursorPos++; |
|
1882 sel.iAnchorPos++; |
|
1883 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel); |
|
1884 } |
|
1885 SimulateKeyEventL(EKeyF19); // asynchronous case update |
|
1886 |
|
1887 response = EKeyWasConsumed; |
|
1888 } |
|
1889 // Predictive QWERTY (XT9) changes <---- |
|
1890 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
1891 } |
|
1892 } |
|
1893 break; |
|
1894 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
1895 case EKeyPhoneEnd: |
|
1896 { |
|
1897 // Suggested word should get committed in exact typing |
|
1898 if ( iWesternPredictive && |
|
1899 IsFlagSet(EFlagInsideInlineEditingTransaction) ) |
|
1900 { |
|
1901 |
|
1902 // If the primary candidate setting is exact typing, The tooltip/bubble always shows the best prediction. |
|
1903 // Word on the typing line is accepted into editor on end key event.. |
|
1904 |
|
1905 iPtiEngine->CommitCurrentWord(); |
|
1906 CommitInlineEditL(); |
|
1907 TryCloseUiL(); |
|
1908 ClearFlag(CAknFepManager::EFlagNoMatches); |
|
1909 SimulateKeyEventL(EKeyF19); // asynchronous case update |
|
1910 } |
|
1911 } |
|
1912 break; |
|
1913 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
1914 default: |
|
1915 break; |
|
1916 } |
|
1917 SchedulePostEventCheckL(aCode); |
|
1918 |
|
1919 #ifdef RD_SCALABLE_UI_V2 |
|
1920 if ( !isPassNext ) |
|
1921 { |
|
1922 SendEventsToPluginManL( EPluginKeyEvent, aCode ); |
|
1923 } |
|
1924 #endif |
|
1925 |
|
1926 return response; |
|
1927 } |
|
1928 |
|
1929 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
1930 void CAknFepManager::HandleShiftHalfQwertyChineseL(TEventCode aEventCode) |
|
1931 { |
|
1932 if (aEventCode == EEventKeyDown) |
|
1933 { |
|
1934 ClearCcpuFlag(ECcpuStateCbaShown); |
|
1935 SetFlag(EFlagShiftKeyDepressed | EFlagNoActionDuringShiftKeyPress); |
|
1936 ClearFlag(EFlagNoActionDuringChrKeyPress); |
|
1937 SetFlag(EFlagQwertyShiftMode); |
|
1938 // Long press of shift key timer is activated. |
|
1939 iShiftKeypressMonitor->Start(EShiftKeyRepeatDelay, |
|
1940 EShiftKeyRepeatDelay, TCallBack(ResetShiftKeyMonitorCallback, |
|
1941 this) ); |
|
1942 } |
|
1943 else if (aEventCode == EEventKeyUp) |
|
1944 { |
|
1945 ClearFlag(EFlagShiftKeyDepressed |
|
1946 |EFlagNoActionDuringShiftKeyPress); |
|
1947 ClearFlag(EFlagQwertyShiftMode); |
|
1948 iShiftKeypressMonitor->Cancel(); |
|
1949 |
|
1950 if ( (iKeyPressedDuringShift)|| IsFlagSet(EFlagLongShiftKeyPress) ) |
|
1951 { |
|
1952 iKeyPressedDuringShift = EFalse; |
|
1953 ClearFlag( EFlagLongShiftKeyPress ); |
|
1954 if ( iFnKeyManager->FnKeyState() ) |
|
1955 { |
|
1956 iFnKeyManager->SetFnKeyState( CAknFepFnKeyManager::EFnKeyNone ); |
|
1957 } |
|
1958 UpdateIndicators(); |
|
1959 } |
|
1960 else |
|
1961 { |
|
1962 CAknEdwinState* editorState = EditorState(); |
|
1963 TInt permittedCases = editorState->PermittedCases(); |
|
1964 permittedCases = permittedCases == 0 ? |
|
1965 EAknEditorLowerCase | EAknEditorUpperCase : permittedCases; |
|
1966 |
|
1967 if (iMode == ELatin && (permittedCases & EAknEditorTextCase)) |
|
1968 { |
|
1969 // Latin case update is changed back to automatic if latin |
|
1970 // text case is allowed and the case is changed manually from #-key. |
|
1971 ClearFlag(CAknFepManager::EFlagSupressAutoUpdate); |
|
1972 } |
|
1973 TInt currentCase = iCaseMan->CurrentCase(); |
|
1974 |
|
1975 // Is current latin case last available case. |
|
1976 TBool lastCase = ( ( !(permittedCases & EAknEditorTextCase) |
|
1977 && ((currentCase == EAknEditorLowerCase) |
|
1978 || (currentCase == EAknEditorUpperCase |
|
1979 && !(permittedCases |
|
1980 & EAknEditorLowerCase)) ) |
|
1981 || (editorState->Flags() & EAknEditorFlagFixedCase) ) |
|
1982 || (editorState->Flags() |
|
1983 & EAknEditorFlagForceTransparentFepModes) ); |
|
1984 |
|
1985 if (iMode == ELatin |
|
1986 && !IsFlagSet(CAknFepManager::EFlagChangeInputMode) |
|
1987 && !lastCase) |
|
1988 { |
|
1989 if (iWesternPredictive) |
|
1990 { |
|
1991 // Input mode is still Latin. Only case is updated. |
|
1992 if (permittedCases & EAknEditorTextCase) |
|
1993 { |
|
1994 iCaseMan->ManualCaseUpdate(); |
|
1995 } |
|
1996 else |
|
1997 { |
|
1998 iCaseMan->SetCurrentCase(EAknEditorLowerCase); |
|
1999 } |
|
2000 } |
|
2001 else |
|
2002 { |
|
2003 if(iCaseMan->CurrentCase() == EAknEditorUpperCase) |
|
2004 { |
|
2005 iCaseMan->SetCurrentCase(EAknEditorLowerCase); |
|
2006 } |
|
2007 else |
|
2008 { |
|
2009 iCaseMan->SetCurrentCase(EAknEditorUpperCase); |
|
2010 } |
|
2011 } |
|
2012 |
|
2013 // Next time input mode is changed if any text is not entered before. |
|
2014 SetFlag(CAknFepManager::EFlagChangeInputMode); |
|
2015 } |
|
2016 else |
|
2017 { |
|
2018 // Input mode is incremented. |
|
2019 SetChangeModeByShiftAndSpace( EFalse ); |
|
2020 TryIncrementChineseModeForQwertyL(iMode); |
|
2021 |
|
2022 ClearFlag(CAknFepManager::EFlagChangeInputMode); |
|
2023 |
|
2024 if ( iMode == ELatin && iWesternPredictive ) // New mode after Increment. |
|
2025 |
|
2026 { |
|
2027 if (editorState->Flags() & EAknEditorFlagFixedCase) |
|
2028 { |
|
2029 // Only one fixed case is available. Use it. |
|
2030 iCaseMan->ConfigureCaseStateFromEditorState(); |
|
2031 SetFlag(CAknFepManager::EFlagChangeInputMode); |
|
2032 } |
|
2033 else if (editorState->Flags() |
|
2034 & EAknEditorFlagForceTransparentFepModes) |
|
2035 { |
|
2036 // Only lower case is used with find pane. |
|
2037 iCaseMan->SetCurrentCase(EAknEditorLowerCase); |
|
2038 SetFlag(CAknFepManager::EFlagSupressAutoUpdate); |
|
2039 SetFlag(CAknFepManager::EFlagChangeInputMode); |
|
2040 } |
|
2041 else if (permittedCases & EAknEditorTextCase) |
|
2042 { |
|
2043 iCaseMan->SetCurrentCase(EAknEditorTextCase); |
|
2044 iCaseMan->UpdateCase(ENullNaviEvent); |
|
2045 } |
|
2046 else |
|
2047 { |
|
2048 if (permittedCases & EAknEditorUpperCase) |
|
2049 { |
|
2050 iCaseMan->SetCurrentCase(EAknEditorUpperCase); |
|
2051 if ( !(permittedCases |
|
2052 & EAknEditorLowerCase)) |
|
2053 { |
|
2054 // We need to move to next input mode since only upper case |
|
2055 // is permitted in Latin input mode. |
|
2056 SetFlag(CAknFepManager::EFlagChangeInputMode); |
|
2057 } |
|
2058 } |
|
2059 else |
|
2060 { |
|
2061 iCaseMan->SetCurrentCase(EAknEditorLowerCase); |
|
2062 SetFlag(CAknFepManager::EFlagChangeInputMode); |
|
2063 } |
|
2064 } |
|
2065 } |
|
2066 } |
|
2067 } |
|
2068 } |
|
2069 } |
|
2070 |
|
2071 void CAknFepManager::HandleShiftQwertyChineseL(TEventCode aEventCode) |
|
2072 { |
|
2073 if ( IsFlagSet( EFlagQwertyChrKeyDepressed ) && |
|
2074 !IsFeatureSupportedJapanese() && |
|
2075 iCurrentFepUI->IsValidShiftKeyPress()) |
|
2076 { |
|
2077 ClearFlag(EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress); |
|
2078 LaunchLanguagesPopupListL(); |
|
2079 return; |
|
2080 } |
|
2081 |
|
2082 TInt language = iSharedDataInterface->InputTextLanguage(); |
|
2083 |
|
2084 if (aEventCode == EEventKeyUp) |
|
2085 { |
|
2086 ClearCcpuFlag(ECcpuStateCbaShown); |
|
2087 if (FepUI()) |
|
2088 { |
|
2089 FepUI()->HandleKeyL(EKeyLeftShift, EShortKeyPress); |
|
2090 } |
|
2091 TBool validShift = iCurrentFepUI->IsValidShiftKeyPress(); |
|
2092 |
|
2093 if (IsFlagSet(EFlagLongShiftKeyPress) ||iKeyPressedDuringShift) |
|
2094 { |
|
2095 if (iKeyPressedDuringShift || IsFlagSet(EFlagQwertyShiftMode)) |
|
2096 { |
|
2097 iShiftKeypressMonitor->Cancel(); |
|
2098 iKeyPressedDuringShift = EFalse; |
|
2099 ClearFlag(EFlagQwertyShiftMode); |
|
2100 } |
|
2101 } |
|
2102 else |
|
2103 if (IsFlagSet(EFlagQwertyShiftMode)) |
|
2104 { |
|
2105 if ( iMode != ELatin && validShift ) |
|
2106 { |
|
2107 iModeBefore = iMode; |
|
2108 TryChangeModeL(ELatin); |
|
2109 ClearFlag( EFlagQwertyShiftMode ); |
|
2110 } |
|
2111 } |
|
2112 else |
|
2113 { |
|
2114 if (iMode == ELatin) |
|
2115 { |
|
2116 TBool isWsPr= EFalse; |
|
2117 if (WesternPredictive()) |
|
2118 { |
|
2119 SetWesternPredictive(EFalse); |
|
2120 isWsPr = ETrue; |
|
2121 } |
|
2122 TInt Modetemp = iModeBefore; |
|
2123 TInt sharedDataMode = iSharedDataInterface->InputMode(); |
|
2124 if (Modetemp == EStroke && |
|
2125 iQwertyInputMode && |
|
2126 sharedDataMode == ECangJie) |
|
2127 { |
|
2128 Modetemp = ECangJie; |
|
2129 } |
|
2130 |
|
2131 TryChangeModeL(Modetemp); |
|
2132 if (isWsPr) |
|
2133 { |
|
2134 SetWesternPredictive(ETrue); |
|
2135 } |
|
2136 } |
|
2137 } |
|
2138 |
|
2139 ClearFlag(EFlagShiftKeyDepressed); |
|
2140 |
|
2141 if (IsFlagSet(EFlagLongShiftKeyPress) |
|
2142 && iMode == ELatin |
|
2143 && IsFlagSet(EFlagQwertyShiftMode))//latin shift ->abc |
|
2144 { |
|
2145 ClearFlag(EFlagQwertyShiftMode); |
|
2146 } |
|
2147 |
|
2148 if (IsFlagSet(EFlagLongShiftKeyPress)) //long keypress up |
|
2149 { |
|
2150 ClearFlag(EFlagLongShiftKeyPress |
|
2151 |EFlagNoActionDuringShiftKeyPress); |
|
2152 } |
|
2153 else // short keypress up |
|
2154 { |
|
2155 iShiftKeypressMonitor->Cancel(); |
|
2156 } |
|
2157 |
|
2158 ClearFlag(EFlagNoActionDuringChrKeyPress); |
|
2159 ClearFlag(EFlagNoActionDuringShiftKeyPress); |
|
2160 if ( validShift ) |
|
2161 { |
|
2162 UpdateIndicators(); |
|
2163 } |
|
2164 else |
|
2165 { |
|
2166 ClearFlag(EFlagQwertyShiftMode); |
|
2167 } |
|
2168 } |
|
2169 else |
|
2170 if (aEventCode == EEventKeyDown) |
|
2171 { |
|
2172 |
|
2173 SetFlag(EFlagShiftKeyDepressed | EFlagNoActionDuringShiftKeyPress); |
|
2174 ClearFlag(EFlagNoActionDuringChrKeyPress); |
|
2175 |
|
2176 if (IsFlagSet(EFlagQwertyShiftMode)) |
|
2177 { |
|
2178 ClearFlag(EFlagQwertyShiftMode); |
|
2179 } |
|
2180 else |
|
2181 { |
|
2182 SetFlag(EFlagQwertyShiftMode); |
|
2183 if ( iCurrentFepUI->IsValidShiftKeyPress() |
|
2184 || iMode == ELatin ) |
|
2185 { |
|
2186 UpdateIndicators(); |
|
2187 } |
|
2188 // If the iShiftKeypressMonitor is actived now, cancel it first. |
|
2189 iShiftKeypressMonitor->Cancel(); |
|
2190 // Long press of shift key timer is activated. |
|
2191 iShiftKeypressMonitor->Start(EShiftKeyRepeatDelay, |
|
2192 EShiftKeyRepeatDelay, TCallBack( |
|
2193 ResetShiftKeyMonitorCallback, this)); |
|
2194 } |
|
2195 } |
|
2196 } |
|
2197 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
2198 TKeyResponse CAknFepManager::HandleShiftKeyEventL(TEventCode aEventCode) |
|
2199 { |
|
2200 TKeyResponse response = EKeyWasNotConsumed; |
|
2201 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2202 // GQF clarification |
|
2203 // In case irrespective Fn/shift key Text case should not be changed. |
|
2204 // Like Shift +Fn + Shift should not toggle the text case of the editor. |
|
2205 // Only Consecutive press of shift key should change the text case |
|
2206 if( iQwertyInputMode && (EEventKeyDown== aEventCode) && EPtiKeyboardHalfQwerty != KeyboardLayout()) |
|
2207 { |
|
2208 if( (iFnKeyManager->FnKeyState() == CAknFepFnKeyManager::EFnKeyNext) && |
|
2209 IsFlagSet(EFlagQwertyShiftMode)) |
|
2210 { |
|
2211 iFnKeyManager->ClearFnKeyState(); |
|
2212 iPtiEngine->SetCase((TPtiTextCase)EPtiCaseLower); |
|
2213 ClearFlag(EFlagQwertyShiftMode); |
|
2214 } |
|
2215 } |
|
2216 TInt language = iSharedDataInterface->InputTextLanguage(); |
|
2217 #endif |
|
2218 |
|
2219 if (iQwertyInputMode) |
|
2220 { |
|
2221 if ( !iInputCapabilities.FepAwareTextEditor() ) |
|
2222 { |
|
2223 response = EKeyWasNotConsumed; |
|
2224 } |
|
2225 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2226 else if (language == ELangTaiwanChinese|| |
|
2227 language == ELangHongKongChinese || |
|
2228 language == ELangPrcChinese) |
|
2229 { |
|
2230 if ( ( EPtiKeyboardHalfQwerty == KeyboardLayout() && FepUI() ) && |
|
2231 iPtiEngine && |
|
2232 ( EPtiCaseFnUpper == iPtiEngine->Case() || EPtiCaseFnLower == iPtiEngine->Case() ) && |
|
2233 ( aEventCode == EEventKeyDown || aEventCode == EEventKeyUp ) ) |
|
2234 { |
|
2235 // Ignore the KeyUp event |
|
2236 if( aEventCode == EEventKeyDown ) |
|
2237 { |
|
2238 FepUI()->HandleKeyL( EPtiKeyQwertyLeftShift, |
|
2239 EShortKeyPress ); |
|
2240 } |
|
2241 if( aEventCode == EEventKeyUp ) |
|
2242 { |
|
2243 ClearCcpuFlag(ECcpuStateCbaShown); |
|
2244 } |
|
2245 } |
|
2246 else |
|
2247 { |
|
2248 if ((iAknEditorFlags & EAknEditorFlagFindPane)&& (CAknFepFnKeyManager::EFnKeyNone ==FnKeyState())) |
|
2249 { |
|
2250 if (aEventCode == EEventKeyUp) |
|
2251 { |
|
2252 ClearCcpuFlag(ECcpuStateCbaShown); |
|
2253 if ( iKeyPressedDuringShift ) |
|
2254 { |
|
2255 iKeyPressedDuringShift = EFalse; |
|
2256 } |
|
2257 else |
|
2258 { |
|
2259 TryIncrementModeChineseQwertyL( iMode ); |
|
2260 } |
|
2261 ClearFlag( EFlagShiftKeyDepressed | EFlagNoActionDuringShiftKeyPress ); |
|
2262 } |
|
2263 else if(aEventCode == EEventKeyDown) |
|
2264 { |
|
2265 SetFlag(EFlagShiftKeyDepressed | EFlagNoActionDuringShiftKeyPress); |
|
2266 ClearFlag(EFlagNoActionDuringChrKeyPress); |
|
2267 } |
|
2268 return EKeyWasConsumed; |
|
2269 } |
|
2270 if (EPtiKeyboardHalfQwerty == KeyboardLayout()) |
|
2271 { |
|
2272 HandleShiftHalfQwertyChineseL(aEventCode); |
|
2273 } |
|
2274 else |
|
2275 { |
|
2276 HandleShiftQwertyChineseL(aEventCode); |
|
2277 } |
|
2278 } |
|
2279 } |
|
2280 #endif // ITI flag |
|
2281 else if (aEventCode == EEventKeyDown) |
|
2282 { |
|
2283 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2284 #ifdef __HALF_QWERTY_KEYPAD |
|
2285 if( ( EPtiKeyboardHalfQwerty == KeyboardLayout() && FepUI() ) && |
|
2286 iPtiEngine && EditorHasFreeSpace()) |
|
2287 { |
|
2288 if (IsFlagSet(CAknFepManager::EFlagInsideMultitapInlineEditingTransaction)) |
|
2289 { |
|
2290 iPtiEngine->CancelTimerActivity(); |
|
2291 } |
|
2292 if( EPtiCaseFnUpper == iPtiEngine->Case() || EPtiCaseFnLower == iPtiEngine->Case() ) |
|
2293 { |
|
2294 FepUI()->HandleKeyL( EPtiKeyQwertyLeftShift, |
|
2295 EShortKeyPress ); |
|
2296 iFnCharInsertedForShift = ETrue; |
|
2297 } |
|
2298 } |
|
2299 #endif // Half Qwerty flag |
|
2300 #endif // ITI flag |
|
2301 |
|
2302 // Shift key is pressed down. |
|
2303 SetFlag(EFlagShiftKeyDepressed | EFlagNoActionDuringShiftKeyPress); |
|
2304 ClearFlag(EFlagNoActionDuringChrKeyPress); |
|
2305 if ( IsFlagSet(EFlagQwertyShiftMode) && IsFlagSet(EFlagNoActionDuringShiftKeyPress) ) |
|
2306 { |
|
2307 ClearFlag(EFlagQwertyShiftMode | EFlagNoActionDuringShiftKeyPress); |
|
2308 // If long shift key press flag is set, then do not do manual case update. |
|
2309 if (!IsFlagSet(EFlagLongShiftKeyPress)) |
|
2310 { |
|
2311 iCaseMan->ManualCaseUpdate(); |
|
2312 } |
|
2313 } |
|
2314 else |
|
2315 { |
|
2316 if (!(iCurrentFepUI->IsValidShiftKeyPress())) |
|
2317 { |
|
2318 return EKeyWasConsumed; |
|
2319 } |
|
2320 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2321 #ifdef __HALF_QWERTY_KEYPAD |
|
2322 if(!iFnCharInsertedForShift) |
|
2323 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
2324 #endif //__HALF_QWERTY_KEYPAD |
|
2325 { |
|
2326 SetFlag(EFlagQwertyShiftMode); |
|
2327 } |
|
2328 |
|
2329 if(iShiftKeypressMonitor->IsActive()) |
|
2330 iShiftKeypressMonitor->Cancel(); |
|
2331 // Long press of shift key timer is activated. |
|
2332 iShiftKeypressMonitor->Start(EShiftKeyRepeatDelay, EShiftKeyRepeatDelay, |
|
2333 TCallBack(ResetShiftKeyMonitorCallback, this)); |
|
2334 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2335 // Shift kkey hack for GQF implementation. Need to check |
|
2336 // if it has any side effect. |
|
2337 if((iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyLock) |
|
2338 && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyForced) |
|
2339 && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyDown) |
|
2340 && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNext)) |
|
2341 #endif |
|
2342 UpdateIndicators(); |
|
2343 } |
|
2344 } |
|
2345 else if (aEventCode == EEventKeyUp) |
|
2346 { |
|
2347 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2348 #ifdef __HALF_QWERTY_KEYPAD |
|
2349 if( ( EPtiKeyboardHalfQwerty == KeyboardLayout() && FepUI() ) && |
|
2350 iPtiEngine ) |
|
2351 { |
|
2352 ClearCcpuFlag(ECcpuStateHashDown |
|
2353 | ECcpuStateHashKeyDeleteDone |
|
2354 | ECcpuStateChangeToPredictionMode); |
|
2355 if (IsCcpuFlagSet(ECcpuStateEdwinInSelectionMode)) |
|
2356 { |
|
2357 SetCcpuFlag(ECcpuStateSelectionEventPosted); |
|
2358 ClearCcpuFlag(ECcpuStateEdwinInSelectionMode); |
|
2359 SetFlag(EFlagLongShiftKeyPress); |
|
2360 |
|
2361 TKeyEvent ccpuStart = {0, EStdKeyLeftShift, 0, 0}; |
|
2362 CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, aEventCode); |
|
2363 } |
|
2364 if( CAknFepFnKeyManager::EFnKeyNone != FnKeyState()) |
|
2365 { |
|
2366 ClearFlag(EFlagQwertyShiftMode); |
|
2367 } |
|
2368 // iFnCharInsertedForShift = EFalse; |
|
2369 } |
|
2370 |
|
2371 #endif // Half Qwerty flag |
|
2372 #endif // ITI flag |
|
2373 |
|
2374 ClearFlag(EFlagShiftKeyDepressed); |
|
2375 ClearCcpuFlag(ECcpuStateCbaShown); |
|
2376 if ( !IsFlagSet(EFlagNoActionDuringShiftKeyPress) || |
|
2377 (IsFlagSet(EFlagNoActionDuringShiftKeyPress) && IsFlagSet(EFlagLongShiftKeyPress)) ) |
|
2378 { |
|
2379 ClearFlag(EFlagQwertyShiftMode); |
|
2380 } |
|
2381 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2382 #ifdef __HALF_QWERTY_KEYPAD |
|
2383 if( IsFlagSet(EFlagQwertyChrKeyDepressed) && IsFlagSet(EFlagNoActionDuringShiftKeyPress)) |
|
2384 { |
|
2385 #ifdef FF_DUAL_LANGUAGE_SUPPORT |
|
2386 // Currently dual language feature would work correctly for ITUT and Half Qwerty products |
|
2387 // Hence the dual language settings should also be displayed only for ITUT and Halfqwerty products |
|
2388 if(iKeyboardType == EPtiKeyboardHalfQwerty ) |
|
2389 LaunchDualLanguageSettingDialogL(); |
|
2390 else |
|
2391 #endif //FF_DUAL_LANGUAGE_SUPPORT |
|
2392 LaunchLanguagesPopupListL(); |
|
2393 ClearFlag(EFlagQwertyChrKeyDepressed|EFlagNoActionDuringChrKeyPress|EFlagNoActionDuringShiftKeyPress); |
|
2394 } |
|
2395 |
|
2396 #ifdef __SHIFT_KEY_LOOP |
|
2397 if( KeyboardLayout() == EPtiKeyboardHalfQwerty && |
|
2398 // looping does not happen for long key press |
|
2399 !IsFlagSet(EFlagLongShiftKeyPress) && |
|
2400 // looping does not happen in functionized state |
|
2401 iFnKeyManager->FnKeyState() == CAknFepFnKeyManager::EFnKeyNone && |
|
2402 // looping happens only when no action |
|
2403 // has happened when the shift key has been pressed |
|
2404 IsFlagSet(EFlagNoActionDuringShiftKeyPress) && !iFnCharInsertedForShift ) |
|
2405 { |
|
2406 HandleKeyEventL( EStdKeyLeftShift, EShortKeyPress ); |
|
2407 ClearFlag(EFlagQwertyShiftMode); |
|
2408 } |
|
2409 iFnCharInsertedForShift = EFalse; |
|
2410 #endif //__SHIFT_KEY_LOOP |
|
2411 #endif //__HALF_QWERTY_KEYPAD |
|
2412 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
2413 if (IsFlagSet(EFlagLongShiftKeyPress)) //long keypress up |
|
2414 { |
|
2415 ClearFlag(EFlagLongShiftKeyPress); |
|
2416 } |
|
2417 else // short keypress up |
|
2418 { |
|
2419 iShiftKeypressMonitor->Cancel(); |
|
2420 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2421 #ifdef __HALF_QWERTY_KEYPAD |
|
2422 #ifdef __SHIFT_KEY_LOOP |
|
2423 // Cancel multitap timer |
|
2424 |
|
2425 if( iPtiEngine != NULL ) |
|
2426 { |
|
2427 iPtiEngine->CancelTimerActivity(); |
|
2428 } |
|
2429 #endif //__SHIFT_KEY_LOOP |
|
2430 #endif //__HALF_QWERTY_KEYPAD |
|
2431 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
2432 } |
|
2433 ClearFlag( EFlagNoActionDuringShiftKeyPress ); |
|
2434 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2435 // Shift kkey hack for GQF implementation. Need to check |
|
2436 // if it has any side effect. |
|
2437 if((iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyLock) |
|
2438 && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyForced) |
|
2439 && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyDown) |
|
2440 &&(iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNext)) |
|
2441 #endif |
|
2442 UpdateIndicators(); |
|
2443 } |
|
2444 } |
|
2445 else |
|
2446 { |
|
2447 if ( !iInputCapabilities.FepAwareTextEditor() && (!iCandidatePopup)) |
|
2448 { |
|
2449 response = EKeyWasNotConsumed; |
|
2450 } |
|
2451 else if (aEventCode == EEventKeyDown) |
|
2452 { |
|
2453 if (Japanese() && iInputCapabilities.FepAwareTextEditor()) |
|
2454 { |
|
2455 if (!(iCurrentFepUI->IsValidShiftKeyPress())) |
|
2456 { |
|
2457 return EKeyWasConsumed; |
|
2458 } |
|
2459 TryCloseUiL(); |
|
2460 } |
|
2461 |
|
2462 // Shift key is pressed down but no any other key is pressed. |
|
2463 ClearCcpuFlag(ECcpuSupressEditMenuFromShiftUp); |
|
2464 SetFlag(EFlagShiftKeyDepressed | EFlagNoActionDuringShiftKeyPress); |
|
2465 if ( !(iAknEditorFlags & EAknEditorFlagNoLRNavigation)) |
|
2466 { |
|
2467 // Cancel the timer first if active. |
|
2468 // EEventKeyUp is not sent always for shift key during debugging on emulator. |
|
2469 iShiftKeypressMonitor->Cancel(); |
|
2470 // Long press of shift key timer is activated. |
|
2471 iShiftKeypressMonitor->Start(EShiftKeyRepeatDelay, EShiftKeyRepeatDelay, |
|
2472 TCallBack(ResetShiftKeyMonitorCallback, this)); |
|
2473 } |
|
2474 if ( IsFlagSet(EFlagInsideInlineEditingTransaction) && |
|
2475 WesternPredictive() && iFepManState == EAknFepStateUIActive ) |
|
2476 { |
|
2477 TryRemoveNoMatchesIndicatorL(); |
|
2478 UpdateCbaL(NULL); |
|
2479 } |
|
2480 } |
|
2481 else if (aEventCode == EEventKeyUp) |
|
2482 { |
|
2483 ClearFlag(EFlagShiftKeyDepressed); |
|
2484 ClearCcpuFlag(ECcpuStateCbaShown); |
|
2485 if (IsFlagSet(EFlagLongShiftKeyPress)) //long keypress up |
|
2486 { |
|
2487 ClearFlag(EFlagLongShiftKeyPress | EFlagNoActionDuringShiftKeyPress); |
|
2488 // Shift long key press timer started, in between release of |
|
2489 // Shift key should cancel active long shift key timer. |
|
2490 iShiftKeypressMonitor->Cancel(); |
|
2491 if (!iInputCapabilities.FepAwareTextEditor()) |
|
2492 { |
|
2493 TKeyEvent ccpuStart = {0, EStdKeyLeftShift, 0, 0}; |
|
2494 CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKeyUp); |
|
2495 } |
|
2496 } |
|
2497 else // short keypress up |
|
2498 { |
|
2499 iShiftKeypressMonitor->Cancel(); |
|
2500 if (!(iAknEditorFlags & EAknEditorFlagSupressShiftMenu) && |
|
2501 IsFlagSet(EFlagNoActionDuringShiftKeyPress) && //iCurrentFepUI->IsValidShiftKeyPress() && |
|
2502 !IsCcpuFlagSet(ECcpuSupressEditMenuFromShiftUp)) |
|
2503 { |
|
2504 // Shift key is released before any other key is pressed. |
|
2505 // Edit menu is launched if it is allowed. |
|
2506 ClearFlag(EFlagNoActionDuringShiftKeyPress); |
|
2507 //Check if pointer event drag is not there before launch of edit menu. |
|
2508 if( !IsExtendedFlagSet(EExtendedFlagPointerEventTypeEDrag)) |
|
2509 { |
|
2510 LaunchSelectModeMenuL(); |
|
2511 } |
|
2512 |
|
2513 if (iInputCapabilities.FepAwareTextEditor()) |
|
2514 { |
|
2515 response = EKeyWasConsumed; |
|
2516 } |
|
2517 } |
|
2518 } |
|
2519 } |
|
2520 } |
|
2521 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2522 if (aEventCode == EEventKeyUp && |
|
2523 EPtiKeyboardQwerty4x10 == KeyboardLayout() && FepUI()) |
|
2524 { |
|
2525 FepUI()->HandleKeyL(EKeyLeftShift, EShortKeyPress); |
|
2526 } |
|
2527 #endif |
|
2528 return response; |
|
2529 } |
|
2530 |
|
2531 TKeyResponse CAknFepManager::HandleThai0KeyEvent(TEventCode aEventCode, TKeyPressLength aLength, |
|
2532 TBool& aThai0KeyHandling) |
|
2533 { |
|
2534 TKeyResponse response = EKeyWasNotConsumed; |
|
2535 aThai0KeyHandling = EFalse; |
|
2536 if(iQwertyInputMode) |
|
2537 { |
|
2538 return response; |
|
2539 } |
|
2540 |
|
2541 if ( iLanguageCapabilities.iInputLanguageCode == ELangThai && |
|
2542 iMode != ENumber && iMode != ENativeNumber ) |
|
2543 { |
|
2544 if (!IsPredictive()) |
|
2545 { |
|
2546 if (aEventCode != EEventKeyUp) |
|
2547 { |
|
2548 response = EKeyWasConsumed; |
|
2549 if ( aLength == ELongKeyPress) |
|
2550 { |
|
2551 if (!iLongThai0Key) |
|
2552 { |
|
2553 iLongThai0Key = ETrue; |
|
2554 response = EKeyWasNotConsumed; // 0 to editor |
|
2555 aThai0KeyHandling = ETrue; |
|
2556 } |
|
2557 } |
|
2558 } |
|
2559 |
|
2560 else if (aEventCode == EEventKeyUp) |
|
2561 { |
|
2562 if (iLongThai0Key) |
|
2563 { |
|
2564 iLongThai0Key = EFalse; |
|
2565 response = EKeyWasConsumed; |
|
2566 } |
|
2567 else |
|
2568 { |
|
2569 response = EKeyWasNotConsumed; // Show Thai 0 key SCT |
|
2570 aThai0KeyHandling = ETrue; |
|
2571 } |
|
2572 } |
|
2573 } |
|
2574 } |
|
2575 return response; |
|
2576 } |
|
2577 |
|
2578 TBool CAknFepManager::HandleQwertyChrKeyEventL(TEventCode aEventCode) |
|
2579 { |
|
2580 TBool response = EFalse; |
|
2581 if ( !iQwertyInputMode || !iInputCapabilities.FepAwareTextEditor() ) |
|
2582 { |
|
2583 return response; |
|
2584 } |
|
2585 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2586 if(IsFlagSet(EFlagShiftKeyDepressed)) |
|
2587 { |
|
2588 iKeyPressedDuringShift = ETrue; |
|
2589 } |
|
2590 #ifdef __HALF_QWERTY_KEYPAD |
|
2591 |
|
2592 if( (aEventCode == EEventKeyUp) ) |
|
2593 { |
|
2594 ClearFlag(EFlagQwertyChrKeyDepressed); |
|
2595 } |
|
2596 // Handle shift for Half Qwerty seperately |
|
2597 if( ( EPtiKeyboardHalfQwerty == KeyboardLayout() && FepUI() ) && |
|
2598 iPtiEngine /*&& |
|
2599 ( aEventCode == EEventKeyDown || aEventCode == EEventKeyUp ) */ && !IsFlagSet(EFlagShiftKeyDepressed)) |
|
2600 { |
|
2601 |
|
2602 if( HandleChrKeyForHalfQwertyL(aEventCode) ) |
|
2603 { |
|
2604 return ETrue; |
|
2605 } |
|
2606 } |
|
2607 #endif // Half Qwerty flag |
|
2608 // This part of code for error fixing. |
|
2609 // whenever fep is Fnupper state, press of "CHR" key |
|
2610 // always launch SCT table. |
|
2611 if( (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNone)&& |
|
2612 (IsFlagSet(EFlagQwertyShiftMode) || IsFlagSet(EFlagLongShiftKeyPress))) |
|
2613 { |
|
2614 ClearFlag(EFlagNoActionDuringShiftKeyPress | EFlagLongShiftKeyPress | EFlagShiftKeyDepressed | EFlagQwertyShiftMode); |
|
2615 iShiftKeypressMonitor->Cancel(); |
|
2616 SetFlag(EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress); |
|
2617 return response; |
|
2618 } |
|
2619 |
|
2620 |
|
2621 #endif // ITI flag |
|
2622 if (aEventCode == EEventKeyDown) |
|
2623 { |
|
2624 SetFlag(EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress); |
|
2625 response = EFalse; |
|
2626 |
|
2627 if (IsFeatureSupportedJapanese() || |
|
2628 ( IsChineseInputLanguage() |
|
2629 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2630 && KeyboardLayout() == EPtiKeyboardHalfQwerty |
|
2631 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
2632 ) ) |
|
2633 { |
|
2634 // start timer for Chr key long pressing |
|
2635 iChrKeypressMonitor->Start(EChrKeyRepeatDelay, EChrKeyRepeatDelay, |
|
2636 TCallBack(HandleChrKeyMonitorCallback, this)); |
|
2637 } |
|
2638 } |
|
2639 else if (aEventCode == EEventKeyUp) |
|
2640 { |
|
2641 if (iChrKeypressMonitor->IsActive()) |
|
2642 { |
|
2643 iChrKeypressMonitor->Cancel(); |
|
2644 } |
|
2645 |
|
2646 if (IsFlagSet(EFlagShiftKeyDepressed) && IsFlagSet(EFlagNoActionDuringChrKeyPress) |
|
2647 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2648 || |
|
2649 IsFlagSet(EFlagQwertyShiftMode) |
|
2650 #endif |
|
2651 ) |
|
2652 { |
|
2653 ClearFlag(EFlagNoActionDuringShiftKeyPress | EFlagLongShiftKeyPress | |
|
2654 EFlagShiftKeyDepressed | EFlagQwertyShiftMode |EFlagQwertyChrKeyDepressed); |
|
2655 iShiftKeypressMonitor->Cancel(); |
|
2656 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2657 iKeyPressedDuringShift = EFalse; |
|
2658 #endif |
|
2659 UpdateIndicators(); |
|
2660 // In Japanese variant, the selecting input language is unnecessary. |
|
2661 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2662 if (EPtiKeyboardQwerty4x10 == KeyboardLayout() || EPtiKeyboardHalfQwerty == KeyboardLayout()) |
|
2663 { |
|
2664 if (!IsFeatureSupportedJapanese() && iCurrentFepUI->IsValidShiftKeyPress()) |
|
2665 { |
|
2666 #ifdef FF_DUAL_LANGUAGE_SUPPORT |
|
2667 // Currently dual language feature would work correctly for ITUT and Half Qwerty products |
|
2668 // Hence the dual language settings should also be displayed only for ITUT and Halfqwerty products |
|
2669 if(iKeyboardType == EPtiKeyboard12Key || iKeyboardType == EPtiKeyboardHalfQwerty ) |
|
2670 LaunchDualLanguageSettingDialogL(); |
|
2671 else |
|
2672 #endif //FF_DUAL_LANGUAGE_SUPPORT |
|
2673 LaunchLanguagesPopupListL(); |
|
2674 } |
|
2675 } |
|
2676 else |
|
2677 { |
|
2678 #endif |
|
2679 if (!IsFeatureSupportedJapanese() && iCurrentFepUI->IsValidShiftKeyPress()) |
|
2680 { |
|
2681 LaunchLanguagesPopupListL(); |
|
2682 } |
|
2683 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2684 } |
|
2685 #endif |
|
2686 } |
|
2687 else if (IsFlagSet(EFlagNoActionDuringChrKeyPress)) |
|
2688 { |
|
2689 // pass key to Chinese UI manager in Chinese qwerty input for sct table |
|
2690 if(IsChineseInputLanguage() && iMode != ELatin) |
|
2691 { |
|
2692 FepUI()->HandleKeyL(EStdKeyLeftFunc, EShortKeyPress); |
|
2693 ClearFlag( EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress ); |
|
2694 } |
|
2695 else if (Japanese()) |
|
2696 { |
|
2697 if (iMode != EHiragana) |
|
2698 { |
|
2699 // Commit characters |
|
2700 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2701 // Set the iSupressCursorMoveToEndChrKeyPressed when cursor is in |
|
2702 // between two words and SCT is launched |
|
2703 iSupressCursorMoveToEndChrKeyPressed = ETrue; |
|
2704 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
2705 HandleChangeInFocus(); |
|
2706 LaunchSpecialCharacterTableL(); |
|
2707 } |
|
2708 } |
|
2709 else if ( IsAbleToLaunchSCT() ) |
|
2710 { |
|
2711 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2712 // Set the iSupressCursorMoveToEndChrKeyPressed when cursor is in |
|
2713 // between two words and SCT is launched |
|
2714 iSupressCursorMoveToEndChrKeyPressed = ETrue; |
|
2715 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
2716 HandleChangeInFocus(); |
|
2717 LaunchSpecialCharacterTableL(); |
|
2718 } |
|
2719 else if(IsFlagSet(EFlagQwertyChrKeyDepressed)) |
|
2720 { |
|
2721 ClearFlag(EFlagQwertyChrKeyDepressed); |
|
2722 } |
|
2723 } |
|
2724 else |
|
2725 { |
|
2726 FepUI()->ExpireMultitapTimer(); |
|
2727 ClearFlag(EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress); |
|
2728 |
|
2729 response = ETrue; |
|
2730 } |
|
2731 } |
|
2732 return response; |
|
2733 } |
|
2734 |
|
2735 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2736 #ifdef __HALF_QWERTY_KEYPAD |
|
2737 TKeyResponse CAknFepManager::HandleChrKeyForHalfQwertyL( TEventCode aEventCode) |
|
2738 { |
|
2739 if ((IsFlagSet(CAknFepManager::EFlagInsideMultitapInlineEditingTransaction)) && !(EPtiCaseFnUpper == iPtiEngine->Case() || EPtiCaseFnLower == iPtiEngine->Case())) |
|
2740 { |
|
2741 iPtiEngine->CancelTimerActivity(); |
|
2742 } |
|
2743 // in functionized mode the chr key is mapped to specific chars |
|
2744 // and should therefore be handled by the states |
|
2745 if ( EPtiCaseFnUpper == iPtiEngine->Case() || EPtiCaseFnLower == iPtiEngine->Case() || IsReverseFnkeyInput()) |
|
2746 { |
|
2747 if( aEventCode == EEventKeyDown && ( EditorHasFreeSpace() || |
|
2748 IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ))) |
|
2749 { |
|
2750 FepUI()->HandleKeyL( EStdKeyLeftFunc, |
|
2751 EShortKeyPress ); |
|
2752 } |
|
2753 return EKeyWasConsumed; |
|
2754 } |
|
2755 // in non-functionized predictive mode, |
|
2756 // a long key press of the chr key should produce the SCT |
|
2757 // a short key press should produce the candidate list |
|
2758 if ( ( iWesternPredictive || IsChineseInputLanguage() ) /*&& |
|
2759 ( iMode != EPinyin && iMode != EStroke && iMode != EZhuyin )*/ ) |
|
2760 { |
|
2761 |
|
2762 if(!iChrKeypressMonitor->IsActive()) |
|
2763 { |
|
2764 // this monitors long key presses of chr key |
|
2765 // the framework does not give us the iRepeats info |
|
2766 // for chr key for some reason |
|
2767 iChrKeypressMonitor->Start(EHalfQwertyChrKeyRepeatDelay, EHalfQwertyChrKeyRepeatDelay, |
|
2768 TCallBack(HandleChrKeyMonitorCallback, this)); |
|
2769 } |
|
2770 |
|
2771 if( aEventCode != EEventKeyUp ) |
|
2772 { |
|
2773 SetFlag( EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress); |
|
2774 return EKeyWasConsumed; |
|
2775 } |
|
2776 |
|
2777 if ( aEventCode == EEventKeyUp && IsFlagSet(EFlagNoActionDuringChrKeyPress) ) |
|
2778 { |
|
2779 if(!iChrLongKeyPress ) |
|
2780 { |
|
2781 // if we have come here it's a short press |
|
2782 // the flag EFlagNoActionDuringChrKeyPress is cleared in the timer callback |
|
2783 if(!IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) || IsFlagSet(CAknFepManager::EFlagInsideMultitapInlineEditingTransaction)) |
|
2784 { |
|
2785 // when not in inline editing mode, |
|
2786 // chr key should produce the SCT |
|
2787 if ( !IsChineseInputLanguage() ) |
|
2788 { |
|
2789 LaunchSpecialCharacterTableL(); |
|
2790 } |
|
2791 else |
|
2792 { |
|
2793 FepUI()->HandleKeyL( EStdKeyLeftFunc, |
|
2794 EShortKeyPress ); |
|
2795 } |
|
2796 } |
|
2797 ClearFlag( EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress); |
|
2798 |
|
2799 iChrKeypressMonitor->Cancel(); |
|
2800 |
|
2801 TInt wordToFocus = KWordToFocusInCandidateList; |
|
2802 TInt numberOfCandidates = iPtiEngine->NumberOfCandidates(); |
|
2803 if (numberOfCandidates > 1) |
|
2804 { |
|
2805 wordToFocus = KWordToFocusInCandidateList; |
|
2806 } |
|
2807 LaunchCandidatePopupListL(wordToFocus); |
|
2808 |
|
2809 return EKeyWasConsumed; |
|
2810 } |
|
2811 else |
|
2812 { |
|
2813 |
|
2814 |
|
2815 // Cancel the timer |
|
2816 iChrKeypressMonitor->Cancel(); |
|
2817 |
|
2818 // commit the characters |
|
2819 HandleChangeInFocus(); |
|
2820 |
|
2821 // Clear the chr key depressed flag |
|
2822 ClearFlag( EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress); |
|
2823 // launch the special character table |
|
2824 iChrLongKeyPress = EFalse; |
|
2825 |
|
2826 if ( IsAbleToLaunchSCT() ) |
|
2827 { |
|
2828 LaunchSpecialCharacterTableL(); |
|
2829 } |
|
2830 |
|
2831 return EKeyWasConsumed; |
|
2832 } |
|
2833 } |
|
2834 else |
|
2835 { |
|
2836 return EKeyWasNotConsumed; |
|
2837 } |
|
2838 } |
|
2839 return EKeyWasNotConsumed; |
|
2840 } |
|
2841 #endif //__HALF_QWERTY_KEYPAD |
|
2842 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
2843 |
|
2844 TKeyResponse CAknFepManager::HandleQwertyControlKeyEventL(const TKeyEvent& aKeyEvent, |
|
2845 TEventCode aEventCode) |
|
2846 { |
|
2847 TKeyResponse response = EKeyWasConsumed; |
|
2848 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2849 if (EPtiKeyboardQwerty4x10 == KeyboardLayout()) |
|
2850 { |
|
2851 if( iCurrentFepUI && !iCurrentFepUI->IsValidShiftKeyPress() && aEventCode == EEventKeyUp ) |
|
2852 { |
|
2853 FepUI()->HandleKeyL(EKeyLeftCtrl, EShortKeyPress); |
|
2854 return EKeyWasConsumed; |
|
2855 } |
|
2856 } |
|
2857 #endif |
|
2858 |
|
2859 // need to ignore [Ctrl] + the following simbol keys |
|
2860 // because FEP doesn't consume [Ctrl] combination keys. |
|
2861 if (Japanese() && aEventCode == EEventKey) |
|
2862 { |
|
2863 TBool comsume = EFalse; |
|
2864 switch (aKeyEvent.iScanCode) |
|
2865 { |
|
2866 case EStdKeyNkpPlus: |
|
2867 case EPtiKeyQwertyPlus: |
|
2868 case EPtiKeyQwertyMinus: |
|
2869 case EPtiKeyQwertyComma: |
|
2870 case EPtiKeyQwertySemicolon: |
|
2871 case EPtiKeyQwertyFullstop: |
|
2872 case EPtiKeyQwertyHash: |
|
2873 case EPtiKeyQwertySlash: |
|
2874 case EPtiKeyQwertyApostrophe: |
|
2875 case EPtiKeyQwertySpace: |
|
2876 comsume = ETrue; |
|
2877 break; |
|
2878 default: |
|
2879 break; |
|
2880 } |
|
2881 if (comsume) |
|
2882 { |
|
2883 return EKeyWasConsumed; |
|
2884 } |
|
2885 } |
|
2886 |
|
2887 #ifdef RD_SCALABLE_UI_V2 |
|
2888 if (aKeyEvent.iModifiers & EModifierCtrl |
|
2889 && (aKeyEvent.iScanCode == EPtiKeyQwertyC || aKeyEvent.iScanCode == EPtiKeyQwertyV || |
|
2890 aKeyEvent.iScanCode == EPtiKeyQwertyX)) |
|
2891 { |
|
2892 SendEventsToPluginManL( EPluginSyncFepAwareText ); |
|
2893 // Let copy / cut / paste events to flow through. |
|
2894 response = EKeyWasNotConsumed; |
|
2895 } |
|
2896 #endif |
|
2897 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2898 // Predictive QWERTY (XT9) changes ----> |
|
2899 // Ctrl combinations which affect the editor state, must commit the current inline edit. |
|
2900 // Otherwise the currently active inline word might be lost. |
|
2901 if ( iWesternPredictive && iQwertyInputMode && IsFlagSet(EFlagInsideInlineEditingTransaction) ) |
|
2902 { |
|
2903 switch (aKeyEvent.iScanCode) |
|
2904 { |
|
2905 case EStdKeyUpArrow: |
|
2906 case EStdKeyDownArrow: |
|
2907 case EStdKeyLeftArrow: |
|
2908 case EStdKeyRightArrow: |
|
2909 case EPtiKeyQwertyC: |
|
2910 case EPtiKeyQwertyV: |
|
2911 case EPtiKeyQwertyX: |
|
2912 case EPtiKeyQwertyA: |
|
2913 iPtiEngine->CommitCurrentWord(); |
|
2914 TryCloseUiL(); |
|
2915 break; |
|
2916 default: |
|
2917 break; |
|
2918 } |
|
2919 } |
|
2920 // Predictive QWERTY (XT9) changes <---- |
|
2921 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
2922 |
|
2923 if (aEventCode != EEventKeyUp) |
|
2924 { |
|
2925 return EKeyWasNotConsumed; |
|
2926 } |
|
2927 |
|
2928 if(iQwertyInputMode) |
|
2929 { |
|
2930 |
|
2931 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2932 // Query ptiEngine to know if the scancode maps to EPtiKeyQwertyC, |
|
2933 // EPtiKeyQwertyV or EPtiKeyQwertyX. |
|
2934 // we should not always rely on scancode as products may change it, while |
|
2935 // still having the 'C', 'V' and 'X' mappings |
|
2936 |
|
2937 TBuf<32> mapData; |
|
2938 iPtiEngine->MappingDataForKey((TPtiKey)aKeyEvent.iScanCode, mapData, EPtiCaseUpper); |
|
2939 |
|
2940 if( mapData.Length() > 0 ) |
|
2941 { |
|
2942 if( mapData[0] == EPtiKeyQwertyC || mapData[0] == EPtiKeyQwertyV || |
|
2943 mapData[0] == EPtiKeyQwertyX ) |
|
2944 { |
|
2945 // Let copy / cut / paste events to flow through. |
|
2946 response = EKeyWasNotConsumed; |
|
2947 } |
|
2948 } |
|
2949 #else |
|
2950 if (aKeyEvent.iScanCode == EPtiKeyQwertyC || aKeyEvent.iScanCode == EPtiKeyQwertyV || |
|
2951 aKeyEvent.iScanCode == EPtiKeyQwertyX) |
|
2952 { |
|
2953 // Let copy / cut / paste events to flow through. |
|
2954 response = EKeyWasNotConsumed; |
|
2955 } |
|
2956 #endif |
|
2957 |
|
2958 |
|
2959 if (aKeyEvent.iScanCode == EStdKeyRightShift || aKeyEvent.iScanCode == EStdKeyLeftShift |
|
2960 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
2961 || |
|
2962 IsFlagSet(EFlagQwertyShiftMode) |
|
2963 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
2964 ) |
|
2965 { |
|
2966 if(!iInputCapabilities.FepAwareTextEditor()) |
|
2967 { |
|
2968 response = EKeyWasNotConsumed; |
|
2969 } |
|
2970 else |
|
2971 { |
|
2972 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
2973 if ( iMode != ENumber && iMode!= ENativeNumber ) |
|
2974 { |
|
2975 iModeBefore = iMode; |
|
2976 } |
|
2977 #ifdef RD_HINDI_PHONETIC_INPUT |
|
2978 |
|
2979 if(iSharedDataInterface->InputTextLanguage() == KLangHindiPhonetic) |
|
2980 { |
|
2981 TryChangePhoneticModeL(); |
|
2982 } |
|
2983 else |
|
2984 { |
|
2985 #endif |
|
2986 if((!(IsOnlyNumericPermitted() || |
|
2987 (iAknEditorFlags & EAknEditorFlagLatinInputModesOnly))) && |
|
2988 TAknFepUiIndicInputManager::IsIndicLangauge( |
|
2989 (TLanguage)iSharedDataInterface->InputTextLanguage())) |
|
2990 { |
|
2991 if(iLanguageCapabilities.iInputLanguageCode == ELangEnglish) |
|
2992 { |
|
2993 ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage()); |
|
2994 } |
|
2995 else |
|
2996 { |
|
2997 ChangeInputLanguageL(ELangEnglish); |
|
2998 } |
|
2999 } |
|
3000 else |
|
3001 { |
|
3002 TryIncrementModeChineseQwertyL(iMode); |
|
3003 } |
|
3004 #ifdef RD_HINDI_PHONETIC_INPUT |
|
3005 } |
|
3006 #endif |
|
3007 } |
|
3008 ClearFlag(EFlagShiftKeyDepressed); |
|
3009 if ( !IsFlagSet(EFlagNoActionDuringShiftKeyPress) || |
|
3010 (IsFlagSet(EFlagNoActionDuringShiftKeyPress) && IsFlagSet(EFlagLongShiftKeyPress)) ) |
|
3011 { |
|
3012 ClearFlag(EFlagQwertyShiftMode); |
|
3013 } |
|
3014 if (IsFlagSet(EFlagLongShiftKeyPress)) //long keypress up |
|
3015 { |
|
3016 ClearFlag(EFlagLongShiftKeyPress); |
|
3017 } |
|
3018 else // short keypress up |
|
3019 { |
|
3020 iShiftKeypressMonitor->Cancel(); |
|
3021 } |
|
3022 ClearFlag( EFlagNoActionDuringShiftKeyPress ); |
|
3023 UpdateIndicators(); |
|
3024 } |
|
3025 else if(aKeyEvent.iScanCode == EStdKeySpace) // switch between last used Chinese input mode and English |
|
3026 { |
|
3027 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3028 // Predictive QWERTY (XT9) changes ----> |
|
3029 // Toggle the predictive mode with ctrl+space |
|
3030 if ( (iPermittedInputModes & EAknEditorTextInputMode) && |
|
3031 !(iAknEditorFlags & EAknEditorFlagNoT9) && |
|
3032 iMode == ELatin && |
|
3033 iLanguageCapabilities.iSupportsWesternQwertyPredictive ) |
|
3034 { |
|
3035 if (iWesternPredictive) |
|
3036 { |
|
3037 //ProcessCommandL(EAknCmdT9PredictiveT9Off); |
|
3038 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
3039 //HandleChangeInFocus(); |
|
3040 if (iMode != ELatin) |
|
3041 { |
|
3042 TryChangeModeL(ELatin); |
|
3043 } |
|
3044 else |
|
3045 { |
|
3046 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3047 RemoveSuggestedAdvanceCompletionL(); |
|
3048 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
3049 CommitInlineEditL(); |
|
3050 } |
|
3051 SetCcpuFlag(ECcpuStataCommitPredictiveWord); |
|
3052 SetWesternPredictive(EFalse); |
|
3053 HandleChangeInFocus(); |
|
3054 } |
|
3055 else |
|
3056 { |
|
3057 //ProcessCommandL(EAknCmdMultitapPredictiveT9On); |
|
3058 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
3059 //HandleChangeInFocus(); |
|
3060 SetWesternPredictive(ETrue); |
|
3061 TryCloseUiL(); |
|
3062 TryChangeModeL(ELatin); |
|
3063 } |
|
3064 // Reset the function key state,if predictive mode is cahnged. |
|
3065 if (iFnKeyManager) |
|
3066 { |
|
3067 iFnKeyManager->ClearFnKeyState(); |
|
3068 } |
|
3069 } |
|
3070 else // Predictive QWERTY (XT9) changes <---- |
|
3071 { |
|
3072 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
3073 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
3074 if(iMode != iModeBefore && iMode != ENumber && iMode != ENativeNumber ) |
|
3075 { |
|
3076 TInt mode = iMode; |
|
3077 if(iMode != ELatin && iModeBefore != ELatin) // more than one Chinese input modes |
|
3078 { |
|
3079 TryChangeModeL(ELatin); |
|
3080 } |
|
3081 else |
|
3082 { |
|
3083 TryChangeToModeBeforeL(); |
|
3084 } |
|
3085 iModeBefore = mode; // deposit previous input mode |
|
3086 } |
|
3087 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3088 } |
|
3089 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
3090 } |
|
3091 #ifdef RD_INTELLIGENT_TEXT_INPUT //// Predictive QWERTY (XT9) changes: open the edit menu with Fn+space ----> |
|
3092 else if (aKeyEvent.iScanCode == EStdKeyLeftFunc) |
|
3093 { |
|
3094 LaunchSelectModeMenuL(); |
|
3095 } // Predictive QWERTY (XT9) changes <---- |
|
3096 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
3097 } |
|
3098 |
|
3099 if (IsCcpuFlagSet(ECcpuStatePosted)) |
|
3100 { |
|
3101 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3102 // Query ptiEngine to know if the scancode maps to EPtiKeyQwertyC, |
|
3103 // EPtiKeyQwertyV or EPtiKeyQwertyX. |
|
3104 // we should not always rely on scancode as products may change it, while |
|
3105 // still having the 'C', 'V' and 'X' mappings |
|
3106 |
|
3107 TBuf<32> mapData; |
|
3108 iPtiEngine->MappingDataForKey((TPtiKey)aKeyEvent.iScanCode, mapData, EPtiCaseUpper); |
|
3109 |
|
3110 if( mapData.Length() > 0 ) |
|
3111 { |
|
3112 if( mapData[0] == EPtiKeyQwertyC || mapData[0] == EPtiKeyQwertyX ) |
|
3113 { |
|
3114 // Let copy / cut events to flow through. |
|
3115 response = EKeyWasNotConsumed; |
|
3116 } |
|
3117 } |
|
3118 #else |
|
3119 if (aKeyEvent.iScanCode == EPtiKeyQwertyC || aKeyEvent.iScanCode == EPtiKeyQwertyX) |
|
3120 { |
|
3121 // Let copy / cut events to flow through. |
|
3122 response = EKeyWasNotConsumed; |
|
3123 } |
|
3124 #endif |
|
3125 ResetCcpuFlags(); |
|
3126 } |
|
3127 |
|
3128 /* if (EPtiKeyboardQwerty4x10 == KeyboardLayout()) |
|
3129 { |
|
3130 FepUI()->HandleKeyL(EKeyLeftCtrl, EShortKeyPress); |
|
3131 }*/ |
|
3132 |
|
3133 //The default value of response is EKeyWasConsumed. So in some case, fep don¡¯t |
|
3134 //do anything, but it return Consumed. |
|
3135 //This make app miss the event EEventKeyUp. |
|
3136 //As per the logic of the function, the combine about ctrl key including: |
|
3137 // Ctrl key + C; Ctrl key + V; Ctrl + X |
|
3138 // Ctrl key + Shift key |
|
3139 // Ctrl key + space |
|
3140 // Ctrl key + Function key |
|
3141 //In above cases, it return EKeyWasConsumed, it is correct. |
|
3142 //The function for Ctrl Key as pressing the only one key ctrl at one time is to |
|
3143 //do something if the flag EFlagQwertyShiftMode is set |
|
3144 //In this case, it return EKeyWasConsumed, it is correct. |
|
3145 //In other case, it should return EKeyWasNotConsumed |
|
3146 if( ( aKeyEvent.iScanCode == EStdKeyRightCtrl || aKeyEvent.iScanCode==EStdKeyLeftCtrl ) |
|
3147 && !IsFlagSet(EFlagQwertyShiftMode) ) |
|
3148 { |
|
3149 response = EKeyWasNotConsumed; |
|
3150 } |
|
3151 |
|
3152 return response; |
|
3153 } |
|
3154 |
|
3155 TBool CAknFepManager::HandleQwertyKeyEventL(const TKeyEvent& aKeyEvent, TKeyResponse& aResponse) |
|
3156 { |
|
3157 TBool keyHandled = EFalse; |
|
3158 aResponse = EKeyWasNotConsumed; |
|
3159 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3160 if(iKeyBackSpaceHit && (EKeyBackspace != aKeyEvent.iCode || EStdKeyBackspace != aKeyEvent.iScanCode)) |
|
3161 iKeyBackSpaceHit = 0; |
|
3162 |
|
3163 if(IsMfneEditor()) |
|
3164 { |
|
3165 // multi-field editors need the key event to be sent to them directly |
|
3166 // therefore not consuming it here |
|
3167 return EFalse; |
|
3168 } |
|
3169 |
|
3170 if(IsFlagSet(EFlagShiftKeyDepressed)) |
|
3171 { |
|
3172 iKeyPressedDuringShift = ETrue; |
|
3173 } |
|
3174 // This part of code for error fixing |
|
3175 // After short pressing of Fn/shift, if user press enter key, delete key |
|
3176 // it will reset the shift key and Fn key state. |
|
3177 if( EKeyEnter == aKeyEvent.iCode || EStdKeyEnter == aKeyEvent.iScanCode|| |
|
3178 EKeyBackspace == aKeyEvent.iCode || EStdKeyBackspace == aKeyEvent.iScanCode) |
|
3179 { |
|
3180 // if the shift key is still depressed, |
|
3181 // don't clear the qwerty shift mode |
|
3182 if(!IsFlagSet(EFlagShiftKeyDepressed)) |
|
3183 ClearFlag(EFlagQwertyShiftMode); |
|
3184 if( iFnKeyManager->FnKeyState() == CAknFepFnKeyManager::EFnKeyNext ) |
|
3185 { |
|
3186 iFnKeyManager->ClearFnKeyState(); |
|
3187 } |
|
3188 } |
|
3189 #endif |
|
3190 |
|
3191 if ( iQwertyInputMode && |
|
3192 ( EditorHasFreeSpace() || |
|
3193 #ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ |
|
3194 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3195 KeyEventWillReplaceCharacter( aKeyEvent ) || |
|
3196 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
3197 #endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ |
|
3198 ( Japanese() && iFepManState == EAknFepStateUIActive ) ) ) |
|
3199 { |
|
3200 if (IsFlagSet(EFlagPassNextKey)) |
|
3201 { |
|
3202 #ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ |
|
3203 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3204 // Don't clear the pass next flag yet on the simulated "rollback key" |
|
3205 // used with secret editors, the actual key code to be entered to the |
|
3206 // editor will follow next. |
|
3207 if ( aKeyEvent.iCode != EKeyF20 ) |
|
3208 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
3209 #endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ |
|
3210 ClearFlag(EFlagPassNextKey); |
|
3211 return ETrue; |
|
3212 } |
|
3213 |
|
3214 TInt keyScanCode = aKeyEvent.iScanCode; |
|
3215 #if defined(__WINS__) |
|
3216 if ( keyScanCode == EStdKeyNkpPlus ) |
|
3217 { |
|
3218 // Workaround solution for the qwerty '+' key in emulator environment. |
|
3219 // I did not find a way how to to configure epoc_352x416_Qwerty.ini to send '+' keyevent. |
|
3220 keyScanCode = 0x2b; // '+' key. |
|
3221 } |
|
3222 #endif |
|
3223 TBool phoneIdle = (EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor); |
|
3224 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3225 TInt keyLayout =iSharedDataInterface->KeyboardLayout(); |
|
3226 if (IsOnlyNumericPermitted() && phoneIdle && |
|
3227 #ifdef __REVERSE_FN_KEY_SUPPORTED |
|
3228 !iIsReverseFnkeyInput && |
|
3229 #endif |
|
3230 (keyLayout != EPtiKeyboardHalfQwerty )) |
|
3231 #else |
|
3232 if (IsOnlyNumericPermitted() && phoneIdle) |
|
3233 #endif |
|
3234 { |
|
3235 return ETrue; |
|
3236 } |
|
3237 //if this SpecialNumeric editor, do not consume event. |
|
3238 if (IsOnlyNumericPermitted() && IsSpecialNumericEditor()) |
|
3239 { |
|
3240 return EFalse; |
|
3241 } |
|
3242 |
|
3243 |
|
3244 #ifdef FF_HOME_SCREEN_EASY_DIALING |
|
3245 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3246 |
|
3247 // This piece of code part of error fixing |
|
3248 // The Fep will insert the char, if Phone application launch the |
|
3249 // Phone number acquire editor in idle mode |
|
3250 // Specially Fep does not maintain Fn key state for non Fepware editor. |
|
3251 // So, Intermediate state of FnKey like FnNext will not work |
|
3252 // Hold on Fn key modify the modifier of of key event. |
|
3253 const TBool fnDown = (aKeyEvent.iModifiers & EModifierRightFunc); |
|
3254 if( phoneIdle && fnDown && iFnKeyManager ) |
|
3255 { |
|
3256 iFnKeyManager->SetFnKeyState(CAknFepFnKeyManager::EFnKeyDown); |
|
3257 SetCase((TCase)EFnKeyLowerCase); |
|
3258 } |
|
3259 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
3260 #endif // FF_HOME_SCREEN_EASY_DIALING |
|
3261 |
|
3262 |
|
3263 const TBool shifted = (aKeyEvent.iModifiers & (EModifierLeftShift | |
|
3264 EModifierRightShift | EModifierShift)); |
|
3265 |
|
3266 // This is needed for forcing shif state if this is the first key press in |
|
3267 // phone idle. |
|
3268 if (shifted && phoneIdle) |
|
3269 { |
|
3270 SetFlag(EFlagQwertyShiftMode); |
|
3271 } |
|
3272 |
|
3273 |
|
3274 if (aKeyEvent.iRepeats == 1) |
|
3275 { |
|
3276 iKeyRepeat = ELongKeyPress; |
|
3277 } |
|
3278 else |
|
3279 { |
|
3280 iKeyRepeat = EShortKeyPress; |
|
3281 } |
|
3282 |
|
3283 if ( IsFlagSet(EFlagShiftKeyDepressed) && |
|
3284 IsChineseInputLanguage() && |
|
3285 keyScanCode == EPtiKeyQwertySpace) |
|
3286 { |
|
3287 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
3288 ClearFlag(EFlagQwertyShiftMode); |
|
3289 ClearFlag(EFlagLongShiftKeyPress); |
|
3290 SetChangeModeByShiftAndSpace( ETrue ); |
|
3291 TryIncrementChineseModeForQwertyL(iMode); |
|
3292 keyHandled = ETrue; |
|
3293 } |
|
3294 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3295 else |
|
3296 { |
|
3297 if(iKeyRepeat == ELongKeyPress && iPtiEngine->CurrentWord().Length() == EMaximumFepWordLength) |
|
3298 { |
|
3299 keyHandled = ETrue; |
|
3300 } |
|
3301 else |
|
3302 { |
|
3303 keyHandled = FepUI()->HandleKeyL(keyScanCode, iKeyRepeat); |
|
3304 if( EPtiKeyboardHalfQwerty == KeyboardLayout() |
|
3305 && iWesternPredictive |
|
3306 && iCaseMan->CurrentCase() != EAknEditorUpperCase ) |
|
3307 { |
|
3308 ClearFlag(CAknFepManager::EFlagChangeInputMode); |
|
3309 } |
|
3310 if ( keyHandled && iFepManState == EAknFepStateUIActive |
|
3311 && (iMode == EPinyin || iMode == EZhuyin || iMode == EStroke || iMode == ECangJie) ) |
|
3312 { |
|
3313 if ( EditorState() ) |
|
3314 { |
|
3315 EditorState()->SetFlags( EditorState()->Flags() | EAknEditorFlagChinesePopup ); |
|
3316 } |
|
3317 } |
|
3318 } |
|
3319 } |
|
3320 #else |
|
3321 if (IsChineseInputLanguage() && keyScanCode == EStdKeyBackspace) |
|
3322 { |
|
3323 keyHandled = FepUI()->HandleKeyL(keyScanCode, iKeyRepeat); |
|
3324 } |
|
3325 else |
|
3326 { |
|
3327 keyHandled = FepUI()->HandleKeyL(keyScanCode, EShortKeyPress); |
|
3328 } |
|
3329 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
3330 |
|
3331 if (keyHandled) |
|
3332 { |
|
3333 aResponse = EKeyWasConsumed; |
|
3334 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3335 // Predictive QWERTY changes ----> |
|
3336 if ( iLangMan->IsSplitView() || ( iFepPluginManager && !iFepPluginManager->EnableITIOnFSQ())) |
|
3337 { |
|
3338 ShowExactWordPopupIfNecessaryL(); |
|
3339 } |
|
3340 // Predictive QWERTY changes <---- |
|
3341 } |
|
3342 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
3343 |
|
3344 // The indicators should be updated only if the key was handled. Otherwise |
|
3345 // the shift-copy-pasting will mess up the indicators. |
|
3346 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3347 TInt language = iSharedDataInterface->InputTextLanguage(); |
|
3348 TBool IsChineseInput = language == ELangTaiwanChinese|| |
|
3349 language == ELangHongKongChinese || |
|
3350 language == ELangPrcChinese; |
|
3351 #endif |
|
3352 if ( !shifted ) |
|
3353 { |
|
3354 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3355 if(IsChineseInput && (iKeyboardType!= EPtiKeyboardHalfQwerty)) |
|
3356 { |
|
3357 ClearFlag(EFlagQwertyShiftMode); |
|
3358 UpdateIndicators(); |
|
3359 } |
|
3360 else if( keyHandled ) |
|
3361 { |
|
3362 #endif |
|
3363 ClearFlag(EFlagQwertyShiftMode); |
|
3364 UpdateIndicators(); |
|
3365 |
|
3366 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3367 } |
|
3368 #endif |
|
3369 } |
|
3370 |
|
3371 #ifdef RD_SCALABLE_UI_V2 |
|
3372 if ( ( (keyScanCode >= EPtiKeyQwertyA && keyScanCode <= EPtiKeyQwertyZ) || |
|
3373 (keyScanCode >= EPtiKeyQwerty0 && keyScanCode <= EPtiKeyQwerty9) || |
|
3374 (keyScanCode == EStdKeyEnter) || |
|
3375 (keyScanCode == EPtiKeyQwertyPlus) || |
|
3376 (keyScanCode == EPtiKeyQwertyMinus) || |
|
3377 (keyScanCode == EPtiKeyQwertyComma) || |
|
3378 (keyScanCode == EPtiKeyQwertySemicolon) || |
|
3379 (keyScanCode == EPtiKeyQwertyFullstop) || |
|
3380 (keyScanCode == EPtiKeyQwertyHash) || |
|
3381 (keyScanCode == EPtiKeyQwertySlash) || |
|
3382 (keyScanCode == EPtiKeyQwertyApostrophe) ) |
|
3383 && !( iFepPluginManager && iFepPluginManager->EnableITIOnFSQ() ) ) |
|
3384 { |
|
3385 //SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
3386 //iFepPluginManager->ClosePluginInputModeL(ETrue); |
|
3387 } |
|
3388 else if( keyHandled ) |
|
3389 { |
|
3390 //for QWERTY, number only, the number is send to editor |
|
3391 //bypass FEP |
|
3392 SendEventsToPluginManL( EPluginSyncFepAwareText ); |
|
3393 //iFepPluginManager->SyncFepAwareText(); |
|
3394 } |
|
3395 #endif |
|
3396 } |
|
3397 |
|
3398 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3399 |
|
3400 TInt lang = iSharedDataInterface->InputTextLanguage(); |
|
3401 |
|
3402 if(lang == ELangTaiwanChinese|| |
|
3403 lang == ELangHongKongChinese || |
|
3404 lang == ELangPrcChinese) |
|
3405 { |
|
3406 if( CurrentInputLangCode() == ELangEnglish |
|
3407 && IsFlagSet(EFlagQwertyShiftMode) |
|
3408 && !IsFlagSet(EFlagLongShiftKeyPress)) |
|
3409 { |
|
3410 ClearFlag(EFlagQwertyShiftMode); |
|
3411 UpdateIndicators(); |
|
3412 } |
|
3413 } |
|
3414 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
3415 iKeyRepeat = EShortKeyPress; |
|
3416 return keyHandled; |
|
3417 } |
|
3418 |
|
3419 |
|
3420 |
|
3421 void CAknFepManager::CancelTransaction() |
|
3422 { |
|
3423 if (iInputCapabilities.FepAwareTextEditor() && IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
3424 { |
|
3425 CancelInlineEdit(); |
|
3426 } |
|
3427 } |
|
3428 |
|
3429 void CAknFepManager::IsOnHasChangedState() |
|
3430 { |
|
3431 } |
|
3432 |
|
3433 void CAknFepManager::OfferKeyEventL(TEventResponse& /*aEventResponse*/, |
|
3434 const TKeyEvent& /*aKeyEvent*/, |
|
3435 TEventCode /*aEventCode*/) |
|
3436 { |
|
3437 } |
|
3438 |
|
3439 void CAknFepManager::OfferPointerEventL(TEventResponse& /*aEventResponse*/, |
|
3440 const TPointerEvent& /*aPointerEvent*/, |
|
3441 const CCoeControl* /*aWindowOwningControl*/) |
|
3442 { |
|
3443 } |
|
3444 |
|
3445 void CAknFepManager::OfferPointerBufferReadyEventL(TEventResponse& /*aEventResponse*/, |
|
3446 const CCoeControl* /*aWindowOwningControl*/) |
|
3447 { |
|
3448 } |
|
3449 |
|
3450 TInt CAknFepManager::NumberOfAttributes() const |
|
3451 { |
|
3452 return 0; |
|
3453 } |
|
3454 |
|
3455 TUid CAknFepManager::AttributeAtIndex(TInt /*aIndex*/) const |
|
3456 { |
|
3457 return KNullUid; |
|
3458 } |
|
3459 |
|
3460 void CAknFepManager::WriteAttributeDataToStreamL(TUid /*aAttributeUid*/, RWriteStream& /*aStream*/) const |
|
3461 { |
|
3462 } |
|
3463 |
|
3464 void CAknFepManager::ReadAttributeDataFromStreamL(TUid /*aAttributeUid*/, RReadStream& /*aStream*/) |
|
3465 { |
|
3466 } |
|
3467 |
|
3468 void CAknFepManager::HandleGainingForeground() |
|
3469 { |
|
3470 if (iFepFullyConstructed) |
|
3471 { |
|
3472 ClearFlag(EFlagRemoveMatchesMenuItem); |
|
3473 ClearCcpuFlag(ECcpuStateHashDown | ECcpuStateSelectionEventPosted | |
|
3474 ECcpuStateEdwinInSelectionMode); |
|
3475 TRAPD(err, iPtiEngine->HandleCommandL(EPtiCommandReloadLearningInfo)); |
|
3476 if (err != KErrNone) |
|
3477 { |
|
3478 CleanUpFep(); |
|
3479 } |
|
3480 } |
|
3481 |
|
3482 #ifdef RD_SCALABLE_UI_V2 |
|
3483 CCoeControl* focusCtrl = static_cast<const CCoeAppUi*>(CCoeEnv::Static()->AppUi())->TopFocusedControl(); |
|
3484 iGainForeground = ETrue; |
|
3485 /*if( iLoseForeAndGainFocus ) |
|
3486 { |
|
3487 SendEventsToPluginManL( EPluginFocusChanged, iGainForeground ); |
|
3488 }*/ |
|
3489 if(focusCtrl && focusCtrl->IsFocused()) |
|
3490 { |
|
3491 if(GetForegroundTaskAppWgId() == CCoeEnv::Static()->RootWin().Identifier()) |
|
3492 //SendEventsToPluginManL( EPluginFocusChanged, iGainForeground ); |
|
3493 TRAP_IGNORE(SendEventsToPluginManL( EPluginForegroundChanged, ETrue)); |
|
3494 } |
|
3495 else |
|
3496 { |
|
3497 if (iFepPluginManager) |
|
3498 { |
|
3499 iFepPluginManager->HandleiDimGainForeground(ETrue); |
|
3500 } |
|
3501 } |
|
3502 #endif // RD_SCALABLE_UI_V2 |
|
3503 } |
|
3504 |
|
3505 void CAknFepManager::HandleLosingForeground() |
|
3506 { |
|
3507 if (iFepFullyConstructed) |
|
3508 { |
|
3509 // Forget the shift state on FEP switch (i.e. when application goes to background) |
|
3510 ClearFlag(EFlagQwertyShiftMode | EFlagShiftKeyDepressed | |
|
3511 EFlagLongShiftKeyPress | EFlagNoActionDuringShiftKeyPress); |
|
3512 } |
|
3513 if (Japanese()) |
|
3514 { |
|
3515 TRAP_IGNORE(TryCloseUiL()); |
|
3516 } |
|
3517 if (IsChineseInputLanguage()) |
|
3518 { |
|
3519 TRAP_IGNORE(TryCloseUiL()); |
|
3520 } |
|
3521 |
|
3522 #ifdef RD_SCALABLE_UI_V2 |
|
3523 iGainForeground = EFalse; |
|
3524 //SendEventsToPluginManL( EPluginFocusChanged, iGainForeground ); |
|
3525 TRAP_IGNORE(SendEventsToPluginManL( EPluginForegroundChanged, EFalse)); |
|
3526 #endif // RD_SCALABLE_UI_V2 |
|
3527 } |
|
3528 |
|
3529 void CAknFepManager::HandleChangeInFocus() |
|
3530 { |
|
3531 TRAPD(err, HandleChangeInFocusL()); |
|
3532 if (err != KErrNone) |
|
3533 { |
|
3534 CleanUpFep(); |
|
3535 } |
|
3536 } |
|
3537 |
|
3538 void CAknFepManager::HandleChangeInFocusForSettingFep() |
|
3539 { |
|
3540 HandleChangeInFocus(); |
|
3541 } |
|
3542 |
|
3543 void CAknFepManager::HandleDestructionOfFocusedItem() |
|
3544 { |
|
3545 if (iInputCapabilities.FepAwareTextEditor()) |
|
3546 { |
|
3547 iFocusedItemDestroy = ETrue; |
|
3548 if ( iFepManState == EAknFepStateUIActive ) |
|
3549 { |
|
3550 TRAP_IGNORE(SendEventsToPluginManL( EPluginFocusItemDestroy )); |
|
3551 if (Japanese() && iAknEditorFlags & EAknEditorFlagFindPane) |
|
3552 { |
|
3553 // In case of Find pane while inputting japanese characters, |
|
3554 // No update or commit characters. |
|
3555 iPtiEngine->ClearCurrentWord(); |
|
3556 } |
|
3557 |
|
3558 #ifdef RD_SCALABLE_UI_V2 |
|
3559 // For addition of ITI features on FSQ, |
|
3560 // need to restore some values stored before opening FSQ |
|
3561 // When go into this section, |
|
3562 // touch ui won't be closed by ClosePluginInputUiL, |
|
3563 // but need to restore fep state here |
|
3564 if ( iFepPluginManager ) |
|
3565 { |
|
3566 TRAP_IGNORE(iFepPluginManager->ResetItiStateL()); |
|
3567 } |
|
3568 #endif |
|
3569 // Close UI |
|
3570 if ( FepUI()) |
|
3571 { |
|
3572 FepUI()->CloseUI(); |
|
3573 } |
|
3574 } |
|
3575 else |
|
3576 { |
|
3577 TRAP_IGNORE(SendEventsToPluginManL( EPluginFocusItemDestroy, ETrue )); |
|
3578 } |
|
3579 iFocusedItemDestroy = EFalse; |
|
3580 } |
|
3581 |
|
3582 if ( !(IsFlagSet(EFlagForegroundUIComponentVisible) || |
|
3583 IsFlagSet(EFlagMenuPaneVisible)) ) |
|
3584 { |
|
3585 iLanguageCapabilities.iNumericEditorDigitType = EDigitTypeUnknown; |
|
3586 //UpdateLocalDigitMode(); |
|
3587 } |
|
3588 if(IsFlagSet(EFlagForegroundUIComponentVisible)) |
|
3589 { |
|
3590 ClearFlag(EFlagForegroundUIComponentVisible); |
|
3591 } |
|
3592 |
|
3593 ClearFlag( EFlagInsideInlineEditingTransaction | |
|
3594 EFlagInsideMultitapInlineEditingTransaction | |
|
3595 EFlagLineFeedCharacter | EFlagNoMatches ); |
|
3596 |
|
3597 iInputCapabilities = NULL; |
|
3598 } |
|
3599 |
|
3600 void CAknFepManager::HandleAknEdwinStateEventL(CAknEdwinState* aAknEdwinState, |
|
3601 EAknEdwinStateEvent aEventType) |
|
3602 { |
|
3603 if(aEventType == EAknEdwinDestroy) |
|
3604 { |
|
3605 // Reset the last focus editor when destroy it. |
|
3606 if ( aAknEdwinState == iLastFocusedEditor ) |
|
3607 { |
|
3608 iLastFocusedEditor->SetObserver( NULL ); |
|
3609 iLastFocusedEditor = NULL; |
|
3610 } |
|
3611 |
|
3612 // Whenever the editor is destroyed, we destroy all the UI components we launched |
|
3613 if(iFepAwareDialogParentEditor == NULL || |
|
3614 iFepAwareDialogParentEditor == aAknEdwinState) |
|
3615 { |
|
3616 // EExtendedFlagEdwinEditorDestroyed flag is used to leave once the dialog is closed. |
|
3617 SetExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
3618 // Delete any candidate popup is launched |
|
3619 if(iCandidatePopup) |
|
3620 { |
|
3621 delete iCandidatePopup; |
|
3622 iCandidatePopup = NULL; |
|
3623 } |
|
3624 // Delete anu UI components launched by Fep. |
|
3625 iUiInterface->DeleteDialogs(); |
|
3626 } |
|
3627 |
|
3628 if ( iFepPluginManager ) |
|
3629 { |
|
3630 // Check whether the destroyed editor is the editor that stored in fep |
|
3631 // according to the editor state |
|
3632 if ( aAknEdwinState == iFepPluginManager->EdwinState()) |
|
3633 { |
|
3634 // Set the editor pointer to NULL to avoid wild pointer exist |
|
3635 iFepPluginManager->ClearDestroyedEditorPointer(); |
|
3636 } |
|
3637 } |
|
3638 } |
|
3639 if ( IsFepAwareTextEditor() ) |
|
3640 { |
|
3641 CAknEdwinState* editorState = EditorState(); |
|
3642 if ( editorState != aAknEdwinState || !iFepFullyConstructed ) |
|
3643 { |
|
3644 // FEP state update is not needed because editor state of non-focused |
|
3645 // editor was changed. |
|
3646 return; |
|
3647 } |
|
3648 |
|
3649 switch (aEventType) |
|
3650 { |
|
3651 case EAknEdwinStateInputModeUpdate: |
|
3652 { |
|
3653 TUint currentInputMode = editorState->CurrentInputMode(); |
|
3654 if ( EditorModeFromFepMode(iMode) != currentInputMode ) |
|
3655 { |
|
3656 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
3657 { |
|
3658 TryRemoveNoMatchesIndicatorL(); |
|
3659 } |
|
3660 UpdateCbaL(NULL); |
|
3661 TryCloseUiL(); |
|
3662 ConfigureFEPFromEditorStateL(); |
|
3663 } |
|
3664 } |
|
3665 break; |
|
3666 case EAknEdwinStateCaseModeUpdate: |
|
3667 { |
|
3668 TInt currentCaseMode = editorState->CurrentCase(); |
|
3669 if ( currentCaseMode != iCaseMan->CurrentCase() ) |
|
3670 { |
|
3671 iCaseMan->SetCurrentCase(currentCaseMode); |
|
3672 } |
|
3673 } |
|
3674 break; |
|
3675 case EAknEdwinStateLocalLanguageUpdate: |
|
3676 { |
|
3677 TLanguage localLanguage = ELangTest; |
|
3678 if (GetLocalLanguage( localLanguage ) ) |
|
3679 { |
|
3680 iLanguageCapabilities.iLocalInputLanguageInUse = ETrue; |
|
3681 if ( localLanguage != iLanguageCapabilities.iInputLanguageCode ) |
|
3682 { |
|
3683 ChangeInputLanguageL(localLanguage); |
|
3684 } |
|
3685 } |
|
3686 } |
|
3687 break; |
|
3688 case EAknEdwinStateFlagsUpdate: |
|
3689 { |
|
3690 TInt oldEditorFlags = iAknEditorFlags; |
|
3691 if(iAknEditorFlags != editorState->Flags()) |
|
3692 { |
|
3693 iAknEditorFlags = editorState->Flags(); |
|
3694 UpdateLocalDigitMode(); |
|
3695 } |
|
3696 if ( iAknEditorFlags != oldEditorFlags ) |
|
3697 { |
|
3698 if ( (iAknEditorFlags & EAknEditorFlagNoT9) != |
|
3699 (oldEditorFlags & EAknEditorFlagNoT9)) |
|
3700 { |
|
3701 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
3702 { |
|
3703 TryRemoveNoMatchesIndicatorL(); |
|
3704 } |
|
3705 UpdateCbaL(NULL); |
|
3706 TryCloseUiL(); |
|
3707 ConfigureFEPFromEditorStateL(); |
|
3708 } |
|
3709 |
|
3710 if ( (iAknEditorFlags & EAknEditorFlagNoEditIndicators) != |
|
3711 (oldEditorFlags & EAknEditorFlagNoEditIndicators)) |
|
3712 { |
|
3713 // We only need to update indicators when EAknEditorFlagNoEditIndicators was modified. |
|
3714 // Current Fep state is not lost. |
|
3715 UpdateIndicators(); |
|
3716 } |
|
3717 |
|
3718 if ( (iAknEditorFlags & EAknEditorFlagFixedCase) != |
|
3719 (oldEditorFlags & EAknEditorFlagFixedCase)) |
|
3720 { |
|
3721 // We only need to update EFlagSupressAutoUpdate flag when the |
|
3722 // EAknEditorFlagFixedCase was modified. |
|
3723 // Current Fep state is not lost. |
|
3724 if (iAknEditorFlags & EAknEditorFlagFixedCase) |
|
3725 { |
|
3726 SetFlag(EFlagSupressAutoUpdate); |
|
3727 } |
|
3728 else |
|
3729 { |
|
3730 ClearFlag(EFlagSupressAutoUpdate); |
|
3731 } |
|
3732 } |
|
3733 } |
|
3734 } |
|
3735 break; |
|
3736 case EAknEdwinStateEventStateUpdate: |
|
3737 { |
|
3738 // Feps state is reseted and new state is fetched completelly from editor state. |
|
3739 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
3740 { |
|
3741 TryRemoveNoMatchesIndicatorL(); |
|
3742 } |
|
3743 UpdateCbaL(NULL); |
|
3744 TryCloseUiL(); |
|
3745 ConfigureFEPFromEditorStateL(); |
|
3746 } |
|
3747 break; |
|
3748 case EAknSyncEdwinState: |
|
3749 #ifdef RD_SCALABLE_UI_V2 |
|
3750 if ( !IsCcpuFlagSet(ECcpuStateIgnoreNextEdwinSyncEvent) && iFepPluginManager && |
|
3751 iFepPluginManager->PluginInputMode() == EPluginInputModeNone ) |
|
3752 #else |
|
3753 if ( !IsCcpuFlagSet(ECcpuStateIgnoreNextEdwinSyncEvent) ) |
|
3754 #endif |
|
3755 { |
|
3756 HandleChangeInFocusL(); |
|
3757 } |
|
3758 else |
|
3759 { |
|
3760 ClearCcpuFlag(ECcpuStateIgnoreNextEdwinSyncEvent); |
|
3761 } |
|
3762 break; |
|
3763 |
|
3764 #ifdef RD_SCALABLE_UI_V2 |
|
3765 case EAknActivatePenInputRequest: |
|
3766 SendEventsToPluginManL( EPluginEditorActivate ); |
|
3767 break; |
|
3768 case EAknClosePenInputRequest: |
|
3769 if ( iFepPluginManager ) |
|
3770 { |
|
3771 iFepPluginManager->ClosePluginInputModeL( EFalse ); |
|
3772 } |
|
3773 break; |
|
3774 case EAknEdwinStatePromptUpdate: |
|
3775 SendEventsToPluginManL( EPluginPromptChanged ); |
|
3776 break; |
|
3777 #endif // RD_SCALABLE_UI_V2 |
|
3778 case EAknCursorPositionChanged: |
|
3779 #ifdef RD_SCALABLE_UI_V2 |
|
3780 SendEventsToPluginManL( EPluginSyncFepAwareText ); |
|
3781 HandleCopyCutStateL(); |
|
3782 #endif |
|
3783 // whenever focus cahnged happen, internally |
|
3784 // editor treat cursorposition change. |
|
3785 // In between, if editor context not in inline edit state. |
|
3786 // Try to update the case editor gets the focus, and editor |
|
3787 // context come in inline state. |
|
3788 iCaseMan->UpdateCase( ENullNaviEvent ); |
|
3789 break; |
|
3790 |
|
3791 default: |
|
3792 break; |
|
3793 } |
|
3794 } |
|
3795 #ifdef RD_SCALABLE_UI_V2 |
|
3796 else |
|
3797 { |
|
3798 // Close touch input when inMenu is opened. When inMenu is opened, |
|
3799 // editor loses focus, and inMenu gets focus. After touch input has |
|
3800 // been force closed, menu state should be restored and last focused |
|
3801 // window ,which launches touch input, should be removed. |
|
3802 if( aEventType == EAknClosePenInputRequest |
|
3803 && iFepPluginManager |
|
3804 && iFepPluginManager->IsInMenuOpen() ) |
|
3805 { |
|
3806 CCoeEnv* env = CCoeEnv::Static(); |
|
3807 TKeyEvent keyEvent = {EKeyCBA2, EStdKeyNull, 0, 0}; |
|
3808 env->SimulateKeyEventL(keyEvent,EEventKey); |
|
3809 iFepPluginManager->ResetMenuState(); |
|
3810 iFepPluginManager->RemoveLastFocusedWinFromOpenList(); |
|
3811 iFepPluginManager->ClosePluginInputModeL( EFalse ); |
|
3812 } |
|
3813 } |
|
3814 #endif // RD_SCALABLE_UI_V2 |
|
3815 } |
|
3816 |
|
3817 |
|
3818 CAknExtendedInputCapabilities::TEditorType CAknFepManager::EditorType() const |
|
3819 { |
|
3820 MObjectProvider* mop = iInputCapabilities.ObjectProvider(); |
|
3821 |
|
3822 if ( mop ) |
|
3823 { |
|
3824 CAknExtendedInputCapabilities* extendedInputCapabilities = |
|
3825 mop->MopGetObject( extendedInputCapabilities ); |
|
3826 |
|
3827 if ( extendedInputCapabilities && iInputCapabilities.FepAwareTextEditor() ) |
|
3828 { |
|
3829 TInt type = extendedInputCapabilities->EditorType(); |
|
3830 return static_cast<CAknExtendedInputCapabilities::TEditorType>( type ); |
|
3831 } |
|
3832 } |
|
3833 |
|
3834 return CAknExtendedInputCapabilities::EUndefined; |
|
3835 } |
|
3836 |
|
3837 TUint CAknFepManager::MIDPConstraint() const |
|
3838 { |
|
3839 TUint ConstraintValue=0xFFFFFFFF; |
|
3840 MObjectProvider* mop = iInputCapabilities.ObjectProvider(); |
|
3841 |
|
3842 if ( mop ) |
|
3843 { |
|
3844 CAknExtendedInputCapabilities* extendedInputCapabilities = |
|
3845 mop->MopGetObject( extendedInputCapabilities ); |
|
3846 if ( extendedInputCapabilities && iInputCapabilities.FepAwareTextEditor() ) |
|
3847 { |
|
3848 ConstraintValue = extendedInputCapabilities->MIDPConstrainst(); |
|
3849 } |
|
3850 } |
|
3851 return ConstraintValue; |
|
3852 } |
|
3853 |
|
3854 TBool CAknFepManager::IsSpecialNumericEditor() |
|
3855 { |
|
3856 TBool JavaNumericEditor = EFalse; |
|
3857 TUint ConstraintValue = MIDPConstraint(); |
|
3858 if((ConstraintValue & ESplConstraintMask) == ESplNumeric ) |
|
3859 JavaNumericEditor = ETrue; |
|
3860 |
|
3861 return JavaNumericEditor; |
|
3862 |
|
3863 } |
|
3864 #ifdef RD_SCALABLE_UI_V2 |
|
3865 void CAknFepManager::HandleInputCapabilitiesEventL( TInt aEvent, TAny* /*aParams*/ ) |
|
3866 { |
|
3867 switch (aEvent) |
|
3868 { |
|
3869 case CAknExtendedInputCapabilities::MAknEventObserver::EActivatePenInputRequest: |
|
3870 SendEventsToPluginManL( EPluginEditorActivate ); |
|
3871 break; |
|
3872 case CAknExtendedInputCapabilities::MAknEventObserver::EClosePenInputRequest: |
|
3873 if ( iFepPluginManager ) |
|
3874 { |
|
3875 iFepPluginManager->ClosePluginInputModeL( EFalse ); |
|
3876 } |
|
3877 break; |
|
3878 case CAknExtendedInputCapabilities::MAknEventObserver::EPointerEventReceived: |
|
3879 |
|
3880 /* |
|
3881 #ifdef RD_TACTILE_FEEDBACK |
|
3882 CAknExtendedInputCapabilities:: |
|
3883 MAknEventObserver::TPointerEventReceivedParams* params = |
|
3884 static_cast<CAknExtendedInputCapabilities:: |
|
3885 MAknEventObserver::TPointerEventReceivedParams*>(aParams); |
|
3886 if (params->iPointerEvent.iType == TPointerEvent::EButton1Down) |
|
3887 { |
|
3888 |
|
3889 MTouchFeedback* feedback = MTouchFeedback::Instance(); |
|
3890 if (feedback && iFepPluginManager && !iFepPluginManager->VKBIsOpened()) |
|
3891 { |
|
3892 feedback->InstantFeedback( ETouchFeedbackBasic ); |
|
3893 } |
|
3894 } |
|
3895 #endif // RD_TACTILE_FEEDBACK |
|
3896 */ |
|
3897 if( IsFlagSet( EFlagInsideInlineEditingTransaction ) ) |
|
3898 { |
|
3899 if (IsFeatureSupportedJapanese()) |
|
3900 { |
|
3901 TryCloseUiL(); |
|
3902 } |
|
3903 else |
|
3904 { |
|
3905 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
3906 iPtiEngine->CommitCurrentWord(); |
|
3907 CommitInlineEditL(); |
|
3908 TryCloseUiL(); |
|
3909 |
|
3910 #else |
|
3911 CommitInlineEditL(); |
|
3912 #endif |
|
3913 } |
|
3914 } |
|
3915 break; |
|
3916 case CAknExtendedInputCapabilities::MAknEventObserver::EControlContentUpdatedInternally: |
|
3917 SendEventsToPluginManL( EPluginSyncFepAwareText, EPluginSyncAll ); |
|
3918 break; |
|
3919 case CAknExtendedInputCapabilities::MAknEventObserver::EOpenStylusMenuCcpu: |
|
3920 // User has highlighted text and editor requests stylus ccpu popup menu |
|
3921 // to be displayed. |
|
3922 LaunchStylusCcpuMenuL(iClickPoint); |
|
3923 break; |
|
3924 } |
|
3925 } |
|
3926 |
|
3927 void CAknFepManager::SubmitInlineTextL( const TDesC& aData ) |
|
3928 { |
|
3929 if(TextIsValidInEditor(aData)) |
|
3930 { |
|
3931 StartInlineEditL(aData); |
|
3932 CommitInlineEditL(); |
|
3933 } |
|
3934 } |
|
3935 |
|
3936 // for japanese |
|
3937 void CAknFepManager::NotifyJapaneseSetting() |
|
3938 { |
|
3939 TInt param = 0; |
|
3940 // Deleting direction ON(right side) / OFF(left side) |
|
3941 if (iSharedDataInterface->ClearDirection() == EClearDirectionRight) |
|
3942 { |
|
3943 param |= EPenInputJapaneseSettingDeletingDirection; |
|
3944 } |
|
3945 // Japanese predictive ON(predictive on) / OFF(predictive off) |
|
3946 if (iJapanesePredictive) |
|
3947 { |
|
3948 param |= EPenInputJapaneseSettingPredictive; |
|
3949 } |
|
3950 // Japanese HWR conversion ON / OFF |
|
3951 if (iSharedDataInterface->JapaneseHwrConversion() == EJapaneseConversionOn) |
|
3952 { |
|
3953 param |= EPenInputJapaneseSettingConversion; |
|
3954 } |
|
3955 // Japanese HWR conversion ON / OFF |
|
3956 if (iCharWidth == EFullWidthChar) |
|
3957 { |
|
3958 param |= EPenInputJapaneseSettingCharacterWidth; |
|
3959 } |
|
3960 // Japanese qwerty setting flag |
|
3961 TInt qwertflag = iSharedDataInterface->JapaneseQwertyFlags(); |
|
3962 // Qwerty Comma |
|
3963 if (qwertflag & EJapQwertySettingComma) |
|
3964 { |
|
3965 param |= EPenInputJapaneseSettingQwertyComma; |
|
3966 } |
|
3967 // Qwerty Period |
|
3968 if (qwertflag & EJapQwertySettingPeriod) |
|
3969 { |
|
3970 param |= EPenInputJapaneseSettingQwertyPeriod; |
|
3971 } |
|
3972 // Qwerty Width Of Space |
|
3973 if (qwertflag & EJapQwertySettingSpaceFullWidth) |
|
3974 { |
|
3975 param |= EPenInputJapaneseSettingQwertyWidthOfSpace; |
|
3976 } |
|
3977 // Lunch SCT |
|
3978 if (IsAbleToLaunchSCT()) |
|
3979 { |
|
3980 param |= EPenInputJapaneseSettingLunchSCT; |
|
3981 } |
|
3982 #ifdef RD_SCALABLE_UI_V2 |
|
3983 // Set Japanese setting |
|
3984 if(iFepPluginManager->CurrentPluginInputFepUI()) |
|
3985 { |
|
3986 TRAP_IGNORE(iFepPluginManager->CurrentPluginInputFepUI()->HandleCommandL( |
|
3987 ECmdPenInputJapaneseSetting, param)); |
|
3988 } |
|
3989 #endif //RD_SCALABLE_UI_V2 |
|
3990 } |
|
3991 |
|
3992 TBool CAknFepManager::FullyFepAwareTextEditor() const |
|
3993 { |
|
3994 if ( iInputCapabilities.FepAwareTextEditor() ) |
|
3995 { |
|
3996 if ( EditorType() != CAknExtendedInputCapabilities::EMFNEBased ) |
|
3997 { |
|
3998 return ETrue; |
|
3999 } |
|
4000 } |
|
4001 |
|
4002 return EFalse; |
|
4003 } |
|
4004 |
|
4005 TBool CAknFepManager::SemiFepAwareTextEditor( TBool aAtLeast ) const |
|
4006 { |
|
4007 if ( aAtLeast ) |
|
4008 { |
|
4009 switch ( EditorType() ) |
|
4010 { |
|
4011 case CAknExtendedInputCapabilities::EEdwinBased: |
|
4012 case CAknExtendedInputCapabilities::EMFNEBased: |
|
4013 return ETrue; |
|
4014 |
|
4015 default: |
|
4016 return EFalse; |
|
4017 } |
|
4018 } |
|
4019 else |
|
4020 { |
|
4021 return EditorType() == CAknExtendedInputCapabilities::EMFNEBased; |
|
4022 } |
|
4023 } |
|
4024 |
|
4025 void CAknFepManager::ProcessEditorMenuCommand(TInt aCommand) |
|
4026 { |
|
4027 TRAP_IGNORE(ProcessCommandL(aCommand)); |
|
4028 } |
|
4029 |
|
4030 TInt CAknFepManager::GetPermittedEditorMenu(TBool aOnlyCount) |
|
4031 { |
|
4032 TInt count = 0; |
|
4033 TRAP_IGNORE(count = GetPermittedEditorMenuL(aOnlyCount)); |
|
4034 return count; |
|
4035 } |
|
4036 |
|
4037 TInt CAknFepManager::GetPermittedEditorMenuL(TBool aOnlyCount) |
|
4038 { |
|
4039 |
|
4040 CAknEdwinState* editorState = NULL; |
|
4041 if (iInputCapabilities.FepAwareTextEditor()) |
|
4042 { |
|
4043 editorState = EditorState(); |
|
4044 } |
|
4045 |
|
4046 CAknFepUiInterfaceMenuBar* menuBar = NULL; |
|
4047 |
|
4048 RPointerArray<CEikMenuPaneItem> editorMenuItemList; |
|
4049 |
|
4050 CEikMenuPane* editorMenuPane = new (ELeave) CEikMenuPane((MEikMenuObserver*)(this)); |
|
4051 CleanupDeletePushL( editorMenuPane ); |
|
4052 |
|
4053 editorMenuPane->SetItemArrayOwnedExternally(EFalse); |
|
4054 TResourceReader reader; |
|
4055 CCoeEnv::Static()->CreateResourceReaderLC(reader, R_AVKON_TOUCH_INDICATOR_EDIT_MODE_MENU);// |
|
4056 |
|
4057 const TInt menuCount=reader.ReadInt16(); |
|
4058 for ( TInt ii=0; ii<menuCount; ++ii ) |
|
4059 { |
|
4060 CEikMenuPaneItem* item = new(ELeave) CEikMenuPaneItem(); |
|
4061 CleanupStack::PushL( item ); |
|
4062 item->iData.iCommandId = reader.ReadInt32(); |
|
4063 item->iData.iCascadeId = reader.ReadInt32(); |
|
4064 item->iData.iFlags = reader.ReadInt32(); |
|
4065 TPtrC txtptr = reader.ReadTPtrC(); |
|
4066 item->SetScaleableTextL( txtptr ); |
|
4067 TPtrC extratxtptr = reader.ReadTPtrC(); |
|
4068 item->iData.iExtraText = extratxtptr; |
|
4069 TPtrC bitmapFile = reader.ReadTPtrC(); |
|
4070 TInt bitmapId = reader.ReadInt16(); |
|
4071 TInt bitmapMaskId = reader.ReadInt16(); |
|
4072 CleanupStack::Pop(); // pop first, since additem pushes again |
|
4073 editorMenuPane->AddMenuItemL( item->iData ); |
|
4074 editorMenuItemList.Append(item); |
|
4075 reader.ReadInt32(); // extension link |
|
4076 } |
|
4077 |
|
4078 CleanupStack::PopAndDestroy(); //reader |
|
4079 |
|
4080 |
|
4081 if (editorState) |
|
4082 { |
|
4083 menuBar = iUiInterface->EditorStateMenuBar(editorState); |
|
4084 } |
|
4085 |
|
4086 TInt count = 0; |
|
4087 |
|
4088 if ( menuBar ) |
|
4089 { |
|
4090 CAknFepUiInterfaceMenuPane* menuPane = menuBar->MenuPane(); |
|
4091 |
|
4092 CEikMenuPane* oldMenuPane = menuPane->GetMenuPane(); |
|
4093 |
|
4094 menuPane->SetMenuPane(editorMenuPane); |
|
4095 |
|
4096 DynInitTouchMenuPaneL(menuPane); |
|
4097 |
|
4098 menuPane->SetMenuPane(oldMenuPane); |
|
4099 |
|
4100 |
|
4101 for (TInt ii = 0; ii < KMaxMenuSize; ii++) |
|
4102 { |
|
4103 CEikMenuPaneItem::SData& itemdata = |
|
4104 editorMenuPane->ItemData(KEditorMenuPermitedSend[ii]); |
|
4105 if ( !(itemdata.iFlags & EEikMenuItemDimmed ) ) |
|
4106 { |
|
4107 count = count + 1; |
|
4108 iEditorCommandList[count] = itemdata.iCommandId; |
|
4109 } |
|
4110 } |
|
4111 iEditorCommandList[0] = count; |
|
4112 if (!aOnlyCount && iFepPluginManager->CurrentPluginInputFepUI()) |
|
4113 { |
|
4114 iFepPluginManager->CurrentPluginInputFepUI()->HandleCommandL( |
|
4115 ECmdPenInputSendEditMenuData, reinterpret_cast<TInt>(iEditorCommandList)); |
|
4116 } |
|
4117 } |
|
4118 |
|
4119 editorMenuItemList.ResetAndDestroy(); |
|
4120 CleanupStack::PopAndDestroy(editorMenuPane); |
|
4121 |
|
4122 return count; |
|
4123 } |
|
4124 #endif // RD_SCALABLE_UI_V2 |
|
4125 |
|
4126 void CAknFepManager::ExitPluginSpellModeByOk() |
|
4127 { |
|
4128 TRAP_IGNORE(ExitPluginSpellModeByOkL()); |
|
4129 } |
|
4130 |
|
4131 void CAknFepManager::ExitPluginSpellModeByOkL() |
|
4132 { |
|
4133 #ifdef RD_SCALABLE_UI_V2 |
|
4134 if (iFepPluginManager->IsSpellVisible()) |
|
4135 { |
|
4136 CommitInlineEditL(); |
|
4137 HBufC* spell = iFepPluginManager->SpellTextInput(); |
|
4138 |
|
4139 iFepPluginManager->SetITUTSpellingStateL(EFalse); |
|
4140 iFepPluginManager->HideSpellEditor(); |
|
4141 |
|
4142 if (spell) |
|
4143 { |
|
4144 CleanupStack::PushL(spell); |
|
4145 TPtr text = spell->Des(); |
|
4146 FepUI()->AddTextToUserDictionaryL(text); |
|
4147 InsertTextFromDialogL(text, iFepPluginManager->CursorSelection()); |
|
4148 CleanupStack::PopAndDestroy(spell); |
|
4149 } |
|
4150 |
|
4151 UpdateCbaL(NULL); |
|
4152 if (iFepPluginManager->CaseUpdatesSupressed()) |
|
4153 { |
|
4154 SetFlag(EFlagSupressAutoUpdate); |
|
4155 } |
|
4156 else |
|
4157 { |
|
4158 ClearFlag(EFlagSupressAutoUpdate); |
|
4159 } |
|
4160 ClearFlag(EFlagSupressAutoUpdateAtEditorStart); |
|
4161 } |
|
4162 #endif |
|
4163 } |
|
4164 |
|
4165 void CAknFepManager::ExitPluginSpellModeByCancel() |
|
4166 { |
|
4167 /* |
|
4168 #ifdef RD_SCALABLE_UI_V2 |
|
4169 if (iFepPluginManager->IsSpellVisible()) |
|
4170 { |
|
4171 iFepPluginManager->SetITUTSpellingStateL(EFalse); |
|
4172 iFepPluginManager->DestroySpellEditor(); |
|
4173 UpdateCbaL(NULL); |
|
4174 HandleChangeInFocus(); |
|
4175 if (iFepPluginManager->CursorSelection().Length()) |
|
4176 { |
|
4177 EditorState()->SetInlineEditSpan(iFepPluginManager->CursorSelection()); |
|
4178 ConfigureFEPFromEditorStateL(); |
|
4179 } |
|
4180 TransferFepStateToEditorL(); |
|
4181 |
|
4182 if (iFepPluginManager->CaseUpdatesSupressed()) |
|
4183 { |
|
4184 SetFlag(EFlagSupressAutoUpdate); |
|
4185 } |
|
4186 else |
|
4187 { |
|
4188 ClearFlag(EFlagSupressAutoUpdate); |
|
4189 } |
|
4190 ClearFlag(EFlagSupressAutoUpdateAtEditorStart); |
|
4191 iFepPluginManager->SetBeforeSpell(ETrue); |
|
4192 } |
|
4193 #endif |
|
4194 */ |
|
4195 #ifdef RD_SCALABLE_UI_V2 |
|
4196 if (iFepPluginManager->IsSpellVisible()) |
|
4197 { |
|
4198 TRAP_IGNORE(iFepPluginManager->SetITUTSpellingStateL(EFalse)); |
|
4199 iFepPluginManager->HideSpellEditor(); |
|
4200 |
|
4201 TRAP_IGNORE(UpdateCbaL(NULL)); |
|
4202 if (iFepPluginManager->CaseUpdatesSupressed()) |
|
4203 { |
|
4204 SetFlag(EFlagSupressAutoUpdate); |
|
4205 } |
|
4206 else |
|
4207 { |
|
4208 ClearFlag(EFlagSupressAutoUpdate); |
|
4209 } |
|
4210 ClearFlag(EFlagSupressAutoUpdateAtEditorStart); |
|
4211 } |
|
4212 #endif |
|
4213 } |
|
4214 |
|
4215 void CAknFepManager::ProcessCommandL(TInt aCommandId) |
|
4216 { |
|
4217 //ProcessCommandL() is called before HandleChangeInFocus() for the editor to insert the |
|
4218 //number into, so have to force a call |
|
4219 |
|
4220 //Process pen input menu if avaliable |
|
4221 #ifdef RD_SCALABLE_UI_V2 |
|
4222 |
|
4223 if (iFepPluginManager && |
|
4224 (iFepPluginManager->PluginInputMode() == EPluginInputModeItut)) |
|
4225 { |
|
4226 switch(aCommandId) |
|
4227 { |
|
4228 case EAknSoftkeyOptions: |
|
4229 { |
|
4230 LaunchSelectModeMenuL(); |
|
4231 } |
|
4232 return; |
|
4233 case EAknSoftkeyOk: |
|
4234 { |
|
4235 iFepPluginManager->ClosePluginInputModeL(ETrue); |
|
4236 } |
|
4237 return; |
|
4238 default: |
|
4239 { |
|
4240 break; |
|
4241 } |
|
4242 } |
|
4243 } |
|
4244 |
|
4245 SendEventsToPluginManL( EPluginMenuCmd, aCommandId ); |
|
4246 |
|
4247 #endif //RD_SCALABLE_UI_V2 |
|
4248 MAknFepManagerInterface* currentFepUI=NULL; |
|
4249 switch (aCommandId) |
|
4250 { |
|
4251 // Edit mode menu commands |
|
4252 //The soft CBA event from touch screen. |
|
4253 case EAknSoftkeyCancel: |
|
4254 // case (TUint16)EAknSoftkeyCancel: |
|
4255 case EAknSoftkeySelect: |
|
4256 // case (TUint16)EAknSoftkeySelect: |
|
4257 currentFepUI = FepUI(); |
|
4258 if (currentFepUI) |
|
4259 currentFepUI->HandleCommandL( aCommandId ); |
|
4260 break; |
|
4261 // --- commands for Japanese --- |
|
4262 case EJapanFepCmdModeHiragana: |
|
4263 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4264 HandleChangeInFocus(); |
|
4265 TryChangeModeL(EHiraganaKanji); |
|
4266 break; |
|
4267 case EJapanFepCmdModeKatakana: |
|
4268 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4269 HandleChangeInFocus(); |
|
4270 TryChangeModeL(EKatakana); |
|
4271 break; |
|
4272 case EAknCmdEditInsertPictograph: |
|
4273 SetStopProcessFocus(ETrue); |
|
4274 HandleChangeInFocus(); |
|
4275 LaunchPictographCharacterTableL(); |
|
4276 SetStopProcessFocus(EFalse); |
|
4277 break; |
|
4278 case EJapanFepCmdModeFullWidth: |
|
4279 case EPenInputJpCmdFullWidth: |
|
4280 case EJapanFepCmdModeHalfWidth: |
|
4281 case EPenInputJpCmdHalfWidth: |
|
4282 { |
|
4283 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4284 HandleChangeInFocus(); |
|
4285 if (aCommandId == EJapanFepCmdModeFullWidth |
|
4286 || aCommandId == EPenInputJpCmdFullWidth) |
|
4287 { |
|
4288 iCharWidth = EFullWidthChar; |
|
4289 } |
|
4290 else |
|
4291 { |
|
4292 iCharWidth = EHalfWidthChar; |
|
4293 } |
|
4294 UpdateIndicators(); |
|
4295 TryChangeModeL(iMode); |
|
4296 #ifdef RD_SCALABLE_UI_V2 |
|
4297 if (aCommandId == EPenInputJpCmdFullWidth |
|
4298 || aCommandId == EPenInputJpCmdHalfWidth) |
|
4299 { |
|
4300 // Re-open pen input window |
|
4301 SendEventsToPluginManL( EPluginActivate ); |
|
4302 } |
|
4303 #endif //RD_SCALABLE_UI_V2 |
|
4304 } |
|
4305 break; |
|
4306 case EJapanFepCmdModeUserDic: |
|
4307 case EPenInputJpCmdSaveWord: |
|
4308 { |
|
4309 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4310 // User dictionary |
|
4311 #ifdef RD_PF_SEC_APPARC |
|
4312 // Launch settings app |
|
4313 if ( iNullService ) |
|
4314 { |
|
4315 delete iNullService; |
|
4316 iNullService = NULL; |
|
4317 } |
|
4318 iNullService = CAknNullService::NewL( KUidUserDictApp, this ); |
|
4319 #else |
|
4320 CEikProcess* process = CEikonEnv::Static()->Process(); |
|
4321 if (iEmbedded) |
|
4322 { |
|
4323 process->DestroyDocument(iEmbedded); |
|
4324 } |
|
4325 #if (defined(SYMBIAN_SUPPORT_UI_FRAMEWORKS_V1) || defined(__SERIES60_27__) || defined(__SERIES60_28__)) |
|
4326 iEmbedded = process->AddNewDocumentL(_L("User Dictionary"), KUidUserDictApp); |
|
4327 #else |
|
4328 iEmbedded = process->AddNewDocumentL(KUidUserDictApp); |
|
4329 #endif |
|
4330 iEmbedded->NewDocumentL(); |
|
4331 iEmbedded->EditL(NULL); |
|
4332 #endif //RD_PF_SEC_APPARC |
|
4333 } |
|
4334 break; |
|
4335 case EPenInputJpCmdKutenCode: |
|
4336 case EJapanFepCmdModeKutenCodeInput: |
|
4337 { |
|
4338 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4339 LaunchKutenCodeQueryL(); |
|
4340 #ifdef RD_SCALABLE_UI_V2 |
|
4341 if (aCommandId == EPenInputJpCmdKutenCode) |
|
4342 { |
|
4343 // Re-open pen input window |
|
4344 SendEventsToPluginManL( EPluginActivate ); |
|
4345 } |
|
4346 #endif //RD_SCALABLE_UI_V2 |
|
4347 } |
|
4348 break; |
|
4349 case EAknCmdEditClearDirectionLeft: |
|
4350 case EAknCmdEditClearDirectionRight: |
|
4351 { |
|
4352 TInt value = EClearDirectionLeft; |
|
4353 if (aCommandId == EAknCmdEditClearDirectionRight) |
|
4354 { |
|
4355 value = EClearDirectionRight; |
|
4356 } |
|
4357 iSharedDataInterface->SetClearDirection(value); |
|
4358 } |
|
4359 break; |
|
4360 case EAknFepSoftkeyCloseWindow: |
|
4361 if(IsChineseInputLanguage()) |
|
4362 { |
|
4363 TryCloseUiL(); |
|
4364 } |
|
4365 if (iCcpuMode != ECcpuStateNone) |
|
4366 { |
|
4367 ResetCcpuFlags(); |
|
4368 |
|
4369 // reset select mode indicators |
|
4370 iIndicator->SetCopyMode(EFalse); |
|
4371 // update view |
|
4372 iPreviousEditingState = EStateNone; |
|
4373 UpdateIndicators(); |
|
4374 |
|
4375 iUiInterface->DeleteSoftkeys(); |
|
4376 break; |
|
4377 } |
|
4378 case EAknFepSoftkeyCommit: |
|
4379 case EAknFepSoftkeySelectCandidate: |
|
4380 case EAknFepSoftkeyConvert: |
|
4381 case EAknFepSoftkeyOtherModes: |
|
4382 case EAknFepSoftkeyRetroActiveHalf: |
|
4383 case EAknFepSoftkeyRetroActiveFull: |
|
4384 { |
|
4385 FepUI()->HandleCommandL(aCommandId); |
|
4386 } |
|
4387 break; |
|
4388 case EAknFepSoftkeyPredictiveOn: |
|
4389 { |
|
4390 iJapanesePredictive = ETrue; |
|
4391 iSharedDataInterface->SetJapanesePredictiveTextOn(); |
|
4392 iHashKeyMan->SetMode(iMode, ETrue); |
|
4393 UpdateIndicators(); |
|
4394 FepUI()->HandleCommandL(aCommandId); |
|
4395 } |
|
4396 break; |
|
4397 case EJapanFepCmdModePredictiveOn: |
|
4398 { |
|
4399 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4400 HandleChangeInFocus(); |
|
4401 if (!iJapanesePredictive) |
|
4402 { |
|
4403 LaunchConfirmationNoteL(R_AVKON_JAPANESE_PREDICTIVE_ACTIVATED_NOTE); |
|
4404 } |
|
4405 iJapanesePredictive = ETrue; |
|
4406 TryChangeModeL(EHiraganaKanji); |
|
4407 iSharedDataInterface->SetJapanesePredictiveTextOn(); |
|
4408 } |
|
4409 break; |
|
4410 case EJapanFepCmdModePredictiveOff: |
|
4411 { |
|
4412 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4413 HandleChangeInFocus(); |
|
4414 if (iJapanesePredictive) |
|
4415 { |
|
4416 LaunchConfirmationNoteL(R_AVKON_JAPANESE_PREDICTIVE_DEACTIVATED_NOTE); |
|
4417 } |
|
4418 iJapanesePredictive = EFalse; |
|
4419 TryChangeModeL(EHiraganaKanji); |
|
4420 iSharedDataInterface->ResetJapanesePredictiveTextOn(); |
|
4421 } |
|
4422 break; |
|
4423 #ifdef RD_SCALABLE_UI_V2 |
|
4424 case EPenInputJpCmdPredictiveOn: |
|
4425 { |
|
4426 iJapanesePredictive = ETrue; |
|
4427 iSharedDataInterface->SetJapanesePredictiveTextOn(); |
|
4428 if (iFepPluginManager->PluginInputMode() == EPluginInputModeHwr) |
|
4429 { |
|
4430 iSharedDataInterface->SetJapaneseHwrConversion(EJapaneseConversionOn); |
|
4431 } |
|
4432 } |
|
4433 break; |
|
4434 case EPenInputJpCmdPredictiveOff: |
|
4435 { |
|
4436 iJapanesePredictive = EFalse; |
|
4437 iSharedDataInterface->ResetJapanesePredictiveTextOn(); |
|
4438 } |
|
4439 break; |
|
4440 case EPenInputJpCmdConversionOn: |
|
4441 { |
|
4442 iSharedDataInterface->SetJapaneseHwrConversion(EJapaneseConversionOn); |
|
4443 } |
|
4444 break; |
|
4445 case EPenInputJpCmdConversionOff: |
|
4446 { |
|
4447 iSharedDataInterface->SetJapaneseHwrConversion(EJapaneseConversionOff); |
|
4448 } |
|
4449 break; |
|
4450 #endif //RD_SCALABLE_UI_V2 |
|
4451 |
|
4452 // --- commands for Chinese --- |
|
4453 case EChinFepCmdModePinyin: |
|
4454 case EChinFepCmdModePinyinPhrase: |
|
4455 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4456 HandleChangeInFocus(); |
|
4457 TryChangeModeL(EPinyin); |
|
4458 break; |
|
4459 case EChinFepCmdModeZhuyin: |
|
4460 case EChinFepCmdModeZhuyinPhrase: |
|
4461 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4462 HandleChangeInFocus(); |
|
4463 TryChangeModeL(EZhuyin); |
|
4464 break; |
|
4465 case EChinFepCmdModeStroke: |
|
4466 case EChinFepCmdModeStrokePhrase: |
|
4467 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4468 HandleChangeInFocus(); |
|
4469 TryChangeModeL(EStroke); |
|
4470 break; |
|
4471 case EChinFepCmdModeCangJie: |
|
4472 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4473 HandleChangeInFocus(); |
|
4474 TryChangeModeL(ECangJie); |
|
4475 break; |
|
4476 case EChinFepCmdModeCangJieOption: |
|
4477 // Launch CangJie option dialog |
|
4478 { |
|
4479 SetStopProcessFocus(ETrue); |
|
4480 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4481 TInt newMode = LaunchCangJieOptionDlgL(); |
|
4482 SetStopProcessFocus(EFalse); |
|
4483 UpdateCangJieState( newMode ); |
|
4484 } |
|
4485 break; |
|
4486 case EChinFepCmdModeLatinUpper: |
|
4487 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4488 HandleChangeInFocus(); |
|
4489 TryChangeModeL(ELatinUpper); |
|
4490 // delete it for support auto update to text-case |
|
4491 //SetFlag(EFlagSupressAutoUpdate); |
|
4492 iCaseMan->SetCurrentCase(EAknEditorUpperCase); |
|
4493 break; |
|
4494 case EAknCmdEditModeKorean: |
|
4495 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4496 HandleChangeInFocus(); |
|
4497 TryChangeModeL(EHangul); |
|
4498 // delete it for support auto update to text-case |
|
4499 //SetFlag(EFlagSupressAutoUpdate); |
|
4500 iCaseMan->SetCurrentCase(EAknEditorUpperCase); |
|
4501 break; |
|
4502 case EChinFepCmdModeLatinLower: |
|
4503 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4504 HandleChangeInFocus(); |
|
4505 TryChangeModeL(ELatinLower); |
|
4506 // delete it for support auto update to text-case |
|
4507 //SetFlag(EFlagSupressAutoUpdate); |
|
4508 iCaseMan->SetCurrentCase(EAknEditorLowerCase); |
|
4509 break; |
|
4510 case EAknCmdEditModeNumber: |
|
4511 //if current input is arabic finger hwr, then change the default |
|
4512 //number mode. |
|
4513 if(iSharedDataInterface->InputTextLanguage() == ELangArabic |
|
4514 && iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr) |
|
4515 { |
|
4516 iSharedDataInterface->SetDefaultArabicNumberMode(0); |
|
4517 HandleChangeInFocus(); |
|
4518 SendEventsToPluginManL(EPluginArabicNumModeChanged, 0); |
|
4519 break; |
|
4520 } |
|
4521 case EJapanFepCmdEditModeNumber: |
|
4522 case EChinFepCmdModeNumber: |
|
4523 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4524 HandleChangeInFocus(); |
|
4525 if ( iLanguageCapabilities.iArabicIndicDigitsAllowed |
|
4526 || iLanguageCapabilities.iEasternArabicIndicDigitsAllowed |
|
4527 || iLanguageCapabilities.iIndicDigitsAllowed ) |
|
4528 { |
|
4529 iLanguageCapabilities.iLocalDigitType = EDigitTypeWestern; |
|
4530 } |
|
4531 TryChangeModeL(ENumber); |
|
4532 break; |
|
4533 case EAknCmdEditModeArabicIndicNumber: |
|
4534 //if current input is arabic finger hwr, then change the default |
|
4535 //number mode. |
|
4536 if(iSharedDataInterface->InputTextLanguage() == ELangArabic |
|
4537 && iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr) |
|
4538 { |
|
4539 iSharedDataInterface->SetDefaultArabicNumberMode(1); |
|
4540 SendEventsToPluginManL(EPluginArabicNumModeChanged, 1); |
|
4541 HandleChangeInFocus(); |
|
4542 } |
|
4543 else |
|
4544 { |
|
4545 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4546 HandleChangeInFocus(); |
|
4547 iLanguageCapabilities.iLocalDigitType = EDigitTypeArabicIndic; |
|
4548 TryChangeModeL(ENativeNumber); |
|
4549 } |
|
4550 break; |
|
4551 /*For Eastern Arabic Numeric*/ |
|
4552 case EAknCmdEditModeEasternArabicIndicNumber: |
|
4553 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4554 HandleChangeInFocus(); |
|
4555 iLanguageCapabilities.iLocalDigitType = EDigitTypeEasternArabicIndic; |
|
4556 TryChangeModeL(ENativeNumber); |
|
4557 break; |
|
4558 /*for Hindi*/ |
|
4559 case EAknCmdEditModeIndicNumber: |
|
4560 HandleChangeInFocus(); |
|
4561 iLanguageCapabilities.iLocalDigitType = EDigitTypeDevanagari; |
|
4562 TryChangeModeL(ENativeNumber); |
|
4563 break; |
|
4564 case EChinFepCmdInstructions: |
|
4565 SetStopProcessFocus(ETrue); |
|
4566 HandleChangeInFocus(); |
|
4567 LaunchHelpTextQueryL(); |
|
4568 SetStopProcessFocus(EFalse); |
|
4569 break; |
|
4570 case EChinFepCmdModeZhuyinFind: |
|
4571 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4572 HandleChangeInFocus(); |
|
4573 TryChangeModeL(EZhuyinFind); |
|
4574 break; |
|
4575 case EChinFepCmdModeStrokeFind: |
|
4576 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4577 HandleChangeInFocus(); |
|
4578 TryChangeModeL(EStrokeFind); |
|
4579 break; |
|
4580 |
|
4581 // commands for western or common |
|
4582 case EJapanFepCmdMultitapPredictiveT9On: |
|
4583 case EAknCmdMultitapPredictiveT9On: |
|
4584 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
4585 case EAknFepCmdPredActivate: |
|
4586 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
4587 SetStopProcessFocus(ETrue, EFalse); |
|
4588 HandleChangeInFocus(); |
|
4589 #ifdef RD_SCALABLE_UI_V2 |
|
4590 if( iFepFullyConstructed && iFepPluginManager) |
|
4591 { |
|
4592 iFepPluginManager->SetMenuState(); |
|
4593 } |
|
4594 #endif |
|
4595 if ( !iWesternPredictive ) |
|
4596 { |
|
4597 LaunchConfirmationNoteL(R_AVKON_T9_ACTIVATED_NOTE); |
|
4598 } |
|
4599 SetWesternPredictive(ETrue); |
|
4600 SetStopProcessFocus(EFalse); |
|
4601 TryChangeModeL(ELatin); |
|
4602 break; |
|
4603 case EAknCmdT9PredictiveT9Off: |
|
4604 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
4605 case EAknFepCmdPredDeactivate: |
|
4606 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
4607 SetStopProcessFocus(ETrue, EFalse); |
|
4608 HandleChangeInFocus(); |
|
4609 #ifdef RD_SCALABLE_UI_V2 |
|
4610 if( iFepFullyConstructed && iFepPluginManager) |
|
4611 { |
|
4612 iFepPluginManager->SetMenuState(); |
|
4613 } |
|
4614 #endif |
|
4615 if (iMode != ELatin) |
|
4616 { |
|
4617 TryChangeModeL(ELatin); |
|
4618 } |
|
4619 else |
|
4620 { |
|
4621 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
4622 RemoveSuggestedAdvanceCompletionL(); |
|
4623 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
4624 CommitInlineEditL(); |
|
4625 } |
|
4626 if ( iWesternPredictive ) |
|
4627 { |
|
4628 LaunchConfirmationNoteL(R_AVKON_T9_DEACTIVATED_NOTE); |
|
4629 } |
|
4630 SetWesternPredictive(EFalse); |
|
4631 SetStopProcessFocus(EFalse); |
|
4632 break; |
|
4633 case EAknCmdEditModeEnglish: |
|
4634 case EAknCmdEditModeAlpha: |
|
4635 case EJapanFepCmdEditModeAlpha: |
|
4636 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4637 HandleChangeInFocus(); |
|
4638 TryChangeModeL(ELatin); |
|
4639 iCaseMan->UpdateCase( ENullNaviEvent ); |
|
4640 ClearFlag(EFlagSupressAutoUpdate); |
|
4641 break; |
|
4642 case EAknCmdEditModeLatinText: |
|
4643 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4644 HandleChangeInFocus(); |
|
4645 TryChangeModeL(ELatinText); |
|
4646 ClearFlag(EFlagSupressAutoUpdate); |
|
4647 iCaseMan->SetCurrentCase(EAknEditorTextCase); |
|
4648 break; |
|
4649 case EAknCmdEditInsertSymbol: |
|
4650 case EAknCmdEditInsertSymbolJp: |
|
4651 case EAknFepSoftkeySymbol: |
|
4652 case EAknCmdEditInsertSmiley: |
|
4653 SetCcpuFlag(ECcpuStateSupressCursorMoveToEnd); |
|
4654 #ifdef RD_SCALABLE_UI_V2 |
|
4655 if (iFepPluginManager && |
|
4656 (iFepPluginManager->PluginInputMode() == EPluginInputModeItut || |
|
4657 iFepPluginManager->PluginInputMode() == EPluginInputModeFSQ || |
|
4658 iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr || |
|
4659 iFepPluginManager->PluginInputMode() == EPluginInputModePortraitFSQ ) ) |
|
4660 { |
|
4661 iFepPluginManager->SetMenuState(); |
|
4662 } |
|
4663 |
|
4664 #endif //RD_SCALABLE_UI_V2 |
|
4665 SetStopProcessFocus(ETrue, EFalse); |
|
4666 HandleChangeInFocus(); |
|
4667 if (aCommandId == EAknFepSoftkeySymbol) |
|
4668 { |
|
4669 SetCcpuFlag(ECcpuStateCbaSymbol); |
|
4670 } |
|
4671 // Show Thai specific SCT with Thai vowels and tonemarks |
|
4672 if ( (iLanguageCapabilities.iInputLanguageCode == ELangThai ) && |
|
4673 (iMode!=ENumber && iMode != ENativeNumber ) ) |
|
4674 { |
|
4675 TInt resourceId = 0; |
|
4676 if (iAknFepThaiSCTSelector) |
|
4677 { |
|
4678 resourceId = iAknFepThaiSCTSelector->ThaiSCRResourceId(PreviousChar(),EPtiKeyStar); |
|
4679 } |
|
4680 LaunchSpecialCharacterTableL(resourceId, |
|
4681 aCommandId==EAknCmdEditInsertSymbol, |
|
4682 aCommandId==EAknCmdEditInsertSmiley); |
|
4683 } |
|
4684 else |
|
4685 { |
|
4686 LaunchSpecialCharacterTableL(0, |
|
4687 aCommandId==EAknCmdEditInsertSymbol, |
|
4688 aCommandId==EAknCmdEditInsertSmiley); |
|
4689 } |
|
4690 SetStopProcessFocus(EFalse); |
|
4691 ClearCcpuFlag(ECcpuStateCbaSymbol); |
|
4692 break; |
|
4693 case EAknFepSoftkeyPrevious: |
|
4694 FepUI()->HandleCommandL(aCommandId); |
|
4695 break; |
|
4696 case EAknFepSoftkeySpell: |
|
4697 LaunchEditWordQueryL(); |
|
4698 break; |
|
4699 case EAknCmdT9PredictiveInsertWord: |
|
4700 SetStopProcessFocus(ETrue, EFalse); |
|
4701 HandleChangeInFocus(); |
|
4702 LaunchInsertWordQueryL(KNullDesC, TCursorSelection(0,0)); |
|
4703 SetStopProcessFocus(EFalse); |
|
4704 #ifdef RD_SCALABLE_UI_V2 |
|
4705 if( iFepFullyConstructed && iFepPluginManager) |
|
4706 { |
|
4707 iFepPluginManager->ResetMenuState(); |
|
4708 } |
|
4709 #endif |
|
4710 break; |
|
4711 case EAknCmdT9PredictiveEditWord: |
|
4712 SetStopProcessFocus( ETrue, EFalse ); |
|
4713 HandleChangeInFocus(); |
|
4714 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
4715 RemoveSuggestedAdvanceCompletionL(); |
|
4716 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
4717 LaunchEditWordQueryL(); |
|
4718 SetStopProcessFocus(EFalse); |
|
4719 #ifdef RD_SCALABLE_UI_V2 |
|
4720 if( iFepFullyConstructed && iFepPluginManager ) |
|
4721 { |
|
4722 iFepPluginManager->ResetMenuState(); |
|
4723 } |
|
4724 #endif |
|
4725 break; |
|
4726 case EAknCmdT9PredictiveMatches: |
|
4727 SetStopProcessFocus(ETrue,EFalse); |
|
4728 LaunchMatchesPopupListL(); |
|
4729 SetStopProcessFocus(EFalse); |
|
4730 break; |
|
4731 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
4732 case EAknCmdPredictiveAutoWord: |
|
4733 if ( !iIsAutoCompleteOn ) |
|
4734 { |
|
4735 SetStopProcessFocus(ETrue); |
|
4736 LaunchConfirmationNoteL(R_AVKON_PREDICTIVE_AUTOCOMPLETION_ACTIVATED_NOTE); |
|
4737 SetStopProcessFocus(EFalse); |
|
4738 } |
|
4739 iIsAutoCompleteOn = ETrue; |
|
4740 iSharedDataInterface->SetPredictiveTextAutoCompleteOn(); |
|
4741 #ifdef RD_SCALABLE_UI_V2 |
|
4742 if(iFepPluginManager->PluginInputMode() == EPluginInputModeItut) |
|
4743 { |
|
4744 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
4745 HandleChangeInFocus(); |
|
4746 } |
|
4747 #endif |
|
4748 UpdateIndicators(); |
|
4749 break; |
|
4750 case EAknCmdPredictiveNormal: |
|
4751 if ( iIsAutoCompleteOn ) |
|
4752 { |
|
4753 SetStopProcessFocus(ETrue); |
|
4754 LaunchConfirmationNoteL(R_AVKON_PREDICTIVE_AUTOCOMPLETION_DEACTIVATED_NOTE); |
|
4755 SetStopProcessFocus(EFalse); |
|
4756 } |
|
4757 iIsAutoCompleteOn = EFalse; |
|
4758 iSharedDataInterface->ResetPredictiveTextAutoCompleteOn(); |
|
4759 UpdateIndicators(); |
|
4760 break; |
|
4761 #endif |
|
4762 case EAknCmdInputLanguage: |
|
4763 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
4764 case EAknFepCmdPredInputLanguage: |
|
4765 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
4766 SetStopProcessFocus(ETrue, EFalse); |
|
4767 HandleChangeInFocus(); |
|
4768 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
4769 #ifdef FF_DUAL_LANGUAGE_SUPPORT |
|
4770 // Currently dual language feature would work correctly for ITUT and Half Qwerty products |
|
4771 // Hence the dual language settings should also be displayed only for ITUT and Halfqwerty products |
|
4772 if(iKeyboardType == EPtiKeyboard12Key || iKeyboardType == EPtiKeyboardHalfQwerty ) |
|
4773 LaunchDualLanguageSettingDialogL(); |
|
4774 else |
|
4775 { |
|
4776 LaunchLanguagesPopupListL(aCommandId == EAknCmdInputLanguage); |
|
4777 iStopProcessFocus = EFalse; |
|
4778 } |
|
4779 #else // FF_DUAL_LANGUAGE_SUPPORT |
|
4780 LaunchLanguagesPopupListL(aCommandId == EAknCmdInputLanguage); |
|
4781 //HandleChangeInFocus(); |
|
4782 iStopProcessFocus = EFalse; |
|
4783 #endif // FF_DUAL_LANGUAGE_SUPPORT |
|
4784 #else |
|
4785 LaunchLanguagesPopupListL(aCommandId == EAknCmdInputLanguage); |
|
4786 HandleChangeInFocus(); |
|
4787 iStopProcessFocus = EFalse; |
|
4788 #endif |
|
4789 break; |
|
4790 case EAknEditMenuCmdCutText: |
|
4791 StartCcpuModeL(EFalse); |
|
4792 if (WesternPredictive()) |
|
4793 { |
|
4794 // Remove underlining from predicted word when focus is re-gained. |
|
4795 SetCcpuFlag(ECcpuStateUncommitWhenFocused); |
|
4796 } |
|
4797 SetCcpuFlag(ECcpuStateIgnoreNextFocusChange); |
|
4798 SetCcpuFlag(ECcpuStateEdwinInSelectionMode); |
|
4799 break; |
|
4800 case EAknEditMenuCmdCopyText: |
|
4801 StartCcpuModeL(ETrue); |
|
4802 if (WesternPredictive()) |
|
4803 { |
|
4804 // Remove underlining from predicted word when focus is re-gained. |
|
4805 SetCcpuFlag(ECcpuStateUncommitWhenFocused); |
|
4806 } |
|
4807 SetCcpuFlag(ECcpuStateIgnoreNextFocusChange); |
|
4808 SetCcpuFlag(ECcpuStateEdwinInSelectionMode); |
|
4809 break; |
|
4810 case EAknFepSoftkeyStartCopy: |
|
4811 case EAknFepSoftkeyStartCut: |
|
4812 { |
|
4813 ResetCcpuFlags(); |
|
4814 if (aCommandId == EAknFepSoftkeyStartCopy) |
|
4815 { |
|
4816 SetCcpuFlag(ECcpuStateCopy); |
|
4817 } |
|
4818 else |
|
4819 { |
|
4820 SetCcpuFlag(ECcpuStateCut); |
|
4821 } |
|
4822 |
|
4823 __ASSERT_DEBUG(iUiInterface->SoftkeysExist(), |
|
4824 AknFepPanic(EAknFepPanicNoHandleToFepAwareTextEditor)); |
|
4825 |
|
4826 TBool update = UpdateCBALabelL(ELeftSoftkeyIndex, KNullCommandId, R_TEXT_SOFTKEY_EMPTY); |
|
4827 update |= UpdateCBALabelL(ERightSoftkeyIndex, EAknFepSoftkeyCloseWindow, |
|
4828 R_AKNFEP_SOFTKEY_CCPU_CANCEL); |
|
4829 update |= UpdateCBALabelL( EMiddleSoftkeyIndex, KNullCommandId, R_TEXT_SOFTKEY_EMPTY ); |
|
4830 if (update) |
|
4831 { |
|
4832 iUiInterface->DrawSoftkeysNow(); |
|
4833 } |
|
4834 } |
|
4835 break; |
|
4836 case EEikCmdEditCopy: |
|
4837 case EEikCmdEditCut: |
|
4838 { |
|
4839 #ifdef RD_SCALABLE_UI_V2 |
|
4840 if (iFepPluginManager && |
|
4841 (iFepPluginManager->PluginInputMode() == EPluginInputModeItut || |
|
4842 iFepPluginManager->PluginInputMode() == EPluginInputModeFSQ || |
|
4843 iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr || |
|
4844 iFepPluginManager->PluginInputMode() == EPluginInputModePortraitFSQ ) ) |
|
4845 { |
|
4846 iFepPluginManager->SetMenuState(EFalse); |
|
4847 } |
|
4848 |
|
4849 #endif //RD_SCALABLE_UI_V2 |
|
4850 SetStopProcessFocus(ETrue, EFalse); |
|
4851 HandleCopyCutEventL(aCommandId); |
|
4852 SetStopProcessFocus(EFalse); |
|
4853 } |
|
4854 break; |
|
4855 case EEikCmdEditPaste: |
|
4856 { |
|
4857 // We have a hindi character in clipboard which can form ligature with the existing text |
|
4858 // if pasted. While the input language is English, the cursor aligmment check would not happen. |
|
4859 // When selecting Options->Paste, the Fep context at this point is for the menu. |
|
4860 // iInputCapabilities for editor context is retrived from CCoeEnv and is restored back |
|
4861 // after doing the operation, else FepAwareTextEditor will be true in menu context. |
|
4862 if ( (!BidiCursorRequired()) && (!WesternPredictive()) ) |
|
4863 { |
|
4864 TCoeInputCapabilities origInputCapabilities = iInputCapabilities; |
|
4865 |
|
4866 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
4867 iInputCapabilities = static_cast<const CCoeAppUi*>(coeEnv->AppUi())->InputCapabilities(); |
|
4868 |
|
4869 if( !(iInputCapabilities.SupportsSecretText()) ) |
|
4870 { |
|
4871 DoCursorDirectionCheckL(); |
|
4872 } |
|
4873 iInputCapabilities = origInputCapabilities; |
|
4874 } |
|
4875 } |
|
4876 break; |
|
4877 |
|
4878 case EAknCmdEditMenuSctSelected: |
|
4879 { |
|
4880 SetCcpuFlag(ECcpuStateSupressCursorMoveToEnd); |
|
4881 HandleChangeInFocus(); // to re-establish contact with editor |
|
4882 |
|
4883 TBuf<ESingleCharacter> charAsDesc(ESingleCharacter); |
|
4884 for ( TInt ii = 0; ii < iSctEditChars->Length(); ii++) |
|
4885 { |
|
4886 charAsDesc[0]=(TText) (*iSctEditChars)[ii]; |
|
4887 if (charAsDesc[0] == TText(0x000A) // 0x000A is line feed |
|
4888 || charAsDesc[0] == CEditableText::EParagraphDelimiter) |
|
4889 { |
|
4890 // This is line feed character. Post it to editor and let it decide |
|
4891 // if it is valid. |
|
4892 if (!(iAknEditorFlags & EAknEditorFlagFindPane) && iSctEditChars->Length() == 1) |
|
4893 { |
|
4894 SimulateKeyEventL(EKeyEnter); |
|
4895 SimulateKeyEventL(EKeyF19); // Asyncronous case update |
|
4896 } |
|
4897 } |
|
4898 else |
|
4899 { |
|
4900 if (CharIsValidInEditor(charAsDesc[0])) |
|
4901 { |
|
4902 TCursorSelection cursorSelection(0,0); |
|
4903 if ((iAknEditorFlags & EAknEditorFlagMTAutoOverwrite) && |
|
4904 iMode == ELatin && !WesternPredictive()) |
|
4905 { |
|
4906 TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
4907 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
4908 if (iUncommittedText.iCursorPos < edSize && iUncommittedText.Length() == 0) |
|
4909 { |
|
4910 cursorSelection = TCursorSelection(iUncommittedText.iCursorPos + 1, |
|
4911 iUncommittedText.iAnchorPos); |
|
4912 } |
|
4913 } |
|
4914 |
|
4915 if (EditorHasFreeSpace()) |
|
4916 { |
|
4917 InsertTextFromDialogL(charAsDesc, cursorSelection); |
|
4918 } |
|
4919 |
|
4920 } |
|
4921 } |
|
4922 |
|
4923 } |
|
4924 } |
|
4925 break; |
|
4926 case EAknCmdTaskSwapper: |
|
4927 SendEventsToPluginManL( EPluginFaseSwap, ETrue ); |
|
4928 break; |
|
4929 |
|
4930 case EAknCmdEditMenuClose: |
|
4931 { |
|
4932 // Handle destruction of menu |
|
4933 StopDisplayingMenuBar(); |
|
4934 } |
|
4935 break; |
|
4936 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
4937 // Predictive QWERTY (XT9) changes ----> |
|
4938 case EAknFepCmdPredMatches: |
|
4939 { |
|
4940 HandleChangeInFocus(); // to re-establish contact with editor |
|
4941 // Focus current active word in list ----> |
|
4942 TInt wordToFocus; |
|
4943 iPtiEngine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates, &wordToFocus ); |
|
4944 iSListLaunchedFromMenu = ETrue; |
|
4945 TKeyEvent candLaunch = {EKeyDownArrow, EStdKeyDownArrow, 0, 0}; |
|
4946 CEikonEnv::Static()->WsSession().SimulateKeyEvent(candLaunch); |
|
4947 //LaunchCandidatePopupListL( wordToFocus ); |
|
4948 } |
|
4949 break; |
|
4950 case EAknFepCmdPredSettings: |
|
4951 LaunchPredictiveSettingDialogL(); |
|
4952 break; |
|
4953 /* |
|
4954 This code is the part of fixing TSW Error |
|
4955 "Matches" and "insert word" options are not available under Edit Menu. |
|
4956 This is For Insert Word Functionality*/ |
|
4957 case EAknEditMenuCmdInsertWord: |
|
4958 HandleChangeInFocus(); |
|
4959 LaunchInsertWordQueryL(KNullDesC, TCursorSelection(0,0)); |
|
4960 break; |
|
4961 #ifdef __USER_DICTIONARY_EDITING__ |
|
4962 case EAknFepCmdPredEditUserDictionary: |
|
4963 if ( IsAutoCompleteOn() ) |
|
4964 { |
|
4965 HandleChangeInFocus(); |
|
4966 RemoveSuggestedAdvanceCompletionL(); |
|
4967 } |
|
4968 UiInterface()->LaunchUserDictEditDialogL(); |
|
4969 break; |
|
4970 #endif //__USER_DICTIONARY_EDITING__ |
|
4971 |
|
4972 case EAknFepCmdPredHelp: |
|
4973 // Help ID:PREDINPUT_HLP_INPUT |
|
4974 { |
|
4975 const TInt KArrayGranularity = 3; |
|
4976 CArrayFix<TCoeHelpContext>* contexts = |
|
4977 new (ELeave) CArrayFixFlat<TCoeHelpContext>( KArrayGranularity ); |
|
4978 CleanupStack::PushL ( contexts ); |
|
4979 TUid appuid = { 0x100058EC }; |
|
4980 contexts->AppendL( TCoeHelpContext( appuid, KPREDINPUT_HLP_INPUT ) ); |
|
4981 CleanupStack::Pop( contexts ); |
|
4982 HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(), contexts ); |
|
4983 } |
|
4984 break; |
|
4985 // Predictive QWERTY (XT9) changes <---- |
|
4986 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
4987 // add for phrase creation user db view. |
|
4988 case EAknCmdUserDBDlg: |
|
4989 { |
|
4990 HandleChangeInFocus(); |
|
4991 LaunchUserDBDlgL(); |
|
4992 } |
|
4993 break; |
|
4994 case EPenInputCmdPreviewOn: |
|
4995 { |
|
4996 iSharedDataInterface->SetFepShowVkbPreviewStatus(KTouchInputPreviewOn); |
|
4997 SendEventsToPluginManL(EPluginPreview, KTouchInputPreviewOn); |
|
4998 } |
|
4999 break; |
|
5000 case EPenInputCmdPreviewOff: |
|
5001 { |
|
5002 iSharedDataInterface->SetFepShowVkbPreviewStatus(KTouchInputPreviewOff); |
|
5003 SendEventsToPluginManL(EPluginPreview, KTouchInputPreviewOff); |
|
5004 } |
|
5005 break; |
|
5006 case EPenInputCmdRecognitionWithDictionary: |
|
5007 { |
|
5008 SetStopProcessFocus(ETrue); |
|
5009 HandleChangeInFocus(); |
|
5010 LaunchRecognitionWithDictionaryPopupListL(); |
|
5011 HandleChangeInFocus(); |
|
5012 iStopProcessFocus = EFalse; |
|
5013 } |
|
5014 break; |
|
5015 case EPenInputCmdHwrInputToPortrait: |
|
5016 { |
|
5017 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
5018 HandleChangeInFocus(); |
|
5019 SendEventsToPluginManL( EPluginSwitchToPortrait); |
|
5020 } |
|
5021 break; |
|
5022 case EPenInputCmdHwrInputToLandscape: |
|
5023 { |
|
5024 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
5025 HandleChangeInFocus(); |
|
5026 SendEventsToPluginManL( EPluginSwitchToLandscape); |
|
5027 } |
|
5028 break; |
|
5029 /*case EPenInputCmdSwitchToVkeyBasedInput: |
|
5030 { |
|
5031 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
5032 HandleChangeInFocus(); |
|
5033 SendEventsToPluginManL( EPluginSwitchMode); |
|
5034 } |
|
5035 break;*/ |
|
5036 case EPenInputCmdWritingSpeed: |
|
5037 { |
|
5038 SetStopProcessFocus(ETrue,EFalse); |
|
5039 LaunchWritingSpeedPopupListL(); |
|
5040 SetStopProcessFocus(EFalse); |
|
5041 } |
|
5042 break; |
|
5043 case EPenInputCmdGuidingLine: |
|
5044 { |
|
5045 SetStopProcessFocus(ETrue,EFalse); |
|
5046 LaunchGuidingLinePopupListL(); |
|
5047 SetStopProcessFocus(EFalse); |
|
5048 } |
|
5049 break; |
|
5050 default: |
|
5051 break; |
|
5052 } |
|
5053 |
|
5054 |
|
5055 StopDisplayingMenuBar(); |
|
5056 } |
|
5057 |
|
5058 void CAknFepManager::SetEmphasis(CBase* /*aMenuControl*/,TBool aEmphasis) |
|
5059 { |
|
5060 if (aEmphasis) |
|
5061 { // opening main menu pane |
|
5062 SetFlag(EFlagMenuPaneVisible); |
|
5063 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
5064 { |
|
5065 SetFlag(EFlagInlineEditInBackground); |
|
5066 } |
|
5067 } |
|
5068 else |
|
5069 { |
|
5070 // The pointer to be cleared when the callback is received on leaving the focus from the menu pane. |
|
5071 #ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__ |
|
5072 iOptionsMenuBar = NULL; |
|
5073 #endif |
|
5074 ClearFlag(EFlagMenuPaneVisible | EFlagRemoveMatchesMenuItem | EFlagInlineEditInBackground); |
|
5075 } |
|
5076 } |
|
5077 |
|
5078 void CAknFepManager::DynInitMenuBarL(TInt aResourceId, CAknFepUiInterfaceMenuBar* aMenuBar) |
|
5079 { |
|
5080 if (iFepFullyConstructed && IsFlagSet(EFlagLaunchEditMenu)) |
|
5081 { |
|
5082 aMenuBar->ReplaceAllMenuPanes(R_AVKON_EDIT_MODE_MENU); |
|
5083 } |
|
5084 |
|
5085 #ifdef RD_SCALABLE_UI_V2 |
|
5086 if (iFepFullyConstructed && |
|
5087 aResourceId == R_AVKON_PENINPUT_OPTION_MENU_BAR) |
|
5088 { |
|
5089 aMenuBar->ReplaceAllMenuPanes(R_AVKON_TOUCH_TOUCHINPUT_MENU); |
|
5090 } |
|
5091 #endif //RD_SCALABLE_UI_V2 |
|
5092 |
|
5093 } |
|
5094 |
|
5095 #ifdef RD_SCALABLE_UI_V2 |
|
5096 void CAknFepManager::DynInitTouchMenuPaneL(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
5097 { |
|
5098 if ( !iFepFullyConstructed ) |
|
5099 { |
|
5100 return; |
|
5101 } |
|
5102 |
|
5103 |
|
5104 if (iFepManState != EAknFepStateNull && |
|
5105 iInputCapabilities.FepAwareTextEditor() && |
|
5106 !(iAknEditorFlags & EAknEditorFlagFindPane)) |
|
5107 { |
|
5108 // 'Input language' menu item on option menu isn't supported in Japanese variant. |
|
5109 if (!IsFeatureSupportedJapanese()) |
|
5110 { |
|
5111 // Insert 'Input language' item to incoming menu if editor is active on screen and |
|
5112 // menu contains 'Help' or 'Exit' item. |
|
5113 if (!IsOnlyNumericPermitted()) |
|
5114 { |
|
5115 TInt helpIndex; |
|
5116 if (aMenuPane->MenuItemExists(EAknCmdHelp, helpIndex) || |
|
5117 aMenuPane->MenuItemExists(EAknCmdExit, helpIndex)) |
|
5118 { |
|
5119 AddInputLanguageItemL(aMenuPane, helpIndex); |
|
5120 } |
|
5121 } |
|
5122 } |
|
5123 } |
|
5124 |
|
5125 TInt index; |
|
5126 if(aMenuPane->MenuItemExists(EAknCmdEditItemPlaceHolder, index)) |
|
5127 { |
|
5128 aMenuPane->DeleteMenuItem(EAknCmdEditItemPlaceHolder); |
|
5129 } |
|
5130 |
|
5131 ClearFlag(EFlagLaunchEditMenu); |
|
5132 |
|
5133 DimInputmodeTouchMenuItems(aMenuPane); |
|
5134 } |
|
5135 #endif //RD_SCALABLE_UI_V2 |
|
5136 void CAknFepManager::DynInitMenuPaneL(TInt aResourceId, CAknFepUiInterfaceMenuPane* aMenuPane) |
|
5137 { |
|
5138 if ( !iFepFullyConstructed ) |
|
5139 { |
|
5140 return; |
|
5141 } |
|
5142 |
|
5143 #ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__ |
|
5144 CAknEdwinState* editorState = NULL; |
|
5145 if (iInputCapabilities.FepAwareTextEditor()) |
|
5146 { |
|
5147 editorState = EditorState(); |
|
5148 } |
|
5149 |
|
5150 if (editorState) |
|
5151 { |
|
5152 iOptionsMenuBar = iUiInterface->EditorStateMenuBar(editorState); |
|
5153 } |
|
5154 #endif |
|
5155 |
|
5156 SetCcpuFlag(ECcpuStateIgnoreNextEdwinSyncEvent); |
|
5157 |
|
5158 if (iFepManState != EAknFepStateNull && |
|
5159 iInputCapabilities.FepAwareTextEditor() && |
|
5160 !(iAknEditorFlags & EAknEditorFlagFindPane)) |
|
5161 { |
|
5162 // 'Input language' menu item on option menu isn't supported in Japanese variant. |
|
5163 if (!IsFeatureSupportedJapanese()) |
|
5164 { |
|
5165 // Insert 'Input language' item to incoming menu if editor is active on screen and |
|
5166 // menu contains 'Help' or 'Exit' item. |
|
5167 //Also, no need for writing language/ITI options in telephony's dialer |
|
5168 if ( (RProcess().SecureId().iId != KPhoneSecureId) && !IsOnlyNumericPermitted() ) |
|
5169 { |
|
5170 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
5171 //This method gets called multiple times - first before the help and exit |
|
5172 //commands are populated and finally after these items are added. |
|
5173 //So if we have already added the input options menu and/or writing language menu, |
|
5174 //remove it. It will get added again to the correct place with the below code. |
|
5175 //No need to handle following menu types here. |
|
5176 if ( !( R_AVKON_EDIT_MODE_MENU == aResourceId || |
|
5177 R_AKNFEP_PRED_INPUT_OPTIONS_SUBMENU == aResourceId || |
|
5178 R_AVKON_PREDICTIVE_TEXT_MENU_T9 == aResourceId || |
|
5179 R_AVKON_INPUT_MODE_SUB_MENU == aResourceId || |
|
5180 R_AKNFEP_EDIT_SUBMENU == aResourceId || |
|
5181 R_AVKON_TOUCH_TOUCHINPUT_MENU == aResourceId ) |
|
5182 // Add this condition for adding "input options" into the option menu of FSQ. |
|
5183 || ( R_AVKON_TOUCH_TOUCHINPUT_MENU == aResourceId |
|
5184 && iFepPluginManager |
|
5185 && iFepPluginManager->IsSupportITIOnFSQ() ) |
|
5186 ) |
|
5187 { |
|
5188 FindAndRemoveInputOptionsMenuItemL( aMenuPane ); |
|
5189 FindAndRemoveEditSubMenuItemL (aMenuPane); |
|
5190 AddInputOptionsMenuItemL( aMenuPane ); |
|
5191 } |
|
5192 #else |
|
5193 TInt helpIndex; |
|
5194 if ( aMenuPane->MenuItemExists(EAknCmdHelp, helpIndex) || |
|
5195 aMenuPane->MenuItemExists(EAknCmdExit, helpIndex) ) |
|
5196 { |
|
5197 AddInputLanguageItemL(aMenuPane, helpIndex); |
|
5198 } |
|
5199 |
|
5200 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
5201 } |
|
5202 } |
|
5203 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
5204 if ( IsChineseInputLanguage() && |
|
5205 ( iKeyboardType == EPtiKeyboardQwerty4x10 || |
|
5206 iKeyboardType == EPtiKeyboardQwerty3x11 ) ) |
|
5207 { |
|
5208 // the follow added for phrase creation |
|
5209 TInt iptlanguage; |
|
5210 if ( !iIsUserdbdlgActive ) |
|
5211 { |
|
5212 aMenuPane->MenuItemExists( EAknCmdInputLanguage, iptlanguage ); |
|
5213 AddUserDBDlgItemL( aMenuPane, iptlanguage ); |
|
5214 } |
|
5215 } |
|
5216 #endif |
|
5217 |
|
5218 if (!(aResourceId == R_AVKON_EDIT_MODE_MENU || |
|
5219 aResourceId == R_AVKON_TOUCH_TOUCHINPUT_MENU || |
|
5220 aResourceId == R_AVKON_TOUCH_INDICATOR_EDIT_MODE_MENU)) |
|
5221 { |
|
5222 AddEditSubmenuL(aMenuPane); |
|
5223 } |
|
5224 } |
|
5225 |
|
5226 //HWR Hindi, Training application is not available, |
|
5227 //Disable Menu option |
|
5228 if(aResourceId == R_AVKON_TOUCH_TOUCHINPUT_MENU && |
|
5229 iLanguageCapabilities.iInputLanguageCode == ELangHindi) |
|
5230 { |
|
5231 aMenuPane->SetItemDimmed(EPenInputCmdHwrTraining, ETrue); |
|
5232 } |
|
5233 TInt index; |
|
5234 if(aMenuPane->MenuItemExists(EAknCmdEditItemPlaceHolder, index)) |
|
5235 { |
|
5236 aMenuPane->DeleteMenuItem(EAknCmdEditItemPlaceHolder); |
|
5237 } |
|
5238 #ifdef RD_SCALABLE_UI_V2 |
|
5239 TInt oldPermitModes = -1; |
|
5240 if (R_AVKON_TOUCH_TOUCHINPUT_MENU == aResourceId ) |
|
5241 { |
|
5242 oldPermitModes = iPermittedInputModes; |
|
5243 |
|
5244 if( iFepPluginManager != NULL ) |
|
5245 { |
|
5246 iPermittedInputModes = iFepPluginManager->PreviousPermitMode(); |
|
5247 } |
|
5248 } |
|
5249 if( iFepPluginManager != NULL ) |
|
5250 { |
|
5251 iFepPluginManager->InitMenuPaneL( iRememberEditorState, aMenuPane, aResourceId ); |
|
5252 } |
|
5253 if (oldPermitModes != -1) |
|
5254 { |
|
5255 iPermittedInputModes = oldPermitModes; |
|
5256 } |
|
5257 #endif // RD_SCALABLE_UI_V2 |
|
5258 switch (aResourceId) |
|
5259 { |
|
5260 case R_AVKON_TOUCHINPUT_PREVIEW: |
|
5261 { |
|
5262 InitPreviewMenuPane(aMenuPane); |
|
5263 } |
|
5264 break; |
|
5265 case R_AVKON_EDIT_MODE_MENU: |
|
5266 case R_AVKON_TOUCH_INDICATOR_EDIT_MODE_MENU: |
|
5267 { |
|
5268 ClearFlag(EFlagLaunchEditMenu); |
|
5269 |
|
5270 //call comes here when edit key or '*' is pressed and displays avkon edit menu |
|
5271 //moving only the essential condition checks in EditSubmenuInUse() here |
|
5272 //no need of checking iSharedDataInterface->EditSubmenuInUse() because for devices with edit key |
|
5273 //this would return 0 and would not populate CUT and COPY option |
|
5274 |
|
5275 TBool tempFlag = ETrue; |
|
5276 if ( ( ( RProcess().SecureId().iId == KPhoneSecureId ) && (iQwertyInputMode) ) || |
|
5277 ( ExtendedInputCapabilities() & |
|
5278 CAknExtendedInputCapabilities::EForceEditSubmenuStatusFlagOff) |
|
5279 |
|
5280 ) |
|
5281 { |
|
5282 tempFlag = EFalse; |
|
5283 } |
|
5284 |
|
5285 if (tempFlag) |
|
5286 { |
|
5287 TInt posit(0); |
|
5288 |
|
5289 if (!(iAknEditorFlags & EAknEditorFlagFindPane) && |
|
5290 iInputCapabilities.FepAwareTextEditor() && |
|
5291 aMenuPane->MenuItemExists(EEikCmdEditCut, posit) && |
|
5292 !IsOnlyNumericPermitted() |
|
5293 ) |
|
5294 { |
|
5295 if (iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep() > 0 ) |
|
5296 { |
|
5297 if (iRememberEditorState && iRememberEditorState->CcpuState() && |
|
5298 !iRememberEditorState->CcpuState()->CcpuCanCopy()&& |
|
5299 PluginInputMode() != EPluginInputModeItut ) |
|
5300 { |
|
5301 TBuf<KMaxFileName> titleStr; |
|
5302 StringLoader::Load(titleStr, R_AKNFEP_OPTIONS_EDIT_MENU_CUT_TEXT); |
|
5303 |
|
5304 CAknFepUiInterfaceMenuPane::SItemData itemData; |
|
5305 |
|
5306 itemData.iCommandId = EAknEditMenuCmdCutText; |
|
5307 itemData.iCascadeId = 0; |
|
5308 if (titleStr.Length()) |
|
5309 { |
|
5310 itemData.iText.Copy(titleStr.Mid(1, titleStr.Length() - 1)); |
|
5311 } |
|
5312 itemData.iFlags = 0; |
|
5313 aMenuPane->InsertMenuItemL(itemData, posit); |
|
5314 |
|
5315 titleStr.Zero(); |
|
5316 itemData.iText.Zero(); |
|
5317 StringLoader::Load(titleStr, R_AKNFEP_OPTIONS_EDIT_MENU_COPY_TEXT); |
|
5318 |
|
5319 itemData.iCommandId = EAknEditMenuCmdCopyText; |
|
5320 if (titleStr.Length()) |
|
5321 { |
|
5322 itemData.iText.Copy(titleStr.Mid(1, titleStr.Length() - 1)); |
|
5323 } |
|
5324 aMenuPane->InsertMenuItemL(itemData, posit); |
|
5325 } |
|
5326 else //Hack for browser in case there are some text already selected |
|
5327 { |
|
5328 if (iRememberEditorState && iRememberEditorState->CcpuState() ) |
|
5329 { |
|
5330 if(iRememberEditorState->CcpuState()->CcpuCanPaste()) |
|
5331 aMenuPane->SetItemDimmed(EEikCmdEditPaste,EFalse); |
|
5332 if(iRememberEditorState->CcpuState()->CcpuCanCopy()) |
|
5333 aMenuPane->SetItemDimmed(EEikCmdEditCopy,EFalse); |
|
5334 if(iRememberEditorState->CcpuState()->CcpuCanCut()) |
|
5335 aMenuPane->SetItemDimmed(EEikCmdEditCut,EFalse); |
|
5336 } |
|
5337 } |
|
5338 } |
|
5339 //if the document size is 0 and there are items in clipboard then dislay Paste item |
|
5340 if ( iRememberEditorState && iRememberEditorState->CcpuState() && |
|
5341 iRememberEditorState->CcpuState()->CcpuCanPaste()) |
|
5342 aMenuPane->SetItemDimmed(EEikCmdEditPaste,EFalse); |
|
5343 |
|
5344 } |
|
5345 |
|
5346 } |
|
5347 |
|
5348 DimInputmodeMenuItems(aMenuPane); |
|
5349 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
5350 //Is this an edit menu launched for a western language? |
|
5351 if ( R_AVKON_EDIT_MODE_MENU == aResourceId && !IsChineseInputLanguage() |
|
5352 && ELangJapanese != iLanguageCapabilities.iInputLanguageCode ) |
|
5353 { |
|
5354 //If this is edit menu (launched from '*' or edit key) and predictive input is allowed, |
|
5355 //we need to remove "Input language" and add "Input options" menu item. |
|
5356 if (!IsOnlyNumericPermitted() && IsLanguageSupportPrediction() && !(iAknEditorFlags & EAknEditorFlagNoT9)) |
|
5357 { |
|
5358 TInt menuitemPos(0); |
|
5359 if(aMenuPane->MenuItemExists(EAknCmdEditInsertSmiley,menuitemPos)) // insert after smiley if exist |
|
5360 { |
|
5361 AddPredictiveModeEditMenuL(aMenuPane,menuitemPos+1); |
|
5362 } |
|
5363 else if(aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol,menuitemPos)) // insert after smybol if exist |
|
5364 { |
|
5365 AddPredictiveModeEditMenuL(aMenuPane,menuitemPos+1); |
|
5366 } |
|
5367 } |
|
5368 } |
|
5369 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
5370 |
|
5371 } |
|
5372 break; |
|
5373 |
|
5374 case R_AVKON_PREDICTIVE_TEXT_MENU_T9: |
|
5375 { |
|
5376 if( (iPtiEngine->NumberOfCandidates() <= 1) && !IsFlagSet(EFlagRemoveMatchesMenuItem ) ) |
|
5377 { |
|
5378 SetFlag( EFlagRemoveMatchesMenuItem ); |
|
5379 } |
|
5380 |
|
5381 if (iMode != ELatin) |
|
5382 { |
|
5383 aMenuPane->SetItemDimmed(EAknCmdT9PredictiveInsertWord, ETrue); |
|
5384 } |
|
5385 if (!IsFlagSet(EFlagInlineEditInBackground)) |
|
5386 { |
|
5387 aMenuPane->SetItemDimmed(EAknCmdT9PredictiveMatches, ETrue); |
|
5388 aMenuPane->SetItemDimmed(EAknCmdT9PredictiveEditWord, ETrue); |
|
5389 } |
|
5390 else if (IsFlagSet(EFlagRemoveMatchesMenuItem)) |
|
5391 { |
|
5392 aMenuPane->SetItemDimmed(EAknCmdT9PredictiveMatches, ETrue); |
|
5393 } |
|
5394 break; |
|
5395 } |
|
5396 case R_AVKON_INPUT_MODE_SUB_MENU: |
|
5397 { |
|
5398 if (IsChineseInputLanguage()) |
|
5399 { |
|
5400 DoChineseSubMenu(aMenuPane); |
|
5401 } |
|
5402 break; |
|
5403 case R_AKNFEP_EDIT_SUBMENU: |
|
5404 DisableEditSubmenuItems(aMenuPane); |
|
5405 break; |
|
5406 } |
|
5407 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
5408 // Predictive QWERTY (XT9) changes ----> |
|
5409 case R_AKNFEP_PRED_INPUT_OPTIONS_SUBMENU: |
|
5410 { |
|
5411 // This part of code fixing TSW Errors |
|
5412 // "Edit word" option is not available under edit menu in ITU-T mode. |
|
5413 // "Insert word" Should not be available QWERTY mode. |
|
5414 if (IsKoreanInputLanguage() || |
|
5415 CurrentInputLangCode() == ELangPrcChinese || |
|
5416 CurrentInputLangCode() == ELangTaiwanChinese || |
|
5417 CurrentInputLangCode() == ELangHongKongChinese ) |
|
5418 { |
|
5419 // No text prediction for korean. |
|
5420 aMenuPane->SetItemDimmed(EAknFepCmdPredActivate, ETrue ); |
|
5421 aMenuPane->SetItemDimmed(EAknFepCmdPredDeactivate,ETrue ); |
|
5422 aMenuPane->SetItemDimmed( EAknFepCmdPredSettings, ETrue ); |
|
5423 } |
|
5424 else |
|
5425 { |
|
5426 aMenuPane->SetItemDimmed( EAknFepCmdPredSettings, EFalse ); |
|
5427 if(iSharedDataInterface->PredictiveTextOn()) |
|
5428 { |
|
5429 aMenuPane->SetItemDimmed( EAknFepCmdPredActivate, ETrue ); |
|
5430 } |
|
5431 else |
|
5432 { |
|
5433 aMenuPane->SetItemDimmed(EAknFepCmdPredDeactivate,ETrue ); |
|
5434 } |
|
5435 } |
|
5436 } |
|
5437 break; |
|
5438 |
|
5439 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
5440 default: |
|
5441 break; |
|
5442 } |
|
5443 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
5444 /* |
|
5445 This code is the part of fixing TSW Error Edit Menu : |
|
5446 "Matches" and "insert word" options are not available under Edit Menu. |
|
5447 This is To make visible/invisible the Insert Word in Optios menu & Edit Menu*/ |
|
5448 iIsLastResourceEditMenu = aResourceId; |
|
5449 #endif |
|
5450 } |
|
5451 |
|
5452 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
5453 void CAknFepManager::FindAndRemoveInputOptionsMenuItemL( CAknFepUiInterfaceMenuPane* aMenuPane ) |
|
5454 { |
|
5455 //Logic : |
|
5456 //Loop through each item in menu pane and check if the data |
|
5457 //CEikMenuPaneItem::SData::iCascadeId == R_AKNFEP_PRED_INPUT_OPTIONS_SUBMENU |
|
5458 //or if CEikMenuPaneItem::SData::iCommandId == EAknCmdInputLanguage |
|
5459 //If so, delete that item. |
|
5460 TInt numOfMenuItems = aMenuPane->NumberOfItemsInPane(); |
|
5461 CEikMenuPane* menuPane = aMenuPane->GetMenuPane(); |
|
5462 for (TInt index(0); index < numOfMenuItems ; ++index ) |
|
5463 { |
|
5464 CEikMenuPaneItem::SData itemData = menuPane->ItemDataByIndexL( index ); |
|
5465 if ( itemData.iCascadeId == R_AKNFEP_PRED_INPUT_OPTIONS_SUBMENU || |
|
5466 itemData.iCommandId == EAknCmdInputLanguage || |
|
5467 itemData.iCascadeId == R_AVKON_INPUT_MODE_SUB_MENU || |
|
5468 ( IsChineseInputLanguage() && iSharedDataInterface->QwertyInputMode() && |
|
5469 itemData.iCommandId == EChinFepCmdModeCangJieOption ) ) |
|
5470 { |
|
5471 menuPane->DeleteBetweenMenuItems( index, index ); |
|
5472 //Assumption - there can only be one such item in the menu pane |
|
5473 //Hence we can return without going through the remaining items |
|
5474 numOfMenuItems = aMenuPane->NumberOfItemsInPane(); |
|
5475 index--; |
|
5476 } |
|
5477 } |
|
5478 } |
|
5479 |
|
5480 void CAknFepManager::FindAndRemoveEditSubMenuItemL( CAknFepUiInterfaceMenuPane* aMenuPane ) |
|
5481 { |
|
5482 //Logic : |
|
5483 //Loop through each item in menu pane and check if the data |
|
5484 //CEikMenuPaneItem::SData::iCascadeId == R_AKNFEP_EDIT_SUBMENU |
|
5485 //If so, delete that item. |
|
5486 TInt numOfMenuItems = aMenuPane->NumberOfItemsInPane(); |
|
5487 CEikMenuPane* menuPane = aMenuPane->GetMenuPane(); |
|
5488 for (TInt index(0); index < numOfMenuItems ; ++index ) |
|
5489 { |
|
5490 CEikMenuPaneItem::SData itemData = menuPane->ItemDataByIndexL( index ); |
|
5491 if ( itemData.iCascadeId == R_AKNFEP_EDIT_SUBMENU ) |
|
5492 { |
|
5493 menuPane->DeleteBetweenMenuItems( index, index ); |
|
5494 //Assumption - there can only be one such item in the menu pane |
|
5495 //Hence we can return without going through the remaining items |
|
5496 return; |
|
5497 } |
|
5498 } |
|
5499 } |
|
5500 |
|
5501 void CAknFepManager::AddInputOptionsMenuItemL( CAknFepUiInterfaceMenuPane* aMenuPane ) |
|
5502 { |
|
5503 //Logic: |
|
5504 //Appropriate location is : |
|
5505 // if Avkon Help command exists, then immediately above it |
|
5506 // else if Avkon Exit command exists, then immediately above it |
|
5507 // else if there are 3 or more items in the Options menu, then 3rd from last |
|
5508 // else it is the last item. |
|
5509 TInt posToInsertItem( 0 ); |
|
5510 //MenuItemExists() will return the index of the item in 2nd parameter |
|
5511 //But if item is not found, it is returning the total number of items. |
|
5512 if ( ( aMenuPane->MenuItemExists(EAknCmdHelp, posToInsertItem) ) || |
|
5513 ( aMenuPane->MenuItemExists(EAknCmdExit, posToInsertItem) ) ) |
|
5514 { |
|
5515 //do nothing - we already have posToInsertItem with required value |
|
5516 } |
|
5517 else |
|
5518 { |
|
5519 TInt numOfMenuItems = aMenuPane->NumberOfItemsInPane(); |
|
5520 if ( numOfMenuItems > 2 ) |
|
5521 { |
|
5522 //We should add the new item as third from last, after ignoring |
|
5523 //any dimmed items in the menu pane |
|
5524 TInt numOfUnDimmedItems(0); |
|
5525 //loop from bottom for better performance |
|
5526 for (TInt index(numOfMenuItems-1); index >= 0 ; --index ) |
|
5527 { |
|
5528 CEikMenuPaneItem::SData itemData = aMenuPane->GetMenuPane()->ItemDataByIndexL( index ); |
|
5529 if ( !(itemData.iFlags & EEikMenuItemDimmed) ) |
|
5530 { |
|
5531 ++numOfUnDimmedItems; |
|
5532 } |
|
5533 if ( numOfUnDimmedItems == 2 ) |
|
5534 { |
|
5535 //We have our position - save it and break from this loop |
|
5536 if ( index > 1 ) |
|
5537 { |
|
5538 posToInsertItem = index; |
|
5539 } |
|
5540 else |
|
5541 { |
|
5542 //There are two or less items on this menu that will be displayed |
|
5543 //Hence, push ITI options to the end of the list: |
|
5544 posToInsertItem = numOfMenuItems; |
|
5545 } |
|
5546 break; |
|
5547 } |
|
5548 } |
|
5549 } |
|
5550 else |
|
5551 { |
|
5552 posToInsertItem = numOfMenuItems; |
|
5553 } |
|
5554 } |
|
5555 TInt inputOptionsPos = 0; |
|
5556 TInt pastePos = 0; |
|
5557 |
|
5558 if ( aMenuPane->MenuItemExists( EEikCmdEditPaste, pastePos ) ) |
|
5559 { |
|
5560 CEikMenuPaneItem::SData& itemData = aMenuPane->GetMenuPane()->ItemDataByIndexL( pastePos ); |
|
5561 if ( !( itemData.iFlags & EEikMenuItemDimmed ) ) |
|
5562 { |
|
5563 inputOptionsPos = pastePos + 1; |
|
5564 } |
|
5565 } |
|
5566 |
|
5567 //Now we have the position at which we need to insert the menu item. |
|
5568 if ( |
|
5569 #ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__ |
|
5570 iQwertyInputMode && |
|
5571 #endif |
|
5572 IsLanguageSupportPrediction() && !(iAknEditorFlags & EAknEditorFlagNoT9)) |
|
5573 { |
|
5574 AddPredictiveModeOptionsL( aMenuPane, inputOptionsPos ); |
|
5575 } |
|
5576 else |
|
5577 { |
|
5578 AddInputLanguageItemL(aMenuPane, posToInsertItem); |
|
5579 } |
|
5580 } |
|
5581 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
5582 |
|
5583 |
|
5584 void CAknFepManager::AddEditSubmenuL(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
5585 { |
|
5586 // Adds edit-submenu to options menu when required contidions are met. |
|
5587 // Edit-submenu is added if: |
|
5588 // 1. There is active editor on screen |
|
5589 // 2. Editor contains text or there is text in clipboard. |
|
5590 // 3. Editor is not in Find Pane. |
|
5591 // |
|
5592 // Since menu will have focus, we also need to remeber certain values |
|
5593 // to be able to access undelying editor attributes. |
|
5594 |
|
5595 CAknEdwinState* editorState = EditorState(); |
|
5596 iEditorCcpuStatus = 0; |
|
5597 if (editorState && editorState->CcpuState()) |
|
5598 { |
|
5599 iEditorCcpuStatus = EditorCcpuStatus(editorState); |
|
5600 } |
|
5601 else |
|
5602 { |
|
5603 // The editor doesn't have ccpu-capability, doen't display the menu. |
|
5604 return; |
|
5605 } |
|
5606 TInt index; |
|
5607 if (aMenuPane->MenuItemExists(EAknCmdEditTextMenu, index)) |
|
5608 { |
|
5609 return; |
|
5610 } |
|
5611 |
|
5612 iRememberLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
5613 |
|
5614 if (iRememberLength > 0 || (iEditorCcpuStatus & ECcpuStatusFlagCanPaste)) |
|
5615 { |
|
5616 if (aMenuPane->MenuItemExists(EAknCmdEditItemPlaceHolder, index) || |
|
5617 aMenuPane->MenuItemExists(EAknCmdInputLanguage, index) || |
|
5618 aMenuPane->MenuItemExists(EAknCmdHelp, index) || |
|
5619 aMenuPane->MenuItemExists(EAknCmdExit, index)) |
|
5620 { |
|
5621 TBuf<KMaxFileName> titleStr; |
|
5622 StringLoader::Load(titleStr, R_AKNFEP_OPTIONS_EDIT_SUBMENU_TITLE); |
|
5623 |
|
5624 CAknFepUiInterfaceMenuPane::SItemData mData; |
|
5625 |
|
5626 mData.iCommandId = EAknCmdEditTextMenu; |
|
5627 mData.iCascadeId = R_AKNFEP_EDIT_SUBMENU; |
|
5628 mData.iFlags = 0; |
|
5629 mData.iText.Copy(titleStr.Mid(1, titleStr.Length() - 1).Left( |
|
5630 CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength)); |
|
5631 |
|
5632 aMenuPane->InsertMenuItemL(mData, index); |
|
5633 |
|
5634 if(aMenuPane->MenuItemExists(EAknCmdEditItemPlaceHolder, index)) |
|
5635 { |
|
5636 aMenuPane->DeleteMenuItem(EAknCmdEditItemPlaceHolder); |
|
5637 |
|
5638 } |
|
5639 // Remember editor state, because there is no access to it while |
|
5640 // menu is on screen. |
|
5641 iRememberEditorState = editorState; |
|
5642 } |
|
5643 } |
|
5644 } |
|
5645 |
|
5646 |
|
5647 void CAknFepManager::DisableEditSubmenuItems(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
5648 { |
|
5649 aMenuPane->SetItemDimmed(EAknEditMenuCmdCopyText, ETrue); |
|
5650 aMenuPane->SetItemDimmed(EEikCmdEditCopy, ETrue); |
|
5651 aMenuPane->SetItemDimmed(EAknEditMenuCmdCutText, ETrue); |
|
5652 aMenuPane->SetItemDimmed(EEikCmdEditCut, ETrue); |
|
5653 aMenuPane->SetItemDimmed(EEikCmdEditPaste, ETrue); |
|
5654 |
|
5655 if (iRememberLength > 0) |
|
5656 { |
|
5657 if (iEditorCcpuStatus & ECcpuStatusFlagCanCopy) |
|
5658 { |
|
5659 aMenuPane->SetItemDimmed(EEikCmdEditCopy, EFalse); |
|
5660 } |
|
5661 else |
|
5662 { |
|
5663 aMenuPane->SetItemDimmed(EAknEditMenuCmdCopyText, EFalse); |
|
5664 } |
|
5665 |
|
5666 if (iEditorCcpuStatus & ECcpuStatusFlagCanCut) |
|
5667 { |
|
5668 aMenuPane->SetItemDimmed(EEikCmdEditCut, EFalse); |
|
5669 } |
|
5670 else |
|
5671 { |
|
5672 aMenuPane->SetItemDimmed(EAknEditMenuCmdCutText, EFalse); |
|
5673 } |
|
5674 } |
|
5675 |
|
5676 if (iEditorCcpuStatus & ECcpuStatusFlagCanPaste) |
|
5677 { |
|
5678 aMenuPane->SetItemDimmed(EEikCmdEditPaste, EFalse); |
|
5679 } |
|
5680 } |
|
5681 |
|
5682 |
|
5683 void CAknFepManager::StartCcpuModeL(TBool aCopyMode) |
|
5684 { |
|
5685 ResetCcpuFlags(); |
|
5686 if (!iUiInterface->SoftkeysExist()) |
|
5687 { |
|
5688 iUiInterface->CreateSoftkeys(R_AVKON_SOFTKEYS_EMPTY, this); |
|
5689 } |
|
5690 |
|
5691 TBool update = EFalse; |
|
5692 if (aCopyMode) |
|
5693 { |
|
5694 SetCcpuFlag(ECcpuStateStartCopy); |
|
5695 update = UpdateCBALabelL(ELeftSoftkeyIndex, EAknFepSoftkeyStartCopy, |
|
5696 R_AKNFEP_SOFTKEY_CCPU_START); |
|
5697 update |= UpdateCBALabelL( EMiddleSoftkeyIndex, EAknFepSoftkeyStartCopy, |
|
5698 R_AVKON_SOFTKEY_SELECT_TEXT ); |
|
5699 } |
|
5700 else |
|
5701 { |
|
5702 SetCcpuFlag(ECcpuStateStartCut); |
|
5703 update = UpdateCBALabelL(ELeftSoftkeyIndex, EAknFepSoftkeyStartCut, |
|
5704 R_AKNFEP_SOFTKEY_CCPU_START); |
|
5705 update |= UpdateCBALabelL( EMiddleSoftkeyIndex, EAknFepSoftkeyStartCut, |
|
5706 R_AVKON_SOFTKEY_SELECT_TEXT ); |
|
5707 } |
|
5708 |
|
5709 update |= UpdateCBALabelL(ERightSoftkeyIndex, EAknFepSoftkeyCloseWindow, |
|
5710 R_AKNFEP_SOFTKEY_CCPU_CANCEL); |
|
5711 |
|
5712 if (update) |
|
5713 { |
|
5714 iUiInterface->DrawSoftkeysNow(); |
|
5715 } |
|
5716 |
|
5717 iIndicator->SetCopyMode(ETrue); |
|
5718 UpdateIndicators(); // updates status of indicators |
|
5719 } |
|
5720 |
|
5721 |
|
5722 TBool CAknFepManager::OkToActivateSelectionMode() const |
|
5723 { |
|
5724 if (iFepManState != EAknFepStateNull && |
|
5725 iInputCapabilities.FepAwareTextEditor() && |
|
5726 !(iAknEditorFlags & EAknEditorFlagFindPane)) |
|
5727 { |
|
5728 return ETrue; |
|
5729 } |
|
5730 |
|
5731 return EFalse; |
|
5732 } |
|
5733 |
|
5734 |
|
5735 TBool CAknFepManager::HandleCcpuModeKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aEventCode, |
|
5736 TKeyResponse& aRetCode, TBool aLongPressFlag) |
|
5737 { |
|
5738 TKeyPressLength length = aKeyEvent.iRepeats ? ELongKeyPress : EShortKeyPress; |
|
5739 TBool indicLang = TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage( |
|
5740 iLanguageCapabilities.iInputLanguageCode)) |
|
5741 #ifdef RD_HINDI_PHONETIC_INPUT |
|
5742 || TAknFepUiIndicInputManager :: IsIndicPhoneticLanguage(TLanguage( |
|
5743 iLanguageCapabilities.iInputLanguageCode)) |
|
5744 #endif |
|
5745 ; |
|
5746 if(aKeyEvent.iCode == EKeyEscape) |
|
5747 return EFalse; |
|
5748 if (aEventCode == EEventKey && aKeyEvent.iCode == '*') |
|
5749 { |
|
5750 iStarScan = aKeyEvent.iScanCode; |
|
5751 } |
|
5752 |
|
5753 if ((aKeyEvent.iScanCode == EStdKeyDevice0) |
|
5754 || (aKeyEvent.iScanCode == EStdKeyDevice1)) |
|
5755 { |
|
5756 if (HashKeySelectionInUse() |
|
5757 && IsCcpuFlagSet(ECcpuStateHashDown)) |
|
5758 { |
|
5759 if (IsCcpuFlagSet(ECcpuStateChangeToPredictionMode)) |
|
5760 { |
|
5761 ClearCcpuFlag(ECcpuStateChangeToPredictionMode); |
|
5762 if (iModeBefore == ELatin |
|
5763 || iModeBefore == EHiraganaKanji) |
|
5764 { |
|
5765 TBool preFlag = IsPredictive(); |
|
5766 TryChangePredictiveInputModeL(!preFlag); |
|
5767 } |
|
5768 else |
|
5769 { |
|
5770 TryChangeToModeBeforeL(); |
|
5771 } |
|
5772 } |
|
5773 } |
|
5774 // Always let sofkeys fall through. |
|
5775 return EFalse; |
|
5776 } |
|
5777 |
|
5778 if (IsCcpuFlagSet(ECcpuStateSelectionEventPosted)) |
|
5779 { |
|
5780 ClearCcpuFlag(ECcpuStateSelectionEventPosted); |
|
5781 return EFalse; |
|
5782 } |
|
5783 |
|
5784 if (HashKeySelectionInUse()) |
|
5785 { |
|
5786 if (aKeyEvent.iScanCode == EStdKeyHash && aEventCode == EEventKeyDown |
|
5787 && iInputCapabilities.FepAwareTextEditor()) |
|
5788 { |
|
5789 SetCcpuFlag(ECcpuStateHashDown); |
|
5790 iHashKeyMan->ResetPreviousSelectionStyleMode(); |
|
5791 return EFalse; |
|
5792 } |
|
5793 |
|
5794 if (!IsOnlyNumericPermitted()) |
|
5795 { |
|
5796 if (IsFeatureSupportedJapanese()) |
|
5797 { |
|
5798 if (FepUI()->IsValidShiftKeyPress() |
|
5799 && aKeyEvent.iScanCode == iStarScan |
|
5800 && !iQwertyInputMode |
|
5801 && !(iMode == EKatakana && iFepManState == EAknFepStateUIActive)) |
|
5802 { |
|
5803 if ( aEventCode == EEventKeyUp && !aLongPressFlag |
|
5804 && !(iMode == ELatin && WesternPredictive() |
|
5805 && iFepManState == EAknFepStateUIActive)) |
|
5806 { |
|
5807 if (!IsCcpuFlagSet(ECcpuStateIgnoreStarUp)) |
|
5808 { |
|
5809 LaunchSpecialCharacterTableL(); |
|
5810 } |
|
5811 return EFalse; |
|
5812 } |
|
5813 else if ( aEventCode == EEventKey |
|
5814 && !aLongPressFlag |
|
5815 && length == ELongKeyPress ) |
|
5816 { |
|
5817 LaunchSelectModeMenuL(); |
|
5818 aRetCode = EKeyWasConsumed; |
|
5819 return ETrue; |
|
5820 } |
|
5821 } |
|
5822 } |
|
5823 else |
|
5824 { |
|
5825 if ((aKeyEvent.iScanCode == iStarScan && aEventCode == EEventKeyUp && |
|
5826 !aLongPressFlag && !iQwertyInputMode) && |
|
5827 (!indicLang || WesternPredictive() || (iMode == ENumber || iMode == ENativeNumber) )) |
|
5828 { |
|
5829 // Disables *-key on korean multitapping mode |
|
5830 if(IsKoreanInputLanguage() && iMode == EHangul) |
|
5831 { |
|
5832 SetCcpuFlag(ECcpuStateIgnoreStarUp); |
|
5833 } |
|
5834 |
|
5835 if (!IsCcpuFlagSet(ECcpuStateIgnoreStarUp)) |
|
5836 { |
|
5837 #ifdef RD_SCALABLE_UI_V2 |
|
5838 if (iFepPluginManager->CurrentFepInputUI()) |
|
5839 { |
|
5840 if (iFepPluginManager->CurrentFepInputUI()->HandleKeyL(EStdKeyNull, EShortKeyPress)) |
|
5841 { |
|
5842 return EFalse; |
|
5843 } |
|
5844 } |
|
5845 #endif |
|
5846 LaunchSelectModeMenuL(); |
|
5847 aRetCode = EKeyWasConsumed; |
|
5848 return ETrue; |
|
5849 } |
|
5850 return EFalse; |
|
5851 } |
|
5852 else if((aKeyEvent.iScanCode == iStarScan && aEventCode == EEventKey |
|
5853 && !aLongPressFlag && !iQwertyInputMode) |
|
5854 && (indicLang) |
|
5855 && (! WesternPredictive()) |
|
5856 && (length == ELongKeyPress) |
|
5857 && (iMode != ENumber && iMode != ENativeNumber )) |
|
5858 { |
|
5859 LaunchSelectModeMenuL(); |
|
5860 return EFalse; |
|
5861 } |
|
5862 } |
|
5863 } |
|
5864 } |
|
5865 |
|
5866 if (IsCcpuFlagSet(ECcpuStateHashDown)) |
|
5867 { |
|
5868 if (aEventCode == EEventKey) |
|
5869 { |
|
5870 if (aKeyEvent.iScanCode == EStdKeyDownArrow |
|
5871 || aKeyEvent.iScanCode == EStdKeyRightArrow |
|
5872 || aKeyEvent.iScanCode == EStdKeyLeftArrow |
|
5873 || aKeyEvent.iScanCode == EStdKeyUpArrow) |
|
5874 { |
|
5875 if (IsFlagSet(EFlagInsideInlineEditingTransaction) && iMode == EHangul) |
|
5876 { |
|
5877 CommitInlineEditL(); |
|
5878 iPtiEngine->ClearCurrentWord(); |
|
5879 } |
|
5880 |
|
5881 if ((IsCcpuFlagSet(ECcpuStateStartCopy)) || |
|
5882 (IsCcpuFlagSet(ECcpuStateStartCut))) |
|
5883 { |
|
5884 aRetCode = EKeyWasConsumed; |
|
5885 return ETrue; |
|
5886 } |
|
5887 |
|
5888 if (!IsCcpuFlagSet(ECcpuStateEdwinInSelectionMode)) |
|
5889 { |
|
5890 // User wants to select and not to change mode, so cancel the mode change |
|
5891 // caused by initial hash key press. |
|
5892 if(!(iAknEditorFlags & EAknEditorFlagFindPane)) |
|
5893 { |
|
5894 iHashKeyMan->SetPreviousSelectionStyleModeL(); |
|
5895 SetCcpuFlag(ECcpuStateEdwinInSelectionMode); |
|
5896 TKeyEvent ccpuStart = {EKeyF21, EStdKeyF21, 0, 0}; |
|
5897 // to enable copy/paste support on cba. We simulate via CCoeEnv |
|
5898 // to avoid fep SimulateKeyEventL adding shift modifiers |
|
5899 CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKey); |
|
5900 } |
|
5901 } |
|
5902 |
|
5903 // If prediction is changed while pressing hash-key, |
|
5904 // it go back previous prediction state. |
|
5905 if (IsCcpuFlagSet(ECcpuStateChangeToPredictionMode)) |
|
5906 { |
|
5907 ClearCcpuFlag(ECcpuStateChangeToPredictionMode); |
|
5908 if (iModeBefore == ELatin |
|
5909 || iModeBefore == EHiraganaKanji) |
|
5910 { |
|
5911 TBool preFlag = IsPredictive(); |
|
5912 TryChangePredictiveInputModeL(!preFlag); |
|
5913 } |
|
5914 else |
|
5915 { |
|
5916 TryChangeToModeBeforeL(); |
|
5917 } |
|
5918 } |
|
5919 |
|
5920 if (WesternPredictive() && IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
5921 { |
|
5922 // This will commit inline edit if it is active for predictive mode. |
|
5923 return EFalse; |
|
5924 } |
|
5925 |
|
5926 aRetCode = EKeyWasNotConsumed; |
|
5927 return ETrue; |
|
5928 } |
|
5929 else if (aKeyEvent.iScanCode == EStdKeyBackspace) |
|
5930 { |
|
5931 if (!(aKeyEvent.iModifiers & EStdKeyLeftShift)) |
|
5932 { |
|
5933 // Simulate edit key + clear key functionality via hash key in no-edit-key device. |
|
5934 TKeyEvent ccpuStart = {127, EStdKeyBackspace, EStdKeyLeftShift, 0}; |
|
5935 CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, aEventCode); |
|
5936 |
|
5937 aRetCode = EKeyWasConsumed; |
|
5938 return ETrue; |
|
5939 } |
|
5940 else if (!IsCcpuFlagSet(ECcpuStateHashKeyDeleteDone)) |
|
5941 { |
|
5942 // Hash key + clear key was pressed, but hash key was released before |
|
5943 // changing to selection mode. Need to return to previous mode, because |
|
5944 // user didn't want to change input mode. |
|
5945 iHashKeyMan->SetPreviousSelectionStyleModeL(); |
|
5946 SetCcpuFlag(ECcpuStateHashKeyDeleteDone); |
|
5947 } |
|
5948 |
|
5949 // If prediction is changed while pressing hash-key, |
|
5950 // it go back previous prediction state. |
|
5951 if (IsCcpuFlagSet(ECcpuStateChangeToPredictionMode)) |
|
5952 { |
|
5953 ClearCcpuFlag(ECcpuStateChangeToPredictionMode); |
|
5954 if (iModeBefore == ELatin |
|
5955 || iModeBefore == EHiraganaKanji) |
|
5956 { |
|
5957 TBool preFlag = IsPredictive(); |
|
5958 TryChangePredictiveInputModeL(!preFlag); |
|
5959 } |
|
5960 else |
|
5961 { |
|
5962 TryChangeToModeBeforeL(); |
|
5963 } |
|
5964 } |
|
5965 |
|
5966 } |
|
5967 } |
|
5968 else if (aKeyEvent.iScanCode == EStdKeyHash && aEventCode == EEventKeyUp) |
|
5969 { |
|
5970 ClearCcpuFlag(ECcpuStateHashDown |
|
5971 | ECcpuStateHashKeyDeleteDone |
|
5972 | ECcpuStateChangeToPredictionMode); |
|
5973 if (IsCcpuFlagSet(ECcpuStateEdwinInSelectionMode)) |
|
5974 { |
|
5975 SetCcpuFlag(ECcpuStateSelectionEventPosted); |
|
5976 ClearCcpuFlag(ECcpuStateEdwinInSelectionMode); |
|
5977 SetFlag(EFlagLongShiftKeyPress); |
|
5978 |
|
5979 TKeyEvent ccpuStart = {0, EStdKeyLeftShift, 0, 0}; |
|
5980 CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, aEventCode); |
|
5981 } |
|
5982 |
|
5983 return EFalse; |
|
5984 } |
|
5985 } |
|
5986 |
|
5987 if (IsCcpuFlagSet(ECcpuStateStartCopy | ECcpuStateStartCut)) |
|
5988 { |
|
5989 if (aKeyEvent.iScanCode == EStdKeyDevice3 && aEventCode == EEventKey) |
|
5990 { |
|
5991 aRetCode = EKeyWasConsumed; |
|
5992 if (IsCcpuFlagSet(ECcpuStateStartCopy)) |
|
5993 { |
|
5994 ProcessCommandL(EAknFepSoftkeyStartCopy); |
|
5995 } |
|
5996 else |
|
5997 { |
|
5998 ProcessCommandL(EAknFepSoftkeyStartCut); |
|
5999 } |
|
6000 return ETrue; |
|
6001 } |
|
6002 else if (aKeyEvent.iScanCode < EStdKeyLeftArrow || |
|
6003 aKeyEvent.iScanCode > EStdKeyDownArrow) |
|
6004 { |
|
6005 aRetCode = EKeyWasConsumed; |
|
6006 return ETrue; |
|
6007 } |
|
6008 } |
|
6009 else if (IsCcpuFlagSet(ECcpuStateCopy | ECcpuStateCut)) |
|
6010 { |
|
6011 if ((aKeyEvent.iScanCode >= EStdKeyLeftArrow) && (aKeyEvent.iScanCode <= EStdKeyDownArrow)) |
|
6012 { |
|
6013 if (!(aKeyEvent.iModifiers & EModifierShift)) |
|
6014 { |
|
6015 TKeyEvent ccpuStart = aKeyEvent; |
|
6016 ccpuStart.iModifiers |= EModifierShift; |
|
6017 ccpuStart.iModifiers |= EModifierRightShift; |
|
6018 CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, aEventCode); |
|
6019 |
|
6020 aRetCode = EKeyWasConsumed; |
|
6021 return ETrue; |
|
6022 } |
|
6023 else |
|
6024 { |
|
6025 aRetCode = EKeyWasNotConsumed; |
|
6026 return ETrue; |
|
6027 } |
|
6028 } |
|
6029 |
|
6030 TCursorSelection cursorSelection; |
|
6031 if( iInputCapabilities.FepAwareTextEditor() ) |
|
6032 { |
|
6033 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSelection); |
|
6034 if( (aEventCode == EEventKeyUp) && (cursorSelection.Length() == 0) |
|
6035 && ((aKeyEvent.iScanCode == EStdKeyBackspace) || (aKeyEvent.iCode == EKeyBackspace) |
|
6036 || (aKeyEvent.iScanCode == EStdKeyDelete) || (aKeyEvent.iCode == EKeyDelete))) |
|
6037 { |
|
6038 ClearCcpuFlag(ECcpuStateButton); |
|
6039 } |
|
6040 } |
|
6041 if (aKeyEvent.iScanCode != EStdKeyBackspace && aKeyEvent.iCode != EKeyOK) |
|
6042 { |
|
6043 aRetCode = EKeyWasConsumed; |
|
6044 return ETrue; |
|
6045 } |
|
6046 else |
|
6047 { |
|
6048 if (iInputCapabilities.FepAwareTextEditor()) |
|
6049 { |
|
6050 TCursorSelection cursorSelection; |
|
6051 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSelection); |
|
6052 if (cursorSelection.Length() == 0) |
|
6053 { |
|
6054 aRetCode = EKeyWasConsumed; |
|
6055 return ETrue; |
|
6056 } |
|
6057 else if (aKeyEvent.iScanCode == EStdKeyBackspace) |
|
6058 { |
|
6059 // Selection will be removed, handle cba button state accordingly |
|
6060 if (iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep() == |
|
6061 cursorSelection.Length()) |
|
6062 { |
|
6063 // Whole text was selected and will be removed. Cancel the ccpu mode. |
|
6064 ProcessCommandL(EAknFepSoftkeyCloseWindow); |
|
6065 } |
|
6066 else |
|
6067 { |
|
6068 // Part of the text will be removed. Set Cba-buttons to initial ccpu-mode status. |
|
6069 __ASSERT_DEBUG(iUiInterface->SoftkeysExist(), |
|
6070 AknFepPanic(EAknFepPanicNoHandleToFepAwareTextEditor)); |
|
6071 |
|
6072 TBool update = UpdateCBALabelL(ELeftSoftkeyIndex, KNullCommandId, R_TEXT_SOFTKEY_EMPTY); |
|
6073 update |= UpdateCBALabelL(ERightSoftkeyIndex, EAknFepSoftkeyCloseWindow, R_AKNFEP_SOFTKEY_CCPU_CANCEL); |
|
6074 update |= UpdateCBALabelL( EMiddleSoftkeyIndex, KNullCommandId, R_TEXT_SOFTKEY_EMPTY ); |
|
6075 if (update) |
|
6076 { |
|
6077 iUiInterface->DrawSoftkeysNow(); |
|
6078 } |
|
6079 } |
|
6080 } |
|
6081 } |
|
6082 } |
|
6083 } |
|
6084 |
|
6085 return EFalse; |
|
6086 } |
|
6087 |
|
6088 |
|
6089 |
|
6090 void CAknFepManager::AddInputLanguageItemL(CAknFepUiInterfaceMenuPane* aMenuPane, TInt aIndex) |
|
6091 { |
|
6092 CAknFepUiInterfaceMenuPane::SItemData mData; |
|
6093 |
|
6094 TBuf<KMaxFileName> langStr; |
|
6095 TInt Inputlangindex; |
|
6096 if(!aMenuPane->MenuItemExists(EAknCmdInputLanguage, Inputlangindex)) |
|
6097 { |
|
6098 StringLoader::Load(langStr, R_AKNFEP_OPTIONS_INPUT_LANGUAGE); |
|
6099 |
|
6100 mData.iCommandId = EAknCmdInputLanguage; |
|
6101 mData.iCascadeId = 0; |
|
6102 mData.iFlags = 0; |
|
6103 mData.iText.Copy(langStr.Mid(1, langStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength)); |
|
6104 |
|
6105 aMenuPane->InsertMenuItemL(mData, aIndex); |
|
6106 } |
|
6107 |
|
6108 // Chinese input mode switching from the option menu |
|
6109 if (IsChineseInputLanguage() && iSharedDataInterface->QwertyInputMode()) |
|
6110 { |
|
6111 // Add Chinese language items |
|
6112 langStr.Zero(); |
|
6113 |
|
6114 StringLoader::Load(langStr, R_AKNFEP_OPTIONS_INPUT_MODE_CHI); |
|
6115 |
|
6116 mData.iCommandId = EAknCmdInputMethod; |
|
6117 mData.iCascadeId = R_AVKON_INPUT_MODE_SUB_MENU; |
|
6118 mData.iFlags = 0; |
|
6119 mData.iText.Copy(langStr.Mid(1, langStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength)); |
|
6120 |
|
6121 aMenuPane->InsertMenuItemL(mData, ++aIndex); |
|
6122 |
|
6123 // Check if the current engine has CangJie feature or not, if not |
|
6124 // then CangJie mode becomes invisible, similar impl in IsInputModeAvailable |
|
6125 // and DoChineseSubMenu |
|
6126 TBool isCangJieSupported = EFalse; |
|
6127 MPtiCoreInfo* ptiCoreInfo = iPtiEngine->CoreInfo(EPtiEngineNormalCangjieQwerty); |
|
6128 if ( ptiCoreInfo ) |
|
6129 { |
|
6130 isCangJieSupported = ptiCoreInfo->CapsBits() & ESupportCangjieInput; |
|
6131 } |
|
6132 |
|
6133 // Add Hong Kong CangJie option, option available only in HK variant and qwerty mode |
|
6134 if ( iLanguageCapabilities.iInputLanguageCode == |
|
6135 ELangHongKongChinese && isCangJieSupported ) |
|
6136 { |
|
6137 langStr.Zero(); |
|
6138 |
|
6139 StringLoader::Load(langStr, R_AKNFEP_OPTIONS_CANGJIE_MODE); |
|
6140 |
|
6141 mData.iCommandId = EChinFepCmdModeCangJieOption; |
|
6142 mData.iCascadeId = 0; |
|
6143 mData.iFlags = 0; |
|
6144 mData.iText.Copy(langStr.Mid(1, langStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength)); |
|
6145 |
|
6146 aMenuPane->InsertMenuItemL(mData, ++aIndex); |
|
6147 } |
|
6148 } |
|
6149 } |
|
6150 |
|
6151 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
6152 // Predictive QWERTY (XT9) changes ----> |
|
6153 void CAknFepManager::AddPredictiveModeOptionsL(CAknFepUiInterfaceMenuPane* aMenuPane, |
|
6154 TInt aIndex ) const |
|
6155 { |
|
6156 CAknFepUiInterfaceMenuPane::SItemData mData; |
|
6157 |
|
6158 HBufC* inputMenuStr = StringLoader::LoadLC(R_AKNFEP_PRED_OPTIONS_INPUT_OPTIONS); |
|
6159 |
|
6160 mData.iCommandId = 0; |
|
6161 mData.iCascadeId = R_AKNFEP_PRED_INPUT_OPTIONS_SUBMENU; |
|
6162 mData.iFlags = 0; |
|
6163 mData.iText.Copy(inputMenuStr->Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength)); |
|
6164 |
|
6165 CleanupStack::PopAndDestroy(inputMenuStr); |
|
6166 |
|
6167 aMenuPane->InsertMenuItemL(mData, aIndex); |
|
6168 |
|
6169 // Chinese input mode switching from the option menu |
|
6170 if (IsChineseInputLanguage() && iSharedDataInterface->QwertyInputMode()) |
|
6171 { |
|
6172 // Add Chinese language items |
|
6173 TBuf<KMaxFileName> langStr; |
|
6174 |
|
6175 langStr.Zero(); |
|
6176 |
|
6177 StringLoader::Load(langStr, R_AKNFEP_OPTIONS_INPUT_MODE_CHI); |
|
6178 |
|
6179 mData.iCommandId = EAknCmdInputMethod; |
|
6180 mData.iCascadeId = R_AVKON_INPUT_MODE_SUB_MENU; |
|
6181 mData.iFlags = 0; |
|
6182 mData.iText.Copy(langStr.Mid(1, langStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength)); |
|
6183 |
|
6184 aMenuPane->InsertMenuItemL(mData, ++aIndex); |
|
6185 |
|
6186 // Check if the current engine has CangJie feature or not, if not |
|
6187 // then CangJie mode becomes invisible, similar impl in IsInputModeAvailable |
|
6188 // and DoChineseSubMenu |
|
6189 TBool isCangJieSupported = EFalse; |
|
6190 MPtiCoreInfo* ptiCoreInfo = iPtiEngine->CoreInfo(EPtiEngineNormalCangjieQwerty); |
|
6191 if ( ptiCoreInfo != NULL) |
|
6192 { |
|
6193 isCangJieSupported = ptiCoreInfo->CapsBits() & ESupportCangjieInput; |
|
6194 } |
|
6195 #ifdef __HALF_QWERTY_KEYPAD |
|
6196 isCangJieSupported = isCangJieSupported && (iKeyboardType != EPtiKeyboardHalfQwerty); |
|
6197 #endif //__HALF_QWERTY_KEYPAD |
|
6198 |
|
6199 // Add Hong Kong CangJie option, option available only in HK variant and qwerty mode |
|
6200 if ( iLanguageCapabilities.iInputLanguageCode == ELangHongKongChinese && isCangJieSupported ) |
|
6201 { |
|
6202 langStr.Zero(); |
|
6203 |
|
6204 StringLoader::Load(langStr, R_AKNFEP_OPTIONS_CANGJIE_MODE); |
|
6205 |
|
6206 mData.iCommandId = EChinFepCmdModeCangJieOption; |
|
6207 mData.iCascadeId = 0; |
|
6208 mData.iFlags = 0; |
|
6209 mData.iText.Copy(langStr.Mid(1, langStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength)); |
|
6210 |
|
6211 aMenuPane->InsertMenuItemL(mData, ++aIndex); |
|
6212 } |
|
6213 } |
|
6214 } |
|
6215 |
|
6216 void CAknFepManager::AddPredictiveModeEditMenuL(CAknFepUiInterfaceMenuPane* aMenuPane, |
|
6217 TInt aIndex ) const |
|
6218 { |
|
6219 // Remove Predictive Edit menu option if XT9 options are there ---> |
|
6220 aMenuPane->SetItemDimmed(EAknCmdPredictiveTextCascade, ETrue); |
|
6221 aMenuPane->SetItemDimmed(EAknCmdMultitapPredictiveT9On, ETrue); |
|
6222 // Remove Predictive Edit menu option if XT9 options are there <--- |
|
6223 //if current writing language supports prediction then display input options settings --> |
|
6224 //if current writing language does not supports prediction then display only input language |
|
6225 //option to modify the writing language, when user wants to modify when edit query is launched. <-- |
|
6226 TBool isLanguagugeSupportsPrediction = EFalse; |
|
6227 switch(iKeyboardType) |
|
6228 { |
|
6229 case EPtiKeyboardHalfQwerty: |
|
6230 #ifdef __HALF_QWERTY_KEYPAD |
|
6231 isLanguagugeSupportsPrediction = (iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive); |
|
6232 #endif //__HALF_QWERTY_KEYPAD |
|
6233 break; |
|
6234 case EPtiKeyboardQwerty4x12: |
|
6235 case EPtiKeyboardQwerty4x10: |
|
6236 case EPtiKeyboardQwerty3x11: |
|
6237 case EPtiKeyboardCustomQwerty: |
|
6238 isLanguagugeSupportsPrediction = (iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternQwertyPredictive); |
|
6239 break; |
|
6240 case EPtiKeyboardNone: |
|
6241 case EPtiKeyboard12Key: |
|
6242 isLanguagugeSupportsPrediction = (!iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternPredictive); |
|
6243 break; |
|
6244 default: |
|
6245 isLanguagugeSupportsPrediction = (!iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternPredictive); |
|
6246 break; |
|
6247 } |
|
6248 if (isLanguagugeSupportsPrediction && !(iAknEditorFlags & EAknEditorFlagNoT9)) |
|
6249 { |
|
6250 aMenuPane->SetItemDimmed(EAknCmdInputLanguage, ETrue); |
|
6251 AddPredictiveModeOptionsL(aMenuPane, aIndex); |
|
6252 } |
|
6253 } |
|
6254 // Predictive QWERTY (XT9) changes <---- |
|
6255 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
6256 void CAknFepManager::DoChineseSubMenu(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
6257 { |
|
6258 // ZhuyinFind & StrokeFind ONLY available for FindEditors |
|
6259 if (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes) |
|
6260 { |
|
6261 if (iMode == EZhuyinFind) |
|
6262 { |
|
6263 aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyinFind, ETrue); |
|
6264 } |
|
6265 |
|
6266 if (iMode == EStrokeFind) |
|
6267 { |
|
6268 aMenuPane->SetItemDimmed(EChinFepCmdModeStrokeFind, ETrue); |
|
6269 } |
|
6270 } |
|
6271 else |
|
6272 { |
|
6273 aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyinFind, ETrue); |
|
6274 aMenuPane->SetItemDimmed(EChinFepCmdModeStrokeFind, ETrue); |
|
6275 } |
|
6276 |
|
6277 // Customize menu item for Chinese mainland |
|
6278 if (iLanguageCapabilities.iInputLanguageCode == ELangPrcChinese) |
|
6279 { |
|
6280 aMenuPane->SetItemDimmed(EChinFepCmdModeCangJie, ETrue); |
|
6281 aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyin, ETrue); |
|
6282 aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyinFind, ETrue); |
|
6283 |
|
6284 if (iMode == EPinyin) |
|
6285 { |
|
6286 aMenuPane->SetItemDimmed(EChinFepCmdModePinyin, ETrue); |
|
6287 } |
|
6288 else if (iMode == EStroke) |
|
6289 { |
|
6290 aMenuPane->SetItemDimmed(EChinFepCmdModeStroke, ETrue); |
|
6291 } |
|
6292 else if (iMode == ELatin) |
|
6293 { |
|
6294 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6295 } |
|
6296 else |
|
6297 return; |
|
6298 } |
|
6299 // Customize menu item for HongKong |
|
6300 else if (iLanguageCapabilities.iInputLanguageCode == ELangHongKongChinese) |
|
6301 { |
|
6302 aMenuPane->SetItemDimmed(EChinFepCmdModePinyin, ETrue); |
|
6303 aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyin, ETrue); |
|
6304 aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyinFind, ETrue); |
|
6305 |
|
6306 TBool isCangJieSupported = EFalse; |
|
6307 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
6308 if ( EPtiKeyboardQwerty3x11 == KeyboardLayout() ) |
|
6309 { |
|
6310 isCangJieSupported = ETrue; |
|
6311 } |
|
6312 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
6313 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
6314 #ifdef __HALF_QWERTY_KEYPAD |
|
6315 isCangJieSupported = isCangJieSupported && (iKeyboardType != EPtiKeyboardHalfQwerty); |
|
6316 #endif //__HALF_QWERTY_KEYPAD |
|
6317 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
6318 |
|
6319 // CangJie is only for qwerty mode |
|
6320 if ( !iSharedDataInterface->QwertyInputMode() || !isCangJieSupported ) |
|
6321 aMenuPane->SetItemDimmed(EChinFepCmdModeCangJie, ETrue); |
|
6322 |
|
6323 if (iMode == EStroke) |
|
6324 { |
|
6325 aMenuPane->SetItemDimmed(EChinFepCmdModeStroke, ETrue); |
|
6326 } |
|
6327 else if (iMode == ECangJie) |
|
6328 { |
|
6329 aMenuPane->SetItemDimmed(EChinFepCmdModeCangJie, ETrue); |
|
6330 } |
|
6331 else if (iMode == ELatin) |
|
6332 { |
|
6333 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6334 } |
|
6335 else |
|
6336 return; |
|
6337 } |
|
6338 // Customize menu item for TaiWan |
|
6339 else if (iLanguageCapabilities.iInputLanguageCode == ELangTaiwanChinese) |
|
6340 { |
|
6341 aMenuPane->SetItemDimmed(EChinFepCmdModePinyin, ETrue); |
|
6342 aMenuPane->SetItemDimmed(EChinFepCmdModeCangJie, ETrue); |
|
6343 |
|
6344 if (iMode == EStroke) |
|
6345 { |
|
6346 aMenuPane->SetItemDimmed(EChinFepCmdModeStroke, ETrue); |
|
6347 } |
|
6348 else if (iMode == EZhuyin) |
|
6349 { |
|
6350 aMenuPane->SetItemDimmed(EChinFepCmdModeZhuyin, ETrue); |
|
6351 } |
|
6352 else if (iMode == ELatin) |
|
6353 { |
|
6354 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6355 } |
|
6356 else |
|
6357 return; |
|
6358 } |
|
6359 else |
|
6360 return; |
|
6361 } |
|
6362 #ifdef RD_SCALABLE_UI_V2 |
|
6363 |
|
6364 void CAknFepManager::DoWesternTouchMenu(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
6365 { |
|
6366 const TInt inputLanguage = iLanguageCapabilities.iInputLanguageCode; |
|
6367 // if mode is already hangul or language is not korean dim korean mode menu item |
|
6368 TInt index; |
|
6369 |
|
6370 if( iMode == EHangul || inputLanguage != ELangKorean || !(IsModePermitted(EHangul))) |
|
6371 { |
|
6372 if ( aMenuPane->MenuItemExists( EAknCmdEditModeKorean, index) ) |
|
6373 { |
|
6374 aMenuPane->SetItemDimmed(EAknCmdEditModeKorean, ETrue); |
|
6375 } |
|
6376 } |
|
6377 else |
|
6378 { |
|
6379 if ( aMenuPane->MenuItemExists( EAknCmdEditModeKorean, index ) ) |
|
6380 { |
|
6381 aMenuPane->SetItemDimmed(EAknCmdEditModeKorean, EFalse); |
|
6382 } |
|
6383 } |
|
6384 // remove Chinese specific items from menu |
|
6385 aMenuPane->SetItemDimmed(EAknCmdEditModeAlpha, ETrue); |
|
6386 |
|
6387 if (aMenuPane->MenuItemExists(EJapanFepCmdModeUserDic, index)) |
|
6388 { |
|
6389 aMenuPane->SetItemDimmed(EJapanFepCmdModeUserDic, ETrue); |
|
6390 } |
|
6391 |
|
6392 // T9 stuff |
|
6393 if (WesternPredictive()) |
|
6394 { |
|
6395 aMenuPane->SetItemDimmed(EAknCmdPredictiveTextCascade, EFalse); |
|
6396 if(iPtiEngine->CurrentLanguage()->HasInputMode(EPtiEngineWordCompletion)) |
|
6397 { |
|
6398 // Disable Autoword Completion feature for Touch Input |
|
6399 #ifndef RD_SCALABLE_UI_V2 |
|
6400 aMenuPane->SetItemDimmed(EAknCmdPredictiveModeCascade, EFalse); |
|
6401 #endif // RD_SCALABLE_UI_V2 |
|
6402 } |
|
6403 |
|
6404 if (aMenuPane->MenuItemExists(EAknCmdT9PredictiveT9Off, index)) |
|
6405 { |
|
6406 aMenuPane->SetItemDimmed(EAknCmdT9PredictiveT9Off, EFalse); |
|
6407 } |
|
6408 } |
|
6409 else |
|
6410 { |
|
6411 if ( (iPermittedInputModes & EAknEditorTextInputMode) && |
|
6412 !(iAknEditorFlags & EAknEditorFlagNoT9) && |
|
6413 iMode == ELatin && |
|
6414 !IsKoreanInputLanguage() && |
|
6415 iLanguageCapabilities.iSupportsWesternPredictive) |
|
6416 { |
|
6417 aMenuPane->SetItemDimmed(EAknCmdMultitapPredictiveT9On, EFalse); |
|
6418 } |
|
6419 } |
|
6420 |
|
6421 if ( ( iMode == ENumber || iMode == ENativeNumber ) && |
|
6422 (iPermittedInputModes & (EAknEditorTextInputMode | EAknEditorSecretAlphaInputMode)) ) |
|
6423 { |
|
6424 aMenuPane->SetItemDimmed(EAknCmdEditModeAlpha, EFalse); |
|
6425 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6426 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue); |
|
6427 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue); |
|
6428 } |
|
6429 |
|
6430 if ( IsModePermitted(ENumber) ) |
|
6431 { |
|
6432 if (( iMode != ENumber || |
|
6433 iMode == ENumber && iLanguageCapabilities.iArabicIndicDigitsAllowed && |
|
6434 !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) && |
|
6435 (iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic)) |
|
6436 || ( iMode != ENumber || |
|
6437 iMode == ENumber && iLanguageCapabilities.iEasternArabicIndicDigitsAllowed && |
|
6438 !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) && |
|
6439 (iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic)) |
|
6440 ||( iMode != ENumber || |
|
6441 iMode == ENumber && iLanguageCapabilities.iIndicDigitsAllowed && |
|
6442 !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) && |
|
6443 (iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari)) && |
|
6444 (!(iPermittedInputModes==EAknEditorNumericInputMode))) // hide the menu if number editor |
|
6445 |
|
6446 { |
|
6447 aMenuPane->SetItemDimmed(EAknCmdEditModeNumber, EFalse); |
|
6448 } |
|
6449 } |
|
6450 |
|
6451 if ( IsModePermitted( ENativeNumber ) ) |
|
6452 { |
|
6453 if ( iLanguageCapabilities.iArabicIndicDigitsAllowed && |
|
6454 !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) && |
|
6455 iMode != ENativeNumber ) |
|
6456 { |
|
6457 aMenuPane->SetItemDimmed(EAknCmdEditModeArabicIndicNumber, EFalse); |
|
6458 } |
|
6459 else if ( iLanguageCapabilities.iEasternArabicIndicDigitsAllowed && |
|
6460 !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) && |
|
6461 iMode != ENativeNumber ) |
|
6462 { |
|
6463 aMenuPane->SetItemDimmed(EAknCmdEditModeEasternArabicIndicNumber, EFalse); |
|
6464 } |
|
6465 else if( iLanguageCapabilities.iIndicDigitsAllowed && |
|
6466 !( iAknEditorFlags & EAknEditorFlagLatinInputModesOnly ) && |
|
6467 |
|
6468 iMode != ENativeNumber ) |
|
6469 { |
|
6470 aMenuPane->SetItemDimmed(EAknCmdEditModeIndicNumber, EFalse); |
|
6471 } |
|
6472 } |
|
6473 |
|
6474 if (IsAbleToLaunchSCT()) |
|
6475 { |
|
6476 if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index)) |
|
6477 { |
|
6478 aMenuPane->SetItemDimmed(EAknCmdEditInsertSymbol, EFalse); |
|
6479 } |
|
6480 } |
|
6481 |
|
6482 if ( iMode != ENumber && iMode != ENativeNumber && |
|
6483 iPtiEngine->NumberOfLanguages() > 1 && |
|
6484 !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly)) |
|
6485 { |
|
6486 aMenuPane->SetItemDimmed(EAknCmdInputLanguage, EFalse); |
|
6487 } |
|
6488 |
|
6489 if (iPermittedInputModes == EAknEditorNumericInputMode) |
|
6490 { |
|
6491 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6492 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue); |
|
6493 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue); |
|
6494 } |
|
6495 else if ( (iMode == ELatin || iMode == ENumber || iMode == ENativeNumber ) && |
|
6496 (iPermittedInputModes & EAknEditorSecretAlphaInputMode) && |
|
6497 !(iPermittedInputModes & EAknEditorTextInputMode)) |
|
6498 { |
|
6499 // Text case mode is not available in secret editors. |
|
6500 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6501 } |
|
6502 |
|
6503 if (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes) |
|
6504 { |
|
6505 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6506 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue); |
|
6507 } |
|
6508 |
|
6509 if (iCaseMan->CurrentCase() == EAknEditorUpperCase) |
|
6510 { |
|
6511 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue); |
|
6512 } |
|
6513 else if (iCaseMan->CurrentCase() == EAknEditorLowerCase) |
|
6514 { |
|
6515 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue); |
|
6516 } |
|
6517 |
|
6518 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6519 |
|
6520 if (!(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) |
|
6521 && iFepPluginManager->IsNonLatinLanguage(TLanguage(iSharedDataInterface->InputTextLanguage()))) |
|
6522 { |
|
6523 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6524 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue); |
|
6525 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue); |
|
6526 } |
|
6527 if( iMode == EHangul ) |
|
6528 { |
|
6529 //aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, EFalse); |
|
6530 //aMenuPane->SetItemDimmed(EAknCmdEditModeAlpha, EFalse); |
|
6531 |
|
6532 aMenuPane->SetItemDimmed(EAknCmdEditModeEnglish, EFalse); |
|
6533 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue); |
|
6534 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue); |
|
6535 |
|
6536 } |
|
6537 else |
|
6538 { |
|
6539 aMenuPane->SetItemDimmed(EAknCmdEditModeEnglish, ETrue); |
|
6540 } |
|
6541 } |
|
6542 |
|
6543 void CAknFepManager::DoChineseTouchMenu(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
6544 { |
|
6545 TInt index; |
|
6546 if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index) |
|
6547 && aMenuPane->MenuItemExists(EJapanFepCmdModeUserDic, index)) |
|
6548 { |
|
6549 aMenuPane->SetItemDimmed(EJapanFepCmdModeUserDic, ETrue); |
|
6550 } |
|
6551 |
|
6552 if (WesternPredictive()) |
|
6553 { |
|
6554 aMenuPane->SetItemDimmed(EAknCmdPredictiveTextCascade, EFalse); |
|
6555 if(iPtiEngine->CurrentLanguage()->HasInputMode(EPtiEngineWordCompletion)) |
|
6556 { |
|
6557 // Disable Autoword Completion feature for Touch Input |
|
6558 #ifndef RD_SCALABLE_UI_V2 |
|
6559 aMenuPane->SetItemDimmed(EAknCmdPredictiveModeCascade, EFalse); |
|
6560 #endif // RD_SCALABLE_UI_V2 |
|
6561 } |
|
6562 |
|
6563 if (aMenuPane->MenuItemExists(EAknCmdT9PredictiveT9Off, index)) |
|
6564 { |
|
6565 aMenuPane->SetItemDimmed(EAknCmdT9PredictiveT9Off, EFalse); |
|
6566 } |
|
6567 } |
|
6568 else |
|
6569 { |
|
6570 if ( (iPermittedInputModes & EAknEditorTextInputMode) && |
|
6571 !(iAknEditorFlags & EAknEditorFlagNoT9) && |
|
6572 iMode == ELatin) |
|
6573 { |
|
6574 aMenuPane->SetItemDimmed(EAknCmdMultitapPredictiveT9On, EFalse); |
|
6575 } |
|
6576 } |
|
6577 if (IsAbleToLaunchSCT() && |
|
6578 aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index)) |
|
6579 { |
|
6580 aMenuPane->SetItemDimmed(EAknCmdEditInsertSymbol, EFalse); |
|
6581 } |
|
6582 if( (iFepPluginManager && (iFepPluginManager->PluginInputMode() != EPluginInputModeItut ) ) |
|
6583 && aMenuPane->MenuItemExists(EChinFepCmdInstructions, index) ) |
|
6584 { |
|
6585 aMenuPane->SetItemDimmed(EChinFepCmdInstructions, ETrue); |
|
6586 } |
|
6587 else if ( !(iPermittedInputModes == EAknEditorNumericInputMode || |
|
6588 iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) ) |
|
6589 { |
|
6590 if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index)) |
|
6591 { |
|
6592 aMenuPane->SetItemDimmed(EChinFepCmdInstructions, EFalse); |
|
6593 } |
|
6594 } |
|
6595 |
|
6596 if ( iMode != ENumber && iPtiEngine->NumberOfLanguages() > 1 && |
|
6597 !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly)) |
|
6598 { |
|
6599 aMenuPane->SetItemDimmed(EAknCmdInputLanguage, EFalse); |
|
6600 } |
|
6601 |
|
6602 if (iPermittedInputModes == EAknEditorNumericInputMode) |
|
6603 { |
|
6604 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6605 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue); |
|
6606 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue); |
|
6607 } |
|
6608 else if ( (iMode == ELatin || iMode == ENumber) && |
|
6609 (iPermittedInputModes & EAknEditorSecretAlphaInputMode) && |
|
6610 !(iPermittedInputModes & EAknEditorTextInputMode)) |
|
6611 { |
|
6612 // Text case mode is not available in secret editors. |
|
6613 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6614 } |
|
6615 if (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes) |
|
6616 { |
|
6617 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6618 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue); |
|
6619 } |
|
6620 |
|
6621 if ( IsModePermitted(ENumber) && iMode != ENumber ) |
|
6622 { |
|
6623 //aMenuPane->SetItemDimmed(EChinFepCmdModeNumber, EFalse); // original statement |
|
6624 aMenuPane->SetItemDimmed(EAknCmdEditModeNumber, EFalse); |
|
6625 // end modifying |
|
6626 } |
|
6627 } |
|
6628 TBool CAknFepManager::IsChineseInputMode( TInt aMode ) |
|
6629 { |
|
6630 return aMode == EPRCFind || aMode == ECangJie || aMode == EZhuyinFind |
|
6631 || aMode == EStrokeFind || aMode == EPinyin || aMode == EZhuyin |
|
6632 || aMode == EStroke; |
|
6633 } |
|
6634 |
|
6635 #endif //RD_SCALABLE_UI_V2 |
|
6636 void CAknFepManager::DoWesternMenu(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
6637 { |
|
6638 // remove Chinese specific items from menu |
|
6639 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue); |
|
6640 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue); |
|
6641 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6642 const TInt inputLanguage = iLanguageCapabilities.iInputLanguageCode; |
|
6643 |
|
6644 |
|
6645 TInt pos=-1; |
|
6646 |
|
6647 if( aMenuPane->MenuItemExists( EAknCmdEditModeKorean, pos ) ) |
|
6648 { |
|
6649 // if mode is already hangul or language is not korean dim korean mode menu item |
|
6650 if( iMode == EHangul || inputLanguage != ELangKorean || !(IsModePermitted(EHangul))) |
|
6651 { |
|
6652 |
|
6653 aMenuPane->SetItemDimmed(EAknCmdEditModeKorean, ETrue); |
|
6654 } |
|
6655 else |
|
6656 { |
|
6657 aMenuPane->SetItemDimmed(EAknCmdEditModeKorean, EFalse); |
|
6658 } |
|
6659 } |
|
6660 |
|
6661 TInt index; |
|
6662 |
|
6663 if (aMenuPane->MenuItemExists(EJapanFepCmdModeUserDic, index)) |
|
6664 { |
|
6665 aMenuPane->SetItemDimmed(EJapanFepCmdModeUserDic, ETrue); |
|
6666 } |
|
6667 |
|
6668 // T9 stuff |
|
6669 if (WesternPredictive()) |
|
6670 { |
|
6671 aMenuPane->SetItemDimmed(EAknCmdPredictiveTextCascade, EFalse); |
|
6672 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
6673 if(iPtiEngine->CurrentLanguage()->HasInputMode(EPtiEngineWordCompletion)) |
|
6674 { |
|
6675 // Disable Autoword Completion feature for Touch Input |
|
6676 #ifndef RD_SCALABLE_UI_V2 |
|
6677 aMenuPane->SetItemDimmed(EAknCmdPredictiveModeCascade, EFalse); |
|
6678 #endif // RD_SCALABLE_UI_V2 |
|
6679 } |
|
6680 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
6681 } |
|
6682 else |
|
6683 { |
|
6684 if ( (iPermittedInputModes & EAknEditorTextInputMode) && |
|
6685 !(iAknEditorFlags & EAknEditorFlagNoT9) && |
|
6686 iMode == ELatin && |
|
6687 !IsKoreanInputLanguage() && |
|
6688 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
6689 // Predictive QWERTY (XT9) changes ----> |
|
6690 (( |
|
6691 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
6692 iLanguageCapabilities.iSupportsWesternPredictive && !IsKoreanInputLanguage() |
|
6693 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
6694 && !iQwertyInputMode) || |
|
6695 (iLanguageCapabilities.iSupportsWesternQwertyPredictive && iQwertyInputMode) |
|
6696 ) |
|
6697 // Predictive QWERTY (XT9) changes <---- |
|
6698 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
6699 ) |
|
6700 { |
|
6701 aMenuPane->SetItemDimmed(EAknCmdMultitapPredictiveT9On, EFalse); |
|
6702 } |
|
6703 } |
|
6704 |
|
6705 if ( ( iMode == ENumber || iMode == ENativeNumber || iMode == EHangul ) && |
|
6706 (iPermittedInputModes & (EAknEditorTextInputMode | EAknEditorSecretAlphaInputMode)) ) |
|
6707 { |
|
6708 aMenuPane->SetItemDimmed(EAknCmdEditModeAlpha, EFalse); |
|
6709 } |
|
6710 |
|
6711 if ( IsModePermitted(ENumber) ) |
|
6712 { |
|
6713 if ( iMode != ENumber ) // hide the menu if number editor |
|
6714 { |
|
6715 aMenuPane->SetItemDimmed(EAknCmdEditModeNumber, EFalse); |
|
6716 } |
|
6717 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
6718 // Predictive QWERTY (XT9) changes ----> |
|
6719 // There's no need for numeric mode when full qwerty keyboard is in use (like in MAXI) |
|
6720 if (iQwertyInputMode) |
|
6721 { |
|
6722 aMenuPane->SetItemDimmed(EAknCmdEditModeNumber, ETrue); |
|
6723 } |
|
6724 // Predictive QWERTY (XT9) changes <---- |
|
6725 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
6726 } |
|
6727 |
|
6728 if ( IsModePermitted(ENativeNumber) && iMode != ENativeNumber) |
|
6729 { |
|
6730 if ( iLanguageCapabilities.iArabicIndicDigitsAllowed ) // hide the menu if number editor) |
|
6731 { |
|
6732 aMenuPane->SetItemDimmed(EAknCmdEditModeArabicIndicNumber, EFalse); |
|
6733 } |
|
6734 else if ( iLanguageCapabilities.iEasternArabicIndicDigitsAllowed ) // hide the menu if number editor) |
|
6735 { |
|
6736 aMenuPane->SetItemDimmed(EAknCmdEditModeEasternArabicIndicNumber, EFalse); |
|
6737 } |
|
6738 else if( iLanguageCapabilities.iIndicDigitsAllowed ) // hide the menu if number editor) |
|
6739 { |
|
6740 aMenuPane->SetItemDimmed(EAknCmdEditModeIndicNumber, EFalse); |
|
6741 } |
|
6742 } |
|
6743 |
|
6744 if (IsAbleToLaunchSCT()) |
|
6745 { |
|
6746 if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index)) |
|
6747 { |
|
6748 aMenuPane->SetItemDimmed(EAknCmdEditInsertSymbol, EFalse); |
|
6749 } |
|
6750 } |
|
6751 TInt writtingLanguage = 0; |
|
6752 if ( iMode != ENumber && iMode != ENativeNumber && iPtiEngine->NumberOfLanguages() > 1 && |
|
6753 !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) |
|
6754 && aMenuPane->MenuItemExists( EAknCmdInputLanguage, writtingLanguage ) ) |
|
6755 { |
|
6756 aMenuPane->SetItemDimmed(EAknCmdInputLanguage, EFalse); |
|
6757 } |
|
6758 } |
|
6759 |
|
6760 void CAknFepManager::DoChineseMenu(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
6761 { |
|
6762 TInt index; |
|
6763 if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index) |
|
6764 && aMenuPane->MenuItemExists(EJapanFepCmdModeUserDic, index)) |
|
6765 { |
|
6766 aMenuPane->SetItemDimmed(EJapanFepCmdModeUserDic, ETrue); |
|
6767 } |
|
6768 |
|
6769 if (WesternPredictive()) |
|
6770 { |
|
6771 aMenuPane->SetItemDimmed(EAknCmdPredictiveTextCascade, EFalse); |
|
6772 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
6773 if(iPtiEngine->CurrentLanguage()->HasInputMode(EPtiEngineWordCompletion)) |
|
6774 { |
|
6775 // Disable Autoword Completion feature for Touch Input |
|
6776 #ifndef RD_SCALABLE_UI_V2 |
|
6777 aMenuPane->SetItemDimmed(EAknCmdPredictiveModeCascade, EFalse); |
|
6778 #endif // RD_SCALABLE_UI_V2 |
|
6779 } |
|
6780 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
6781 } |
|
6782 else |
|
6783 { |
|
6784 if ( (iPermittedInputModes & EAknEditorTextInputMode) && |
|
6785 !(iAknEditorFlags & EAknEditorFlagNoT9) && |
|
6786 iMode == ELatin) |
|
6787 { |
|
6788 aMenuPane->SetItemDimmed(EAknCmdMultitapPredictiveT9On, EFalse); |
|
6789 } |
|
6790 } |
|
6791 if (IsAbleToLaunchSCT() && |
|
6792 aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index)) |
|
6793 { |
|
6794 aMenuPane->SetItemDimmed(EAknCmdEditInsertSymbol, EFalse); |
|
6795 } |
|
6796 if( iQwertyInputMode && aMenuPane->MenuItemExists(EChinFepCmdInstructions, index) ) |
|
6797 { |
|
6798 aMenuPane->SetItemDimmed(EChinFepCmdInstructions, ETrue); |
|
6799 } |
|
6800 else if ( !(iPermittedInputModes == EAknEditorNumericInputMode || |
|
6801 iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) ) |
|
6802 { |
|
6803 if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index) |
|
6804 && aMenuPane->MenuItemExists(EChinFepCmdInstructions, index)) |
|
6805 { |
|
6806 aMenuPane->SetItemDimmed(EChinFepCmdInstructions, EFalse); |
|
6807 } |
|
6808 } |
|
6809 |
|
6810 if ( (!IsOnlyNumericPermitted()) && iPtiEngine->NumberOfLanguages() > 1 && |
|
6811 !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly)) |
|
6812 { |
|
6813 aMenuPane->SetItemDimmed(EAknCmdInputLanguage, EFalse); |
|
6814 // the follow added for phrase creation |
|
6815 TInt iptlanguage; |
|
6816 if ( !iIsUserdbdlgActive |
|
6817 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
6818 && EPtiKeyboardHalfQwerty != KeyboardLayout() |
|
6819 #endif |
|
6820 && IsChineseInputLanguage() ) |
|
6821 { |
|
6822 aMenuPane->MenuItemExists( EAknCmdInputLanguage, iptlanguage ); |
|
6823 MPtiLanguage* ptilang = iPtiEngine->CurrentLanguage(); |
|
6824 TInt inputLanguage = (ptilang)? ptilang->LanguageCode() : 0; |
|
6825 if (iQwertyInputMode && (inputLanguage == ELangPrcChinese || |
|
6826 inputLanguage == ELangHongKongChinese || |
|
6827 inputLanguage == ELangTaiwanChinese)) |
|
6828 { |
|
6829 TRAP_IGNORE(AddUserDBDlgItemL( aMenuPane, iptlanguage )); |
|
6830 } |
|
6831 } |
|
6832 } |
|
6833 |
|
6834 if (iPermittedInputModes == EAknEditorNumericInputMode) |
|
6835 { |
|
6836 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6837 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue); |
|
6838 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue); |
|
6839 } |
|
6840 else if ( (iMode == ELatin || iMode == ENumber) && |
|
6841 (iPermittedInputModes & EAknEditorSecretAlphaInputMode) && |
|
6842 !(iPermittedInputModes & EAknEditorTextInputMode)) |
|
6843 { |
|
6844 // Text case mode is not available in secret editors. |
|
6845 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6846 } |
|
6847 if (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes) |
|
6848 { |
|
6849 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6850 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue); |
|
6851 } |
|
6852 |
|
6853 if ( IsModePermitted(ENumber) && iMode != ENumber ) |
|
6854 { |
|
6855 //aMenuPane->SetItemDimmed(EChinFepCmdModeNumber, EFalse); // original statement |
|
6856 aMenuPane->SetItemDimmed(EAknCmdEditModeNumber, EFalse); |
|
6857 // end modifying |
|
6858 } |
|
6859 } |
|
6860 |
|
6861 void CAknFepManager::DoJapaneseMenu(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
6862 { |
|
6863 // remove Chinese specific items from menu |
|
6864 TInt index; |
|
6865 if (aMenuPane->MenuItemExists(EAknCmdEditInsertSymbol, index)) |
|
6866 { |
|
6867 aMenuPane->SetItemDimmed(EAknCmdEditInsertSymbol, ETrue); |
|
6868 } |
|
6869 |
|
6870 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinUpper, ETrue); |
|
6871 aMenuPane->SetItemDimmed(EChinFepCmdModeLatinLower, ETrue); |
|
6872 aMenuPane->SetItemDimmed(EAknCmdEditModeLatinText, ETrue); |
|
6873 |
|
6874 if (IsAbleToLaunchSCT() |
|
6875 && !iSharedDataInterface->QwertyInputMode()) |
|
6876 { |
|
6877 aMenuPane->SetItemDimmed(EAknCmdEditInsertSymbolJp, EFalse); |
|
6878 } |
|
6879 |
|
6880 if (IsAbleToLaunchPCT() |
|
6881 && !iSharedDataInterface->QwertyInputMode()) |
|
6882 { |
|
6883 aMenuPane->SetItemDimmed(EAknCmdEditInsertPictograph, EFalse); |
|
6884 } |
|
6885 |
|
6886 if (!(iPermittedInputModes & EAknEditorHiraganaKanjiInputMode) && |
|
6887 aMenuPane->MenuItemExists(EJapanFepCmdModeUserDic, index) |
|
6888 ) |
|
6889 { |
|
6890 aMenuPane->SetItemDimmed(EJapanFepCmdModeUserDic, ETrue); |
|
6891 } |
|
6892 |
|
6893 if (iPermittedInputModes == (EAknEditorSecretAlphaInputMode | EAknEditorNumericInputMode)) |
|
6894 { |
|
6895 if (iMode == ELatin) |
|
6896 { |
|
6897 aMenuPane->SetItemDimmed(EJapanFepCmdEditModeNumber, EFalse); |
|
6898 } |
|
6899 else if (iMode == ENumber) |
|
6900 { |
|
6901 aMenuPane->SetItemDimmed(EJapanFepCmdEditModeAlpha, EFalse); |
|
6902 } |
|
6903 } |
|
6904 else |
|
6905 { |
|
6906 // If the fep is running on the Janapnse User Dictionary Application, |
|
6907 // "User Dictionary" in editting options menu is hidden. |
|
6908 if (CEikonEnv::Static()->EikAppUi()->Application()) |
|
6909 { |
|
6910 if (CEikonEnv::Static()->EikAppUi()->Application()->AppDllUid() == KUidUserDictApp) |
|
6911 { |
|
6912 aMenuPane->SetItemDimmed(EJapanFepCmdModeUserDic, ETrue); |
|
6913 } |
|
6914 } |
|
6915 |
|
6916 if (iPermittedInputModes & EAknEditorHiraganaKanjiInputMode) |
|
6917 { |
|
6918 aMenuPane->SetItemDimmed(EJapanFepCmdModeKutenCodeInput, EFalse); |
|
6919 } |
|
6920 |
|
6921 TInt value = iSharedDataInterface->ClearDirection(); |
|
6922 if (value == EClearDirectionRight) |
|
6923 { |
|
6924 aMenuPane->SetItemDimmed(EAknCmdEditClearDirectionLeft, EFalse); |
|
6925 } |
|
6926 else |
|
6927 { |
|
6928 aMenuPane->SetItemDimmed(EAknCmdEditClearDirectionRight, EFalse); |
|
6929 } |
|
6930 |
|
6931 if (!iSharedDataInterface->QwertyInputMode()) |
|
6932 { |
|
6933 if (IsPredictive(ELatin)) |
|
6934 { |
|
6935 aMenuPane->SetItemDimmed(EJapanFepCmdPredictiveTextCascade, EFalse); |
|
6936 } |
|
6937 else if ((iPermittedInputModes & EAknEditorHalfWidthTextInputMode) |
|
6938 && !(iAknEditorFlags & EAknEditorFlagNoT9)) |
|
6939 { |
|
6940 aMenuPane->SetItemDimmed(EJapanFepCmdMultitapPredictiveT9On, EFalse); |
|
6941 } |
|
6942 } |
|
6943 |
|
6944 if (IsPredictive(EHiraganaKanji)) |
|
6945 { |
|
6946 aMenuPane->SetItemDimmed(EJapanFepCmdModePredictiveOff, EFalse); |
|
6947 } |
|
6948 else if((iPermittedInputModes & EAknEditorHiraganaKanjiInputMode) |
|
6949 && !(iAknEditorFlags & EAknEditorFlagNoT9)) |
|
6950 { |
|
6951 aMenuPane->SetItemDimmed(EJapanFepCmdModePredictiveOn, EFalse); |
|
6952 } |
|
6953 |
|
6954 if (iMode != EHiraganaKanji && iPermittedInputModes & EAknEditorHiraganaKanjiInputMode) |
|
6955 { |
|
6956 aMenuPane->SetItemDimmed(EJapanFepCmdModeHiragana, EFalse); |
|
6957 } |
|
6958 |
|
6959 if (iCharWidth == EHalfWidthChar) |
|
6960 { |
|
6961 if (iPermittedInputModes & EAknEditorKatakanaInputMode && iMode != EKatakana) |
|
6962 { |
|
6963 aMenuPane->SetItemDimmed(EJapanFepCmdModeKatakana, EFalse); |
|
6964 } |
|
6965 |
|
6966 if (iMode != ELatin && (iPermittedInputModes & EAknEditorHalfWidthTextInputMode |
|
6967 || iPermittedInputModes & EAknEditorSecretAlphaInputMode)) |
|
6968 { |
|
6969 aMenuPane->SetItemDimmed(EJapanFepCmdEditModeAlpha, EFalse); |
|
6970 } |
|
6971 |
|
6972 if (iMode != ENumber |
|
6973 && iPermittedInputModes & EAknEditorNumericInputMode |
|
6974 && !iSharedDataInterface->QwertyInputMode()) |
|
6975 { |
|
6976 aMenuPane->SetItemDimmed(EJapanFepCmdEditModeNumber, EFalse); |
|
6977 } |
|
6978 |
|
6979 if (iMode == EKatakana && iPermittedInputModes & EAknEditorFullWidthKatakanaInputMode) |
|
6980 { |
|
6981 aMenuPane->SetItemDimmed(EJapanFepCmdModeFullWidth, EFalse); |
|
6982 } |
|
6983 |
|
6984 if (iMode == ELatin && !iWesternPredictive |
|
6985 && iPermittedInputModes & EAknEditorFullWidthTextInputMode) |
|
6986 { |
|
6987 aMenuPane->SetItemDimmed(EJapanFepCmdModeFullWidth, EFalse); |
|
6988 } |
|
6989 |
|
6990 if (iMode == ENumber |
|
6991 && iPermittedInputModes & EAknEditorFullWidthNumericInputMode) |
|
6992 { |
|
6993 aMenuPane->SetItemDimmed(EJapanFepCmdModeFullWidth, EFalse); |
|
6994 } |
|
6995 } |
|
6996 else // Full width Character |
|
6997 { |
|
6998 if (iMode != EKatakana && iPermittedInputModes & EAknEditorFullWidthKatakanaInputMode) |
|
6999 { |
|
7000 aMenuPane->SetItemDimmed(EJapanFepCmdModeKatakana, EFalse); |
|
7001 } |
|
7002 |
|
7003 if (iMode != ELatin && iPermittedInputModes & EAknEditorFullWidthTextInputMode) |
|
7004 { |
|
7005 aMenuPane->SetItemDimmed(EJapanFepCmdEditModeAlpha, EFalse); |
|
7006 } |
|
7007 |
|
7008 if (iMode != ENumber |
|
7009 && iPermittedInputModes & EAknEditorFullWidthNumericInputMode |
|
7010 && !iSharedDataInterface->QwertyInputMode()) |
|
7011 { |
|
7012 aMenuPane->SetItemDimmed(EJapanFepCmdEditModeNumber, EFalse); |
|
7013 } |
|
7014 |
|
7015 if (iMode == EKatakana && iPermittedInputModes & EAknEditorKatakanaInputMode) |
|
7016 { |
|
7017 aMenuPane->SetItemDimmed(EJapanFepCmdModeHalfWidth, EFalse); |
|
7018 } |
|
7019 |
|
7020 if (iMode == ELatin && iPermittedInputModes & EAknEditorFullWidthTextInputMode) |
|
7021 { |
|
7022 aMenuPane->SetItemDimmed(EJapanFepCmdModeHalfWidth, EFalse); |
|
7023 } |
|
7024 |
|
7025 if (iMode == ENumber |
|
7026 && iPermittedInputModes & EAknEditorFullWidthNumericInputMode) |
|
7027 { |
|
7028 aMenuPane->SetItemDimmed(EJapanFepCmdModeHalfWidth, EFalse); |
|
7029 } |
|
7030 } |
|
7031 } |
|
7032 } |
|
7033 |
|
7034 void CAknFepManager::HandlePointerEventInInlineTextL(TPointerEvent::TType /*aType*/, TUint /*aModifiers*/, TInt /*aPositionInInlineText*/) |
|
7035 { |
|
7036 } |
|
7037 |
|
7038 void CAknFepManager::GetFormatOfFepInlineText(TCharFormat& aFormat, |
|
7039 TInt& aNumberOfCharactersWithSameFormat, |
|
7040 TInt aPositionOfCharacter) const |
|
7041 { |
|
7042 if ( FepUI() ) |
|
7043 { |
|
7044 FepUI()->GetFormatOfFepInlineText(aFormat, aNumberOfCharactersWithSameFormat, |
|
7045 aPositionOfCharacter); |
|
7046 } |
|
7047 } |
|
7048 |
|
7049 void CAknFepManager::NumberModeChangeGSNotification() |
|
7050 { |
|
7051 iLanguageCapabilities.iNumericEditorDigitType = EDigitTypeUnknown; |
|
7052 UpdateNumericEditorDigitType(); |
|
7053 UpdateLocalDigitMode(); |
|
7054 } |
|
7055 |
|
7056 void CAknFepManager::HandleChangeInFocusL() |
|
7057 { |
|
7058 // Closing SCT has done focus change, so here just reset the flag. |
|
7059 // dim state changed, need fetch it again. |
|
7060 SendEventsToPluginManL(EPluginEnableFetchDimState); |
|
7061 |
|
7062 //The CCPU flag ECcpuStateShiftkeyWasPressedBeforeLosingFocus suggests that the candidate list was closed |
|
7063 //with a long key press of shift key. If so then, FEP needs to set the EFlagShiftKeyDepressed for the CCPU mode to work |
|
7064 //correctly. The state of the shift state is copied to local variable isToSetShiftKeyStateDown because as a function of change |
|
7065 //of focus the FEP clears all the CCPU flags which would reset ECcpuStateShiftkeyWasPressedBeforeLosingFocus also. |
|
7066 TBool isToSetShiftKeyStateDown = IsCcpuFlagSet(ECcpuStateShiftkeyWasPressedBeforeLosingFocus); |
|
7067 if (!Japanese() || iFepManState != EAknFepStateUIActive) |
|
7068 { |
|
7069 if (IsCcpuFlagSet(ECcpuStateIgnoreNextFocusChange)) |
|
7070 { |
|
7071 // The focus event was caused by menu selection, don't clear all ccpu flags. |
|
7072 ClearCcpuFlag(ECcpuStateIgnoreNextFocusChange); |
|
7073 } |
|
7074 else |
|
7075 { |
|
7076 if((HashKeySelectionInUse() && IsCcpuFlagSet(ECcpuStateHashDown) |
|
7077 && IsCcpuFlagSet(ECcpuStateEdwinInSelectionMode))) |
|
7078 { |
|
7079 ClearCcpuFlag(ECcpuStateHashDown); |
|
7080 SetCcpuFlag(ECcpuStateSelectionEventPosted); |
|
7081 ClearCcpuFlag(ECcpuStateEdwinInSelectionMode); |
|
7082 SetFlag(EFlagLongShiftKeyPress); |
|
7083 TKeyEvent ccpuStart = {0, EStdKeyLeftShift, 0, 0}; |
|
7084 CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKeyUp); |
|
7085 } |
|
7086 else |
|
7087 { |
|
7088 TBool isToSupressCursorMove = IsCcpuFlagSet(ECcpuStateSupressCursorMoveToEnd); |
|
7089 TBool isCommitPredictiveWord = IsCcpuFlagSet(ECcpuStataCommitPredictiveWord); |
|
7090 CancelCcpuMode(); |
|
7091 if(isToSupressCursorMove) |
|
7092 SetCcpuFlag(ECcpuStateSupressCursorMoveToEnd); |
|
7093 if(isCommitPredictiveWord) |
|
7094 SetCcpuFlag(ECcpuStataCommitPredictiveWord); |
|
7095 } |
|
7096 |
|
7097 } |
|
7098 SetCcpuFlag(ECcpuSupressEditMenuFromShiftUp); |
|
7099 iPreviousEditingState = EStateNone; |
|
7100 iEditIndicatorAtLastUpdate = NULL; |
|
7101 ClearFlag( EFlagBidiCursorIsInitialized ); |
|
7102 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
7103 // removing the no match indicator is not necessary for ITI |
|
7104 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
7105 { |
|
7106 TryRemoveNoMatchesIndicatorL(); |
|
7107 } |
|
7108 #endif |
|
7109 UpdateCbaL(NULL); |
|
7110 |
|
7111 if (iFepFullyConstructed) |
|
7112 { |
|
7113 SetCcpuFlag(ECcpuStateLosingFocus); // CommitInlineEditL needs to now we're losing focus (for cursor handling): |
|
7114 CancelAllTimerActivity(); |
|
7115 FepUI()->ExpireMultitapTimer(); |
|
7116 ClearCcpuFlag(ECcpuStateLosingFocus); // Cleared right away to make sure nothing else is affected. |
|
7117 } |
|
7118 // Forget shift key and chr key press if application or UI component is |
|
7119 // changed during shiftkey press. |
|
7120 ClearFlag(EFlagQwertyChrKeyDepressed); |
|
7121 //If candidate list was closed by long keypress of shift key, set the flag EFlagShiftKeyDepressed for CCPU mode |
|
7122 //to work correctly once it re-focuses on the editor. |
|
7123 if(isToSetShiftKeyStateDown) |
|
7124 { |
|
7125 SetFlag(EFlagShiftKeyDepressed); |
|
7126 ClearCcpuFlag(ECcpuStateShiftkeyWasPressedBeforeLosingFocus); |
|
7127 } |
|
7128 else |
|
7129 { |
|
7130 ClearFlag(EFlagShiftKeyDepressed); |
|
7131 } |
|
7132 if ( iFepFullyConstructed && IsFepAwareTextEditor() ) |
|
7133 { |
|
7134 //save state of old item |
|
7135 TransferFepStateToEditorL(); |
|
7136 |
|
7137 if ( WesternPredictive() ) |
|
7138 { |
|
7139 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
7140 // To rip off suggested word completion when there is a change in focus |
|
7141 if(IsAutoCompleteOn()) |
|
7142 { |
|
7143 RemoveSuggestedCompletionL(); |
|
7144 |
|
7145 } |
|
7146 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
7147 SetCcpuFlag(ECcpuStateLosingFocus); // CommitInlineEditL needs to now we're losing focus (for cursor handling): |
|
7148 CommitInlineEditL(); |
|
7149 ClearCcpuFlag(ECcpuStateLosingFocus); // Cleared right away to make sure nothing else is affected. |
|
7150 } |
|
7151 else |
|
7152 { |
|
7153 TryCloseUiL(); |
|
7154 } |
|
7155 |
|
7156 iRememberLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
7157 if (iLastFocusedEditor && !IsExtendedFlagSet(EExtendedFlagFepAwareDialogLaunched)) |
|
7158 { |
|
7159 iLastFocusedEditor->SetObserver(NULL); |
|
7160 iLastFocusedEditor = NULL; |
|
7161 } |
|
7162 // When editor launches a non-fep aware dialog, then we |
|
7163 // should not set the observer to Null. Because if the dialog is |
|
7164 // destroyed we will not know and the dialog will remain orphaned. |
|
7165 // Also we need to know the fep editor pointer. |
|
7166 iLastFocusedEditor = EditorState(); |
|
7167 iEditorCcpuStatus = EditorCcpuStatus(iLastFocusedEditor); |
|
7168 //iLastFocusedEditor->SetObserver(NULL); |
|
7169 #ifdef RD_SCALABLE_UI_V2 |
|
7170 UnregisterObserver(); |
|
7171 #endif // RD_SCALABLE_UI_V2 |
|
7172 } |
|
7173 |
|
7174 if (iPermittedInputModes & EAknEditorSecretAlphaInputMode && |
|
7175 !(iPermittedInputModes & EAknEditorTextInputMode)) |
|
7176 { |
|
7177 // For password editors. |
|
7178 ClearFlag(EFlagSupressAutoUpdate); |
|
7179 } |
|
7180 |
|
7181 // Losing focus is over, from this point on we are gaining focus. |
|
7182 ClearCcpuFlag(ECcpuStateLosingFocus); |
|
7183 |
|
7184 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
7185 if(iFnKeyManager) |
|
7186 iFnKeyManager->ClearFnKeyState(); |
|
7187 |
|
7188 if(iResourceString) |
|
7189 { |
|
7190 delete iResourceString; |
|
7191 iResourceString = NULL; |
|
7192 } |
|
7193 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
7194 |
|
7195 // get input capabilities from newly focused item |
|
7196 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
7197 iInputCapabilities = static_cast<const CCoeAppUi*>(coeEnv->AppUi())->InputCapabilities(); |
|
7198 SetQwertyModeToInputcapbility(); |
|
7199 if ( IsFepAwareTextEditor() ) |
|
7200 { |
|
7201 // Now at the launch of non-fep aware dialogs we do not set the editor observer to NULL, |
|
7202 // and retain the editor pointer in iLastFocusedEditor. |
|
7203 // So in case the editor is back in focus, we set iLastFocusedEditor to NULL |
|
7204 // and set the editor observer again. |
|
7205 |
|
7206 // At launch of fep aware dialog on a fep aware editor say spell query launched on messaging editor, |
|
7207 // we have the flag EExtendedFlagFepAwareDialogLaunched set. |
|
7208 // So in this scenario we retain the observer for both the editor as we need to close the spell query |
|
7209 // on close of messaging editor. |
|
7210 // Specific scenario is explained, the same is applicable for all general scenarios, for any |
|
7211 // fep aware dialog launched on any other fep aware editor. |
|
7212 if (iLastFocusedEditor && !IsExtendedFlagSet(EExtendedFlagFepAwareDialogLaunched)) |
|
7213 { |
|
7214 iLastFocusedEditor->SetObserver(NULL); |
|
7215 iLastFocusedEditor = NULL; |
|
7216 } |
|
7217 if( EditorState() ) |
|
7218 { |
|
7219 EditorState()->SetObserver(this); |
|
7220 } |
|
7221 ConfigureFEPFromEditorStateL(); |
|
7222 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
7223 if( PtiEngine() ) |
|
7224 { |
|
7225 if(!IsAutoCompleteOn()) |
|
7226 { |
|
7227 TInt tailLength = 0; |
|
7228 TRAP_IGNORE( PtiEngine()->HandleCommandL( |
|
7229 EPtiCommandGetAutoCompletionTailLength, |
|
7230 &tailLength )); |
|
7231 if(tailLength) |
|
7232 { |
|
7233 RemoveSuggestedAdvanceCompletionL(); |
|
7234 } |
|
7235 } |
|
7236 } |
|
7237 #endif |
|
7238 if (!iWesternPredictive && iMode == ELatin) |
|
7239 { |
|
7240 // It is possible to cause situation (by ill-acting client |
|
7241 // app) where focus handling goes out of sync and there actually |
|
7242 // is uncomitted inline edit operation going on in to-be-focused |
|
7243 // editor. Multitapping mode doesn't like that, so we make sure here |
|
7244 // that it won't happen. |
|
7245 CancelInlineEdit(); |
|
7246 } |
|
7247 AdjustCursorTypeForCurrentPosition(); |
|
7248 |
|
7249 if (IsCcpuFlagSet(ECcpuStateUncommitWhenFocused)) |
|
7250 { |
|
7251 // One of the ccpu editing options mode was started from |
|
7252 // options menu. If there is active predictive word it |
|
7253 // needs to be deactivated. |
|
7254 ClearCcpuFlag(ECcpuStateUncommitWhenFocused); |
|
7255 DeactivatePredicitveWordAndMoveCursorL(); |
|
7256 } |
|
7257 #ifdef RD_SCALABLE_UI_V2 |
|
7258 RegisterObserver(); |
|
7259 #endif // RD_SCALABLE_UI_V2 |
|
7260 } |
|
7261 else // no FepAwareTextEditor |
|
7262 { |
|
7263 #ifdef RD_SCALABLE_UI_V2 |
|
7264 // register to receive TInputCapabilitiesEvent events |
|
7265 if ( SemiFepAwareTextEditor() ) |
|
7266 { |
|
7267 RegisterObserver(); |
|
7268 TLanguage localLanguage = ELangTest; |
|
7269 if (GetLocalLanguage( localLanguage ) ) |
|
7270 { |
|
7271 iLanguageCapabilities.iLocalInputLanguageInUse = ETrue; |
|
7272 if ( localLanguage != iLanguageCapabilities.iInputLanguageCode ) |
|
7273 { |
|
7274 ChangeInputLanguageL(localLanguage); |
|
7275 } |
|
7276 } |
|
7277 else if (iLanguageCapabilities.iLocalInputLanguageInUse) |
|
7278 { |
|
7279 iLanguageCapabilities.iLocalInputLanguageInUse = EFalse; |
|
7280 ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage()); |
|
7281 } |
|
7282 |
|
7283 if (IsFlagSet(EFlagNewSharedDataInputLanguage) ) |
|
7284 { |
|
7285 //Global mode or input language has been changed in general settings |
|
7286 if ( !iLanguageCapabilities.iLocalInputLanguageInUse) |
|
7287 { |
|
7288 ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage()); |
|
7289 } |
|
7290 ClearFlag(EFlagNewSharedDataInputLanguage); |
|
7291 } |
|
7292 } |
|
7293 #endif // RD_SCALABLE_UI_V2 |
|
7294 // Check for non Edwin derived editors (eg mfne, tel no editor etc) |
|
7295 if (iInputCapabilities.SupportsWesternNumericIntegerPositive() || |
|
7296 iInputCapabilities.SupportsWesternNumericIntegerNegative() || |
|
7297 iInputCapabilities.SupportsWesternNumericReal() ) |
|
7298 { |
|
7299 SyncStates(EAknFepStateInitial); |
|
7300 iPermittedInputModes = EAknEditorNumericInputMode; |
|
7301 iAknEditorNumericKeymap = EAknEditorNativeKeysNumberModeKeymap; |
|
7302 iAknEditorFlags = 0; |
|
7303 iCharWidth = EHalfWidthChar; |
|
7304 UpdateNumericEditorDigitType(); |
|
7305 |
|
7306 if ( IsMfneEditor() ) |
|
7307 { |
|
7308 UpdateLocalDigitMode(); |
|
7309 } |
|
7310 |
|
7311 if( IsInputModeAvailable(ENativeNumber) && |
|
7312 ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic || |
|
7313 iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic || |
|
7314 iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) ) |
|
7315 { |
|
7316 TryChangeModeL( ENativeNumber ); |
|
7317 } |
|
7318 else |
|
7319 { |
|
7320 TryChangeModeL( ENumber ); |
|
7321 } |
|
7322 } |
|
7323 else //we don't have a valid editor |
|
7324 { |
|
7325 SyncStates(EAknFepStateNull); |
|
7326 |
|
7327 // Reset the qwerty shift case mode when we do not have a valis editor. |
|
7328 ClearFlag(IsFlagSet( EFlagQwertyShiftMode )); |
|
7329 if (!IsFlagSet(EFlagForegroundUIComponentVisible | EFlagMenuPaneVisible) && |
|
7330 iIndicator) |
|
7331 { |
|
7332 iIndicator->SetState(EStateNone); |
|
7333 iHybridAplphaChangedToAlphanumeric = EFalse; |
|
7334 } |
|
7335 ClearFlag(EFlagForegroundUIComponentVisible); |
|
7336 iPermittedInputModes = EAknEditorNullInputMode; |
|
7337 |
|
7338 #ifdef RD_SCALABLE_UI_V2 |
|
7339 RegisterObserver(); |
|
7340 #endif // RD_SCALABLE_UI_V2 |
|
7341 } |
|
7342 } |
|
7343 } |
|
7344 else if (Japanese() && iFepManState == EAknFepStateUIActive) |
|
7345 { |
|
7346 if (iInputCapabilities.FepAwareTextEditor()) |
|
7347 { |
|
7348 TryCloseUiL(); |
|
7349 } |
|
7350 } |
|
7351 |
|
7352 #ifdef RD_SCALABLE_UI_V2 |
|
7353 { |
|
7354 /* |
|
7355 if( iGainForeground ) |
|
7356 { |
|
7357 iLoseForeAndGainFocus = EFalse; |
|
7358 } |
|
7359 else |
|
7360 { |
|
7361 iLoseForeAndGainFocus = ETrue; |
|
7362 } |
|
7363 SendEventsToPluginManL( EPluginFocusChanged, iGainForeground ); |
|
7364 */ |
|
7365 CCoeControl* focusCtrl = static_cast<const CCoeAppUi*>(CCoeEnv::Static()->AppUi())->TopFocusedControl(); |
|
7366 CAknAppUi* aui = static_cast<CAknAppUi*>(CEikonEnv::Static()->AppUi()); |
|
7367 TBool bForeGround = aui->IsForeground(); |
|
7368 if(iGainForeground && ! bForeGround) |
|
7369 { |
|
7370 iGainForeground = EFalse; |
|
7371 } |
|
7372 |
|
7373 if(iGainForeground && iNotifyPlugin) |
|
7374 { |
|
7375 SendEventsToPluginManL( EPluginFocusChanged, |
|
7376 iGainForeground && focusCtrl!=0 && focusCtrl->IsFocused()); |
|
7377 } |
|
7378 iNotifyPlugin = ETrue; |
|
7379 } |
|
7380 #endif // RD_SCALABLE_UI_V2 |
|
7381 if( PtiEngine() && FepAwareTextEditor() ) |
|
7382 { |
|
7383 if( FepAwareTextEditor()->DocumentLengthForFep() == 0 && |
|
7384 IsFlagSet(EFlagInsideInlineEditingTransaction)&& |
|
7385 iFepManState == EAknFepStateUIActive ) |
|
7386 { |
|
7387 PtiEngine()->ClearCurrentWord(); |
|
7388 TryCloseUiL(); |
|
7389 } |
|
7390 } |
|
7391 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
7392 // Predictive QWERTY (XT9) changes ----> |
|
7393 ShowExactWordPopupIfNecessaryL(); |
|
7394 // Predictive QWERTY (XT9) changes <---- |
|
7395 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
7396 } |
|
7397 |
|
7398 void CAknFepManager::CleanUpFep() |
|
7399 { |
|
7400 if (iFepFullyConstructed) |
|
7401 { |
|
7402 CancelAllTimerActivity(); |
|
7403 iInputCapabilities.FepAwareTextEditor()->CancelFepInlineEdit(); |
|
7404 } |
|
7405 else |
|
7406 { |
|
7407 CommonDestroyFep(); |
|
7408 } |
|
7409 } |
|
7410 |
|
7411 #ifdef RD_SCALABLE_UI_V2 |
|
7412 void CAknFepManager::UnregisterObserver() |
|
7413 { |
|
7414 |
|
7415 MObjectProvider* mop = iInputCapabilities.ObjectProvider(); |
|
7416 |
|
7417 if ( mop ) |
|
7418 { |
|
7419 CAknExtendedInputCapabilities* extendedInputCapabilities = |
|
7420 mop->MopGetObject( extendedInputCapabilities ); |
|
7421 |
|
7422 if ( extendedInputCapabilities ) |
|
7423 { |
|
7424 extendedInputCapabilities->UnregisterObserver( this ); |
|
7425 } |
|
7426 } |
|
7427 } |
|
7428 |
|
7429 void CAknFepManager::RegisterObserver() |
|
7430 { |
|
7431 |
|
7432 MObjectProvider* mop = iInputCapabilities.ObjectProvider(); |
|
7433 |
|
7434 if ( mop ) |
|
7435 { |
|
7436 CAknExtendedInputCapabilities* extendedInputCapabilities = |
|
7437 mop->MopGetObject( extendedInputCapabilities ); |
|
7438 |
|
7439 if ( extendedInputCapabilities ) |
|
7440 { |
|
7441 extendedInputCapabilities->RegisterObserver( this ); |
|
7442 } |
|
7443 } |
|
7444 } |
|
7445 |
|
7446 #endif // RD_SCALABLE_UI_V2 |
|
7447 |
|
7448 void CAknFepManager::SimulateKeyEventL(TUint aKeyCode, TBool aActiveObj) |
|
7449 { |
|
7450 if (aActiveObj) |
|
7451 { |
|
7452 iSimulateKey = aKeyCode; |
|
7453 iAsyncOwnSimulateKey.CallBack(); |
|
7454 } |
|
7455 else |
|
7456 { |
|
7457 CArrayFix<TUint>* simCharArray = new(ELeave) CArrayFixFlat<TUint>(1); |
|
7458 CleanupStack::PushL(simCharArray); |
|
7459 simCharArray->AppendL(aKeyCode); |
|
7460 SimulateKeyEventsL(simCharArray->Array()); |
|
7461 CleanupStack::PopAndDestroy(); // simCharArray |
|
7462 } |
|
7463 } |
|
7464 |
|
7465 TInt CAknFepManager::ResetShiftKeyMonitorCallback(TAny* aObj) |
|
7466 { |
|
7467 TRAPD(err, static_cast<CAknFepManager*>(aObj)->ResetShiftKeyMonitorL()); |
|
7468 if (err) |
|
7469 { |
|
7470 static_cast<CAknFepManager*>(aObj)->CleanUpFep(); |
|
7471 return KErrDied; |
|
7472 } |
|
7473 return KErrNone; |
|
7474 } |
|
7475 |
|
7476 void CAknFepManager::ResetShiftKeyMonitorL() |
|
7477 { |
|
7478 TBool phoneIdle = (EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor); |
|
7479 if(phoneIdle) |
|
7480 { |
|
7481 iShiftKeypressMonitor->Cancel(); |
|
7482 return; |
|
7483 } |
|
7484 |
|
7485 SetFlag(EFlagLongShiftKeyPress); |
|
7486 #ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ |
|
7487 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
7488 // Copy-paste with shift+SKs is always available on ITU-T. On QWERTY, |
|
7489 // it's available if activated in the Central Repository. |
|
7490 if ( (!iQwertyInputMode || iSharedDataInterface->ShiftCopyPastingOnQwerty()) && |
|
7491 !(iAknEditorFlags & EAknEditorFlagFindPane) ) |
|
7492 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
7493 #else |
|
7494 if (!iQwertyInputMode && !(iAknEditorFlags & EAknEditorFlagFindPane)) |
|
7495 #endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ |
|
7496 { |
|
7497 if (HashKeySelectionInUse() && IsCcpuFlagSet(ECcpuStateHashDown)) |
|
7498 { |
|
7499 SetCcpuFlag(ECcpuStateEdwinInSelectionMode); |
|
7500 iHashKeyMan->SetPreviousSelectionStyleModeL(); |
|
7501 } |
|
7502 if(iCandidatePopup) |
|
7503 { // if candidate list is launched and then a long key press of shift key is done, destroy the candidate list first |
|
7504 iCandidatePopup->AttemptExitL(EFalse); |
|
7505 HandleChangeInFocusL(); |
|
7506 } |
|
7507 if(!IsCcpuFlagSet(ECcpuStateCbaShown)) |
|
7508 { |
|
7509 TKeyEvent ccpuStart = {EKeyF21, EStdKeyF21, 0, 0}; |
|
7510 // to enable copy/paste support on cba. We simulate via CCoeEnv |
|
7511 // to avoid fep SimulateKeyEventL adding shift modifiers |
|
7512 CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKey); |
|
7513 SetCcpuFlag(ECcpuStateCbaShown); |
|
7514 } |
|
7515 } |
|
7516 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
7517 #ifdef __HALF_QWERTY_KEYPAD |
|
7518 // we should not enter the copy-paste mode in find pane editors |
|
7519 if( EPtiKeyboardHalfQwerty == KeyboardLayout() && !(iAknEditorFlags & EAknEditorFlagFindPane)) |
|
7520 { |
|
7521 CAknFepFnKeyManager::TFnKeyState fnState = FnKeyState(); |
|
7522 |
|
7523 if( CAknFepFnKeyManager::EFnKeyNone != fnState |
|
7524 || iFnCharInsertedForShift ) |
|
7525 { |
|
7526 TText prevCh = PreviousChar(); |
|
7527 if (prevCh == '#' || prevCh == '/') |
|
7528 { |
|
7529 RemovePreviousCharacterL(); |
|
7530 } |
|
7531 // reset the fn state if it is FnNext |
|
7532 if( fnState == CAknFepFnKeyManager::EFnKeyNext ) |
|
7533 { |
|
7534 SetFnKeyState( CAknFepFnKeyManager::EFnKeyNone ); |
|
7535 } |
|
7536 } |
|
7537 SetCcpuFlag( CAknFepManager::ECcpuStateEdwinInSelectionMode ); |
|
7538 if(!IsCcpuFlagSet(ECcpuStateCbaShown)) |
|
7539 { |
|
7540 TKeyEvent ccpuStart = {EKeyF21, EStdKeyF21, 0, 0}; |
|
7541 |
|
7542 // to enable copy/paste support on cba. We simulate via CCoeEnv |
|
7543 // to avoid fep SimulateKeyEventL adding shift modifiers |
|
7544 CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKey); |
|
7545 SetCcpuFlag(ECcpuStateCbaShown); |
|
7546 } |
|
7547 } |
|
7548 #endif //__HALF_QWERTY_KEYPAD |
|
7549 |
|
7550 #endif//RD_INTELLIGENT_TEXT_INPUT |
|
7551 iShiftKeypressMonitor->Cancel(); |
|
7552 } |
|
7553 |
|
7554 void CAknFepManager::CancelAllTimerActivity() |
|
7555 { |
|
7556 if (iShiftKeypressMonitor->IsActive()) |
|
7557 { |
|
7558 iShiftKeypressMonitor->Cancel(); |
|
7559 } |
|
7560 if (iConcatenationTimer->IsActive()) |
|
7561 { |
|
7562 iConcatenationTimer->Cancel(); |
|
7563 } |
|
7564 if (iChrKeypressMonitor->IsActive()) |
|
7565 { |
|
7566 iChrKeypressMonitor->Cancel(); |
|
7567 } |
|
7568 if (iPostEventCheck->IsActive()) |
|
7569 { |
|
7570 iPostEventCheck->Cancel(); |
|
7571 } |
|
7572 if ( iHashKeyMan ) |
|
7573 { |
|
7574 iHashKeyMan->CancelHashKeyTimer(); |
|
7575 } |
|
7576 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
7577 if( iNumericResourceTimer ) |
|
7578 { |
|
7579 TRAP_IGNORE( NumericResourceMultiTapTimerTimeoutL()); |
|
7580 } |
|
7581 #endif |
|
7582 DeactivateFnkeyPressMonitor(); |
|
7583 } |
|
7584 |
|
7585 TBool CAknFepManager::IsModePermitted(TInt aMode, TWidthChar aWidth) const |
|
7586 { |
|
7587 if (aWidth == ENoneWidthChar) |
|
7588 { |
|
7589 aWidth = iCharWidth; |
|
7590 } |
|
7591 |
|
7592 TBool isModePermitted = ETrue; |
|
7593 const TInt inputLanguage = iLanguageCapabilities.iInputLanguageCode; |
|
7594 |
|
7595 if ( aMode == ENativeNumber && !IsInputModeAvailable( aMode ) ) |
|
7596 { |
|
7597 if ( inputLanguage == ELangThai && iFepPluginManager && |
|
7598 iFepPluginManager->PluginInputMode() != EPluginInputModeItut && |
|
7599 !iQwertyInputMode) |
|
7600 { |
|
7601 return ETrue; |
|
7602 } |
|
7603 return EFalse; |
|
7604 } |
|
7605 |
|
7606 TUint editorMode = EditorMode(aMode, aWidth); |
|
7607 |
|
7608 //Support Boxcn default Chinese inputmode when defaul inputmode is Cangjie Hongkong |
|
7609 //only if Chinese input is permitted in the editor |
|
7610 if (!( (iVariantPermittedModes | ELatinText | ELatinUpper | ELatinLower | EHiragana) & aMode) ) |
|
7611 { |
|
7612 //the mode is never valid in this variant |
|
7613 isModePermitted = EFalse; |
|
7614 } |
|
7615 else if( aMode == ECangJie && !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly)) |
|
7616 { |
|
7617 if (iQwertyInputMode || iFepPluginManager->PluginInputMode() == EPluginInputModeVkb |
|
7618 || iFepPluginManager->PluginInputMode() == EPluginInputModeFSQ) |
|
7619 { |
|
7620 isModePermitted = ETrue; |
|
7621 } |
|
7622 else |
|
7623 { |
|
7624 isModePermitted = EFalse; |
|
7625 } |
|
7626 } |
|
7627 else if (!(iPermittedInputModes & editorMode)) |
|
7628 { |
|
7629 isModePermitted = EFalse; |
|
7630 } |
|
7631 else if (((aMode == EPinyin) || (aMode == EZhuyin) || (aMode == EStroke) || (aMode == ECangJie) |
|
7632 || (aMode == EHiraganaKanji) || (aMode == EKatakana) || ( aMode == EHangul ) |
|
7633 || (((aMode == ELatin) || (aMode == ENumber) || iMode == ENativeNumber ) && (iCharWidth == EFullWidthChar))) |
|
7634 && (iAknEditorFlags & EAknEditorFlagLatinInputModesOnly)) |
|
7635 { |
|
7636 //the editor does not allow Chinese modes |
|
7637 isModePermitted = EFalse; |
|
7638 } |
|
7639 else if (((aMode == EStrokeFind) || (aMode == EZhuyinFind)) |
|
7640 && (!(iAknEditorFlags & EAknEditorFlagForceTransparentFepModes))) |
|
7641 { |
|
7642 //StrokeFind and ZhuyinFind modes are only valid in a chinese find pane |
|
7643 isModePermitted = EFalse; |
|
7644 } |
|
7645 else |
|
7646 { |
|
7647 TUint editorsWhichAllowThisMode; |
|
7648 if (aMode == ENumber || aMode == ENativeNumber ) |
|
7649 { |
|
7650 //The FEP's ENumber mode has a direct mapping to EAknEditorNumericInputMode |
|
7651 // or EAknEditorFullWidthNumericInputMode |
|
7652 editorsWhichAllowThisMode = EAknEditorNumericInputMode; |
|
7653 if (aWidth == EFullWidthChar) |
|
7654 { |
|
7655 editorsWhichAllowThisMode = EAknEditorFullWidthNumericInputMode; |
|
7656 } |
|
7657 } |
|
7658 else if (aMode == EHiragana) |
|
7659 { |
|
7660 editorsWhichAllowThisMode = EAknEditorHiraganaInputMode; |
|
7661 } |
|
7662 else if (aMode == EKatakana || (aMode == ELatin && aWidth == EFullWidthChar)) |
|
7663 { |
|
7664 editorsWhichAllowThisMode = EditorMode(aMode, aWidth); |
|
7665 } |
|
7666 else if (aMode == EHiraganaKanji) |
|
7667 { |
|
7668 // HiraganaKanji mode allows all input mode. |
|
7669 editorsWhichAllowThisMode = EAknEditorAllInputModes; |
|
7670 } |
|
7671 else if (aMode == EHangul) |
|
7672 { |
|
7673 editorsWhichAllowThisMode =(EAknEditorTextInputMode | EAknEditorSecretAlphaInputMode | EAknEditorHalfWidthTextInputMode); |
|
7674 } |
|
7675 else |
|
7676 { |
|
7677 //if the editor allows Text Input or Secret Alpha Mode, |
|
7678 //we infer that Chinese Modes are valid |
|
7679 editorsWhichAllowThisMode =(EAknEditorTextInputMode | |
|
7680 EAknEditorSecretAlphaInputMode | |
|
7681 EAknEditorHalfWidthTextInputMode); |
|
7682 } |
|
7683 isModePermitted = iPermittedInputModes & editorsWhichAllowThisMode; |
|
7684 } |
|
7685 |
|
7686 return isModePermitted; |
|
7687 } |
|
7688 |
|
7689 TInt CAknFepManager::SyncStates(TAknFepManagerState aState) |
|
7690 { |
|
7691 TInt ret = KErrNone; |
|
7692 |
|
7693 if (!iFepFullyConstructed) |
|
7694 { |
|
7695 if (aState == EAknFepStateNull) |
|
7696 { |
|
7697 return KErrNone; |
|
7698 } |
|
7699 |
|
7700 TRAP(ret, ConstructFullyL()); |
|
7701 } |
|
7702 if (iFepFullyConstructed) |
|
7703 { |
|
7704 iFepManState = aState; |
|
7705 iKeyCatcher->SetState(aState); |
|
7706 } |
|
7707 |
|
7708 return ret; |
|
7709 } |
|
7710 |
|
7711 TUint CAknFepManager::EditorMode(TInt aMode, TWidthChar aWidth) const |
|
7712 { |
|
7713 TInt editorMode = 0; |
|
7714 switch(aMode) |
|
7715 { |
|
7716 case EPinyin: |
|
7717 case EZhuyin: |
|
7718 case EStroke: |
|
7719 case ECangJie: |
|
7720 case EPRCFind: |
|
7721 case EZhuyinFind: |
|
7722 case EStrokeFind: |
|
7723 case EHangul: |
|
7724 { |
|
7725 editorMode = EAknEditorTextInputMode; |
|
7726 } |
|
7727 break; |
|
7728 case EHindi: |
|
7729 case ELatin: |
|
7730 case ELatinText: |
|
7731 case ELatinUpper: |
|
7732 case ELatinLower: |
|
7733 { |
|
7734 if (iPermittedInputModes & EAknEditorTextInputMode) |
|
7735 { |
|
7736 editorMode = EAknEditorTextInputMode; |
|
7737 } |
|
7738 else if (iPermittedInputModes & EAknEditorHalfWidthTextInputMode) |
|
7739 { |
|
7740 if (IsFeatureSupportedJapanese()) |
|
7741 { |
|
7742 editorMode = EAknEditorHalfWidthTextInputMode; |
|
7743 } |
|
7744 else |
|
7745 { |
|
7746 editorMode = EAknEditorTextInputMode; |
|
7747 } |
|
7748 } |
|
7749 else |
|
7750 { |
|
7751 editorMode = EAknEditorSecretAlphaInputMode; |
|
7752 } |
|
7753 if (aWidth == EFullWidthChar) |
|
7754 { |
|
7755 editorMode = EAknEditorFullWidthTextInputMode; |
|
7756 } |
|
7757 } |
|
7758 break; |
|
7759 case EHiragana: |
|
7760 { |
|
7761 editorMode = EAknEditorHiraganaInputMode; |
|
7762 } |
|
7763 break; |
|
7764 case EHiraganaKanji: |
|
7765 { |
|
7766 editorMode = EAknEditorHiraganaKanjiInputMode; |
|
7767 } |
|
7768 break; |
|
7769 case EKatakana: |
|
7770 { |
|
7771 editorMode = EAknEditorKatakanaInputMode; |
|
7772 if (aWidth == EFullWidthChar) |
|
7773 { |
|
7774 editorMode = EAknEditorFullWidthKatakanaInputMode; |
|
7775 } |
|
7776 } |
|
7777 break; |
|
7778 case ENumber: |
|
7779 case ENativeNumber: |
|
7780 { |
|
7781 editorMode = EAknEditorNumericInputMode; |
|
7782 if (aWidth == EFullWidthChar) |
|
7783 { |
|
7784 editorMode = EAknEditorFullWidthNumericInputMode; |
|
7785 } |
|
7786 } |
|
7787 break; |
|
7788 default: |
|
7789 break; |
|
7790 } |
|
7791 |
|
7792 return editorMode; |
|
7793 } |
|
7794 |
|
7795 void CAknFepManager::LaunchPenSupportMenuL() |
|
7796 { |
|
7797 if (HashKeySelectionInUse() && IsCcpuFlagSet(ECcpuStateHashDown)) |
|
7798 { |
|
7799 return; |
|
7800 } |
|
7801 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
7802 if(iCandidatePopup) |
|
7803 { |
|
7804 iCandidatePopup->AttemptExitL(EFalse); |
|
7805 HandleChangeInFocusL(); |
|
7806 } |
|
7807 #endif |
|
7808 |
|
7809 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
7810 { |
|
7811 TryRemoveNoMatchesIndicatorL(); |
|
7812 /* |
|
7813 This code is the part of fixing TSW Error Edit Menu : |
|
7814 "Matches" and "insert word" options are not available under Edit Menu. |
|
7815 When we launch Edit Menu.the word which in Inline Editing in the BackGorund |
|
7816 Should not Commit*/ |
|
7817 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
7818 CommitInlineEditL(); |
|
7819 #endif |
|
7820 /* |
|
7821 This code is the part of fixing TSW ErrorEdit Menu : |
|
7822 "Matches" and "insert word" options are not available under Edit Menu. |
|
7823 This Flag is useful for deciding whether "Matches" Menu Item can Visible |
|
7824 or not*/ |
|
7825 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
7826 SetFlag(EFlagInlineEditInBackground); |
|
7827 #endif |
|
7828 /* |
|
7829 This code is the part of fixing TSW Error Edit Menu : |
|
7830 "Matches" and "insert word" options are not available under Edit Menu.*/ |
|
7831 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
7832 ClearFlag(EFlagInsideInlineEditingTransaction); |
|
7833 #endif |
|
7834 } |
|
7835 |
|
7836 CAknEdwinState* editorState = NULL; |
|
7837 if (iInputCapabilities.FepAwareTextEditor()) |
|
7838 { |
|
7839 editorState = EditorState(); |
|
7840 } |
|
7841 |
|
7842 iEditMenuBar = NULL; |
|
7843 if (editorState) |
|
7844 { |
|
7845 iEditMenuBar = iUiInterface->EditorStateMenuBar(editorState); |
|
7846 } |
|
7847 |
|
7848 if (iEditMenuBar && |
|
7849 !iEditMenuBar->IsDisplayed()) |
|
7850 { |
|
7851 |
|
7852 iPenSupportMenu = ETrue; |
|
7853 // SetFlag(EFlagLaunchEditMenu); |
|
7854 CAknFepUiInterfaceMenuPane* menuPane = iEditMenuBar->MenuPane(); |
|
7855 |
|
7856 CEikMenuPane* oldMenuPane = menuPane->GetMenuPane(); |
|
7857 if (!oldMenuPane) |
|
7858 { |
|
7859 menuPane = NULL; |
|
7860 } |
|
7861 |
|
7862 iRememberEditorState = EditorState(); |
|
7863 |
|
7864 iEditMenuBar->SetMenuType(CAknFepUiInterfaceMenuBar::EMenuEdit); |
|
7865 // It is unnecessary to add ROW SCT in Editting option menu. |
|
7866 iEditMenuBar->TryDisplayMenuBarL(); |
|
7867 if (menuPane && menuPane->NumberOfItemsInPane() == 0) |
|
7868 { |
|
7869 // Edit menu do not contain any items. |
|
7870 iEditMenuBar->StopDisplayingMenuBar(); |
|
7871 } |
|
7872 else |
|
7873 { |
|
7874 //adjust menu position to the front of dialog to |
|
7875 //avoid input capability is wrongly got |
|
7876 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
7877 CCoeAppUi* appUi = (CCoeAppUi*)(coeEnv->AppUi()); |
|
7878 if( appUi->IsDisplayingDialog() ) |
|
7879 { |
|
7880 iEditMenuBar->RemoveFromStack(); |
|
7881 iEditMenuBar->AddToStackL(ECoeStackPriorityDialog + 1, ECoeStackFlagStandard); |
|
7882 } |
|
7883 } |
|
7884 |
|
7885 iEditMenuBar->SetMenuType(CAknFepUiInterfaceMenuBar::EMenuOptions); |
|
7886 } |
|
7887 iPenSupportMenu = EFalse; |
|
7888 } |
|
7889 |
|
7890 void CAknFepManager::LaunchSelectModeMenuL() |
|
7891 { |
|
7892 if (HashKeySelectionInUse() && IsCcpuFlagSet(ECcpuStateHashDown)) |
|
7893 { |
|
7894 return; |
|
7895 } |
|
7896 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
7897 if(iCandidatePopup) |
|
7898 { |
|
7899 iCandidatePopup->AttemptExitL(EFalse); |
|
7900 HandleChangeInFocusL(); |
|
7901 } |
|
7902 #endif |
|
7903 |
|
7904 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
7905 { |
|
7906 TryRemoveNoMatchesIndicatorL(); |
|
7907 /* |
|
7908 This code is the part of fixing TSW Error : Edit Menu : |
|
7909 "Matches" and "insert word" options are not available under Edit Menu. |
|
7910 When we launch Edit Menu.the word which in Inline Editing in the BackGorund |
|
7911 Should not Commit*/ |
|
7912 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
7913 CommitInlineEditL(); |
|
7914 #endif |
|
7915 /* |
|
7916 This code is the part of fixing TSW Error : Edit Menu : |
|
7917 "Matches" and "insert word" options are not available under Edit Menu. |
|
7918 This Flag is useful for deciding whether "Matches" Menu Item can Visible |
|
7919 or not*/ |
|
7920 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
7921 SetFlag(EFlagInlineEditInBackground); |
|
7922 #endif |
|
7923 /* |
|
7924 This code is the part of fixing TSW Error : Edit Menu : |
|
7925 "Matches" and "insert word" options are not available under Edit Menu.*/ |
|
7926 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
7927 ClearFlag(EFlagInsideInlineEditingTransaction); |
|
7928 #endif |
|
7929 } |
|
7930 |
|
7931 CAknEdwinState* editorState = NULL; |
|
7932 if (iInputCapabilities.FepAwareTextEditor()) |
|
7933 { |
|
7934 editorState = EditorState(); |
|
7935 } |
|
7936 |
|
7937 iEditMenuBar = NULL; |
|
7938 if (editorState) |
|
7939 { |
|
7940 iEditMenuBar = iUiInterface->EditorStateMenuBar(editorState); |
|
7941 } |
|
7942 |
|
7943 if (iEditMenuBar && |
|
7944 !iEditMenuBar->IsDisplayed()) |
|
7945 { |
|
7946 // SetFlag(EFlagLaunchEditMenu); |
|
7947 CAknFepUiInterfaceMenuPane* menuPane = iEditMenuBar->MenuPane(); |
|
7948 CEikMenuPane* oldMenuPane = menuPane->GetMenuPane(); |
|
7949 if (!oldMenuPane) |
|
7950 { |
|
7951 menuPane = NULL; |
|
7952 } |
|
7953 if(menuPane) |
|
7954 SetFlag(EFlagLaunchEditMenu); |
|
7955 |
|
7956 iRememberEditorState = EditorState(); |
|
7957 |
|
7958 // It is unnecessary to add ROW SCT in Editting option menu. |
|
7959 if (!IsFeatureSupportedJapanese()) |
|
7960 { |
|
7961 iEditCharsPtr.Copy(KNullDesC); |
|
7962 iEditCharsPtr.Set( iSctEditChars->Des() ); |
|
7963 |
|
7964 // get the SCT resource id from editor default settings |
|
7965 TInt currentEditorSCTResId = GetCurrentEditorSCTResId(); |
|
7966 TInt charResourceId = ENoCharacters; |
|
7967 if ( currentEditorSCTResId == EDefaultNumericCharMapResId) |
|
7968 { |
|
7969 charResourceId = NumericModeSCTResourceId(); |
|
7970 if ( charResourceId != ENoCharacters && IsAbleToLaunchSCT()&& |
|
7971 EditorType() != CAknExtendedInputCapabilities::EEikSecretEditorBased) |
|
7972 { |
|
7973 |
|
7974 if( menuPane != NULL ) |
|
7975 { |
|
7976 menuPane->ConstructMenuSctRowL( iEditCharsPtr, charResourceId ); |
|
7977 } |
|
7978 } |
|
7979 else |
|
7980 { |
|
7981 currentEditorSCTResId = charResourceId; |
|
7982 } |
|
7983 } |
|
7984 else |
|
7985 { |
|
7986 TInt sctChars = EAknSCTChiChineseInputModes; |
|
7987 if (iCharWidth == EFullWidthChar) |
|
7988 { |
|
7989 sctChars = EAknSCTFullCase; |
|
7990 } |
|
7991 else |
|
7992 { |
|
7993 if (iMode == ELatin) |
|
7994 { |
|
7995 if ( FeatureManager::FeatureSupported(KFeatureIdChinese) ) |
|
7996 { |
|
7997 sctChars = EAknSCTChiLatinInputModes; |
|
7998 } |
|
7999 else |
|
8000 { |
|
8001 if (iQwertyInputMode) |
|
8002 { |
|
8003 sctChars = EAknSCTQwerty; |
|
8004 } |
|
8005 else |
|
8006 { |
|
8007 sctChars = EAknSCTUpperCase; |
|
8008 if (iCaseMan->CurrentCase() == EAknEditorLowerCase) |
|
8009 { |
|
8010 sctChars = EAknSCTLowerCase; |
|
8011 } |
|
8012 } |
|
8013 } |
|
8014 } |
|
8015 else if (iMode == ENumber || iMode == ENativeNumber) |
|
8016 { |
|
8017 sctChars = EAknSCTNumeric; |
|
8018 if ( ((iAknEditorFlags & EAknEditorFlagUseSCTNumericCharmap) || |
|
8019 (iAknEditorNumericKeymap == EAknEditorAlphanumericNumberModeKeymap)) && |
|
8020 !IsOnlyHalfWidthCharacterPermitted() ) |
|
8021 { |
|
8022 sctChars = EAknSCTLowerCase; |
|
8023 } |
|
8024 } |
|
8025 //delete for phrase creation |
|
8026 // else if (iMode == EStroke && iFepManState == EAknFepStateUIActive) |
|
8027 // { |
|
8028 // return; |
|
8029 // } |
|
8030 else if (iMode == EHiraganaKanji) |
|
8031 { |
|
8032 sctChars = EAknSCTFullCase; |
|
8033 } |
|
8034 else if(iMode == EKatakana) |
|
8035 { |
|
8036 sctChars = EAknSCTHalfCase; |
|
8037 } |
|
8038 } |
|
8039 |
|
8040 if (!(ExtendedInputCapabilities() & CAknExtendedInputCapabilities::EDisableSCT)) |
|
8041 { |
|
8042 if( menuPane && (EditorType() != CAknExtendedInputCapabilities::EEikSecretEditorBased)) |
|
8043 { |
|
8044 if(IsAbleToLaunchSmiley()) |
|
8045 { |
|
8046 sctChars |= EAknCharMapEmotionUse; |
|
8047 } |
|
8048 |
|
8049 menuPane->ConstructMenuSctRowFromDialogL( sctChars, iEditCharsPtr, |
|
8050 currentEditorSCTResId ); |
|
8051 } |
|
8052 } |
|
8053 } |
|
8054 } |
|
8055 iEditMenuBar->SetMenuType(CAknFepUiInterfaceMenuBar::EMenuEdit); |
|
8056 iFepPluginManager->SetMenuState( ETrue ); |
|
8057 iEditMenuBar->TryDisplayMenuBarL(); |
|
8058 if (menuPane && menuPane->NumberOfItemsInPane() == 0) |
|
8059 { |
|
8060 // Edit menu do not contain any items. |
|
8061 iEditMenuBar->StopDisplayingMenuBar(); |
|
8062 iFepPluginManager->ResetMenuState( ETrue ); |
|
8063 } |
|
8064 else |
|
8065 { |
|
8066 //adjust menu position to the front of dialog to |
|
8067 //avoid input capability is wrongly got |
|
8068 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
8069 CCoeAppUi* appUi = (CCoeAppUi*)(coeEnv->AppUi()); |
|
8070 if( appUi->IsDisplayingDialog() ) |
|
8071 { |
|
8072 iEditMenuBar->RemoveFromStack(); |
|
8073 // Set the MenuBar not focused, the later add to stack operation could unfocus other control correctly |
|
8074 iEditMenuBar->SetFocus(EFalse); |
|
8075 iEditMenuBar->AddToStackL(ECoeStackPriorityDialog + 1, ECoeStackFlagStandard); |
|
8076 } |
|
8077 } |
|
8078 |
|
8079 iEditMenuBar->SetMenuType(CAknFepUiInterfaceMenuBar::EMenuOptions); |
|
8080 } |
|
8081 } |
|
8082 |
|
8083 void CAknFepManager::LaunchMatchesPopupListL() |
|
8084 { |
|
8085 TInt noOfMatches = iPtiEngine->NumberOfCandidates(); |
|
8086 if (noOfMatches > 1) // 1 => only current match available, 0 => not in inline edit |
|
8087 { |
|
8088 // Create a list to pass to the dialog |
|
8089 CDesCArrayFlat* matchesList=new(ELeave)CDesCArrayFlat(1); |
|
8090 CleanupStack::PushL(matchesList); |
|
8091 iPtiEngine->GetCandidateListL(*matchesList); |
|
8092 TBuf<EMaximumFepWordLength> matchListDesc; |
|
8093 TInt matchListItemCount = matchesList->MdcaCount(); |
|
8094 TInt currentIndex = ResolveCurrentCandidateListIndex(matchesList); |
|
8095 for ( TInt ii=0; ii < matchListItemCount ; ii++) |
|
8096 { |
|
8097 matchListDesc = matchesList->MdcaPoint(ii); |
|
8098 TChar tempChar = matchListDesc[0]; |
|
8099 if(tempChar.IsDigit()) |
|
8100 { |
|
8101 AknTextUtils::ConvertDigitsTo(matchListDesc,iLanguageCapabilities.iLocalDigitType); |
|
8102 matchesList->Delete(ii); |
|
8103 matchesList->InsertL(ii,matchListDesc); |
|
8104 } |
|
8105 } |
|
8106 |
|
8107 // add 'Spell' to the bottom of the list |
|
8108 TResourceReader reader; |
|
8109 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
8110 coeEnv->CreateResourceReaderLC(reader, R_AVKON_T9_MATCHES_QUERY_SPELL_ITEM); |
|
8111 matchesList->AppendL(reader.ReadTPtrC()); |
|
8112 CleanupStack::PopAndDestroy(); // reader |
|
8113 |
|
8114 TInt index = 0; |
|
8115 SetFlag(EFlagForegroundUIComponentVisible); |
|
8116 |
|
8117 TUid fepUid = CCoeEnv::Static()->FepUid(); |
|
8118 ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
8119 SendEventsToPluginManL(EPluginEnablePriorityChangeOnOriChange,EFalse); |
|
8120 // Fire up the dialog |
|
8121 iMatchesListLaunched = ETrue; |
|
8122 TInt returnValue = iUiInterface->LaunchListPopupL(R_AVKON_T9_MATCHES_QUERY, index, |
|
8123 currentIndex, matchesList, NULL); |
|
8124 iMatchesListLaunched = EFalse; |
|
8125 PrepareFepAfterDialogExitL(fepUid); |
|
8126 SendEventsToPluginManL(EPluginEnablePriorityChangeOnOriChange,ETrue); |
|
8127 if(returnValue == EAknSoftkeyOk) |
|
8128 {// Selected item 'index' from the matches array |
|
8129 HandleChangeInFocusL(); |
|
8130 TBuf<EMaximumFepWordLength> newText; |
|
8131 // Get current match from editor and show it as a default text in 'insert word' query. |
|
8132 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(newText, |
|
8133 iUncommittedText.iAnchorPos, iUncommittedText.Length()); |
|
8134 |
|
8135 if (index==noOfMatches) // => 'spell' item at the bottom of the list |
|
8136 { |
|
8137 LaunchInsertWordQueryL(newText, iUncommittedText); |
|
8138 #ifdef RD_SCALABLE_UI_V2 |
|
8139 if( iFepFullyConstructed && iFepPluginManager ) |
|
8140 { |
|
8141 iFepPluginManager->ResetMenuState(); |
|
8142 } |
|
8143 #endif |
|
8144 } |
|
8145 else |
|
8146 { // insert word at index into text |
|
8147 TBuf<EMaximumFepWordLength> modifiedMatch; |
|
8148 modifiedMatch.Copy(matchesList->MdcaPoint(index)); |
|
8149 TChar first(newText[0]); |
|
8150 if (first.IsUpper()) |
|
8151 { |
|
8152 TChar converted(modifiedMatch[0]); |
|
8153 converted.UpperCase(); |
|
8154 modifiedMatch[0] = converted; |
|
8155 } |
|
8156 InsertTextFromDialogL(modifiedMatch, iUncommittedText); |
|
8157 } |
|
8158 } |
|
8159 CleanupStack::PopAndDestroy(); // matchesList |
|
8160 } |
|
8161 } |
|
8162 |
|
8163 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
8164 // Predictive QWERTY (XT9) changes ----> |
|
8165 void CAknFepManager::LaunchCandidatePopupListL( TInt aFocusedIndex ) |
|
8166 { |
|
8167 iKeyBackSpaceHit = 1; |
|
8168 //CPtiEngine* ptiEngine = iPtiEngine; |
|
8169 |
|
8170 // Addition for ITI features on FSQ. |
|
8171 // Before open candidate list, if FSQ is opened, |
|
8172 // also need to check and close tooltip on it. |
|
8173 SendEventsToPluginManL( EPluginHideTooltip ); |
|
8174 |
|
8175 // Before open candidate list, if touch ui is opened, |
|
8176 // also need to close touch ui firstly. |
|
8177 if ( iFepPluginManager->PluginInputMode() != EPluginInputModeNone ) |
|
8178 { |
|
8179 iFepPluginManager->ClosePluginInputUiL( ETrue ); |
|
8180 } |
|
8181 |
|
8182 iExactWordPopupContent->HidePopUp(); |
|
8183 |
|
8184 TBool isShiftKeyDepressedAfterCandidateListLaunched = EFalse; |
|
8185 // Retrieve active index for QWERTY keypad when Best Prediction is Set |
|
8186 TInt activeIndex = KErrNotFound; |
|
8187 |
|
8188 if(iPrimaryCandidate && IsQwerty() && ( KeyboardLayout() != EPtiKeyboardHalfQwerty)) |
|
8189 { |
|
8190 iPtiEngine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates, &activeIndex ); |
|
8191 } |
|
8192 |
|
8193 TInt noOfMatches = iPtiEngine->NumberOfCandidates(); |
|
8194 if (noOfMatches > 0) |
|
8195 { |
|
8196 //! The compact candidate popup that opens with when arrow down pressed while inline editing |
|
8197 //MAknFepCandidatePopup *candidatePopup; |
|
8198 |
|
8199 //Predictive QWERTY (XT9) changes for new Architecture ----> |
|
8200 iCandidatePopup = UiInterface()->NewCandidatePopupL(*this); |
|
8201 //Predictive QWERTY (XT9) changes for new Architecture <---- |
|
8202 |
|
8203 // Determine the place where to spawn the candidate popup. |
|
8204 TPoint inlineEditorTl; |
|
8205 TPoint inlineEditorBr; |
|
8206 TInt height; |
|
8207 TInt ascent; |
|
8208 TInt documentOffset = iPtiEngine->CurrentWord().Length(); |
|
8209 |
|
8210 // Popup Position was not right for RTL ----> |
|
8211 if(iLanguageCapabilities.iRightToLeftLanguage) |
|
8212 documentOffset = 0; |
|
8213 // Popup Position was not right for RTL <---- |
|
8214 GetScreenCoordinatesL(inlineEditorTl, height, ascent, documentOffset); |
|
8215 |
|
8216 inlineEditorTl.iY -= height; |
|
8217 GetScreenCoordinatesL(inlineEditorBr, height, ascent); |
|
8218 |
|
8219 // Focus next word in list ----> |
|
8220 // To fix the bug Candidate list opens with the highlight on 3rd candidate when Exact typing is use. |
|
8221 // Show the popup. |
|
8222 TInt selectedIdx = aFocusedIndex; |
|
8223 TKeyEvent lastKeyEvent; |
|
8224 |
|
8225 if(selectedIdx == KErrNotFound) |
|
8226 { |
|
8227 if (noOfMatches > 1) |
|
8228 { |
|
8229 selectedIdx = KWordToFocusInCandidateList; |
|
8230 } |
|
8231 // Focus next word in list <---- |
|
8232 if(iSListLaunchedFromMenu) |
|
8233 { |
|
8234 iPtiEngine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates, &selectedIdx ); |
|
8235 iSListLaunchedFromMenu = EFalse; |
|
8236 } |
|
8237 } |
|
8238 TUid fepUid = CCoeEnv::Static()->FepUid(); |
|
8239 ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
8240 TInt popupCmd = iCandidatePopup->ExecutePopupL( TRect(inlineEditorTl, inlineEditorBr), |
|
8241 selectedIdx, lastKeyEvent, iLanguageCapabilities.iRightToLeftLanguage, |
|
8242 (TInt)KeyboardLayout() ); |
|
8243 PrepareFepAfterDialogExitL(fepUid); |
|
8244 |
|
8245 if((lastKeyEvent.iScanCode == EStdKeyDevice3 ) || |
|
8246 ((lastKeyEvent.iScanCode == KAknFEPZeroKey)&& ((KeyboardLayout()== EPtiKeyboard12Key)||(KeyboardLayout()==EPtiKeyboardHalfQwerty))) |
|
8247 || lastKeyEvent.iCode == EKeySpace ) |
|
8248 { |
|
8249 SetExtendedFlag(EExtendedFlagOkKeyPressOnCandidatePopup); |
|
8250 } |
|
8251 |
|
8252 |
|
8253 TBool needToExecute(EFalse); |
|
8254 //The candidate list was closed by long key press of shift key |
|
8255 isShiftKeyDepressedAfterCandidateListLaunched = IsFlagSet(EFlagShiftKeyDepressed) && (KeyboardLayout()== EPtiKeyboard12Key); |
|
8256 if (popupCmd != EAknSoftkeyCancel) |
|
8257 { |
|
8258 HandleChangeInFocusL(); |
|
8259 |
|
8260 if (popupCmd == EAknFepSoftkeySpell) |
|
8261 { |
|
8262 // For QWERTY Input Mode |
|
8263 if (iQwertyInputMode && EPtiKeyboardHalfQwerty != iKeyboardType) |
|
8264 { |
|
8265 TInt activeIdx = KErrNotFound; |
|
8266 TInt secondaryIdx = KErrNotFound; |
|
8267 |
|
8268 iPtiEngine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates, |
|
8269 &activeIdx ); |
|
8270 iPtiEngine->HandleCommandL( EPtiCommandUserActionGetIndexOfSecondaryCandidate, |
|
8271 &secondaryIdx ); |
|
8272 |
|
8273 if(activeIdx != secondaryIdx) |
|
8274 { |
|
8275 iPtiEngine->HandleCommandL( |
|
8276 EPtiCommandUserActionSetCurrentIndexOfCandidates, &secondaryIdx ); |
|
8277 } |
|
8278 else |
|
8279 { |
|
8280 secondaryIdx = 0; |
|
8281 iPtiEngine->HandleCommandL( |
|
8282 EPtiCommandUserActionSetCurrentIndexOfCandidates, &secondaryIdx ); |
|
8283 } |
|
8284 TPtrC selectedWord = iPtiEngine->CurrentWord(); |
|
8285 if(!IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
8286 { |
|
8287 StartInlineEditingWithSelectedWord(selectedWord); |
|
8288 } |
|
8289 UpdateInlineEditL( selectedWord, selectedWord.Length() ); |
|
8290 |
|
8291 } |
|
8292 // For ITUT Keypad, remove autocompletion part before launching Query Dialog |
|
8293 else |
|
8294 { |
|
8295 RemoveSuggestedAdvanceCompletionL(); |
|
8296 } |
|
8297 |
|
8298 // delete the candidate popup before launching the edit word dialog |
|
8299 // as the candidate list has already been closed. |
|
8300 if(iCandidatePopup) |
|
8301 { |
|
8302 delete iCandidatePopup; |
|
8303 iCandidatePopup = NULL; |
|
8304 } |
|
8305 |
|
8306 LaunchEditWordQueryL(); |
|
8307 } |
|
8308 |
|
8309 // Close with space or selection key: Commit and add space or move cursor ahead one |
|
8310 // character if next character already is space |
|
8311 else if ( ( lastKeyEvent.iScanCode == EStdKeyDevice3 || lastKeyEvent.iScanCode == KAknFEPZeroKey ) |
|
8312 && ( KeyboardLayout() == EPtiKeyboard12Key || KeyboardLayout() == EPtiKeyboardHalfQwerty ) ) |
|
8313 { |
|
8314 iPtiEngine->HandleCommandL( EPtiCommandUserActionSetCurrentIndexOfCandidates, |
|
8315 &selectedIdx ); |
|
8316 TPtrC selectedWord = iPtiEngine->CurrentWord(); |
|
8317 if(!IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
8318 { |
|
8319 StartInlineEditingWithSelectedWord(selectedWord); |
|
8320 } |
|
8321 UpdateInlineEditL( selectedWord, selectedWord.Length() ); |
|
8322 iPtiEngine->CommitCurrentWord(); |
|
8323 CommitInlineEditL(); |
|
8324 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
8325 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
8326 #endif |
|
8327 |
|
8328 AddOneSpaceOrMoveCursorL(); |
|
8329 } |
|
8330 // Close with right arrow commits the word, does not add space |
|
8331 else if ( lastKeyEvent.iScanCode == EStdKeyRightArrow ) |
|
8332 { |
|
8333 // Change of UI Spec |
|
8334 /* |
|
8335 * The following codde change is a part of bug fix for improper |
|
8336 * behavior of right arrow key when the candidate list is open. The |
|
8337 * right arrow key according to the UI specs should not the selected |
|
8338 * candicdate and cursor should be end of the word. |
|
8339 */ |
|
8340 iPtiEngine->HandleCommandL( EPtiCommandUserActionSetCurrentIndexOfCandidates, |
|
8341 &selectedIdx ); |
|
8342 TPtrC selectedWord = iPtiEngine->CurrentWord(); |
|
8343 if(!IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
8344 { |
|
8345 StartInlineEditingWithSelectedWord(selectedWord); |
|
8346 } |
|
8347 UpdateInlineEditL( selectedWord, selectedWord.Length() ); //selection.iAnchorPosition |
|
8348 iPtiEngine->CommitCurrentWord(); |
|
8349 CommitInlineEditL(); |
|
8350 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
8351 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
8352 #endif |
|
8353 |
|
8354 SimulateKeyEventL(EKeyF19); |
|
8355 } |
|
8356 else if(popupCmd == EAknSoftkeyOk) |
|
8357 { |
|
8358 iPtiEngine->HandleCommandL( EPtiCommandUserActionSetCurrentIndexOfCandidates, |
|
8359 &selectedIdx ); |
|
8360 TPtrC selectedWord = iPtiEngine->CurrentWord(); |
|
8361 if(!IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
8362 { |
|
8363 StartInlineEditingWithSelectedWord(selectedWord); |
|
8364 } |
|
8365 UpdateInlineEditL( selectedWord, selectedWord.Length() ); |
|
8366 iPtiEngine->CommitCurrentWord(); |
|
8367 CommitInlineEditL(); |
|
8368 AddOneSpaceOrMoveCursorL(); |
|
8369 } |
|
8370 else |
|
8371 { |
|
8372 iPtiEngine->HandleCommandL( EPtiCommandUserActionSetCurrentIndexOfCandidates, |
|
8373 &selectedIdx ); |
|
8374 TPtrC selectedWord = iPtiEngine->CurrentWord(); |
|
8375 if(!IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
8376 { |
|
8377 StartInlineEditingWithSelectedWord(selectedWord); |
|
8378 } |
|
8379 UpdateInlineEditL( selectedWord, selectedWord.Length() ); |
|
8380 needToExecute = ETrue; |
|
8381 } |
|
8382 } |
|
8383 else if (popupCmd == EAknSoftkeyCancel && iPrimaryCandidate && IsQwerty() |
|
8384 && ( KeyboardLayout() != EPtiKeyboardHalfQwerty ) ) |
|
8385 { |
|
8386 iPtiEngine->HandleCommandL( EPtiCommandUserActionSetIndexOfActiveCandidate, &activeIndex ); |
|
8387 iKeyBackSpaceHit = 0; |
|
8388 } |
|
8389 else if(lastKeyEvent.iCode == EKeyPhoneEnd ) |
|
8390 { |
|
8391 HandleChangeInFocusL(); |
|
8392 CCoeEnv::Static()->SimulateKeyEventL( lastKeyEvent, EEventKey ); |
|
8393 } |
|
8394 else if (popupCmd == EAknSoftkeyCancel && IsQwerty() && ( KeyboardLayout() != EPtiKeyboardHalfQwerty ) ) |
|
8395 iKeyBackSpaceHit = 0; |
|
8396 |
|
8397 // If the dialog is not closed by pressing softkeys, escape, or right arrow |
|
8398 // then the pressed key is handled also by Fep. This way the user can keep typing when the popup is open. |
|
8399 |
|
8400 //=============== Error fixing and simplify the condition ========================================== |
|
8401 // The following piece of code should be excuted, if focus word |
|
8402 // in the candidate list is accept, otherwise word sholud remain as it is. |
|
8403 // If user does not accept the word,popupCmd always be EAknSoftkeyCancel. |
|
8404 // Insetead of earlier lengthy condition, makes it simple. |
|
8405 |
|
8406 if( needToExecute ) |
|
8407 { |
|
8408 const TBool shifted = (lastKeyEvent.iModifiers & (EModifierLeftShift | |
|
8409 EModifierRightShift | EModifierShift)); |
|
8410 const TBool chrDown = (lastKeyEvent.iModifiers & (EModifierLeftFunc)); |
|
8411 |
|
8412 const TBool fnDown = (lastKeyEvent.iModifiers & (EModifierRightFunc)); |
|
8413 if(fnDown ) |
|
8414 iFnKeyManager->SetFnKeyState(CAknFepFnKeyManager::EFnKeyDown) ; |
|
8415 |
|
8416 if (shifted) |
|
8417 { |
|
8418 SetFlag(EFlagQwertyShiftMode|EFlagNoActionDuringShiftKeyPress); |
|
8419 } |
|
8420 else |
|
8421 { |
|
8422 ClearFlag(EFlagQwertyShiftMode|EFlagNoActionDuringShiftKeyPress); |
|
8423 } |
|
8424 |
|
8425 if (chrDown) |
|
8426 { |
|
8427 SetFlag(EFlagQwertyChrKeyDepressed|EFlagNoActionDuringChrKeyPress); |
|
8428 } |
|
8429 else |
|
8430 { |
|
8431 ClearFlag(EFlagQwertyChrKeyDepressed|EFlagNoActionDuringChrKeyPress); |
|
8432 } |
|
8433 if ( lastKeyEvent.iScanCode == EStdKeyDevice3 ) |
|
8434 { |
|
8435 CCoeEnv::Static()->SimulateKeyEventL( lastKeyEvent, EEventKey ); |
|
8436 } |
|
8437 if (! ( lastKeyEvent.iScanCode == EStdKeyDevice3 || |
|
8438 lastKeyEvent.iScanCode == EStdKeyRightArrow ) ) |
|
8439 { |
|
8440 /* |
|
8441 * The following code change is a part of bug fix for improper |
|
8442 * behavior of any keypress when the candidate list is open. The |
|
8443 * keypress according to the UI specs should lock the selected |
|
8444 * candidate to editor and the inserted letter is appended to it. |
|
8445 */ |
|
8446 iPtiEngine->HandleCommandL( EPtiCommandLockCurrentCandidate); |
|
8447 TPtrC selectedWord = iPtiEngine->CurrentWord(); |
|
8448 if(!IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
8449 { |
|
8450 StartInlineEditingWithSelectedWord(selectedWord); |
|
8451 } |
|
8452 UpdateInlineEditL( selectedWord, selectedWord.Length() ); //selection.iAnchorPosition |
|
8453 // For QWERTY input mode, scanCode is used |
|
8454 #ifdef __HALF_QWERTY_KEYPAD |
|
8455 if( KeyboardLayout() == EPtiKeyboardHalfQwerty) |
|
8456 { |
|
8457 iHalfQwertyLastKeyEvent = lastKeyEvent; |
|
8458 iAsyncOwnSimulateKey.CallBack(); |
|
8459 } |
|
8460 else |
|
8461 #endif //__HALF_QWERTY_KEYPAD |
|
8462 if (iQwertyInputMode) |
|
8463 { |
|
8464 CCoeEnv::Static()->SimulateKeyEventL( lastKeyEvent, EEventKey ); |
|
8465 } |
|
8466 // For ITUT input Mode, keyCode is used |
|
8467 else |
|
8468 { |
|
8469 SimulateKeyEventL( lastKeyEvent.iCode); |
|
8470 } |
|
8471 } |
|
8472 } |
|
8473 |
|
8474 ShowExactWordPopupIfNecessaryL(); |
|
8475 if(iCandidatePopup) |
|
8476 { |
|
8477 delete iCandidatePopup; |
|
8478 iCandidatePopup = NULL; |
|
8479 } |
|
8480 } |
|
8481 //The flag ECcpuStateShiftkeyWasPressedBeforeLosingFocus suggests that the candidate list was closed with a |
|
8482 //long key press of edit key (shift key). There are multiple calls to HandleChangedInFocusL() one manually and the other through |
|
8483 //CONE focus change notifier. We want the flag to be set for CONE's focus handler. |
|
8484 if(isShiftKeyDepressedAfterCandidateListLaunched) |
|
8485 { |
|
8486 SetCcpuFlag(ECcpuStateShiftkeyWasPressedBeforeLosingFocus); |
|
8487 } |
|
8488 } |
|
8489 void CAknFepManager::StartInlineEditingWithSelectedWord(TDesC& aTextToUncommit) |
|
8490 { |
|
8491 if(iConcatenationTimer->IsActive()) |
|
8492 iConcatenationTimer->Cancel(); |
|
8493 |
|
8494 TInt docLenFep=iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
8495 if (iUncommittedText.iCursorPos>docLenFep) |
|
8496 iUncommittedText.iCursorPos=docLenFep; |
|
8497 if (iUncommittedText.iAnchorPos>docLenFep) |
|
8498 iUncommittedText.iAnchorPos=docLenFep; |
|
8499 // Activates western predictive UI to an inline editing state. |
|
8500 FepUI()->ActivateUI(); |
|
8501 SyncStates(EAknFepStateUIActive); |
|
8502 // Predictive QWERTY (XT9) changes <---- |
|
8503 TRAP_IGNORE(StartInlineEditL(iUncommittedText, aTextToUncommit, |
|
8504 aTextToUncommit.Length(), EFalse)); |
|
8505 |
|
8506 } |
|
8507 void CAknFepManager::GetCandidatesWithIndexL(CDesCArray* aArray, |
|
8508 TInt& aActiveIdx, TInt& aSecondaryIdx) |
|
8509 { |
|
8510 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
8511 return; |
|
8512 #endif |
|
8513 aActiveIdx = -1; |
|
8514 aSecondaryIdx = -1; |
|
8515 iPtiEngine->HandleCommandL( |
|
8516 EPtiCommandUserActionGetCurrentIndexOfCandidates, &aActiveIdx); |
|
8517 |
|
8518 if (iKeyBackSpaceHit) |
|
8519 aSecondaryIdx = aActiveIdx; |
|
8520 else |
|
8521 iPtiEngine->HandleCommandL( |
|
8522 EPtiCommandUserActionGetIndexOfSecondaryCandidate, |
|
8523 &aSecondaryIdx); |
|
8524 |
|
8525 if (aArray == NULL || aActiveIdx == aSecondaryIdx) |
|
8526 return; |
|
8527 |
|
8528 iPtiEngine->GetCandidateListL(*aArray); |
|
8529 iPtiEngine->HandleCommandL( |
|
8530 EPtiCommandUserActionGetCurrentIndexOfCandidates, &aActiveIdx); |
|
8531 iPtiEngine->HandleCommandL( |
|
8532 EPtiCommandUserActionGetIndexOfSecondaryCandidate, &aSecondaryIdx); |
|
8533 } |
|
8534 |
|
8535 void CAknFepManager::ShowExactWordPopupIfNecessaryL() |
|
8536 { |
|
8537 // Ok, I have to do it here, same logics are in |
|
8538 // TryPopExactWordInICFL and ShowExactWordPopupIfNecessaryL. |
|
8539 // the code follows the old code's logic: this is a |
|
8540 // equivalent of the OLD ShowExactWordPopupIfNecessaryL; but |
|
8541 // now I can call TryPopExactWordInICFL and |
|
8542 // TryPopExactWordInOtherPlaceL directly after extracting them from |
|
8543 // the OLD ShowExactWordPopupIfNecessaryL. |
|
8544 iExactWordPopupContent->HidePopUp(); |
|
8545 // SendEventsToPluginManL(EPluginHideTooltip); |
|
8546 if (!iWesternPredictive || !IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
8547 return; |
|
8548 |
|
8549 if (EPtiKeyboardHalfQwerty == KeyboardLayout()) |
|
8550 { |
|
8551 if (IsFlagSet(CAknFepManager::EFlagNoMatches)) |
|
8552 UpdateCbaL(R_AKNFEP_SOFTKEYS_SPELL_EMPTY); |
|
8553 return; |
|
8554 } |
|
8555 |
|
8556 //TryPopExactWordInICFL(); |
|
8557 if (iFepPluginManager && !iFepPluginManager->IsTooltipOpenOnFSQ()) |
|
8558 TryPopExactWordInOtherPlaceL(); |
|
8559 } |
|
8560 |
|
8561 void CAknFepManager::TryPopExactWordInICFL() |
|
8562 { |
|
8563 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
8564 return; |
|
8565 #endif |
|
8566 |
|
8567 // Before open tooltip, |
|
8568 // also need to check and close tooltip on it. |
|
8569 // SendEventsToPluginManL(EPluginHideTooltip); |
|
8570 if (!iWesternPredictive || !IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
8571 { |
|
8572 SendEventsToPluginManL(EPluginHideTooltip); |
|
8573 return; |
|
8574 } |
|
8575 |
|
8576 TInt activeIdx, secondaryIdx; |
|
8577 GetCandidatesWithIndexL(NULL, activeIdx, secondaryIdx); |
|
8578 if (activeIdx == secondaryIdx) |
|
8579 { |
|
8580 SendEventsToPluginManL(EPluginHideTooltip); |
|
8581 return; |
|
8582 } |
|
8583 |
|
8584 CDesCArray* candidates = new (ELeave) CDesCArrayFlat(16); |
|
8585 CleanupStack::PushL(candidates); |
|
8586 GetCandidatesWithIndexL(candidates, activeIdx, secondaryIdx); |
|
8587 CleanupStack::PopAndDestroy(candidates); |
|
8588 if (activeIdx == secondaryIdx) |
|
8589 { |
|
8590 SendEventsToPluginManL(EPluginHideTooltip); |
|
8591 return; |
|
8592 } |
|
8593 |
|
8594 if (iFepPluginManager) |
|
8595 SendEventsToPluginManL(EPluginShowTooltip, secondaryIdx); |
|
8596 } |
|
8597 |
|
8598 void CAknFepManager::TryPopExactWordInOtherPlaceL() |
|
8599 { |
|
8600 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
8601 return; |
|
8602 #endif |
|
8603 |
|
8604 iExactWordPopupContent->HidePopUp(); |
|
8605 if (!iWesternPredictive || !IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
8606 return; |
|
8607 // In the proactive mode this popup is used to show the exact input if it differs from the |
|
8608 // default candidate shown inline. |
|
8609 // In the reactive mode it is used to show the best guess candidate if it differs from the |
|
8610 // exact word shown inline. |
|
8611 |
|
8612 TBool popupBelowInline = EFalse; // ETrue -> popup is above inline editor |
|
8613 TInt activeIdx, secondaryIdx; |
|
8614 GetCandidatesWithIndexL(NULL, activeIdx, secondaryIdx); |
|
8615 if (activeIdx == secondaryIdx) |
|
8616 return; |
|
8617 |
|
8618 CDesCArray* candidates = new (ELeave) CDesCArrayFlat(16); |
|
8619 CleanupStack::PushL(candidates); |
|
8620 GetCandidatesWithIndexL(candidates, activeIdx, secondaryIdx); |
|
8621 |
|
8622 // In case the active index and the secondary index is same, |
|
8623 // then we do not need to display the popup |
|
8624 if (activeIdx == secondaryIdx) |
|
8625 { |
|
8626 CleanupStack::PopAndDestroy(candidates); |
|
8627 return; |
|
8628 } |
|
8629 |
|
8630 TPtrC secondaryWord = (*candidates)[secondaryIdx]; |
|
8631 iExactWordPopupContent->SetTextL(secondaryWord); |
|
8632 iExactWordPopupContent->SetArrowDirection( |
|
8633 MAknFepUiWordPopupContent::EUpwards); |
|
8634 CleanupStack::PopAndDestroy(candidates); |
|
8635 |
|
8636 TPoint popupTopRight; |
|
8637 TInt height; |
|
8638 TInt ascent; |
|
8639 TInt documentOffset = iPtiEngine->CurrentWord().Length(); |
|
8640 |
|
8641 GetScreenCoordinatesL(popupTopRight, height, ascent, documentOffset); |
|
8642 iExactWordPopupContent->UpdateContentSize(); |
|
8643 |
|
8644 TBool rightToLeftLang = IsRightToLeftParagraph(DocPos()); |
|
8645 if (!rightToLeftLang) |
|
8646 { |
|
8647 popupTopRight.iX += iExactWordPopupContent->Size().iWidth; |
|
8648 } |
|
8649 |
|
8650 if (popupBelowInline) |
|
8651 { |
|
8652 popupTopRight.iY += ascent / 2; |
|
8653 } |
|
8654 else |
|
8655 { |
|
8656 popupTopRight.iY -= height + iExactWordPopupContent->Size().iHeight; |
|
8657 } |
|
8658 |
|
8659 iExactWordPopupContent->SetPosition(popupTopRight); |
|
8660 iExactWordPopupContent->ShowPopUp(); |
|
8661 } |
|
8662 |
|
8663 void CAknFepManager::LaunchPredictiveSettingDialogL() |
|
8664 { |
|
8665 #ifdef RD_SCALABLE_UI_V2 |
|
8666 // Addtion of ITI features on FSQ. |
|
8667 if ( iFepPluginManager |
|
8668 && iFepPluginManager->IsSupportITIOnFSQ() ) |
|
8669 { |
|
8670 // Hide touch input ui firstly, |
|
8671 // otherwise, touch ui can hide status pane. |
|
8672 // Let CAknFepPluginManager know this setting dialog will be opened. |
|
8673 iFepPluginManager->ITISettingDialogOpen( ETrue ); |
|
8674 iFepPluginManager->ClosePluginInputUiL( ETrue ); |
|
8675 SendEventsToPluginManL( ELostForeground ); |
|
8676 } |
|
8677 #endif // RD_SCALABLE_UI_V2 |
|
8678 |
|
8679 // Hide fixed toolbar just before launching predictive settings dialog |
|
8680 CEikAppUiFactory * appUiFactory = NULL; |
|
8681 appUiFactory = static_cast<CEikAppUiFactory*>(CEikonEnv::Static()->AppUiFactory()); |
|
8682 |
|
8683 CAknToolbar * fixedToolbar = NULL; |
|
8684 if(appUiFactory) |
|
8685 fixedToolbar = appUiFactory->CurrentFixedToolbar(); |
|
8686 |
|
8687 // If fixedtoolbar is not there in the current editor, we don't need to hide it before launching settings dialog |
|
8688 // and unhide it after settings dialog is done. |
|
8689 if( fixedToolbar && !( fixedToolbar->IsShown() && fixedToolbar->CountComponentControls()>0 ) ) |
|
8690 fixedToolbar = NULL; |
|
8691 |
|
8692 if(fixedToolbar) |
|
8693 { |
|
8694 fixedToolbar->SetDimmed(ETrue); |
|
8695 fixedToolbar->DrawDeferred(); |
|
8696 } |
|
8697 TUid fepUid = CCoeEnv::Static()->FepUid(); |
|
8698 ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
8699 |
|
8700 if ( iFepPluginManager && iFepPluginManager->IsSupportITIOnFSQ() ) |
|
8701 { |
|
8702 RProperty::Set( KPSUidAknFep, KAknFepSettingDialogState, 2 ); |
|
8703 } |
|
8704 else |
|
8705 { |
|
8706 RProperty::Set( KPSUidAknFep, KAknFepSettingDialogState, 1 ); |
|
8707 } |
|
8708 |
|
8709 UiInterface()->LaunchPredictiveSettingDialogL(R_PREDICTIVESETTING_DIALOG, |
|
8710 R_PREDICTIVESETTINGDIALOG_MENUBAR, |
|
8711 R_PREDICTIVETEXTOFF_CONFIRMATION_QUERY, |
|
8712 R_AKNFEP_PRED_INPUT_SETTINGS_TITLE); |
|
8713 PrepareFepAfterDialogExitL(fepUid); |
|
8714 RProperty::Set(KPSUidAknFep,KAknFepSettingDialogState,0); |
|
8715 #ifdef RD_SCALABLE_UI_V2 |
|
8716 // // Addtion of ITI features on FSQ. |
|
8717 if ( iFepPluginManager |
|
8718 && iFepPluginManager->IsSupportITIOnFSQ() ) |
|
8719 { |
|
8720 // Let CAknFepPluginManager know this setting dialog will be opened. |
|
8721 iFepPluginManager->ITISettingDialogOpen( EFalse ); |
|
8722 } |
|
8723 #endif // RD_SCALABLE_UI_V2 |
|
8724 |
|
8725 // Enables fixed toolbar after predictive settings dialog is closed |
|
8726 if(fixedToolbar) |
|
8727 { |
|
8728 fixedToolbar->SetDimmed(EFalse); |
|
8729 fixedToolbar->DrawDeferred(); |
|
8730 } |
|
8731 } |
|
8732 #ifdef FF_DUAL_LANGUAGE_SUPPORT |
|
8733 void CAknFepManager::LaunchWritingLanguageSettingDialogL() |
|
8734 { |
|
8735 TUid fepUid = CCoeEnv::Static()->FepUid(); |
|
8736 ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
8737 UiInterface()->LaunchWritingLanguageSettingDialogL(R_INPUTLANGUAGE_DIALOG, R_PREDICTIVESETTINGDIALOG_MENUBAR, R_INPUT_LANGUAGE_SETTINGS_TITLE); |
|
8738 PrepareFepAfterDialogExitL(fepUid); |
|
8739 } |
|
8740 |
|
8741 void CAknFepManager:: LaunchDualLanguageSettingDialogL() |
|
8742 { |
|
8743 /* In Chinese language variant,if there are more than one languages supporting dual language feature, |
|
8744 display writing language setting view in which Primary and Secondary Languages can be selected from the list. |
|
8745 |
|
8746 In Chinese language variant,if there is only one language supporting dual language feature, |
|
8747 no need to display the Writing language view which contains Primary and Secondary Language. |
|
8748 Instead we can display the Writing language list directly to the user;from which the user can select the writing language*/ |
|
8749 |
|
8750 if( FeatureManager::FeatureSupported( KFeatureIdChinese ) || FeatureManager::FeatureSupported( KFeatureIdJapanese )) |
|
8751 { |
|
8752 CArrayFixFlat<TInt>* languages = new( ELeave )CArrayFixFlat<TInt>( ELanguageArrayGranularity ); |
|
8753 CleanupStack::PushL( languages ); |
|
8754 iPtiEngine->GetAvailableLanguagesL( languages ); |
|
8755 |
|
8756 TInt count = languages->Count(); |
|
8757 TInt noLangSupportWesternPred = count; |
|
8758 for (TInt index = 0; index < count; index++) |
|
8759 { |
|
8760 TInt langCode = languages->At(index); |
|
8761 |
|
8762 if (langCode == ELangTaiwanChinese || |
|
8763 langCode == ELangHongKongChinese || |
|
8764 langCode == ELangPrcChinese || |
|
8765 langCode == ELangJapanese || |
|
8766 langCode == ELangKorean ) |
|
8767 { |
|
8768 noLangSupportWesternPred--; |
|
8769 } |
|
8770 } |
|
8771 CleanupStack::PopAndDestroy(languages); |
|
8772 |
|
8773 if( noLangSupportWesternPred > 1 ) |
|
8774 { |
|
8775 SetFlag(CAknFepManager::EFlagNewSharedDataInputMode); |
|
8776 LaunchWritingLanguageSettingDialogL(); |
|
8777 if(IsFlagSet(CAknFepManager::EFlagNewSharedDataInputLanguage)) |
|
8778 { |
|
8779 ClearFlag(CAknFepManager::EFlagNewSharedDataInputLanguage); |
|
8780 HandleChangeInFocusL(); |
|
8781 ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage()); |
|
8782 } |
|
8783 } |
|
8784 else |
|
8785 LaunchLanguagesPopupListL(); |
|
8786 } |
|
8787 else |
|
8788 { |
|
8789 LaunchWritingLanguageSettingDialogL(); |
|
8790 if(IsFlagSet(CAknFepManager::EFlagNewSharedDataInputLanguage)) |
|
8791 { |
|
8792 ClearFlag(CAknFepManager::EFlagNewSharedDataInputLanguage); |
|
8793 HandleChangeInFocusL(); |
|
8794 ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage()); |
|
8795 } |
|
8796 } |
|
8797 |
|
8798 } |
|
8799 #endif //FF_DUAL_LANGUAGE_SUPPORT |
|
8800 // Predictive QWERTY (XT9) changes <---- |
|
8801 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
8802 void CAknFepManager::LaunchInsertWordQueryL(const TDesC& aInitialText, |
|
8803 TCursorSelection aTextSpanToReplace) |
|
8804 { |
|
8805 TInt recourceId = R_AVKON_INSERT_WORD_QUERY; |
|
8806 LaunchFepQueryDialogL(recourceId, aInitialText, aTextSpanToReplace); |
|
8807 } |
|
8808 |
|
8809 void CAknFepManager::LaunchEditWordQueryL() |
|
8810 { |
|
8811 |
|
8812 TBuf<EMaximumFepWordLength> newText; |
|
8813 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
8814 if(IsAutoCompleteOn()) |
|
8815 { |
|
8816 RemoveSuggestedCompletionL(); |
|
8817 } |
|
8818 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
8819 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(newText, |
|
8820 iUncommittedText.iAnchorPos, |
|
8821 iUncommittedText.Length()); |
|
8822 |
|
8823 TInt recourceId = R_AVKON_INSERT_WORD_QUERY; |
|
8824 LaunchFepQueryDialogL(recourceId, newText, iUncommittedText); |
|
8825 } |
|
8826 |
|
8827 void CAknFepManager::LaunchFepQueryDialogL(TInt aResourceId, const TDesC& aInitialText, |
|
8828 TCursorSelection aTextSpanToReplace) |
|
8829 { |
|
8830 HBufC* textBuf = HBufC::NewLC(EQueryBufferLength); // buffer for inserted text |
|
8831 TPtr text = textBuf->Des(); |
|
8832 |
|
8833 if (aInitialText.Length() <= EQueryBufferLength) |
|
8834 text.Copy(aInitialText); |
|
8835 else // truncate the incoming text to EQueryBufferLength before copying |
|
8836 { |
|
8837 TPtrC truncatedText = aInitialText.Left(EQueryBufferLength); |
|
8838 text.Copy(truncatedText); |
|
8839 } |
|
8840 |
|
8841 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
8842 { |
|
8843 TryRemoveNoMatchesIndicatorL(); |
|
8844 CommitInlineEditL(); |
|
8845 } |
|
8846 UpdateCbaL(NULL); |
|
8847 |
|
8848 TInt underlyingCase = iCaseMan->CurrentCase(); |
|
8849 TBool isCaseUpdatesSupressed = IsFlagSet(EFlagSupressAutoUpdateAtEditorStart); |
|
8850 |
|
8851 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
8852 if (aInitialText.Length()) |
|
8853 { |
|
8854 iCaseMan->SetCurrentCase(EAknEditorLowerCase); |
|
8855 if (aInitialText.Length() == 1) |
|
8856 { |
|
8857 if (STATIC_CAST(TChar, aInitialText[0]).IsUpper()) |
|
8858 iCaseMan->SetCurrentCase(EAknEditorTextCase); |
|
8859 } |
|
8860 else // length of initial text > 1 |
|
8861 { |
|
8862 if (STATIC_CAST(TChar, aInitialText[0]).IsUpper()) |
|
8863 { |
|
8864 if (STATIC_CAST(TChar, aInitialText[1]).IsLower()) |
|
8865 iCaseMan->SetCurrentCase(EAknEditorTextCase); |
|
8866 else // 2nd character is upper case |
|
8867 iCaseMan->SetCurrentCase(EAknEditorUpperCase); |
|
8868 } |
|
8869 } |
|
8870 } |
|
8871 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
8872 |
|
8873 if (iCaseMan->CurrentCase() == EAknEditorLowerCase |
|
8874 || iCaseMan->CurrentCase() == EAknEditorUpperCase) |
|
8875 { |
|
8876 SetFlag(EFlagSupressAutoUpdateAtEditorStart); |
|
8877 } |
|
8878 |
|
8879 TransferFepStateToEditorL(); |
|
8880 |
|
8881 SetFlag(EFlagForegroundUIComponentVisible); |
|
8882 |
|
8883 TInt textQueryEditorFlag = 0; |
|
8884 if ((aResourceId == R_AVKON_INSERT_WORD_QUERY || |
|
8885 aResourceId == R_AVKON_EDIT_WORD_QUERY ) && |
|
8886 FeatureManager::FeatureSupported( KFeatureIdChinese )) |
|
8887 { |
|
8888 textQueryEditorFlag = EAknEditorFlagLatinInputModesOnly; |
|
8889 } |
|
8890 #ifdef RD_SCALABLE_UI_V2 |
|
8891 if (iFepFullyConstructed && |
|
8892 iFepPluginManager->PluginInputMode() == EPluginInputModeItut ) |
|
8893 // if ( iFepFullyConstructed && |
|
8894 // (( iFepPluginManager->PluginInputMode() == EPluginInputModeItut ) && IsChineseInputLanguage())) |
|
8895 { |
|
8896 iFepPluginManager->SpellText(textBuf); |
|
8897 iFepPluginManager->DisplaySpellEditor(textQueryEditorFlag, aInitialText, |
|
8898 TCursorSelection(aInitialText.Length(), 0)); |
|
8899 |
|
8900 delete iSpellInitText; |
|
8901 iSpellInitText = NULL; |
|
8902 iSpellInitText = aInitialText.AllocL(); |
|
8903 iSpellInitCurSel = aTextSpanToReplace; |
|
8904 |
|
8905 iFepPluginManager->SetCaseUpdatesSupressed(isCaseUpdatesSupressed); |
|
8906 //add to avoid text update late when open spell. |
|
8907 //iFepPluginManager->SetITUTSpellingStateL(ETrue); |
|
8908 iFepPluginManager->SetCursorSelection(aTextSpanToReplace); |
|
8909 CleanupStack::PopAndDestroy(); |
|
8910 |
|
8911 return; |
|
8912 } |
|
8913 #endif |
|
8914 |
|
8915 if(iFepPluginManager) |
|
8916 { |
|
8917 iFepPluginManager->SetInEditWordQueryFlag(ETrue); |
|
8918 } |
|
8919 |
|
8920 PrepareFepForFepAwareDialogLaunch(); |
|
8921 TUid fepUid = CCoeEnv::Static()->FepUid(); |
|
8922 ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
8923 TInt id = iUiInterface->TextQueryDialogL(text, *EditorState(), |
|
8924 textQueryEditorFlag, aResourceId); |
|
8925 PrepareFepAfterFepAwareDialogExitL(fepUid); |
|
8926 PrepareFepAfterDialogExitL(fepUid); |
|
8927 |
|
8928 if(iFepPluginManager) |
|
8929 { |
|
8930 iFepPluginManager->SetInEditWordQueryFlag(EFalse); |
|
8931 } |
|
8932 if (id == EAknSoftkeyOk) |
|
8933 { |
|
8934 // Insert the character into the edwin. |
|
8935 InsertTextFromDialogL(text, aTextSpanToReplace); |
|
8936 // Add the word to the user dictionary (except for single character) after it has been added to the editor. |
|
8937 // FepUI of the main editor is used. Different FepUI is used in multitap |
|
8938 // query and predictive mode 'main' editor at least in Japanese variant. |
|
8939 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
8940 if(text.Length() > 1) |
|
8941 FepUI()->AddTextToUserDictionaryL(text); |
|
8942 #else |
|
8943 FepUI()->AddTextToUserDictionaryL(text); |
|
8944 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
8945 |
|
8946 } |
|
8947 else // restore original case and inline text |
|
8948 { |
|
8949 HandleChangeInFocus(); |
|
8950 if (aTextSpanToReplace.Length()) |
|
8951 { |
|
8952 EditorState()->SetInlineEditSpan(aTextSpanToReplace); |
|
8953 ConfigureFEPFromEditorStateL(); |
|
8954 } |
|
8955 iCaseMan->SetCurrentCase(underlyingCase); |
|
8956 TransferFepStateToEditorL(); |
|
8957 } |
|
8958 |
|
8959 if (isCaseUpdatesSupressed) |
|
8960 { |
|
8961 SetFlag(EFlagSupressAutoUpdate); |
|
8962 } |
|
8963 else |
|
8964 { |
|
8965 ClearFlag(EFlagSupressAutoUpdate); |
|
8966 } |
|
8967 ClearFlag(EFlagSupressAutoUpdateAtEditorStart); |
|
8968 CleanupStack::PopAndDestroy(); // text |
|
8969 } |
|
8970 |
|
8971 void CAknFepManager::InsertTextFromDialogL(const TDesC& aTextFromDialog, |
|
8972 TCursorSelection aExtentOfTextToReplace) |
|
8973 { |
|
8974 SetCcpuFlag(ECcpuStateSupressCursorMoveToEnd); |
|
8975 // ensure we're back on the correct editor |
|
8976 |
|
8977 #ifdef RD_SCALABLE_UI_V2 |
|
8978 iNotifyPlugin = EFalse; // not really focus change |
|
8979 HandleChangeInFocus(); |
|
8980 iNotifyPlugin = ETrue; |
|
8981 #else |
|
8982 HandleChangeInFocus(); |
|
8983 #endif |
|
8984 // need to commit if the editor was previously performing an inline edit |
|
8985 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
8986 CommitInlineEditL(); |
|
8987 |
|
8988 TInt addedTextLength=0; |
|
8989 |
|
8990 TCursorSelection currentSelection; |
|
8991 // In case input capabilities goes null leaving with an error code and allowing application to handle.. |
|
8992 if (NULL == iInputCapabilities.FepAwareTextEditor()) |
|
8993 User::Leave(KErrCorrupt); |
|
8994 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(currentSelection); |
|
8995 // Prepare for the edit |
|
8996 TInt docLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
8997 TInt maxLength = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep(); |
|
8998 |
|
8999 if (aExtentOfTextToReplace.Length()) |
|
9000 { |
|
9001 if (currentSelection.Length()) |
|
9002 // Want to 'cancel' the selection so move cursor & anchor to the end of |
|
9003 // the selection and then to the end of the current word |
|
9004 { |
|
9005 TInt endOfSelection=currentSelection.HigherPos(); |
|
9006 iUncommittedText.SetSelection(endOfSelection, endOfSelection); |
|
9007 if (CursorInsideWord()) |
|
9008 MoveCursorToEndOfWordL(); |
|
9009 } |
|
9010 iUncommittedText = aExtentOfTextToReplace; |
|
9011 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText); |
|
9012 addedTextLength = aTextFromDialog.Length(); |
|
9013 if (maxLength != 0) |
|
9014 { |
|
9015 addedTextLength = Min(addedTextLength, |
|
9016 (maxLength - docLength + iUncommittedText.Length())); |
|
9017 } |
|
9018 } |
|
9019 else |
|
9020 { |
|
9021 addedTextLength = aTextFromDialog.Length(); |
|
9022 |
|
9023 //maxLength of 0 means the editor has no limit |
|
9024 if (maxLength != 0) |
|
9025 { |
|
9026 addedTextLength = Min(addedTextLength, |
|
9027 (maxLength - docLength + currentSelection.Length())); |
|
9028 } |
|
9029 if (currentSelection.Length()) |
|
9030 { |
|
9031 iUncommittedText.SetSelection(currentSelection.HigherPos(), |
|
9032 currentSelection.LowerPos()); |
|
9033 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText); |
|
9034 } |
|
9035 else // do this in order for editor to get the correct number of chars to format from GetFormatOfFepInlineText() |
|
9036 iUncommittedText.iCursorPos+=addedTextLength; |
|
9037 } |
|
9038 // if necessary trim text to fit into available space in the editor & perform the edit |
|
9039 TPtrC textToEditor = aTextFromDialog.Left(addedTextLength); |
|
9040 |
|
9041 StartInlineEditL(textToEditor); |
|
9042 CommitInlineEditL(); |
|
9043 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
9044 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
9045 #endif |
|
9046 |
|
9047 EditorState()->SetInlineEditSpan(iUncommittedText); |
|
9048 } |
|
9049 |
|
9050 void CAknFepManager::LaunchKutenCodeQueryL() |
|
9051 { |
|
9052 TInt code; |
|
9053 TUid fepUid = CCoeEnv::Static()->FepUid(); |
|
9054 ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
9055 UiInterface()->JapaneseKutenQueryDialogL(R_AKNFEPUICTRLJAPANESEKUTEN_QUERY, code, 0); |
|
9056 |
|
9057 PrepareFepAfterDialogExitL(fepUid); |
|
9058 |
|
9059 HandleChangeInFocus(); // to re-establish contact with editor under KutenCode Query |
|
9060 |
|
9061 if (code > 0 && EditorHasFreeSpace()) |
|
9062 { |
|
9063 TBuf<ESingleCharacter> text; |
|
9064 text.Append((TText)code); |
|
9065 SetFlag(EFlagInsideInlineEditingTransaction); |
|
9066 iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(text, ESingleCharacter, |
|
9067 ETrue, NULL, *this, *this); |
|
9068 CommitInlineEditL(); |
|
9069 } |
|
9070 } |
|
9071 |
|
9072 TInt CAknFepManager::NumericModeSCTResourceId() const |
|
9073 { |
|
9074 TInt charMapResId = EDefaultNumericCharMapResId; |
|
9075 TBool phoneIdle = (EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor); |
|
9076 |
|
9077 if( phoneIdle ) |
|
9078 { |
|
9079 charMapResId=R_AKNFEP_SCT_NUMERIC_MODE_CHARS_STANDARD; |
|
9080 return charMapResId; |
|
9081 } |
|
9082 |
|
9083 switch (iAknEditorNumericKeymap) |
|
9084 { |
|
9085 case EAknEditorStandardNumberModeKeymap: |
|
9086 charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_STANDARD; |
|
9087 break; |
|
9088 case EAknEditorCalculatorNumberModeKeymap: |
|
9089 charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_CALCULATOR; |
|
9090 break; |
|
9091 case EAknEditorConverterNumberModeKeymap: |
|
9092 charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_CONVERTER; |
|
9093 break; |
|
9094 case EAknEditorFixedDiallingNumberModeKeymap: |
|
9095 charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_FIXED_DIALLING; |
|
9096 break; |
|
9097 case EAknEditorSATNumberModeKeymap: |
|
9098 charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_SAT; |
|
9099 break; |
|
9100 case EAknEditorToFieldNumberModeKeymap: |
|
9101 charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_TO_FIELD; |
|
9102 break; |
|
9103 case EAknEditorPlainNumberModeKeymap: |
|
9104 charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_PLAIN; |
|
9105 break; |
|
9106 case EAknEditorNativeKeysNumberModeKeymap: |
|
9107 //currently this is not in use |
|
9108 break; |
|
9109 case EAknEditorSATHiddenNumberModeKeymap: |
|
9110 charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_SAT_HIDDEN; |
|
9111 break; |
|
9112 default: |
|
9113 //We reach here because there is no valid SCT resource ID set |
|
9114 //by the current editor. So best we can do now is set the |
|
9115 //default mode for numeric editors. |
|
9116 charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_STANDARD; |
|
9117 break; |
|
9118 } |
|
9119 if(IsHybridAplhaEditor() && !IsHybridAlphaModeChangedtoAplhanumeric()) |
|
9120 { |
|
9121 charMapResId = R_AKNFEP_SCT_NUMERIC_MODE_CHARS_STANDARD; |
|
9122 } |
|
9123 return charMapResId; |
|
9124 } |
|
9125 |
|
9126 |
|
9127 TBool CAknFepManager::HashKeyModeChangeBlockedInSearchField() const |
|
9128 { |
|
9129 if ((iAknEditorFlags & EAknEditorFlagFindPane) && |
|
9130 iSharedDataInterface->HashKeySelectionInUse() && |
|
9131 !IsChineseInputLanguage() && |
|
9132 !IsKoreanInputLanguage() && |
|
9133 iLanguageCapabilities.iInputLanguageCode != ELangVietnamese && |
|
9134 !FeatureManager::FeatureSupported(KFeatureIdJapanese)) |
|
9135 { |
|
9136 if (iMode == ELatin || iMode == ENumber || iMode == ENativeNumber ) |
|
9137 { |
|
9138 return ETrue; |
|
9139 } |
|
9140 } |
|
9141 |
|
9142 return EFalse; |
|
9143 } |
|
9144 |
|
9145 |
|
9146 TKeyResponse CAknFepManager::HandleHashKeyL(TKeyPressLength aLength) |
|
9147 { |
|
9148 TKeyResponse response = EKeyWasNotConsumed; |
|
9149 if (IsFlagSet(EFlagPassNextKey)) |
|
9150 { |
|
9151 ClearFlag(EFlagPassNextKey); |
|
9152 } |
|
9153 else if (IsFlagSet(EFlagShiftKeyDepressed)) |
|
9154 { |
|
9155 response = EKeyWasConsumed; |
|
9156 } |
|
9157 else if (HashKeyModeChangeBlockedInSearchField()) |
|
9158 { |
|
9159 // Do not allow case changes for latin languages in search field |
|
9160 // if hash key selection is active. |
|
9161 response = EKeyWasConsumed; |
|
9162 } |
|
9163 else |
|
9164 { |
|
9165 if ( IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) ) |
|
9166 { |
|
9167 #ifdef RD_HINDI_PHONETIC_INPUT |
|
9168 if(iSharedDataInterface->InputTextLanguage() != KLangHindiPhonetic) |
|
9169 #endif |
|
9170 FepUI()->ExpireMultitapTimer(); |
|
9171 // For Japanese, send backspace key event in case hash key |
|
9172 // is pressed while secret text input. |
|
9173 if (IsFeatureSupportedJapanese()) |
|
9174 { |
|
9175 if (iInputCapabilities.SupportsSecretText()) |
|
9176 { |
|
9177 SimulateKeyEventL(EKeyF20); //backspace |
|
9178 } |
|
9179 } |
|
9180 #ifdef RD_HINDI_PHONETIC_INPUT |
|
9181 if(iSharedDataInterface->InputTextLanguage() != KLangHindiPhonetic) |
|
9182 #endif |
|
9183 ClearFlag(EFlagInsideMultitapInlineEditingTransaction); |
|
9184 iCaseMan->UpdateCase(ENullNaviEvent); |
|
9185 } |
|
9186 if (aLength == EShortKeyPress) |
|
9187 { |
|
9188 if ( iMode != ENumber && iMode != ENativeNumber ) |
|
9189 { |
|
9190 iModeBefore = iMode; |
|
9191 if (iModeBefore == ELatin) |
|
9192 { |
|
9193 iCaseBefore = iCaseMan->CurrentCase(); |
|
9194 } |
|
9195 } |
|
9196 } |
|
9197 |
|
9198 // always keep previous input mode for Japanese input |
|
9199 if (IsFeatureSupportedJapanese()) |
|
9200 { |
|
9201 iModeBefore = iMode; |
|
9202 if (iModeBefore == ELatin) |
|
9203 { |
|
9204 iCaseBefore = iCaseMan->CurrentCase(); |
|
9205 } |
|
9206 } |
|
9207 if (iMode == EHangul && aLength == ELongKeyPress) |
|
9208 { |
|
9209 if (IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) |
|
9210 { |
|
9211 TPtrC text = iPtiEngine->CurrentWord(); |
|
9212 if (text.Length() > 0) |
|
9213 { |
|
9214 CancelInlineEdit(); |
|
9215 StartInlineEditL(); |
|
9216 UpdateInlineEditL(iPtiEngine->PreviousCandidate(), iPtiEngine->PreviousCandidate().Length()); |
|
9217 CommitInlineEditL(); |
|
9218 } |
|
9219 else |
|
9220 { |
|
9221 CancelInlineEdit(); |
|
9222 } |
|
9223 iPtiEngine->ClearCurrentWord(); |
|
9224 } |
|
9225 } |
|
9226 |
|
9227 response = iHashKeyMan->HandleKeyEventL(aLength); |
|
9228 if (response == EKeyWasNotConsumed) |
|
9229 { |
|
9230 switch (iAknEditorNumericKeymap) |
|
9231 { |
|
9232 case EAknEditorStandardNumberModeKeymap: //fall through |
|
9233 case EAknEditorFixedDiallingNumberModeKeymap: |
|
9234 case EAknEditorSATNumberModeKeymap: |
|
9235 case EAknEditorSATHiddenNumberModeKeymap: |
|
9236 case EAknEditorAlphanumericNumberModeKeymap: |
|
9237 if (!EditorHasFreeSpace()) |
|
9238 { |
|
9239 response=EKeyWasConsumed; |
|
9240 } |
|
9241 break; |
|
9242 case EAknEditorCalculatorNumberModeKeymap: //fall through |
|
9243 case EAknEditorConverterNumberModeKeymap: |
|
9244 SimulateKeyEventL(CurrentDecimalSeparator()); |
|
9245 if (EditorHasFreeSpace()) |
|
9246 { |
|
9247 SetFlag(EFlagCharacterAdded); |
|
9248 } |
|
9249 response=EKeyWasConsumed; |
|
9250 break; |
|
9251 case EAknEditorToFieldNumberModeKeymap: |
|
9252 SimulateKeyEventL(text_to_field_mode_hash_key); |
|
9253 if (EditorHasFreeSpace()) |
|
9254 { |
|
9255 SetFlag(EFlagCharacterAdded); |
|
9256 } |
|
9257 response=EKeyWasConsumed; |
|
9258 break; |
|
9259 case EAknEditorPlainNumberModeKeymap: |
|
9260 response=EKeyWasConsumed; |
|
9261 break; |
|
9262 case EAknEditorNativeKeysNumberModeKeymap: |
|
9263 break; |
|
9264 default: |
|
9265 break; |
|
9266 } |
|
9267 } |
|
9268 } |
|
9269 return response; |
|
9270 } |
|
9271 |
|
9272 TInt CAknFepManager::EditorNumericKeymap() const |
|
9273 { |
|
9274 return iAknEditorNumericKeymap; |
|
9275 } |
|
9276 |
|
9277 |
|
9278 TBool CAknFepManager::HashKeySelectionInUse() const |
|
9279 { |
|
9280 if (ExtendedInputCapabilities() |
|
9281 & CAknExtendedInputCapabilities::EForceHashKeySelectionStatusFlagOff) |
|
9282 { |
|
9283 return EFalse; |
|
9284 } |
|
9285 |
|
9286 return iSharedDataInterface->HashKeySelectionInUse(); |
|
9287 } |
|
9288 |
|
9289 |
|
9290 TBool CAknFepManager::EditSubmenuInUse() const |
|
9291 { |
|
9292 if (RProcess().SecureId().iId == KPhoneSecureId) |
|
9293 { |
|
9294 if (iQwertyInputMode) |
|
9295 { |
|
9296 return EFalse; |
|
9297 } |
|
9298 } |
|
9299 |
|
9300 if (ExtendedInputCapabilities() & CAknExtendedInputCapabilities::EForceEditSubmenuStatusFlagOff) |
|
9301 { |
|
9302 return EFalse; |
|
9303 } |
|
9304 |
|
9305 return iSharedDataInterface->EditSubmenuInUse(); |
|
9306 } |
|
9307 |
|
9308 |
|
9309 void CAknFepManager::DimEditMenuModeItems(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
9310 { |
|
9311 // current item |
|
9312 DimMenuItem(aMenuPane, iMode); |
|
9313 |
|
9314 // dim menu items for Chinese input modes that aren't valid in the current editor |
|
9315 // or the device subvariant |
|
9316 for (TInt mode = KFirstMode; mode <= KLastMode; mode = mode << 1) |
|
9317 { |
|
9318 if (!IsModePermitted(mode)) |
|
9319 { |
|
9320 DimMenuItem(aMenuPane, mode); |
|
9321 } |
|
9322 } |
|
9323 |
|
9324 // Switch menu whether input language is supported related chinese phrase |
|
9325 MPtiLanguage* ptilang = iPtiEngine->GetLanguage( |
|
9326 iLanguageCapabilities.iInputLanguageCode ); |
|
9327 if ( ptilang ) |
|
9328 { |
|
9329 if( iMode != EPinyin && IsModePermitted( EPinyin ) ) |
|
9330 { |
|
9331 if( ptilang->HasInputMode( EPtiEnginePinyinByPhrase ) ) |
|
9332 { |
|
9333 aMenuPane->SetItemDimmed( EChinFepCmdModePinyin, ETrue ); |
|
9334 aMenuPane->SetItemDimmed( EChinFepCmdModePinyinPhrase, EFalse ); |
|
9335 } |
|
9336 } |
|
9337 |
|
9338 if( iMode != EZhuyin && IsModePermitted( EZhuyin ) ) |
|
9339 { |
|
9340 if( ptilang->HasInputMode( EPtiEngineZhuyinByPhrase ) ) |
|
9341 { |
|
9342 aMenuPane->SetItemDimmed( EChinFepCmdModeZhuyin, ETrue ); |
|
9343 aMenuPane->SetItemDimmed( EChinFepCmdModeZhuyinPhrase, EFalse ); |
|
9344 } |
|
9345 } |
|
9346 |
|
9347 if( iMode != EStroke && IsModePermitted( EStroke ) ) |
|
9348 { |
|
9349 if( ptilang->HasInputMode( EPtiEngineStrokeByPhrase ) ) |
|
9350 { |
|
9351 aMenuPane->SetItemDimmed( EChinFepCmdModeStroke, ETrue ); |
|
9352 aMenuPane->SetItemDimmed( EChinFepCmdModeStrokePhrase, EFalse ); |
|
9353 } |
|
9354 } |
|
9355 } |
|
9356 |
|
9357 if (IsAbleToLaunchSmiley()) |
|
9358 { |
|
9359 TInt index; |
|
9360 if (aMenuPane->MenuItemExists(EAknCmdEditInsertSmiley, index)) |
|
9361 { |
|
9362 aMenuPane->SetItemDimmed(EAknCmdEditInsertSmiley, EFalse); |
|
9363 } |
|
9364 } |
|
9365 } |
|
9366 |
|
9367 void CAknFepManager::DimMenuItem(CAknFepUiInterfaceMenuPane* aMenuPane, TInt aMode) |
|
9368 { |
|
9369 TInt dimmedMenuItem = 0; |
|
9370 switch (aMode) |
|
9371 { |
|
9372 case EPinyin: |
|
9373 dimmedMenuItem = EChinFepCmdModePinyin; |
|
9374 break; |
|
9375 case EZhuyin: |
|
9376 dimmedMenuItem = EChinFepCmdModeZhuyin; |
|
9377 break; |
|
9378 case EStroke: |
|
9379 dimmedMenuItem = EChinFepCmdModeStroke; |
|
9380 break; |
|
9381 case ECangJie: |
|
9382 dimmedMenuItem = EChinFepCmdModeCangJie; |
|
9383 break; |
|
9384 case EZhuyinFind: |
|
9385 dimmedMenuItem = EChinFepCmdModeZhuyinFind; |
|
9386 break; |
|
9387 case EStrokeFind: |
|
9388 dimmedMenuItem = EChinFepCmdModeStrokeFind; |
|
9389 break; |
|
9390 case ELatin: |
|
9391 if ( iLanguageCapabilities.iInputLanguageCode != ELangJapanese) |
|
9392 { |
|
9393 // According Katja's info, dim the current case item in the |
|
9394 // indicator menu. |
|
9395 if ( iCaseMan->CurrentCase() == EAknEditorUpperCase ) |
|
9396 { |
|
9397 dimmedMenuItem = EChinFepCmdModeLatinUpper; |
|
9398 } |
|
9399 else if(iCaseMan->CurrentCase() == EAknEditorLowerCase) |
|
9400 { |
|
9401 dimmedMenuItem = EChinFepCmdModeLatinLower; |
|
9402 } |
|
9403 else if(iCaseMan->CurrentCase() == EAknEditorTextCase) |
|
9404 { |
|
9405 dimmedMenuItem = EAknCmdEditModeLatinText; |
|
9406 } |
|
9407 } |
|
9408 break; |
|
9409 case ENativeNumber: |
|
9410 { |
|
9411 aMenuPane->SetItemDimmed(EAknCmdEditModeArabicIndicNumber, ETrue); |
|
9412 aMenuPane->SetItemDimmed(EAknCmdEditModeEasternArabicIndicNumber, ETrue); |
|
9413 aMenuPane->SetItemDimmed(EAknCmdEditModeIndicNumber, ETrue); |
|
9414 } |
|
9415 break; |
|
9416 default: |
|
9417 break; |
|
9418 } |
|
9419 TInt index; |
|
9420 if (dimmedMenuItem && aMenuPane->MenuItemExists(dimmedMenuItem, index)) |
|
9421 { |
|
9422 aMenuPane->SetItemDimmed(dimmedMenuItem, ETrue); |
|
9423 } |
|
9424 } |
|
9425 |
|
9426 void CAknFepManager::LaunchConfirmationNoteL(TInt aResourceId) |
|
9427 { |
|
9428 SetFlag(EFlagForegroundUIComponentVisible); |
|
9429 iUiInterface->LaunchConfirmationNoteL(aResourceId); |
|
9430 } |
|
9431 |
|
9432 void CAknFepManager::NewCharacterL(const TDesC& aChar) |
|
9433 { |
|
9434 if ( aChar.Length() == 0 ) |
|
9435 { |
|
9436 return; |
|
9437 } |
|
9438 TChar ch = aChar[0]; |
|
9439 |
|
9440 TBool validNewCandidate = CharIsValidInEditor(ch); |
|
9441 // Check if the character is valid for the editor. |
|
9442 if ( !validNewCandidate ) |
|
9443 { |
|
9444 TChar firstNewCandidate = ch; |
|
9445 TBool goneThroughAllCandidates(EFalse); |
|
9446 TPtrC8 sequence = iPtiEngine->CurrentInputSequence(); |
|
9447 |
|
9448 if ( sequence.Length() ) |
|
9449 { |
|
9450 TPtiKey key = (TPtiKey)sequence[0]; |
|
9451 |
|
9452 TBuf<20> mapData; |
|
9453 iPtiEngine->MappingDataForKey(key, mapData, iPtiEngine->Case()); |
|
9454 // If the character was not coming from ptiengine mappings, fail instantly. |
|
9455 if (mapData.Locate(firstNewCandidate) != KErrNotFound) |
|
9456 { |
|
9457 // If there is an ivalid character in chr-loop, try to jump to next valid one. |
|
9458 for (TInt jj = 0; jj < mapData.Length(); jj++) |
|
9459 { |
|
9460 TPtrC text = iPtiEngine->AppendKeyPress(key); |
|
9461 if ( text.Length() == 0 ) |
|
9462 { |
|
9463 continue; |
|
9464 } |
|
9465 ch = text[0]; |
|
9466 goneThroughAllCandidates = (ch == firstNewCandidate); |
|
9467 validNewCandidate = CharIsValidInEditor(ch); |
|
9468 if (validNewCandidate || goneThroughAllCandidates) |
|
9469 { |
|
9470 break; |
|
9471 } |
|
9472 } |
|
9473 } |
|
9474 } |
|
9475 } |
|
9476 if (!validNewCandidate) |
|
9477 { |
|
9478 // No valid characters at all. |
|
9479 CancelInlineEdit(); |
|
9480 return; |
|
9481 } |
|
9482 |
|
9483 if ( (ch == KAknFEPLineFeedSymbol || |
|
9484 ch == KAknFEPMirroredLineFeedSymbol) && |
|
9485 (EditorHasFreeSpace() || IsFlagSet(EFlagLastCharacterInEditor))) |
|
9486 { |
|
9487 SetFlag(EFlagLineFeedCharacter); |
|
9488 } |
|
9489 else |
|
9490 { |
|
9491 ClearFlag(EFlagLineFeedCharacter); |
|
9492 } |
|
9493 |
|
9494 if ( (ch == EKeySpace) && |
|
9495 (EditorHasFreeSpace() || IsFlagSet(EFlagLastCharacterInEditor))) |
|
9496 { |
|
9497 SetFlag(EFlagSpaceCharacter); |
|
9498 } |
|
9499 else |
|
9500 { |
|
9501 ClearFlag(EFlagSpaceCharacter); |
|
9502 } |
|
9503 |
|
9504 |
|
9505 if (iInputCapabilities.SupportsSecretText()) |
|
9506 { |
|
9507 if (IsFlagSet(EFlagInsideMultitapInlineEditingTransaction)) |
|
9508 { |
|
9509 SimulateKeyEventL(EKeyF20); // to delete previous char in secret text editor |
|
9510 } |
|
9511 //we receive an extra key press if we simulate a key that is also a device key |
|
9512 if (ch.IsDigit() || TUint(ch) == EStarKeyUnicodeValue || TUint(ch) == EHashKeyUnicodeValue) |
|
9513 { |
|
9514 SetFlag(EFlagPassNextKey); |
|
9515 } |
|
9516 if ( ch.IsDigit() && iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic ) |
|
9517 { |
|
9518 ClearFlag(EFlagPassNextKey); |
|
9519 SimulateKeyEventL(ch + (TChar)KLatinToArabicIndicDigitsDelta ); |
|
9520 } |
|
9521 else if ( ch.IsDigit() |
|
9522 && iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic ) |
|
9523 { |
|
9524 ClearFlag(EFlagPassNextKey); |
|
9525 if(iLanguageCapabilities.iInputLanguageCode == ELangUrdu |
|
9526 || iLanguageCapabilities.iInputLanguageCode == ELangFarsi) |
|
9527 { |
|
9528 SimulateKeyEventL(ch + (TChar)KLatinToEasternArabicIndicDigitsDelta ); |
|
9529 } |
|
9530 } |
|
9531 else if ( ch.IsDigit() && iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) |
|
9532 { |
|
9533 ClearFlag(EFlagPassNextKey); |
|
9534 SimulateKeyEventL(ch + (TChar)KLatinToDevanagariDigitsDelta); |
|
9535 } |
|
9536 else |
|
9537 { |
|
9538 SimulateKeyEventL(ch); |
|
9539 } |
|
9540 SetFlag(EFlagInsideMultitapInlineEditingTransaction | EFlagInsideInlineEditingTransaction); |
|
9541 } |
|
9542 else if (EditorHasFreeSpace() || IsFlagSet(EFlagInsideMultitapInlineEditingTransaction)) |
|
9543 { |
|
9544 TBuf<1> buf; |
|
9545 if ( ch.IsDigit() && iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic ) |
|
9546 { |
|
9547 buf.Append( ch + (TChar)KLatinToArabicIndicDigitsDelta ); |
|
9548 } |
|
9549 else if ( ch.IsDigit() |
|
9550 && iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic ) |
|
9551 { |
|
9552 if(iLanguageCapabilities.iInputLanguageCode == ELangUrdu |
|
9553 || iLanguageCapabilities.iInputLanguageCode == ELangFarsi) |
|
9554 { |
|
9555 buf.Append( ch + (TChar)KLatinToEasternArabicIndicDigitsDelta ); |
|
9556 } |
|
9557 } |
|
9558 else if ( ch.IsDigit() && iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) |
|
9559 { |
|
9560 buf.Append( ch + (TChar)KLatinToDevanagariDigitsDelta ); |
|
9561 } |
|
9562 else |
|
9563 { |
|
9564 buf.Append( ch ); |
|
9565 } |
|
9566 |
|
9567 if (iFepManState == EAknFepStateInitial) //multitapping |
|
9568 { |
|
9569 if (!IsFlagSet(EFlagInsideMultitapInlineEditingTransaction)) |
|
9570 { |
|
9571 TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
9572 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
9573 if (iAknEditorFlags & EAknEditorFlagMTAutoOverwrite && iMode == ELatin |
|
9574 && !WesternPredictive() |
|
9575 && iUncommittedText.iCursorPos < edSize |
|
9576 && iUncommittedText.Length() == 0) |
|
9577 { |
|
9578 // If the cursor is at the beginning or in the middle of the text, |
|
9579 // existing characters are replaced with new ones in latin multitap input. |
|
9580 iUncommittedText.iCursorPos++; |
|
9581 StartInlineEditL(iUncommittedText, buf, ESingleCharacter, EFalse); |
|
9582 SetFlag(EFlagInsideMultitapInlineEditingTransaction); |
|
9583 UpdateInlineEditL(buf, ESingleCharacter); |
|
9584 } |
|
9585 else |
|
9586 { |
|
9587 StartInlineEditL(buf); |
|
9588 SetFlag(EFlagInsideMultitapInlineEditingTransaction); |
|
9589 } |
|
9590 } |
|
9591 else |
|
9592 { |
|
9593 UpdateInlineEditL(buf, ESingleCharacter); |
|
9594 } |
|
9595 |
|
9596 if(!EditorHasFreeSpace()) |
|
9597 { |
|
9598 SetFlag(EFlagLastCharacterInEditor); |
|
9599 } |
|
9600 } |
|
9601 else |
|
9602 { |
|
9603 iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(buf, ESingleCharacter, |
|
9604 ETrue, NULL, *this, *this); |
|
9605 } |
|
9606 SetFlag(EFlagInsideInlineEditingTransaction); |
|
9607 } |
|
9608 } |
|
9609 |
|
9610 void CAknFepManager::NewTextL(const TDesC& aText) |
|
9611 { |
|
9612 ClearFlag(EFlagLineFeedCharacter); |
|
9613 TBool unlimit = EFalse; |
|
9614 TInt freeSpace = EditorFreeSpace(unlimit); |
|
9615 |
|
9616 if (IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) || |
|
9617 unlimit || freeSpace > 0 ) // |
|
9618 { |
|
9619 if( unlimit || freeSpace > aText.Length() ) |
|
9620 { |
|
9621 iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(aText, aText.Length(), ETrue, |
|
9622 NULL, *this, *this); |
|
9623 } |
|
9624 else |
|
9625 { |
|
9626 iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(aText.Left(freeSpace), freeSpace, ETrue, |
|
9627 NULL, *this, *this); |
|
9628 } |
|
9629 |
|
9630 SetFlag(EFlagInsideInlineEditingTransaction); |
|
9631 } |
|
9632 } |
|
9633 |
|
9634 |
|
9635 void CAknFepManager::NewCharacterSequenceL(const TDesC& aText, TIndicInputResponse aResponse) |
|
9636 { |
|
9637 TChar zws((ZERO_WIDTH_SPACE)); |
|
9638 TChar virama((TAknFepUiIndicInputManager::Virama(TLanguage( |
|
9639 iLanguageCapabilities.iInputLanguageCode)))); |
|
9640 TBool ret = ETrue; |
|
9641 TBuf<CAknFepManager::EMaximumFepWordLength> buf; |
|
9642 buf.Zero(); |
|
9643 TBool isTextLayoutPresent = (AknFepDocumentNavigation() || TextLayout()) ? ETrue : EFalse; |
|
9644 switch( aResponse ) |
|
9645 { |
|
9646 case EIndicInputResponseNone: |
|
9647 { |
|
9648 NewCharacterL(aText); |
|
9649 } |
|
9650 break; |
|
9651 case EIndicInputResponseNumber: |
|
9652 { |
|
9653 NewCharacterL(aText); |
|
9654 CommitInlineEditL(); |
|
9655 } |
|
9656 break; |
|
9657 case EIndicInputResponseZWSandCharacter: |
|
9658 { |
|
9659 if (! iInputCapabilities.SupportsSecretText() && isTextLayoutPresent) |
|
9660 { |
|
9661 buf.Append(zws); |
|
9662 NewCharacterL(buf); |
|
9663 CommitInlineEditL(); |
|
9664 } |
|
9665 NewCharacterL(aText); |
|
9666 } |
|
9667 break; |
|
9668 case EIndicInputResponseInsertZWS: |
|
9669 { |
|
9670 buf.Append(virama); |
|
9671 if(isTextLayoutPresent) |
|
9672 buf.Append(zws); |
|
9673 ret = EFalse; |
|
9674 } |
|
9675 break; |
|
9676 case EIndicInputResponseInsertZWSandLigature: |
|
9677 { |
|
9678 buf.Append(virama); |
|
9679 if(isTextLayoutPresent) |
|
9680 buf.Append(zws); |
|
9681 if ( iInputCapabilities.SupportsSecretText() ) |
|
9682 { |
|
9683 buf.Append(aText); |
|
9684 } |
|
9685 ret = EFalse; |
|
9686 } |
|
9687 break; |
|
9688 |
|
9689 case EIndicInputResponseInsertRepha: |
|
9690 { |
|
9691 MCoeFepAwareTextEditor* fepAwareTextEditor = |
|
9692 iInputCapabilities.FepAwareTextEditor(); |
|
9693 |
|
9694 if( fepAwareTextEditor ) |
|
9695 { |
|
9696 TInt nextCharPos = 0; |
|
9697 TCursorSelection curSel; |
|
9698 |
|
9699 fepAwareTextEditor->GetCursorSelectionForFep( curSel ); |
|
9700 |
|
9701 // Insert Repha before the desired syllable. |
|
9702 TBool leftFlag = GetNextVisualLeftCharacter( nextCharPos ); |
|
9703 if( leftFlag ) |
|
9704 { |
|
9705 curSel.iCursorPos = nextCharPos; |
|
9706 curSel.iAnchorPos = nextCharPos; |
|
9707 |
|
9708 fepAwareTextEditor->SetCursorSelectionForFepL( curSel ); |
|
9709 |
|
9710 TAknFepUiIndicInputManager::GetRepha( buf, |
|
9711 TLanguage( iLanguageCapabilities.iInputLanguageCode ) ); |
|
9712 |
|
9713 ret = EFalse; |
|
9714 } |
|
9715 } |
|
9716 break; |
|
9717 } |
|
9718 |
|
9719 case EIndicInputResponseInsertRakar: |
|
9720 { |
|
9721 TAknFepUiIndicInputManager::GetRakar( buf, |
|
9722 TLanguage( iLanguageCapabilities.iInputLanguageCode ) ); |
|
9723 ret = EFalse; |
|
9724 } |
|
9725 break; |
|
9726 #ifdef RD_HINDI_PHONETIC_INPUT |
|
9727 case EIndicInputResponsePhoneticMultitapText: |
|
9728 { |
|
9729 buf.Append(aText); |
|
9730 ret = EFalse; |
|
9731 } |
|
9732 break; |
|
9733 case EIndicInputResponsePhoneticQwertyText: |
|
9734 { |
|
9735 buf.Append(aText); |
|
9736 ret = EFalse; |
|
9737 } |
|
9738 break; |
|
9739 #endif |
|
9740 |
|
9741 case EIndicInputResponseInsertDirectLigature: |
|
9742 { |
|
9743 // In key-0, the new line character preceeds the Ksha. |
|
9744 // First clear the new line flag. |
|
9745 ClearFlag( EFlagLineFeedCharacter ); |
|
9746 |
|
9747 buf.Append( aText ); |
|
9748 ret = EFalse; |
|
9749 } |
|
9750 break; |
|
9751 |
|
9752 case EIndicInputResponseInsertViramaZWSandDirectLigature: |
|
9753 { |
|
9754 // This case handles the insertion of Virama when star key |
|
9755 // is pressed. |
|
9756 |
|
9757 // In key-0, the new line character preceeds the Ksha. |
|
9758 // First clear the new line flag. |
|
9759 ClearFlag( EFlagLineFeedCharacter ); |
|
9760 |
|
9761 buf.Append(virama); |
|
9762 if(isTextLayoutPresent) |
|
9763 buf.Append(zws); |
|
9764 if ( iInputCapabilities.SupportsSecretText() ) |
|
9765 { |
|
9766 buf.Append(aText); |
|
9767 } |
|
9768 ret = EFalse; |
|
9769 } |
|
9770 break; |
|
9771 |
|
9772 case EIndicInputResponseZWSandDirectLigature: |
|
9773 { |
|
9774 if (! iInputCapabilities.SupportsSecretText() && isTextLayoutPresent) |
|
9775 { |
|
9776 buf.Append(zws); |
|
9777 NewCharacterL(buf); |
|
9778 CommitInlineEditL(); |
|
9779 } |
|
9780 buf.Zero(); |
|
9781 buf.Append( aText ); |
|
9782 ret = EFalse; |
|
9783 } |
|
9784 break; |
|
9785 |
|
9786 #ifdef RD_MARATHI |
|
9787 case EIndicInputResponseInsertEyeLashRa: |
|
9788 { |
|
9789 TAknFepUiIndicInputManager::GetEyeLashRa( buf, |
|
9790 (TLanguage)iLanguageCapabilities.iInputLanguageCode ); |
|
9791 ret = EFalse; |
|
9792 } |
|
9793 break; |
|
9794 |
|
9795 case EIndicInputResponseInsertChandraA: |
|
9796 { |
|
9797 TAknFepUiIndicInputManager::GetChandraA( buf ); |
|
9798 ret = EFalse; |
|
9799 } |
|
9800 break; |
|
9801 #endif // RD_MARATHI |
|
9802 |
|
9803 default: |
|
9804 break; |
|
9805 } |
|
9806 |
|
9807 if(ret) |
|
9808 return; |
|
9809 |
|
9810 if ( iInputCapabilities.SupportsSecretText() ) |
|
9811 { |
|
9812 if ( IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) ) |
|
9813 { |
|
9814 SimulateKeyEventL(EKeyF20); // to delete previous char in secret text editor |
|
9815 } |
|
9816 for( TInt counter=0; counter<buf.Length(); counter++ ) |
|
9817 { |
|
9818 if( (buf[counter] != ZERO_WIDTH_SPACE) ) |
|
9819 SimulateKeyEventL(buf[counter]); |
|
9820 } |
|
9821 SetFlag(EFlagInsideMultitapInlineEditingTransaction | EFlagInsideInlineEditingTransaction); |
|
9822 } |
|
9823 else if ( EditorHasFreeSpace() || IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) ) |
|
9824 { |
|
9825 if ( iFepManState == EAknFepStateInitial ) //multitapping |
|
9826 { |
|
9827 if ( !IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) ) |
|
9828 { |
|
9829 TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
9830 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
9831 if (iAknEditorFlags & EAknEditorFlagMTAutoOverwrite && iMode == ELatin |
|
9832 && !WesternPredictive() |
|
9833 && iUncommittedText.iCursorPos < edSize |
|
9834 && iUncommittedText.Length() == 0) |
|
9835 { |
|
9836 // If the cursor is at the beginning or in the middle of the text, |
|
9837 // existing characters are replaced with new ones in latin multitap input. |
|
9838 iUncommittedText.iCursorPos++; |
|
9839 StartInlineEditL(iUncommittedText, buf, ESingleCharacter, EFalse); |
|
9840 } |
|
9841 else |
|
9842 { |
|
9843 StartInlineEditL(); |
|
9844 } |
|
9845 SetFlag(EFlagInsideMultitapInlineEditingTransaction); |
|
9846 } |
|
9847 UpdateInlineEditL(buf, buf.Length()); |
|
9848 |
|
9849 if( !EditorHasFreeSpace() ) |
|
9850 { |
|
9851 SetFlag(EFlagLastCharacterInEditor); |
|
9852 } |
|
9853 } |
|
9854 SetFlag(EFlagInsideInlineEditingTransaction); |
|
9855 |
|
9856 // Check if text needs to be committed |
|
9857 if( ( TAknFepUiIndicInputManager::IsToCommitCharSeq( aResponse ) ) ) |
|
9858 { |
|
9859 CommitInlineEditL(); |
|
9860 } |
|
9861 if( aResponse == EIndicInputResponseInsertZWSandLigature ) |
|
9862 { |
|
9863 NewCharacterL(aText); |
|
9864 } |
|
9865 else if( aResponse == EIndicInputResponseInsertViramaZWSandDirectLigature ) |
|
9866 { |
|
9867 // Doing this here because we first commit the virama |
|
9868 // and ZWS and keep the ligature in the inline buffer. |
|
9869 NewLigatureL( aText ); |
|
9870 } |
|
9871 } |
|
9872 } |
|
9873 |
|
9874 void CAknFepManager::CommitInlineEditL() |
|
9875 { |
|
9876 if ( !IsFlagSet( CAknFepManager::EFlagInsideInlineEditingTransaction ) ) |
|
9877 { |
|
9878 return; |
|
9879 } |
|
9880 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
9881 // Before commit inline, check and close |
|
9882 // tooltip on FSQ first. |
|
9883 SendEventsToPluginManL( EPluginHideTooltip ); |
|
9884 |
|
9885 // Predictive QWERTY (XT9) changes ----> |
|
9886 // Exact word popup is hidden when the inline editor is closed |
|
9887 iExactWordPopupContent->HidePopUp(); |
|
9888 // Predictive QWERTY (XT9) changes <---- |
|
9889 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
9890 if (iInputCapabilities.FepAwareTextEditor()) |
|
9891 { |
|
9892 if (IsFlagSet(EFlagLineFeedCharacter)) |
|
9893 { |
|
9894 if (iInputCapabilities.SupportsSecretText()) |
|
9895 { |
|
9896 SimulateKeyEventL(EKeyF20); // backspace to delete previous char in secret text editor |
|
9897 SimulateKeyEventL(EKeyEnter); |
|
9898 SimulateKeyEventL(EKeyF19); // Asyncronous case update |
|
9899 } |
|
9900 else |
|
9901 { |
|
9902 __ASSERT_DEBUG(iInputCapabilities.FepAwareTextEditor(), |
|
9903 AknFepPanic(EAknFepPanicNoHandleToFepAwareTextEditor)); |
|
9904 iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL(ETrue); |
|
9905 iInputCapabilities.FepAwareTextEditor()->CancelFepInlineEdit(); |
|
9906 |
|
9907 // Multitapping enter event is not posted for find pane. |
|
9908 // It would never accept it anyway but the event causes problems in gallery's find. |
|
9909 // Allow real enter from qwerty keyboard though. |
|
9910 if (!(iAknEditorFlags & EAknEditorFlagFindPane) || iQwertyInputMode) |
|
9911 { |
|
9912 SimulateKeyEventL(EKeyEnter); |
|
9913 SimulateKeyEventL(EKeyF19); // Asyncronous case update |
|
9914 } |
|
9915 } |
|
9916 } |
|
9917 else if (IsFlagSet(EFlagSpaceCharacter | EFlagFullWidthSpaceCharacter)) |
|
9918 { |
|
9919 TBuf<ESingleCharacter> charAsDesc(ESingleCharacter); |
|
9920 |
|
9921 if (IsFlagSet(EFlagSpaceCharacter)) |
|
9922 { |
|
9923 charAsDesc[0] = TText(0x0020); // 0x0020 is space |
|
9924 } |
|
9925 else |
|
9926 { |
|
9927 charAsDesc[0] = TText(0x3000); // 0x3000 is full-width space |
|
9928 } |
|
9929 |
|
9930 if (iInputCapabilities.SupportsSecretText()) |
|
9931 { |
|
9932 SimulateKeyEventL(EKeyF20); // backspace to delete previous char in secret text editor |
|
9933 SimulateKeyEventL(charAsDesc[0]); |
|
9934 SimulateKeyEventL(EKeyF19); // Asyncronous case update |
|
9935 } |
|
9936 else |
|
9937 { |
|
9938 iInputCapabilities.FepAwareTextEditor()->UpdateFepInlineTextL(charAsDesc, 1); |
|
9939 iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL(ETrue); |
|
9940 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
9941 iInputCapabilities.FepAwareTextEditor()->CommitFepInlineEditL(*coeEnv); |
|
9942 iCaseMan->UpdateCase(ENullNaviEvent); |
|
9943 if (!EditorHasFreeSpace()) |
|
9944 { |
|
9945 SetFlag(EFlagEditorFull); |
|
9946 } |
|
9947 else |
|
9948 { |
|
9949 ClearFlag(EFlagEditorFull); |
|
9950 } |
|
9951 } |
|
9952 } |
|
9953 else if (IsFlagSet(EFlagInsideInlineEditingTransaction) |
|
9954 && !iInputCapabilities.SupportsSecretText()) |
|
9955 { |
|
9956 // Chinese languages seem not to support this |
|
9957 if ( !IsChineseInputLanguage() && |
|
9958 (iUncommittedText.Length() == 0 || |
|
9959 ( |
|
9960 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
9961 !IsAutoCompleteOn() && |
|
9962 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
9963 !EditorSupportsNeutralProtection() |
|
9964 ) |
|
9965 ) |
|
9966 ) |
|
9967 |
|
9968 { // empty insertions need no resolution. |
|
9969 /*Hindi*/ |
|
9970 if( (TAknFepUiIndicInputManager :: IsIndicLangauge( |
|
9971 TLanguage(iLanguageCapabilities.iInputLanguageCode))) |
|
9972 #ifdef RD_HINDI_PHONETIC_INPUT |
|
9973 || ( TAknFepUiIndicInputManager :: IsIndicPhoneticLanguage( |
|
9974 TLanguage(iLanguageCapabilities.iInputLanguageCode)) ) |
|
9975 #endif |
|
9976 ) |
|
9977 { |
|
9978 // NOTE! Need to get cursor visibility information from some where. |
|
9979 CommitInlineEditWithoutResolutionL( *(iInputCapabilities.FepAwareTextEditor()), |
|
9980 ETrue, EFalse); |
|
9981 } |
|
9982 else |
|
9983 { |
|
9984 // NOTE! Need to get cursor visibility information from some where. |
|
9985 CommitInlineEditWithoutResolutionL( *(iInputCapabilities.FepAwareTextEditor()), |
|
9986 ETrue); |
|
9987 } |
|
9988 } |
|
9989 else |
|
9990 { |
|
9991 |
|
9992 //note secret text editors do not use the MCoeFepAwareTextEditor interface, |
|
9993 //we only need to clear the flags to 'commit' a character |
|
9994 |
|
9995 __ASSERT_DEBUG(iInputCapabilities.FepAwareTextEditor(), |
|
9996 AknFepPanic(EAknFepPanicNoHandleToFepAwareTextEditor)); |
|
9997 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
9998 |
|
9999 TBool showCursor = ETrue; |
|
10000 if (IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) || |
|
10001 IsCcpuFlagSet(ECcpuStateLosingFocus)) |
|
10002 { |
|
10003 showCursor = EFalse; |
|
10004 } |
|
10005 else |
|
10006 { |
|
10007 if(IsKoreanInputLanguage( ) && !IsQwerty() && |
|
10008 IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) |
|
10009 { |
|
10010 showCursor = EFalse; |
|
10011 } |
|
10012 } |
|
10013 |
|
10014 iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL(showCursor); |
|
10015 ClearFlag(EFlagInsideInlineEditingTransaction); |
|
10016 iInputCapabilities.FepAwareTextEditor()->CommitFepInlineEditL(*coeEnv); |
|
10017 |
|
10018 // Arabic & Hebrew required functionality added ----> |
|
10019 if (IsFlagSet(EFlagInsideMultitapInlineEditingTransaction)) // Condition added for AknFep. |
|
10020 { |
|
10021 // 3 * as each original character can potentially take 2 markers |
|
10022 HBufC* decoratedTextBuf = HBufC::NewLC(KMaxInlineEditSize + 2); // +2 to accommodate previous and next charcaters |
|
10023 TPtr decoratedText = decoratedTextBuf->Des(); |
|
10024 // Resolve in a slightly wider range than the new text. Attempt to expand 1 character in each direction |
|
10025 TCursorSelection resolveSpan(iUncommittedText.HigherPos(), |
|
10026 iUncommittedText.LowerPos()); |
|
10027 TInt decCursor = 0; |
|
10028 |
|
10029 // Gets the CPlainText object from the focused editor if it exists. |
|
10030 CPlainText* plainText = PlainText(); |
|
10031 TBool containsTextField = EFalse; |
|
10032 if (resolveSpan.iAnchorPos > 0) |
|
10033 { |
|
10034 if (plainText) |
|
10035 { |
|
10036 // Check if surrounding document position contains text field. |
|
10037 containsTextField = plainText->FindFields(resolveSpan.iAnchorPos - 1); |
|
10038 } |
|
10039 TBuf<ESingleCharacter> chDes; |
|
10040 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep( chDes, |
|
10041 resolveSpan.iAnchorPos - 1, ESingleCharacter); |
|
10042 if ( chDes.Length() != 0 && chDes[0] != CEditableText::EPictureCharacter && !containsTextField) |
|
10043 { |
|
10044 // Resolve span is not extended if surrounding character is picture character or it |
|
10045 // contains text field. Text field data would be lost when FEP replaces existing editor |
|
10046 // content with new text buffer content that does not have text field data. |
|
10047 // ResolveDecoratedText() call does not handle these special cases which can has some |
|
10048 // effects to Arabic & Hebrew text rendering. |
|
10049 resolveSpan.iAnchorPos--; |
|
10050 } |
|
10051 } |
|
10052 if (resolveSpan.iCursorPos < |
|
10053 iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep()) |
|
10054 { |
|
10055 containsTextField = EFalse; |
|
10056 if (plainText) |
|
10057 { |
|
10058 // Check if surrounding document position contains text fields. |
|
10059 containsTextField = plainText->FindFields(resolveSpan.iCursorPos); |
|
10060 } |
|
10061 TBuf<ESingleCharacter> chDes; |
|
10062 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep( chDes, |
|
10063 resolveSpan.iCursorPos, ESingleCharacter); |
|
10064 if ( chDes.Length() != 0 && chDes[0] != CEditableText::EPictureCharacter && !containsTextField) |
|
10065 { |
|
10066 // Resolve span is not extended if surrounding character is picture character or it |
|
10067 // contains text field. Text field data would be lost when FEP replaces existing editor |
|
10068 // content with new text buffer content that does not have text field data. |
|
10069 // ResolveDecoratedText() call does not handle these special cases which can has some |
|
10070 // effect to Arabic & Hebrew text rendering. |
|
10071 resolveSpan.iCursorPos++; |
|
10072 decCursor++; |
|
10073 } |
|
10074 } |
|
10075 |
|
10076 // resolveSpan has been widened. Now go get the text for that span. |
|
10077 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(decoratedText, |
|
10078 resolveSpan.iAnchorPos, resolveSpan.Length()); |
|
10079 |
|
10080 if ( decoratedText.Length() != resolveSpan.Length() ) |
|
10081 { |
|
10082 // This assert checks is we have failed to retrieve enough text. Should not happen |
|
10083 // __ASSERT_DEBUG( decoratedText.Length() == resolveSpan.Length(), Panic(EEikPanicT9CharPosOutOfRange) ); |
|
10084 // Abondon the resolution. |
|
10085 |
|
10086 iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL( ETrue ); |
|
10087 } |
|
10088 else |
|
10089 { |
|
10090 TInt lowerOffset = iUncommittedText.LowerPos() - resolveSpan.LowerPos(); |
|
10091 |
|
10092 TBool needsResolving = iInlineTextDecorator->ResolveDecoratedText(decoratedText, |
|
10093 TCursorSelection(lowerOffset, lowerOffset + iUncommittedText.Length())); |
|
10094 |
|
10095 if ( needsResolving ) |
|
10096 { |
|
10097 TBool setToTrue=EFalse; |
|
10098 iInputCapabilities.FepAwareTextEditor()->Extension1()->StartFepInlineEditL( |
|
10099 setToTrue, |
|
10100 resolveSpan, |
|
10101 decoratedText, |
|
10102 decoratedText.Length() - decCursor, |
|
10103 EFalse, |
|
10104 0, // MFormCustomDrawer* |
|
10105 *this, |
|
10106 *this); |
|
10107 |
|
10108 iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL( ETrue ); |
|
10109 if (IsFeatureSupportedJapanese()) |
|
10110 { |
|
10111 // need to call clear buffer of PtiEngine for Japanese varint |
|
10112 // before calling second CommitFepInlineEditL(). |
|
10113 // because the committed string is set as reading string twice |
|
10114 iPtiEngine->ClearCurrentWord(); |
|
10115 } |
|
10116 iInputCapabilities.FepAwareTextEditor()->CommitFepInlineEditL(*coeEnv); |
|
10117 } |
|
10118 else |
|
10119 { |
|
10120 // Line cursor is made invisible here. There is no line cursor in S60 LAF, even though there is |
|
10121 // an Edwin flag which govern this. See CEikEdwin::SetCursorVisibilityL(TBool) |
|
10122 // Cursor is not set if this CommitInlineEditL call was prompted when losing focus. |
|
10123 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
10124 |
|
10125 // Use FepAwareTextEditor to judge, not use TextView() |
|
10126 if ( (docNavi || FepAwareTextEditor()) && !IsCcpuFlagSet(ECcpuStateLosingFocus) ) |
|
10127 { |
|
10128 if (docNavi) |
|
10129 { |
|
10130 docNavi->SetCursorVisibilityL( TCursor::EFCursorInvisible, |
|
10131 TCursor::EFCursorFlashing ); |
|
10132 } |
|
10133 else |
|
10134 { |
|
10135 //Use Edwin (FepAwareTextEditor) to set cursor visibility |
|
10136 FepAwareTextEditor()->SetInlineEditingCursorVisibilityL( ETrue ); |
|
10137 } |
|
10138 } |
|
10139 } |
|
10140 } |
|
10141 // iMatchState=EWordMatchFirst; |
|
10142 |
|
10143 CleanupStack::PopAndDestroy(); // decoratedTextBuf |
|
10144 } |
|
10145 if (iInputCapabilities.FepAwareTextEditor()) |
|
10146 { |
|
10147 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
10148 } |
|
10149 |
|
10150 iCaseMan->UpdateCase(ENullNaviEvent); |
|
10151 // <---- Arabic & Hebrew required functionality added |
|
10152 if (!EditorHasFreeSpace()) |
|
10153 { |
|
10154 SetFlag(EFlagEditorFull); |
|
10155 } |
|
10156 else |
|
10157 { |
|
10158 ClearFlag(EFlagEditorFull); |
|
10159 } |
|
10160 } |
|
10161 } |
|
10162 else if (IsFlagSet(EFlagInsideInlineEditingTransaction) |
|
10163 && iInputCapabilities.SupportsSecretText()) |
|
10164 { |
|
10165 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
10166 iInputCapabilities.FepAwareTextEditor()->CommitFepInlineEditL(*coeEnv); |
|
10167 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
10168 |
|
10169 if (iQwertyInputMode) |
|
10170 { |
|
10171 // Case may need to updated automatically in case of qwerty secret text editor |
|
10172 // beause of the sticky shift feature. |
|
10173 if (iCaseMan->CurrentCase() == EAknEditorLowerCase) |
|
10174 { |
|
10175 SetCase(ELowerCase); |
|
10176 } |
|
10177 else |
|
10178 { |
|
10179 SetCase(EUpperCase); |
|
10180 } |
|
10181 UpdateIndicators(); |
|
10182 } |
|
10183 } |
|
10184 } |
|
10185 |
|
10186 // SendEventsToPluginManL( EPluginSyncFepAwareText, EPluginSyncUpdatedText ); |
|
10187 |
|
10188 ClearFlag(EFlagInsideMultitapInlineEditingTransaction | EFlagInsideInlineEditingTransaction | |
|
10189 EFlagLineFeedCharacter | EFlagLastCharacterInEditor | EFlagSpaceCharacter | |
|
10190 EFlagFullWidthSpaceCharacter); |
|
10191 |
|
10192 // No-edit_key devices: Inline editing ending, allow edit-menu again. |
|
10193 ClearCcpuFlag(ECcpuStateIgnoreStarUp | ECcpuStateNewPredictiveWord); |
|
10194 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
10195 iUncommittedText.iCursorPos=0; |
|
10196 iUncommittedText.iAnchorPos=0; |
|
10197 #endif |
|
10198 if (!iInputCapabilities.FepAwareTextEditor()) |
|
10199 { |
|
10200 // In case while updating the inline edit, 3rd party app removes the focus out of editor before the transaction |
|
10201 // completes, we return with an error. |
|
10202 User::Leave(KErrCorrupt); |
|
10203 } |
|
10204 |
|
10205 } |
|
10206 |
|
10207 void CAknFepManager::CommitInlineEditL(const TDesC& aText, TInt aUncommitedTextChange) |
|
10208 { |
|
10209 if (iMode == EHiraganaKanji) |
|
10210 { |
|
10211 // When there is not enough editing space to enter the selected candidate, |
|
10212 // the error tone is played. |
|
10213 if ((iFreeSpaceOfEditor > 0) && (iFreeSpaceOfEditor < aText.Length())) |
|
10214 { |
|
10215 PlaySound(EAvkonSIDErrorTone); |
|
10216 } |
|
10217 } |
|
10218 |
|
10219 //maxLength of 0 means the editor has no limit |
|
10220 TInt maxEdSize = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep(); |
|
10221 if ( maxEdSize != 0 && iFreeSpaceOfEditor < aText.Length()) |
|
10222 { |
|
10223 TPtrC charbuf = aText.Left(iFreeSpaceOfEditor); |
|
10224 TInt uncommitedTextChange = charbuf.Length(); |
|
10225 UpdateInlineEditL(charbuf, uncommitedTextChange); |
|
10226 } |
|
10227 else |
|
10228 { |
|
10229 UpdateInlineEditL(aText, aUncommitedTextChange); |
|
10230 } |
|
10231 |
|
10232 ClearFlag(EFlagInsideMultitapInlineEditingTransaction); |
|
10233 CommitInlineEditL(); |
|
10234 } |
|
10235 |
|
10236 void CAknFepManager::CancelInlineEdit() |
|
10237 { |
|
10238 if( !EditorState()->CurrentInlineEditSpan().Length() ) |
|
10239 { |
|
10240 ClearFlag(EFlagInsideInlineEditingTransaction); |
|
10241 if(IsFlagSet(CAknFepManager::EFlagNoMatches)) |
|
10242 { |
|
10243 ClearFlag(CAknFepManager::EFlagNoMatches); |
|
10244 } |
|
10245 } |
|
10246 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
10247 { |
|
10248 TRAP_IGNORE(TryRemoveNoMatchesIndicatorL()); |
|
10249 |
|
10250 if (iInputCapabilities.SupportsSecretText()) |
|
10251 { |
|
10252 TRAP_IGNORE(SimulateKeyEventL(EKeyF20)); // backspace to delete previous char in secret text editor |
|
10253 } |
|
10254 else if (IsFeatureSupportedJapanese() |
|
10255 && iFepManState == EAknFepStateUIActive) |
|
10256 { |
|
10257 FepUI()->CloseUI(); |
|
10258 FepUI()->ExpireMultitapTimer(); |
|
10259 iPtiEngine->ClearCurrentWord(); |
|
10260 SyncStates(EAknFepStateInitial); |
|
10261 } |
|
10262 } |
|
10263 |
|
10264 iUncommittedText.iCursorPos=0; |
|
10265 |
|
10266 iUncommittedText.iAnchorPos=0; |
|
10267 |
|
10268 iInputCapabilities.FepAwareTextEditor()->CancelFepInlineEdit(); |
|
10269 ClearFlag(EFlagInsideMultitapInlineEditingTransaction | EFlagInsideInlineEditingTransaction |
|
10270 | EFlagLineFeedCharacter | EFlagSpaceCharacter | EFlagFullWidthSpaceCharacter); |
|
10271 ClearCcpuFlag(ECcpuStateNewPredictiveWord); |
|
10272 } |
|
10273 |
|
10274 void CAknFepManager::GetScreenCoordinatesL(TPoint& aLeftSideOfBaseLine, TInt& aHeight, |
|
10275 TInt& aAscent, TInt aDocumentOffset) |
|
10276 { |
|
10277 TCursorSelection cursorSelection; |
|
10278 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSelection); |
|
10279 TInt documentPosition = cursorSelection.LowerPos() - aDocumentOffset; |
|
10280 if (documentPosition < 0) |
|
10281 documentPosition = 0; |
|
10282 iInputCapabilities.FepAwareTextEditor()->GetScreenCoordinatesForFepL(aLeftSideOfBaseLine, |
|
10283 aHeight, aAscent, documentPosition); |
|
10284 } |
|
10285 |
|
10286 void CAknFepManager::GetScreenCoordinatesL(TPoint& aLeftSideOfBaseLine, |
|
10287 TInt& aHeight, TInt& aAscent) |
|
10288 { |
|
10289 TCursorSelection cursorSelection; |
|
10290 MCoeFepAwareTextEditor* fepAwareTextEditor = iInputCapabilities.FepAwareTextEditor(); |
|
10291 |
|
10292 fepAwareTextEditor->GetCursorSelectionForFep(cursorSelection); |
|
10293 fepAwareTextEditor->GetScreenCoordinatesForFepL(aLeftSideOfBaseLine, aHeight, aAscent, |
|
10294 cursorSelection.LowerPos()); |
|
10295 } |
|
10296 |
|
10297 TBool CAknFepManager::EditorHasFreeSpace( TInt aRequiredNumberOfCharacter ) const |
|
10298 { |
|
10299 TBool unlimit = EFalse; |
|
10300 TInt freeSpace = 0; |
|
10301 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
10302 if(WesternPredictive()) |
|
10303 { |
|
10304 freeSpace = EditorFreeSpaceForAutoWordCompletion(unlimit); |
|
10305 } |
|
10306 else |
|
10307 { |
|
10308 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
10309 freeSpace = EditorFreeSpace(unlimit); |
|
10310 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
10311 } |
|
10312 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
10313 if( unlimit || freeSpace > aRequiredNumberOfCharacter ) |
|
10314 { |
|
10315 return ETrue; |
|
10316 } |
|
10317 return EFalse; |
|
10318 } |
|
10319 |
|
10320 // ----------------------------------------------------------------------------- |
|
10321 // check whether the current editor is a Java secret editor |
|
10322 // ----------------------------------------------------------------------------- |
|
10323 TBool CAknFepManager::IsJavaSecretEditor() |
|
10324 { |
|
10325 TBool JavaSecretEditor = EFalse; |
|
10326 |
|
10327 TUint ConstraintValue = 0; |
|
10328 MObjectProvider* mop = iInputCapabilities.ObjectProvider(); |
|
10329 |
|
10330 if ( mop ) |
|
10331 { |
|
10332 CAknExtendedInputCapabilities* extendedInputCapabilities = |
|
10333 mop->MopGetObject( extendedInputCapabilities ); |
|
10334 if ( extendedInputCapabilities && iInputCapabilities.FepAwareTextEditor() ) |
|
10335 { |
|
10336 ConstraintValue = extendedInputCapabilities->MIDPConstrainst(); |
|
10337 } |
|
10338 } |
|
10339 if( ConstraintValue & 0x10000 ) |
|
10340 { |
|
10341 JavaSecretEditor = ETrue; |
|
10342 } |
|
10343 |
|
10344 return JavaSecretEditor; |
|
10345 } |
|
10346 |
|
10347 TBool CAknFepManager::IsEditorHasFreeSpace() const |
|
10348 { |
|
10349 TBool unlimit = EFalse; |
|
10350 TInt freeSpace = 0; |
|
10351 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
10352 if(WesternPredictive()) |
|
10353 { |
|
10354 freeSpace = EditorFreeSpaceForAutoWordCompletion(unlimit); |
|
10355 } |
|
10356 else |
|
10357 { |
|
10358 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
10359 freeSpace = EditorFreeSpace(unlimit); |
|
10360 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
10361 } |
|
10362 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
10363 if( unlimit || freeSpace > 0 ) |
|
10364 { |
|
10365 return ETrue; |
|
10366 } |
|
10367 return EFalse; |
|
10368 } |
|
10369 |
|
10370 TInt CAknFepManager::EditorFreeSpace(TBool& aUnlimit, |
|
10371 TBool isToCountUncommittedTextLength /*= EFalse */) const |
|
10372 { |
|
10373 aUnlimit = EFalse; |
|
10374 |
|
10375 if (!iInputCapabilities.FepAwareTextEditor()) |
|
10376 { |
|
10377 //no handle to MCoeFepAwareTextEditor in non Edwin derived editors |
|
10378 return 0; |
|
10379 } |
|
10380 |
|
10381 //maxLength of 0 means the editor has no limit |
|
10382 TInt maxEdSize = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep(); |
|
10383 TCursorSelection currentSelection; |
|
10384 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(currentSelection); |
|
10385 |
|
10386 aUnlimit = (maxEdSize == 0 || ((iAknEditorFlags & EAknEditorFlagMTAutoOverwrite) && |
|
10387 (currentSelection.iCursorPos >= 0 && |
|
10388 currentSelection.iCursorPos < maxEdSize) )); |
|
10389 if(aUnlimit) |
|
10390 { |
|
10391 return 0; |
|
10392 } |
|
10393 |
|
10394 TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
10395 |
|
10396 if( isToCountUncommittedTextLength ) |
|
10397 { |
|
10398 return ( maxEdSize - edSize + |
|
10399 currentSelection.Length() + UncommittedText().Length() ); |
|
10400 } |
|
10401 |
|
10402 return (maxEdSize - edSize + currentSelection.Length()); |
|
10403 |
|
10404 } |
|
10405 |
|
10406 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
10407 TInt CAknFepManager::EditorFreeSpaceForAutoWordCompletion(TBool& aUnlimit, |
|
10408 TBool /* isToCountUncommittedTextLength = EFalse*/ ) const |
|
10409 { |
|
10410 aUnlimit = EFalse; |
|
10411 |
|
10412 if (!iInputCapabilities.FepAwareTextEditor()) |
|
10413 { |
|
10414 //no handle to MCoeFepAwareTextEditor in non Edwin derived editors |
|
10415 return 0; |
|
10416 } |
|
10417 |
|
10418 //maxLength of 0 means the editor has no limit |
|
10419 TInt maxEdSize = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep(); |
|
10420 TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
10421 TInt keySequenceLength = iPtiEngine->CurrentInputSequence().Length(); |
|
10422 TCursorSelection currentSelectionOrUncommitted; |
|
10423 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(currentSelectionOrUncommitted); |
|
10424 |
|
10425 aUnlimit = (maxEdSize == 0 || ((iAknEditorFlags & EAknEditorFlagMTAutoOverwrite) && |
|
10426 (currentSelectionOrUncommitted.iCursorPos >= 0 && |
|
10427 currentSelectionOrUncommitted.iCursorPos < maxEdSize) )); |
|
10428 if(aUnlimit) |
|
10429 { |
|
10430 return 0; |
|
10431 } |
|
10432 else |
|
10433 { |
|
10434 |
|
10435 if ( !iQwertyInputMode ) |
|
10436 { |
|
10437 return ( maxEdSize - edSize + currentSelectionOrUncommitted.Length() ); |
|
10438 } |
|
10439 else |
|
10440 { |
|
10441 // In the predictive QWERTY mode, the keySequenceLength doesn't necessarily have anything |
|
10442 // to do with the amount of characters on screen. At least entering accented characters with |
|
10443 // Chr-multitapping will increase the key sequence length although number of characters |
|
10444 // doesn't change (this is either bug or feature of ZiCore). Ask the auto-completion |
|
10445 // length directly from PtiEngine instead of trying to calculate it on our own. |
|
10446 TInt tailLength = 0; |
|
10447 TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength )); |
|
10448 if( tailLength < 0 ) |
|
10449 { |
|
10450 tailLength = 0; |
|
10451 } |
|
10452 return (maxEdSize - edSize + currentSelectionOrUncommitted.Length() + tailLength); |
|
10453 } |
|
10454 } |
|
10455 } |
|
10456 #endif |
|
10457 #ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ |
|
10458 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
10459 |
|
10460 TInt CAknFepManager::DocumentLength() const |
|
10461 { |
|
10462 TInt ret = 0; |
|
10463 if ( iInputCapabilities.FepAwareTextEditor() ) |
|
10464 { |
|
10465 ret = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
10466 } |
|
10467 return ret; |
|
10468 } |
|
10469 |
|
10470 TBool CAknFepManager::KeyEventWillReplaceCharacter( const TKeyEvent& aKeyEvent ) |
|
10471 { |
|
10472 // The function is currently used only in QWERTY mode. It might not work correctly |
|
10473 // with ITU-T input. |
|
10474 TBool ret = EFalse; |
|
10475 if ( IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) ) |
|
10476 { |
|
10477 // Multitapping |
|
10478 ret = ETrue; |
|
10479 } |
|
10480 else if ( aKeyEvent.iRepeats && |
|
10481 LongPressNumberEntryOnQwerty() && |
|
10482 FnKeyState() == CAknFepFnKeyManager::EFnKeyNone && |
|
10483 KeyMapsDifferentCharacterWithFn( (TPtiKey)aKeyEvent.iScanCode ) ) |
|
10484 { |
|
10485 // QWERTY key long press producing another charcter |
|
10486 ret = ETrue; |
|
10487 } |
|
10488 return ret; |
|
10489 } |
|
10490 #endif |
|
10491 #endif |
|
10492 TChar CAknFepManager::CurrentDecimalSeparator() const |
|
10493 { |
|
10494 TLocale tLoc; |
|
10495 return tLoc.DecimalSeparator(); |
|
10496 } |
|
10497 |
|
10498 void CAknFepManager::ConfigureFEPFromEditorStateL() |
|
10499 { |
|
10500 User::LeaveIfError(SyncStates(EAknFepStateInitial)); |
|
10501 |
|
10502 CAknEdwinState* editorState = EditorState(); |
|
10503 TInt editorMode = editorState->CurrentInputMode(); |
|
10504 TInt sharedDataMode = iSharedDataInterface->InputMode(); |
|
10505 TBool latinCaseSet = EFalse; |
|
10506 iPermittedInputModes = editorState->PermittedInputModes(); |
|
10507 TInt defaultInputMode = editorState->DefaultInputMode(); |
|
10508 if(iAknEditorFlags != editorState->Flags()) |
|
10509 { |
|
10510 iAknEditorFlags = editorState->Flags(); |
|
10511 UpdateLocalDigitMode(); |
|
10512 } |
|
10513 iAknEditorNumericKeymap = editorState->NumericKeymap(); |
|
10514 |
|
10515 TLanguage localLanguage = ELangTest; |
|
10516 if (GetLocalLanguage( localLanguage ) ) |
|
10517 { |
|
10518 iLanguageCapabilities.iLocalInputLanguageInUse = ETrue; |
|
10519 if ( localLanguage != iLanguageCapabilities.iInputLanguageCode ) |
|
10520 { |
|
10521 ChangeInputLanguageL(localLanguage); |
|
10522 } |
|
10523 } |
|
10524 else if (iLanguageCapabilities.iLocalInputLanguageInUse) |
|
10525 { |
|
10526 ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage()); |
|
10527 iLanguageCapabilities.iLocalInputLanguageInUse = EFalse; |
|
10528 ClearFlag(EFlagNewSharedDataInputMode); |
|
10529 } |
|
10530 |
|
10531 if (IsFlagSet(EFlagNewSharedDataInputLanguage) ) |
|
10532 { |
|
10533 //Global mode or input language has been changed in general settings |
|
10534 if ( !iLanguageCapabilities.iLocalInputLanguageInUse) |
|
10535 { |
|
10536 ChangeInputLanguageL(iSharedDataInterface->InputTextLanguage()); |
|
10537 } |
|
10538 ClearFlag(EFlagNewSharedDataInputLanguage); |
|
10539 } |
|
10540 |
|
10541 if (IsFeatureSupportedJapanese()) |
|
10542 { |
|
10543 // set Japanese predicitve ON/OFF |
|
10544 if (iAknEditorFlags & EAknEditorFlagNoT9) |
|
10545 { |
|
10546 iJapanesePredictive = EFalse; |
|
10547 } |
|
10548 else |
|
10549 { |
|
10550 // Is it supported Japanese predictive input |
|
10551 if (HasJapanesePredictionInputMode()) |
|
10552 { |
|
10553 iJapanesePredictive = iSharedDataInterface->PredictiveTextJapaneseOn(); |
|
10554 } |
|
10555 else |
|
10556 { |
|
10557 // if Predictive Japanese input isn't supported in PtiEngine, set to OFF. |
|
10558 iJapanesePredictive = EFalse; |
|
10559 iSharedDataInterface->ResetJapanesePredictiveTextOn(); |
|
10560 } |
|
10561 } |
|
10562 |
|
10563 // In Japanese variant, EAknEditorTextInputMode of allow input mode |
|
10564 // means all input mode. |
|
10565 if (iPermittedInputModes & EAknEditorTextInputMode) |
|
10566 { |
|
10567 iPermittedInputModes |= (EAknEditorKatakanaInputMode | |
|
10568 EAknEditorHalfWidthTextInputMode | |
|
10569 EAknEditorFullWidthTextInputMode | |
|
10570 EAknEditorFullWidthNumericInputMode | |
|
10571 EAknEditorFullWidthKatakanaInputMode | |
|
10572 EAknEditorHiraganaKanjiInputMode | |
|
10573 EAknEditorHiraganaInputMode); |
|
10574 } |
|
10575 |
|
10576 if (iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) |
|
10577 { |
|
10578 if (iPermittedInputModes == EAknEditorNumericInputMode) |
|
10579 { |
|
10580 iPermittedInputModes = EAknEditorNumericInputMode; |
|
10581 } |
|
10582 else if (iPermittedInputModes & EAknEditorNumericInputMode) |
|
10583 { |
|
10584 iPermittedInputModes = (EAknEditorHalfWidthTextInputMode |
|
10585 | EAknEditorNumericInputMode); |
|
10586 } |
|
10587 else |
|
10588 { |
|
10589 iPermittedInputModes = EAknEditorHalfWidthTextInputMode; |
|
10590 } |
|
10591 } |
|
10592 |
|
10593 if (editorMode) |
|
10594 { |
|
10595 editorMode = ConfigureFepModeFromEditorMode(editorMode); |
|
10596 } |
|
10597 else // for new editors |
|
10598 { |
|
10599 iCharWidth = EHalfWidthChar; |
|
10600 sharedDataMode = EHiraganaKanji; |
|
10601 // First input mode is changed to Latin from Hiragana/Kanji |
|
10602 // if display language is English. |
|
10603 TInt dispLang = iSharedDataInterface->DisplayLanguage(); |
|
10604 // ELangTest means Automatic as display language in GS |
|
10605 if (dispLang == ELangTest) |
|
10606 { |
|
10607 // UiLanguage isn't Japanese, Latin is set. |
|
10608 if (iUiLanguage != ELangJapanese) |
|
10609 { |
|
10610 sharedDataMode = ELatin; |
|
10611 } |
|
10612 } |
|
10613 else if (dispLang != ELangJapanese) |
|
10614 { |
|
10615 // Display language isn't Japanese, Latin is set. |
|
10616 sharedDataMode = ELatin; |
|
10617 } |
|
10618 |
|
10619 if (!(iPermittedInputModes & EAknEditorHiraganaKanjiInputMode)) |
|
10620 { |
|
10621 if (IsOnlyFullWidthCharacterPermitted()) |
|
10622 { |
|
10623 iCharWidth = EFullWidthChar; |
|
10624 } |
|
10625 else if (IsOnlyHalfWidthCharacterPermitted()) |
|
10626 { |
|
10627 iCharWidth = EHalfWidthChar; |
|
10628 } |
|
10629 |
|
10630 if (iPermittedInputModes & (EAknEditorKatakanaInputMode | |
|
10631 EAknEditorFullWidthKatakanaInputMode)) |
|
10632 { |
|
10633 // In case setting Latin as above, Latin is used preferentially. |
|
10634 if (sharedDataMode == ELatin |
|
10635 && (iPermittedInputModes & |
|
10636 (EAknEditorHalfWidthTextInputMode | EAknEditorFullWidthTextInputMode))) |
|
10637 { |
|
10638 sharedDataMode = ELatin; |
|
10639 } |
|
10640 else |
|
10641 { |
|
10642 sharedDataMode = EKatakana; |
|
10643 } |
|
10644 } |
|
10645 else if (iPermittedInputModes & (EAknEditorHalfWidthTextInputMode | |
|
10646 EAknEditorFullWidthTextInputMode)) |
|
10647 { |
|
10648 sharedDataMode = ELatin; |
|
10649 } |
|
10650 else if (iPermittedInputModes & (EAknEditorNumericInputMode | |
|
10651 EAknEditorFullWidthNumericInputMode)) |
|
10652 { |
|
10653 sharedDataMode = ENumber; |
|
10654 } |
|
10655 // First input mode is changed to latin from katakana |
|
10656 // if display language is English. |
|
10657 if (!(dispLang == ELangTest || dispLang == ELangJapanese)) |
|
10658 { |
|
10659 if ((iPermittedInputModes & EAknEditorKatakanaInputMode) && |
|
10660 (iPermittedInputModes & EAknEditorHalfWidthTextInputMode)) |
|
10661 { |
|
10662 sharedDataMode = ELatin; |
|
10663 } |
|
10664 |
|
10665 if ((iPermittedInputModes & EAknEditorKatakanaInputMode) && |
|
10666 (iPermittedInputModes & EAknEditorFullWidthTextInputMode)) |
|
10667 { |
|
10668 sharedDataMode = ELatin; |
|
10669 } |
|
10670 } |
|
10671 } |
|
10672 } |
|
10673 } |
|
10674 else // for other variants (western or chinese) |
|
10675 { |
|
10676 if (!(iPermittedInputModes & (EAknEditorTextInputMode | EAknEditorNumericInputMode |
|
10677 | EAknEditorSecretAlphaInputMode))) |
|
10678 { |
|
10679 // Any latin input mode is not permitted by the editor. |
|
10680 // For compatibility permitted japanese input modes are checked and |
|
10681 // corresponding latin input modes are allowed. |
|
10682 if ( iPermittedInputModes & ( EAknEditorKatakanaInputMode | |
|
10683 EAknEditorHalfWidthTextInputMode | |
|
10684 EAknEditorFullWidthTextInputMode | |
|
10685 EAknEditorFullWidthKatakanaInputMode | |
|
10686 EAknEditorHiraganaKanjiInputMode | |
|
10687 EAknEditorHiraganaInputMode |
|
10688 | EAknEditorHangulInputMode ) ) |
|
10689 { |
|
10690 iPermittedInputModes |= EAknEditorTextInputMode; |
|
10691 } |
|
10692 if ( iPermittedInputModes & EAknEditorFullWidthNumericInputMode ) |
|
10693 { |
|
10694 iPermittedInputModes |= EAknEditorNumericInputMode; |
|
10695 } |
|
10696 |
|
10697 if ( !(defaultInputMode & (EAknEditorTextInputMode | EAknEditorNumericInputMode))) |
|
10698 { |
|
10699 if ( defaultInputMode & ( EAknEditorKatakanaInputMode | |
|
10700 EAknEditorHalfWidthTextInputMode| |
|
10701 EAknEditorFullWidthTextInputMode | |
|
10702 EAknEditorFullWidthKatakanaInputMode | |
|
10703 EAknEditorHiraganaKanjiInputMode | |
|
10704 EAknEditorHiraganaInputMode |
|
10705 | EAknEditorHangulInputMode ) ) |
|
10706 { |
|
10707 defaultInputMode = EAknEditorTextInputMode; |
|
10708 } |
|
10709 else if (defaultInputMode & EAknEditorFullWidthNumericInputMode) |
|
10710 { |
|
10711 defaultInputMode = EAknEditorNumericInputMode; |
|
10712 } |
|
10713 } |
|
10714 } |
|
10715 } |
|
10716 |
|
10717 // object provider items |
|
10718 iEditMenuBar = NULL; |
|
10719 editorState->SetMenu(); |
|
10720 editorState->SetCba(); |
|
10721 |
|
10722 #ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__ |
|
10723 iOptionsMenuBar = NULL; |
|
10724 #endif |
|
10725 |
|
10726 SetWesternPredictive(iSharedDataInterface->PredictiveTextOn()); |
|
10727 //check that we don't have a Chinese find mode saved to an editor that is |
|
10728 //not a Chinese find pane |
|
10729 __ASSERT_DEBUG( !((editorMode == EZhuyinFind || editorMode == EStrokeFind) && |
|
10730 !(iAknEditorFlags & EAknEditorFlagForceTransparentFepModes)) |
|
10731 , AknFepPanic(EAknFepPanicFindModeSavedToNonFindEditor)); |
|
10732 |
|
10733 ReadHashKeyLoopL(); |
|
10734 |
|
10735 UpdateNumericEditorDigitType(); |
|
10736 if ( IsMfneEditor() ) |
|
10737 { |
|
10738 UpdateLocalDigitMode(); |
|
10739 } |
|
10740 |
|
10741 if (editorMode) //should be an editor that has been used before |
|
10742 { |
|
10743 if (IsFlagSet(EFlagNewSharedDataInputMode) && (IsModePermitted(sharedDataMode)) && !IsKoreanInputLanguage() |
|
10744 && (!(iAknEditorFlags & EAknEditorFlagForceTransparentFepModes))) |
|
10745 { |
|
10746 |
|
10747 { |
|
10748 //change to global mode, except in Find Pane, where we ignore |
|
10749 //GS setting |
|
10750 TryChangeModeL(sharedDataMode); |
|
10751 ClearFlag(EFlagNewSharedDataInputMode); |
|
10752 latinCaseSet = sharedDataMode & (ELatinUpper | ELatinLower); |
|
10753 if (sharedDataMode == ELatinText) |
|
10754 { |
|
10755 editorState->SetFlags( editorState->Flags() & ~EFlagSupressAutoUpdate ); |
|
10756 } |
|
10757 } |
|
10758 } |
|
10759 |
|
10760 // Next two cases are apps/UI intitialinsg their editors in the |
|
10761 // with the modes defined in uikon.hrh, change these to an appropriate |
|
10762 // FEP mode |
|
10763 else if (editorMode == EAknEditorNumericInputMode) |
|
10764 { |
|
10765 iCharWidth = EHalfWidthChar; |
|
10766 if ( (iMode == ENumber || iMode == ENativeNumber) && |
|
10767 IsModePermitted(iMode)) |
|
10768 { |
|
10769 TryChangeModeL( iMode ); |
|
10770 } |
|
10771 else if ( IsInputModeAvailable(ENativeNumber) && |
|
10772 ( iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic || |
|
10773 iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari || |
|
10774 iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic ) ) |
|
10775 { |
|
10776 TryChangeModeL( ENativeNumber ); |
|
10777 } |
|
10778 else |
|
10779 { |
|
10780 TryChangeModeL( ENumber ); |
|
10781 } |
|
10782 } |
|
10783 else if (editorMode == EAknEditorSecretAlphaInputMode) |
|
10784 { |
|
10785 //this is safe default as it is currently allowed in all FEPs |
|
10786 SetWesternPredictive(EFalse); |
|
10787 TryChangeModeL(ELatin); |
|
10788 } |
|
10789 else if (editorMode == EAknEditorTextInputMode) |
|
10790 { |
|
10791 if (IsKoreanInputLanguage()) |
|
10792 { |
|
10793 if( iMode == EAknEditorNullInputMode ) |
|
10794 { |
|
10795 SetWesternPredictive(EFalse); |
|
10796 TryChangeModeL(EHangul); |
|
10797 } |
|
10798 else |
|
10799 { |
|
10800 TryChangeModeL(ELatin); |
|
10801 } |
|
10802 } |
|
10803 else |
|
10804 { |
|
10805 //this is safe default as it is currently allowed in all FEPs |
|
10806 TryChangeModeL(ELatin); |
|
10807 } |
|
10808 } |
|
10809 else if ( editorMode == EAknEditorHangulInputMode ) |
|
10810 { |
|
10811 // Choose EHangul as the current fep mode |
|
10812 // if the editor mode stored in editor state is EAknEditorHangulInputMode. |
|
10813 TryChangeModeL(EHangul); |
|
10814 } |
|
10815 else if (!iStrokeUsedInQWERTY) |
|
10816 { |
|
10817 if (editorMode == EStroke && sharedDataMode == ECangJie) |
|
10818 { |
|
10819 TryChangeModeL(sharedDataMode); |
|
10820 } |
|
10821 else |
|
10822 { |
|
10823 TryChangeModeL(editorMode); |
|
10824 } |
|
10825 } |
|
10826 else //normal case, use locally stored mode |
|
10827 { |
|
10828 if (editorMode == ECangJie && sharedDataMode == ECangJie && iQwertyInputMode) |
|
10829 { |
|
10830 TryChangeModeL(EStroke); |
|
10831 } |
|
10832 else |
|
10833 { |
|
10834 TryChangeModeL(editorMode); |
|
10835 } |
|
10836 } |
|
10837 } |
|
10838 else if ((iAknEditorFlags & EAknEditorFlagForceTransparentFepModes) |
|
10839 && !IsFeatureSupportedJapanese()) //new find pane |
|
10840 { |
|
10841 // the default chinese find mode is the first mode in the hash key loop, except PrcChinese |
|
10842 if( iLanguageCapabilities.iInputLanguageCode == ELangPrcChinese) |
|
10843 { |
|
10844 // Default searching language shall be ELatin |
|
10845 // Changed from EPinyin to ELatin here |
|
10846 TryChangeModeL(ELatin); |
|
10847 } |
|
10848 else |
|
10849 { |
|
10850 TryChangeModeL(iHashKeyLoop[0]); |
|
10851 } |
|
10852 } |
|
10853 else //new editor |
|
10854 { |
|
10855 if (defaultInputMode == EAknEditorNumericInputMode) |
|
10856 { |
|
10857 //numeric mode is not saved to/retreived from shared data |
|
10858 iCharWidth = EHalfWidthChar; |
|
10859 |
|
10860 if( IsInputModeAvailable(ENativeNumber) && |
|
10861 ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic || |
|
10862 iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic || |
|
10863 iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) ) |
|
10864 { |
|
10865 TryChangeModeL( ENativeNumber ); |
|
10866 } |
|
10867 else |
|
10868 { |
|
10869 TryChangeModeL( ENumber ); |
|
10870 } |
|
10871 } |
|
10872 else if ((defaultInputMode == EAknEditorTextInputMode) && |
|
10873 ((iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) || |
|
10874 (iAknEditorFlags & EAknEditorFlagNoT9))) |
|
10875 { |
|
10876 //Chinese Modes or Western Predictive mode not allowed. |
|
10877 //See if we are ok going to the current shared data mode, |
|
10878 //otherwise go for a safe default |
|
10879 if (TryChangeModeL(sharedDataMode)) |
|
10880 { |
|
10881 latinCaseSet = sharedDataMode & (ELatinUpper | ELatinLower); |
|
10882 } |
|
10883 else |
|
10884 { |
|
10885 TryChangeModeL(ELatin); |
|
10886 } |
|
10887 } |
|
10888 else if (defaultInputMode == EAknEditorHalfWidthTextInputMode) |
|
10889 { |
|
10890 iCharWidth = EHalfWidthChar; |
|
10891 TryChangeModeL(ELatin); |
|
10892 } |
|
10893 else if (defaultInputMode == EAknEditorHiraganaInputMode) |
|
10894 { |
|
10895 TryChangeModeL(EHiragana); |
|
10896 } |
|
10897 else if ( iLanguageCapabilities.iInputLanguageCode == ELangJapanese |
|
10898 && (defaultInputMode == EAknEditorKatakanaInputMode |
|
10899 || defaultInputMode == EAknEditorFullWidthKatakanaInputMode)) |
|
10900 { |
|
10901 iCharWidth = (defaultInputMode == EAknEditorKatakanaInputMode)? |
|
10902 EHalfWidthChar : EFullWidthChar; |
|
10903 TryChangeModeL(EKatakana); |
|
10904 } |
|
10905 else if (defaultInputMode == EAknEditorFullWidthTextInputMode) |
|
10906 { |
|
10907 iCharWidth = EFullWidthChar; |
|
10908 TryChangeModeL(ELatin); |
|
10909 } |
|
10910 else if (defaultInputMode == EAknEditorFullWidthNumericInputMode) |
|
10911 { |
|
10912 iCharWidth = EFullWidthChar; |
|
10913 if( IsInputModeAvailable(ENativeNumber) && |
|
10914 ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic || |
|
10915 iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic || |
|
10916 iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) ) |
|
10917 { |
|
10918 TryChangeModeL( ENativeNumber ); |
|
10919 } |
|
10920 else |
|
10921 { |
|
10922 TryChangeModeL( ENumber ); |
|
10923 } |
|
10924 } |
|
10925 else if (defaultInputMode == EAknEditorTextInputMode |
|
10926 && iLanguageCapabilities.iInputLanguageCode == ELangHindi ) |
|
10927 { |
|
10928 TryChangeModeL( EHindi ); |
|
10929 } |
|
10930 else // Default input mode is EAknEditorTextInputMode |
|
10931 { |
|
10932 // Check possibility move this section on else if |
|
10933 if (IsKoreanInputLanguage()) |
|
10934 { |
|
10935 TryChangeModeL(EHangul); |
|
10936 } |
|
10937 else if (TryChangeModeL(sharedDataMode)) |
|
10938 { |
|
10939 latinCaseSet = sharedDataMode & (ELatinUpper | ELatinLower); |
|
10940 } |
|
10941 else |
|
10942 { |
|
10943 TryChangeModeL(ELatin); |
|
10944 } |
|
10945 |
|
10946 } |
|
10947 } |
|
10948 |
|
10949 if (!iMode) |
|
10950 { |
|
10951 // If mode change wasn't successful, try latin mode as fallback. |
|
10952 TryChangeModeL(ELatin); |
|
10953 } |
|
10954 |
|
10955 // if also fallback fails, panic. |
|
10956 __ASSERT_DEBUG(iMode, AknFepPanic(EAknFepPanicNoPermittedEditorModesAvailable)); |
|
10957 |
|
10958 if (iCaseMan && !latinCaseSet) |
|
10959 { |
|
10960 iCaseMan->ConfigureCaseStateFromEditorState(); |
|
10961 if ( (editorState->Flags() & EFlagSupressAutoUpdate) || |
|
10962 editorMode == EAknEditorSecretAlphaInputMode ) |
|
10963 { |
|
10964 SetFlag(EFlagSupressAutoUpdate); |
|
10965 } |
|
10966 else |
|
10967 { |
|
10968 ClearFlag(EFlagSupressAutoUpdate); |
|
10969 } |
|
10970 } |
|
10971 if ((iAknEditorFlags & EAknEditorFlagForceTransparentFepModes) && |
|
10972 IsChineseInputLanguage() && iCaseMan != NULL ) |
|
10973 { |
|
10974 SetFlag(EFlagSupressAutoUpdate); |
|
10975 iCaseMan->SetCurrentCase(EAknEditorLowerCase); |
|
10976 } |
|
10977 |
|
10978 UpdateEditorContext(); |
|
10979 |
|
10980 // Check if this editor was previously inline editing |
|
10981 if ( WesternPredictive() && editorState->CurrentInlineEditSpan().Length()) |
|
10982 { // restore the fep to an inline editing state |
|
10983 iUncommittedText = editorState->CurrentInlineEditSpan(); |
|
10984 TInt docLenFep=iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
10985 if (iUncommittedText.iCursorPos>docLenFep) |
|
10986 iUncommittedText.iCursorPos=docLenFep; |
|
10987 if (iUncommittedText.iAnchorPos>docLenFep) |
|
10988 iUncommittedText.iAnchorPos=docLenFep; |
|
10989 |
|
10990 TBuf<EMaximumFepWordLength> textToUncommit; |
|
10991 iInputCapabilities.FepAwareTextEditor()-> |
|
10992 GetEditorContentForFep(textToUncommit, iUncommittedText.iAnchorPos, |
|
10993 Min(iUncommittedText.Length(), EMaximumFepWordLength)); |
|
10994 |
|
10995 // Activates western predictive UI to an inline editing state. |
|
10996 FepUI()->ActivateUI(); |
|
10997 SyncStates(EAknFepStateUIActive); |
|
10998 TInt err = iPtiEngine->SetCurrentWord(textToUncommit); |
|
10999 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
11000 // Predictive QWERTY (XT9) changes (TEST) ----> |
|
11001 // The PtiXt9Core may choose to ignore the SetCurrentInputSequence() call. |
|
11002 // Make sure our text buffer is in sync with the one in PtiEngine. |
|
11003 if(KErrNone != err) |
|
11004 textToUncommit = iPtiEngine->CurrentWord(); |
|
11005 TInt maxEdSize = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep(); |
|
11006 if((maxEdSize > 0) && (iUncommittedText.iAnchorPos + textToUncommit.Length() > maxEdSize)) |
|
11007 { |
|
11008 textToUncommit.SetLength(maxEdSize - iUncommittedText.iAnchorPos); |
|
11009 iUncommittedText.iCursorPos = maxEdSize; |
|
11010 } |
|
11011 // Predictive QWERTY (XT9) changes <---- |
|
11012 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
11013 StartInlineEditL(iUncommittedText, textToUncommit, textToUncommit.Length(), EFalse); |
|
11014 |
|
11015 // Make sure editor character case in sync |
|
11016 if( iUncommittedText.iAnchorPos == 0 ) |
|
11017 iCaseMan->UpdateCase(ENullNaviEvent); |
|
11018 |
|
11019 } |
|
11020 |
|
11021 if (editorState != iPreviousEditorState) |
|
11022 { |
|
11023 // we have changed editor, time to update local digits mode |
|
11024 UpdateLocalDigitMode(); |
|
11025 iPreviousEditorState = editorState; |
|
11026 } |
|
11027 |
|
11028 if(IsExtendedFlagSet(EExtendedFlagShiftReleasedOnPopup) && !(iAknEditorFlags & EAknEditorFlagFindPane) ) |
|
11029 { |
|
11030 // If in FEP context, shift is released on a non fep aware dialog |
|
11031 // like "text copied to clipboard", then release the shift |
|
11032 // when the editor comes in focus by simulating shift up event. |
|
11033 ClearExtendedFlag(EExtendedFlagShiftReleasedOnPopup); |
|
11034 TKeyEvent shiftUp = {0, EStdKeyLeftShift, 0, 0}; |
|
11035 CCoeEnv::Static()->SimulateKeyEventL(shiftUp, EEventKeyUp); |
|
11036 } |
|
11037 else if (IsFlagSet(EFlagLongShiftKeyPress) && !(iAknEditorFlags & EAknEditorFlagFindPane)) |
|
11038 { |
|
11039 // Find pane editor does not require any shift simulation |
|
11040 |
|
11041 // After the "text copied" note and if the shift key was not released |
|
11042 // then simulate shift down event. |
|
11043 TKeyEvent shiftDown = {0, EStdKeyLeftShift, 0, 0}; |
|
11044 CCoeEnv::Static()->SimulateKeyEventL(shiftDown, EEventKeyDown); |
|
11045 if((!iCandidatePopup) && (KeyboardLayout() != EPtiKeyboard12Key )) |
|
11046 ResetShiftKeyMonitorL(); |
|
11047 } |
|
11048 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
11049 TransferFepStateToEditorL(EFalse); // ensure editor has up to date state |
|
11050 #else |
|
11051 TransferFepStateToEditorL(); // ensure editor has up to date state |
|
11052 #endif |
|
11053 |
|
11054 iHashKeyMan->ResetIndicHashKeyStateL(); |
|
11055 ClearExtendedFlag(EExtendedFlagShortPressHashKey); |
|
11056 } |
|
11057 |
|
11058 TInt CAknFepManager::ConfigureFepModeFromEditorMode(TInt aEditorMode) |
|
11059 { |
|
11060 TInt fepMode(aEditorMode); |
|
11061 |
|
11062 switch (aEditorMode) |
|
11063 { |
|
11064 case EAknEditorNumericInputMode: |
|
11065 if( IsInputModeAvailable(ENativeNumber) && |
|
11066 ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic || |
|
11067 iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic || |
|
11068 iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) ) |
|
11069 { |
|
11070 fepMode = ENativeNumber; |
|
11071 } |
|
11072 else |
|
11073 { |
|
11074 fepMode = ENumber; |
|
11075 } |
|
11076 iCharWidth = EHalfWidthChar; |
|
11077 break; |
|
11078 case EAknEditorSecretAlphaInputMode: |
|
11079 case EAknEditorTextInputMode: |
|
11080 case EAknEditorHalfWidthTextInputMode: |
|
11081 fepMode = ELatin; |
|
11082 iCharWidth = EHalfWidthChar; |
|
11083 break; |
|
11084 case EAknEditorKatakanaInputMode: |
|
11085 fepMode = EKatakana; |
|
11086 iCharWidth = EHalfWidthChar; |
|
11087 break; |
|
11088 case EAknEditorFullWidthTextInputMode: |
|
11089 fepMode = ELatin; |
|
11090 iCharWidth = EFullWidthChar; |
|
11091 break; |
|
11092 case EAknEditorFullWidthKatakanaInputMode: |
|
11093 fepMode = EKatakana; |
|
11094 iCharWidth = EFullWidthChar; |
|
11095 break; |
|
11096 case EAknEditorFullWidthNumericInputMode: |
|
11097 if( IsInputModeAvailable(ENativeNumber) && |
|
11098 ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic || |
|
11099 iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic || |
|
11100 iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) ) |
|
11101 { |
|
11102 fepMode = ENativeNumber; |
|
11103 } |
|
11104 else |
|
11105 { |
|
11106 fepMode = ENumber; |
|
11107 } |
|
11108 iCharWidth = EFullWidthChar; |
|
11109 break; |
|
11110 case EAknEditorHiraganaKanjiInputMode: |
|
11111 fepMode = EHiraganaKanji; |
|
11112 break; |
|
11113 case EAknEditorHiraganaInputMode: |
|
11114 fepMode = EHiragana; |
|
11115 break; |
|
11116 default: |
|
11117 break; |
|
11118 } |
|
11119 return fepMode; |
|
11120 } |
|
11121 |
|
11122 void CAknFepManager::LaunchHelpTextQueryL() |
|
11123 { |
|
11124 TUid fepUid = CCoeEnv::Static()->FepUid(); |
|
11125 ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
11126 iUiInterface->LaunchHelpTextQueryL(R_AKNFEP_HELP_TEXT); |
|
11127 PrepareFepAfterDialogExitL(fepUid); |
|
11128 } |
|
11129 |
|
11130 void CAknFepManager::UpdateEditorContext() const |
|
11131 { |
|
11132 if(EditingStateIndicator()) |
|
11133 { |
|
11134 iUiInterface->UpdateEditorContext(*EditingStateIndicator(), *FepUI()); |
|
11135 } |
|
11136 } |
|
11137 |
|
11138 TBool CAknFepManager::TextIsValidInEditor(const TDesC& aText) |
|
11139 { |
|
11140 TBool ret = ETrue; |
|
11141 TUint length = aText.Length(); |
|
11142 TCoeInputCapabilities::MCoeFepSpecificExtensions* ipCapExt = |
|
11143 iInputCapabilities.FepSpecificExtensions(TUid::Uid(EAknFepUid)); |
|
11144 if (ipCapExt) |
|
11145 { |
|
11146 while(length--) |
|
11147 { |
|
11148 if (!ipCapExt->IsValidCharacter(aText[length])) |
|
11149 { |
|
11150 ret = EFalse; |
|
11151 } |
|
11152 } |
|
11153 } |
|
11154 return ret; |
|
11155 } |
|
11156 |
|
11157 TBool CAknFepManager::CharIsValidInEditor(TChar aChar) |
|
11158 { |
|
11159 TBool ret = ETrue; |
|
11160 TCoeInputCapabilities::MCoeFepSpecificExtensions* ipCapExt = |
|
11161 iInputCapabilities.FepSpecificExtensions(TUid::Uid(EAknFepUid)); |
|
11162 if (ipCapExt) |
|
11163 { |
|
11164 if (!ipCapExt->IsValidCharacter(aChar)) |
|
11165 { |
|
11166 ret = EFalse; |
|
11167 } |
|
11168 } |
|
11169 return ret; |
|
11170 } |
|
11171 |
|
11172 void CAknFepManager::SetCursorType(TChineseFepCursorType aType) |
|
11173 { |
|
11174 TBool setToTrue = ETrue; |
|
11175 TTextCursor newCursor; |
|
11176 |
|
11177 newCursor.iType=TTextCursor::ETypeRectangle; |
|
11178 if (aType == EPassive) |
|
11179 { |
|
11180 newCursor.iType=TTextCursor::ETypeHollowRectangle; |
|
11181 } |
|
11182 if ( IsFepAwareTextEditor() ) |
|
11183 { |
|
11184 iInputCapabilities.FepAwareTextEditor()->Extension1()->SetCursorType(setToTrue, newCursor); |
|
11185 } |
|
11186 } |
|
11187 |
|
11188 MAknEditingStateIndicator* CAknFepManager::EditingStateIndicator() const |
|
11189 { |
|
11190 MAknEditingStateIndicator* indicator = NULL; |
|
11191 |
|
11192 // First ask indicator from controls owning the editor. |
|
11193 // For example CAknQueryControl and CAknSearchField implement |
|
11194 // their own indicators. |
|
11195 |
|
11196 MObjectProvider* objectProvider = NULL; |
|
11197 |
|
11198 // First try through CAknEdwinState object. |
|
11199 // It exists with CEikEdwin-derived editors. |
|
11200 |
|
11201 MCoeFepAwareTextEditor* editor = NULL; |
|
11202 MCoeFepAwareTextEditor_Extension1* ext1 = NULL; |
|
11203 CAknEdwinState* state = NULL; |
|
11204 |
|
11205 editor = iInputCapabilities.FepAwareTextEditor(); |
|
11206 |
|
11207 if(editor) |
|
11208 ext1 = editor->Extension1() ; |
|
11209 if(ext1) |
|
11210 state = (CAknEdwinState*)ext1->State( KNullUid ) ; |
|
11211 |
|
11212 if ( IsFepAwareTextEditor() && ( editor ) && ( ext1) && ( state )) |
|
11213 { |
|
11214 objectProvider = state->ObjectProvider(); |
|
11215 } |
|
11216 |
|
11217 // If not found, try to get object provider from input capabilities. |
|
11218 // It is set there with CEikMfne-derived editors. |
|
11219 |
|
11220 if ( !objectProvider ) |
|
11221 { |
|
11222 objectProvider = iInputCapabilities.ObjectProvider(); |
|
11223 } |
|
11224 |
|
11225 if ( objectProvider ) |
|
11226 { |
|
11227 indicator = objectProvider->MopGetObject( indicator ); |
|
11228 } |
|
11229 |
|
11230 // If no indicator was supplied, get one from CAknEnv. |
|
11231 // By default, this one is FEP's own indicator. |
|
11232 |
|
11233 if ( !indicator ) |
|
11234 { |
|
11235 indicator = CAknEnv::Static()->EditingStateIndicator(); |
|
11236 if (indicator != iIndicator) |
|
11237 { |
|
11238 CAknEnv::Static()->SwapEditingStateIndicator(iIndicator); |
|
11239 indicator = iIndicator; |
|
11240 } |
|
11241 } |
|
11242 |
|
11243 return indicator; |
|
11244 } |
|
11245 |
|
11246 TBool CAknFepManager::TryHandleArrowRightEventL(TInt aDokumentLength) |
|
11247 { |
|
11248 TBool ret = EFalse; |
|
11249 TBool thai = (iLanguageCapabilities.iInputLanguageCode == ELangThai); |
|
11250 if ( iInputCapabilities.FepAwareTextEditor() && |
|
11251 (iSharedDataInterface->SpaceWithScrollRight() || thai ) && |
|
11252 (!(iAknEditorFlags & EAknEditorFlagNoLRNavigation)) && |
|
11253 iFepManState == EAknFepStateInitial && |
|
11254 (!IsFlagSet(EFlagInsideInlineEditingTransaction) ) && |
|
11255 (!IsFlagSet(EFlagShiftKeyDepressed)) && |
|
11256 iMode != EHiragana ) // Not supported in only Hiragana input mode |
|
11257 { |
|
11258 TInt cursorPos = DocPos().iPos; |
|
11259 TCursorSelection cursorSel; |
|
11260 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSel); |
|
11261 if (( cursorPos == aDokumentLength) |
|
11262 && !cursorSel.Length() |
|
11263 && (IsFeatureSupportedJapanese() || (PreviousChar() != 0x0020)) ) |
|
11264 { |
|
11265 // set to half-width space or full-width space by current input mode. |
|
11266 // 0x0020 is unicode for half-width space |
|
11267 // 0x3000 is unicode for full-width space |
|
11268 TUint code(0); |
|
11269 switch (iMode) |
|
11270 { |
|
11271 case EHiraganaKanji: |
|
11272 code = 0x3000; |
|
11273 break; |
|
11274 case ELatin: |
|
11275 code = (!WesternPredictive() && iCharWidth == EFullWidthChar)? |
|
11276 0x3000 : 0x0020; |
|
11277 break; |
|
11278 case EHiragana: |
|
11279 // Not supported in only Hiragana input mode |
|
11280 break; |
|
11281 case EHangul: |
|
11282 code = 0x0020; |
|
11283 break; |
|
11284 case ENumber: |
|
11285 case ENativeNumber: |
|
11286 case EKatakana: |
|
11287 default: |
|
11288 code = (iCharWidth == EFullWidthChar)? 0x3000 : 0x0020; |
|
11289 break; |
|
11290 } |
|
11291 if (code) |
|
11292 { |
|
11293 SimulateKeyEventL(code); // add a space |
|
11294 SimulateKeyEventL(EKeyF19); // Asyncronous case update |
|
11295 ret = ETrue; |
|
11296 } |
|
11297 } |
|
11298 } |
|
11299 return ret; |
|
11300 } |
|
11301 |
|
11302 TBool CAknFepManager::TryHandleArrowLeftEventL(TInt aDokumentLength) |
|
11303 { |
|
11304 TBool ret = EFalse; |
|
11305 if (iInputCapabilities.FepAwareTextEditor() && |
|
11306 iSharedDataInterface->SpaceWithScrollRight() && |
|
11307 (!(iAknEditorFlags & EAknEditorFlagNoLRNavigation)) && |
|
11308 iFepManState == EAknFepStateInitial && |
|
11309 (!IsFlagSet(EFlagInsideInlineEditingTransaction) ) && |
|
11310 (!IsFlagSet(EFlagShiftKeyDepressed)) && |
|
11311 iMode != EHiragana ) // Not supported in only Hiragana input mode |
|
11312 { |
|
11313 TInt cursorPos = DocPos().iPos; |
|
11314 TCursorSelection cursorSel; |
|
11315 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSel); |
|
11316 TText previousChar = PreviousChar(); |
|
11317 if (( cursorPos == aDokumentLength) |
|
11318 && !cursorSel.Length() |
|
11319 && (IsFeatureSupportedJapanese() |
|
11320 && (previousChar == 0x3000 || previousChar == 0x0020) )) // full width or half-width space. |
|
11321 { |
|
11322 SimulateKeyEventL(EKeyBackspace); |
|
11323 SimulateKeyEventL(EKeyF19); // Asyncronous case update |
|
11324 ret = ETrue; |
|
11325 } |
|
11326 } |
|
11327 return ret; |
|
11328 } |
|
11329 |
|
11330 TBool CAknFepManager::TryHandleArrowDownEventL(TInt aDokumentLength) |
|
11331 { |
|
11332 TBool ret = EFalse; |
|
11333 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
11334 // Predictive QWERTY (XT9) changes ----> |
|
11335 if ( iWesternPredictive && |
|
11336 IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) && !(iAknEditorFlags & EAknEditorFlagNoT9) |
|
11337 && !IsFlagSet(EFlagInsideMultitapInlineEditingTransaction) && !IsFlagSet(EFlagNoMatches)) |
|
11338 { |
|
11339 LaunchCandidatePopupListL(); |
|
11340 ret = ETrue; |
|
11341 } |
|
11342 // Predictive QWERTY (XT9) changes <---- |
|
11343 else |
|
11344 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
11345 if ( ( iAknEditorFlags & EAknEditorFlagAllowEntersWithScrollDown ) && |
|
11346 iInputCapabilities.FepAwareTextEditor() && |
|
11347 ( iSharedDataInterface->EntersWithScrollDown() ) && |
|
11348 iFepManState == EAknFepStateInitial && |
|
11349 !IsFlagSet(EFlagInsideInlineEditingTransaction) && |
|
11350 !IsFlagSet(EFlagShiftKeyDepressed) ) |
|
11351 { |
|
11352 TInt cursorPos = DocPos().iPos; |
|
11353 TCursorSelection cursorSel; |
|
11354 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(cursorSel); |
|
11355 if ( cursorPos == aDokumentLength && |
|
11356 !cursorSel.Length() ) |
|
11357 { |
|
11358 SimulateKeyEventL(EKeyEnter); // add line feed |
|
11359 SimulateKeyEventL(EKeyF19); // Asyncronous case update |
|
11360 ret = ETrue; |
|
11361 } |
|
11362 } |
|
11363 return ret; |
|
11364 } |
|
11365 |
|
11366 TUint CAknFepManager::EditorModeFromFepMode(TInt aFepMode) |
|
11367 { |
|
11368 TUint editorMode(aFepMode); |
|
11369 switch (aFepMode) |
|
11370 { |
|
11371 case ELatin: |
|
11372 if (iPermittedInputModes & EAknEditorTextInputMode) |
|
11373 { |
|
11374 editorMode = EAknEditorTextInputMode; |
|
11375 if (IsFeatureSupportedJapanese()) |
|
11376 { |
|
11377 if (iCharWidth == EHalfWidthChar |
|
11378 && (iPermittedInputModes & EAknEditorHalfWidthTextInputMode)) |
|
11379 { |
|
11380 editorMode = EAknEditorHalfWidthTextInputMode; |
|
11381 } |
|
11382 else if (iCharWidth == EFullWidthChar |
|
11383 && (iPermittedInputModes & EAknEditorFullWidthTextInputMode)) |
|
11384 { |
|
11385 editorMode = EAknEditorFullWidthTextInputMode; |
|
11386 } |
|
11387 } |
|
11388 } |
|
11389 else if (iPermittedInputModes & EAknEditorHalfWidthTextInputMode) |
|
11390 { |
|
11391 editorMode = EAknEditorTextInputMode; |
|
11392 if (IsFeatureSupportedJapanese()) |
|
11393 { |
|
11394 editorMode = EAknEditorHalfWidthTextInputMode; |
|
11395 if (iCharWidth == EFullWidthChar |
|
11396 &&(iPermittedInputModes & EAknEditorFullWidthTextInputMode)) |
|
11397 { |
|
11398 editorMode = EAknEditorFullWidthTextInputMode; |
|
11399 } |
|
11400 } |
|
11401 } |
|
11402 else if (iPermittedInputModes & EAknEditorFullWidthTextInputMode) |
|
11403 { |
|
11404 editorMode = EAknEditorTextInputMode; |
|
11405 if (IsFeatureSupportedJapanese()) |
|
11406 { |
|
11407 editorMode = EAknEditorFullWidthTextInputMode; |
|
11408 } |
|
11409 } |
|
11410 else |
|
11411 { |
|
11412 editorMode = EAknEditorSecretAlphaInputMode; |
|
11413 } |
|
11414 break; |
|
11415 case ENumber: |
|
11416 case ENativeNumber: |
|
11417 editorMode = EAknEditorNumericInputMode; |
|
11418 if (iCharWidth == EFullWidthChar |
|
11419 && (iPermittedInputModes & EAknEditorFullWidthNumericInputMode)) |
|
11420 { |
|
11421 editorMode = EAknEditorFullWidthNumericInputMode; |
|
11422 } |
|
11423 break; |
|
11424 case EHangul: |
|
11425 editorMode = EAknEditorHangulInputMode; |
|
11426 break; |
|
11427 default: |
|
11428 if (IsFeatureSupportedJapanese()) |
|
11429 { |
|
11430 editorMode = EditorMode(aFepMode, iCharWidth); |
|
11431 } |
|
11432 break; |
|
11433 } |
|
11434 return editorMode; |
|
11435 } |
|
11436 |
|
11437 CAknKeySoundSystem* CAknFepManager::SoundSystem() const |
|
11438 { |
|
11439 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
11440 if (coeEnv->AppUi()) |
|
11441 { |
|
11442 return iAvkonAppUiBase->KeySounds(); |
|
11443 } |
|
11444 return NULL; |
|
11445 } |
|
11446 |
|
11447 void CAknFepManager::SetHashKeyStyle() |
|
11448 { |
|
11449 CAknFepHashKeyManager::THashKeyStyle style = CAknFepHashKeyManager::EHashKeyStyleWestern; |
|
11450 |
|
11451 switch (iLanguageCapabilities.iInputLanguageCode) |
|
11452 { |
|
11453 case ELangPrcChinese: |
|
11454 case ELangHongKongChinese: |
|
11455 case ELangTaiwanChinese: |
|
11456 style = CAknFepHashKeyManager::EHashKeyStyleChineseWithWestern; |
|
11457 break; |
|
11458 case ELangJapanese: |
|
11459 style = CAknFepHashKeyManager::EHashKeyStyleJapanese; |
|
11460 break; |
|
11461 case ELangKorean: |
|
11462 style = CAknFepHashKeyManager::EHashKeyStyleKoreanWithWestern; |
|
11463 break; |
|
11464 default: |
|
11465 break; |
|
11466 } |
|
11467 |
|
11468 iHashKeyMan->SetHashKeyStyle( style ); |
|
11469 } |
|
11470 |
|
11471 void CAknFepManager::ReadHashKeyLoopL() |
|
11472 { |
|
11473 iHashKeyLoop.Reset(); |
|
11474 |
|
11475 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
11476 TResourceReader reader; |
|
11477 coeEnv->CreateResourceReaderLC(reader, R_HASH_KEY_LOOP_ALL_INPUT_MODES); |
|
11478 |
|
11479 iVariantPermittedModes = 0; |
|
11480 const TInt count = reader.ReadInt16(); |
|
11481 for (TInt ii=0; ii<count; ii++) |
|
11482 { |
|
11483 TInt mode = reader.ReadInt32(); |
|
11484 if ( IsInputModeAvailable(mode) ) |
|
11485 { |
|
11486 if ( mode == EPRCFind) |
|
11487 { |
|
11488 mode = ELatin; |
|
11489 } |
|
11490 iHashKeyLoop.Append(mode); |
|
11491 iVariantPermittedModes |= mode; |
|
11492 } |
|
11493 } |
|
11494 CleanupStack::PopAndDestroy(); //reader |
|
11495 } |
|
11496 |
|
11497 TBool CAknFepManager::IsValidInLineCharacter(TChar aCharacter) const |
|
11498 { |
|
11499 TBool validInlineCharacter = ETrue; |
|
11500 TChar::TCategory category = aCharacter.GetCategory(); |
|
11501 TChar::TBdCategory bdCategory = aCharacter.GetBdCategory(); |
|
11502 switch (iLanguageCapabilities.iInputLanguageCode) |
|
11503 { |
|
11504 case ELangArabic: |
|
11505 { |
|
11506 // Needs more specific category |
|
11507 validInlineCharacter = ( (category & TChar::ELetterOtherGroup) && |
|
11508 (bdCategory == TChar::ERightToLeftArabic) ); |
|
11509 break; |
|
11510 } |
|
11511 case ELangHebrew: |
|
11512 { |
|
11513 // Needs more specific category |
|
11514 validInlineCharacter = ( (category & TChar::ELetterOtherGroup) && |
|
11515 (bdCategory == TChar::ERightToLeft) ); |
|
11516 break; |
|
11517 } |
|
11518 case ELangFarsi: |
|
11519 case ELangUrdu: |
|
11520 { |
|
11521 // Needs more specific category |
|
11522 validInlineCharacter = ( (category & TChar::ELetterOtherGroup) && |
|
11523 (bdCategory == TChar::ERightToLeftArabic) ); |
|
11524 break; |
|
11525 } |
|
11526 /*Hindi*/ |
|
11527 case ELangHindi: |
|
11528 #ifdef RD_MARATHI |
|
11529 /* Same for Marathi */ |
|
11530 case ELangMarathi: |
|
11531 #endif |
|
11532 { |
|
11533 // Needs more specific category |
|
11534 validInlineCharacter = IsValidInlineIndicCharacter(aCharacter); |
|
11535 |
|
11536 break; |
|
11537 } |
|
11538 case ELangVietnamese: |
|
11539 { |
|
11540 // For full screen qwerty, validInlineCharacter is true |
|
11541 if( !( iFepPluginManager && iFepPluginManager->EnableITIOnFSQ() ) ) |
|
11542 { |
|
11543 validInlineCharacter = (aCharacter.IsAlpha() && |
|
11544 !((category & TChar::ELetterOtherGroup))) || |
|
11545 ((category == TChar::EMarkGroup) && |
|
11546 (bdCategory == TChar::ENonSpacingMark)); |
|
11547 } |
|
11548 break; |
|
11549 } |
|
11550 case ELangThai: |
|
11551 { |
|
11552 validInlineCharacter = (!(aCharacter.IsSpace() || (aCharacter == 0x2029))) && |
|
11553 ((aCharacter.IsAlpha() && |
|
11554 !(category & TChar::ELetterOtherGroup)) || |
|
11555 ((category & TChar::EMarkGroup) && |
|
11556 (bdCategory == TChar::ENonSpacingMark)) || |
|
11557 ((category & TChar::ELetterModifierGroup) && |
|
11558 (bdCategory == TChar::ELeftToRight)) || |
|
11559 ((category & TChar::ESeparatorGroup ) && |
|
11560 (bdCategory == TChar::EWhitespace))|| |
|
11561 ((category & TChar::EMcCategory) && |
|
11562 (bdCategory == TChar::ELeftToRight))); |
|
11563 break; |
|
11564 } |
|
11565 case ELangTaiwanChinese: |
|
11566 case ELangHongKongChinese: |
|
11567 case ELangPrcChinese: |
|
11568 case ELangEnglish: |
|
11569 { |
|
11570 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
11571 // for qwerty special characters should not break the word |
|
11572 if( iQwertyInputMode && ( KeyboardLayout() !=EPtiKeyboardHalfQwerty )) |
|
11573 { |
|
11574 validInlineCharacter = (!( aCharacter.IsSpace() || (aCharacter == 0x2029) || |
|
11575 ( aCharacter.IsAlpha() && |
|
11576 (category & TChar::ELetterOtherGroup))|| |
|
11577 ((category & TChar::EMarkGroup) && |
|
11578 (bdCategory == TChar::ENonSpacingMark)) || |
|
11579 ((category & TChar::ELetterModifierGroup) && |
|
11580 (bdCategory == TChar::ELeftToRight)) || |
|
11581 ((category & TChar::ESeparatorGroup ) && |
|
11582 (bdCategory == TChar::EWhitespace)))); |
|
11583 } |
|
11584 else |
|
11585 #endif // whereas for ITUT and Half Qwerty they should |
|
11586 { |
|
11587 validInlineCharacter = ( aCharacter.IsAlpha() && !(category & TChar::ELetterOtherGroup) ); |
|
11588 } |
|
11589 break; |
|
11590 } |
|
11591 default: |
|
11592 { |
|
11593 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
11594 // for qwerty special characters should not break the word |
|
11595 |
|
11596 if( iQwertyInputMode && ( KeyboardLayout() !=EPtiKeyboardHalfQwerty ) ) |
|
11597 { |
|
11598 validInlineCharacter = (!(aCharacter.IsSpace() || (aCharacter == 0x2029))); |
|
11599 } |
|
11600 else |
|
11601 #endif // whereas for ITUT and Half Qwerty they should |
|
11602 { |
|
11603 validInlineCharacter = ( aCharacter.IsAlpha() && !(category & TChar::ELetterOtherGroup) ); |
|
11604 } |
|
11605 |
|
11606 |
|
11607 break; |
|
11608 } |
|
11609 } |
|
11610 |
|
11611 TUint16 key = 0; |
|
11612 if(validInlineCharacter) |
|
11613 { |
|
11614 validInlineCharacter = EFalse; |
|
11615 ConvertCharToKey(aCharacter, key); |
|
11616 if(0 != key) |
|
11617 { |
|
11618 validInlineCharacter = ETrue; |
|
11619 } |
|
11620 } |
|
11621 |
|
11622 return validInlineCharacter; |
|
11623 } |
|
11624 TBool CAknFepManager::IsValidInlineIndicCharacter(TChar aCharacter) const |
|
11625 { |
|
11626 TBool validInlineCharacter = ETrue; |
|
11627 TChar::TCategory category = aCharacter.GetCategory(); |
|
11628 TChar::TBdCategory bdCategory = aCharacter.GetBdCategory(); |
|
11629 |
|
11630 if(!((category == TChar::EPoCategory) || aCharacter == 0x0950 || aCharacter == 0x093D)) |
|
11631 { |
|
11632 validInlineCharacter = ((( (category & TChar::ELetterOtherGroup) |
|
11633 && (bdCategory == TChar::ELeftToRight) ) |
|
11634 ||( (category & TChar::EMcCategory) |
|
11635 && (bdCategory == TChar::ELeftToRight) ) |
|
11636 ||( (category & TChar::EMarkGroup) |
|
11637 && (bdCategory == TChar::ENonSpacingMark)) ) |
|
11638 &&( ! ( aCharacter.IsAlpha() |
|
11639 && !(category & TChar::ELetterOtherGroup) ))); |
|
11640 } |
|
11641 else |
|
11642 { |
|
11643 validInlineCharacter = EFalse; |
|
11644 } |
|
11645 return validInlineCharacter; |
|
11646 } |
|
11647 |
|
11648 TInt CAknFepManager::WordConcatenationTimerTimeoutCallback(TAny* aObj) |
|
11649 { |
|
11650 TRAPD(err, static_cast<CAknFepManager*>(aObj)->WordConcatenationTimerTimeoutL()); |
|
11651 if (err) |
|
11652 { |
|
11653 static_cast<CAknFepManager*>(aObj)->CleanUpFep(); |
|
11654 return KErrNoMemory; |
|
11655 } |
|
11656 return KErrNone; |
|
11657 } |
|
11658 |
|
11659 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
11660 |
|
11661 TBool CAknFepManager::IsHybridAplhaEditor() const |
|
11662 { |
|
11663 TBool phoneIdle = (EditorType() == CAknExtendedInputCapabilities::EHybridAlphaNumericEditor); |
|
11664 return phoneIdle; |
|
11665 } |
|
11666 |
|
11667 TBool CAknFepManager::IsHybridAlphaModeChangedtoAplhanumeric() const |
|
11668 { |
|
11669 return iHybridAplphaChangedToAlphanumeric; |
|
11670 } |
|
11671 |
|
11672 TBool CAknFepManager::IsPhoneNumberEditor() const |
|
11673 { |
|
11674 TBool phoneEditor = (EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor); |
|
11675 return phoneEditor; |
|
11676 } |
|
11677 CAknFepFnKeyManager::TFnKeyState CAknFepManager::FnKeyState() |
|
11678 { |
|
11679 return iFnKeyManager->FnKeyState(); |
|
11680 } |
|
11681 void CAknFepManager::SetFnKeyState(CAknFepFnKeyManager::TFnKeyState aState) |
|
11682 { |
|
11683 iFnKeyManager->SetFnKeyState(aState); |
|
11684 } |
|
11685 #ifdef __REVERSE_FN_KEY_SUPPORTED |
|
11686 TBool CAknFepManager::IsReverseFnkeyInput() |
|
11687 { |
|
11688 return iIsReverseFnkeyInput; |
|
11689 } |
|
11690 void CAknFepManager::SetReverseFnkeyInputMode(TBool iIsOn) |
|
11691 { |
|
11692 iIsReverseFnkeyInput = iIsOn; |
|
11693 } |
|
11694 TBool CAknFepManager::IsValidCharInNumericEditorL( TChar aChar ) const |
|
11695 { |
|
11696 if(!EditorState()) |
|
11697 { |
|
11698 return EFalse; |
|
11699 } |
|
11700 TBool validChar = EFalse; |
|
11701 if( aChar.IsDigit() ) |
|
11702 { |
|
11703 return ETrue; |
|
11704 } |
|
11705 TBool phoneIdle = (EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor); |
|
11706 if( (phoneIdle || (IsHybridAplhaEditor() && !IsHybridAlphaModeChangedtoAplhanumeric())) |
|
11707 && aChar == '#') |
|
11708 { |
|
11709 return ETrue; |
|
11710 } |
|
11711 if( aChar == '.' && EAknEditorConverterNumberModeKeymap == iAknEditorNumericKeymap) |
|
11712 { |
|
11713 return ETrue; |
|
11714 } |
|
11715 if( IsAllowedKeymappingForNumberMode(aChar) ) |
|
11716 { |
|
11717 return ETrue; |
|
11718 } |
|
11719 |
|
11720 TInt resourceSCTId = EditorState()->SpecialCharacterTableResourceId(); |
|
11721 // No SCT table use default SCT |
|
11722 if( resourceSCTId == KErrNotFound || !resourceSCTId || |
|
11723 (IsHybridAplhaEditor()&& !IsHybridAlphaModeChangedtoAplhanumeric())) |
|
11724 { |
|
11725 resourceSCTId = NumericModeSCTResourceId(); |
|
11726 } |
|
11727 |
|
11728 if( resourceSCTId ) |
|
11729 { |
|
11730 TResourceReader reader; |
|
11731 CEikonEnv::Static()->CreateResourceReaderLC(reader,resourceSCTId); |
|
11732 reader.ReadInt32(); // skip sct id |
|
11733 TPtrC chars=reader.ReadTPtrC(); // read special char |
|
11734 validChar = ( chars.Locate(aChar)>=0 ); |
|
11735 CleanupStack::PopAndDestroy(); |
|
11736 } |
|
11737 return validChar; |
|
11738 |
|
11739 } |
|
11740 TInt CAknFepManager::GetNumericSCTResID() |
|
11741 { |
|
11742 if(!EditorState()) |
|
11743 { |
|
11744 return NumericModeSCTResourceId(); |
|
11745 } |
|
11746 TInt resourceSCTId = EditorState()->SpecialCharacterTableResourceId(); |
|
11747 if(resourceSCTId == KErrNotFound || !resourceSCTId ) |
|
11748 { |
|
11749 resourceSCTId = NumericModeSCTResourceId(); |
|
11750 } |
|
11751 return resourceSCTId; |
|
11752 } |
|
11753 |
|
11754 TBool CAknFepManager::IsValidCharForNumericInFnReverseL(TInt aKey, TPtiTextCase aCase) |
|
11755 { |
|
11756 if(!EditorState()) |
|
11757 { |
|
11758 return EFalse; |
|
11759 } |
|
11760 TBuf<32> keyMaps; |
|
11761 iPtiEngine->MappingDataForKey( (TPtiKey)aKey, keyMaps, aCase); |
|
11762 |
|
11763 TBool validKey(EFalse); |
|
11764 if( keyMaps.Length()<= 0 ) |
|
11765 { |
|
11766 return validKey; |
|
11767 } |
|
11768 TChar chr =keyMaps[0]; |
|
11769 if( chr.IsDigit() ) |
|
11770 { |
|
11771 return ETrue; |
|
11772 } |
|
11773 |
|
11774 TInt resourceSCTId = EditorState()->SpecialCharacterTableResourceId(); |
|
11775 // No SCT table use default SCT |
|
11776 if( resourceSCTId == KErrNotFound || !resourceSCTId ) |
|
11777 { |
|
11778 resourceSCTId = NumericModeSCTResourceId(); |
|
11779 } |
|
11780 |
|
11781 if( resourceSCTId ) |
|
11782 { |
|
11783 TResourceReader reader; |
|
11784 CEikonEnv::Static()->CreateResourceReaderLC(reader,resourceSCTId); |
|
11785 reader.ReadInt32(); // skip sct id |
|
11786 TPtrC chars=reader.ReadTPtrC(); // read special char |
|
11787 |
|
11788 validKey = (chars.Locate(chr)>=0 ); |
|
11789 if(chr.IsAlpha()) |
|
11790 { |
|
11791 chr.UpperCase(); |
|
11792 validKey |= (chars.Locate(chr)>=0 ) ; |
|
11793 } |
|
11794 |
|
11795 CleanupStack::PopAndDestroy(); |
|
11796 } |
|
11797 |
|
11798 return validKey; |
|
11799 |
|
11800 } |
|
11801 #endif //__REVERSE_FN_KEY_SUPPORTED |
|
11802 void CAknFepManager::AddOneSpaceOrMoveCursorL() |
|
11803 { |
|
11804 if(static_cast<TChar>(NextChar()).IsSpace()) |
|
11805 { |
|
11806 TCursorSelection sel; |
|
11807 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(sel); |
|
11808 sel.iCursorPos++; |
|
11809 sel.iAnchorPos++; |
|
11810 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel); |
|
11811 } |
|
11812 else if(IsEditorHasFreeSpace()) |
|
11813 { |
|
11814 SimulateKeyEventL(EKeySpace); |
|
11815 } |
|
11816 SimulateKeyEventL(EKeyF19); |
|
11817 } |
|
11818 #endif |
|
11819 TBool CAknFepManager::IsOnlyNumericPermitted() const |
|
11820 { |
|
11821 if (IsFeatureSupportedJapanese()) |
|
11822 { |
|
11823 return !(iPermittedInputModes & ~(EAknEditorNumericInputMode |
|
11824 | EAknEditorFullWidthNumericInputMode) ); |
|
11825 } |
|
11826 else |
|
11827 { |
|
11828 // Only non-japanese modes are considered. |
|
11829 return !( iPermittedInputModes & |
|
11830 (EAknEditorTextInputMode | EAknEditorSecretAlphaInputMode) ); |
|
11831 } |
|
11832 } |
|
11833 |
|
11834 void CAknFepManager::TryIncrementModeL(TInt aCurrentMode) |
|
11835 { |
|
11836 //check that we are currently in the correct mode |
|
11837 __ASSERT_DEBUG(IsModePermitted(iMode), |
|
11838 AknFepPanic(EAknFepPanicNonPermittedEditorMode)); |
|
11839 __ASSERT_DEBUG(iInputCapabilities.FepAwareTextEditor(), |
|
11840 AknFepPanic(EAknFepPanicNoHandleToFepAwareTextEditor)); |
|
11841 |
|
11842 const TInt lastModePos = iHashKeyLoop.Count()-1 ; |
|
11843 const TInt currentModePos = iHashKeyLoop.Find(aCurrentMode); |
|
11844 TInt newModePos = currentModePos; |
|
11845 |
|
11846 __ASSERT_DEBUG(currentModePos != KErrNotFound , |
|
11847 AknFepPanic(EAknFepPanicNonPermittedEditorMode)); |
|
11848 |
|
11849 do { |
|
11850 if (newModePos == lastModePos) |
|
11851 { |
|
11852 //we've got to the end of the hash key loop, go back to the beginning |
|
11853 newModePos = 0; |
|
11854 } |
|
11855 else |
|
11856 { |
|
11857 newModePos++; |
|
11858 } |
|
11859 |
|
11860 if (TryChangeModeL(iHashKeyLoop[newModePos])) |
|
11861 { |
|
11862 return; //succeeded to move to next available mode |
|
11863 } |
|
11864 } |
|
11865 while (newModePos != currentModePos); |
|
11866 } |
|
11867 |
|
11868 void CAknFepManager::TryIncrementModeChineseQwertyL(TInt aCurrentMode) |
|
11869 { |
|
11870 __ASSERT_DEBUG(IsModePermitted(aCurrentMode),AknFepPanic(EAknFepPanicNonPermittedEditorMode)); |
|
11871 |
|
11872 const TInt lastModePos = iHashKeyLoop.Count() - 1 ; |
|
11873 const TInt currentModePos = iHashKeyLoop.Find(aCurrentMode); |
|
11874 TInt newModePos = currentModePos; |
|
11875 |
|
11876 __ASSERT_DEBUG(currentModePos != KErrNotFound , |
|
11877 AknFepPanic(EAknFepPanicNonPermittedEditorMode)); |
|
11878 |
|
11879 do |
|
11880 { |
|
11881 if (newModePos == lastModePos) |
|
11882 { |
|
11883 //we've got to the end of the hash key loop, go back to the beginning |
|
11884 newModePos = 0; |
|
11885 } |
|
11886 else |
|
11887 { |
|
11888 newModePos++; |
|
11889 } |
|
11890 }while(iHashKeyLoop[newModePos] == ENumber && !IsOnlyNumericPermitted()); // no number mode in Chinese qwerty input, except those editors which only support number |
|
11891 |
|
11892 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
11893 if(TryChangeModeL(iHashKeyLoop[newModePos])) |
|
11894 { |
|
11895 return; //succeeded to move to next available mode |
|
11896 } |
|
11897 } |
|
11898 |
|
11899 void CAknFepManager::TryIncrementChineseModeForQwertyL( TInt aCurrentMode ) |
|
11900 { |
|
11901 __ASSERT_DEBUG(IsModePermitted(aCurrentMode),AknFepPanic(EAknFepPanicNonPermittedEditorMode)); |
|
11902 |
|
11903 const TInt lastModePos = iHashKeyLoop.Count() - 1; |
|
11904 const TInt currentModePos = iHashKeyLoop.Find( aCurrentMode ); |
|
11905 TInt newModePos = currentModePos; |
|
11906 |
|
11907 __ASSERT_DEBUG(currentModePos != KErrNotFound , |
|
11908 AknFepPanic(EAknFepPanicNonPermittedEditorMode)); |
|
11909 |
|
11910 do |
|
11911 { |
|
11912 if ( newModePos == lastModePos ) |
|
11913 { |
|
11914 //we've got to the end of the hash key loop, go back to the beginning |
|
11915 newModePos = 0; |
|
11916 } |
|
11917 else |
|
11918 { |
|
11919 newModePos++; |
|
11920 } |
|
11921 } |
|
11922 while ( (iHashKeyLoop[newModePos] == ENumber |
|
11923 && !IsOnlyNumericPermitted()) || (iHashKeyLoop[newModePos] == ELatin |
|
11924 && IsChangeModeByShiftAndSpace() ) ); // no number mode and latin in Chinese qwerty input, except those editors which only support number |
|
11925 |
|
11926 SendEventsToPluginManL( EPluginCloseMode, EFalse ); |
|
11927 if ( TryChangeModeL( iHashKeyLoop[newModePos] ) ) |
|
11928 { |
|
11929 return; //succeeded to move to next available mode |
|
11930 } |
|
11931 } |
|
11932 |
|
11933 void CAknFepManager::TryChangeToSharedDataModeL() |
|
11934 { |
|
11935 TInt sharedDataMode = iSharedDataInterface->InputMode(); |
|
11936 TryChangeModeL(sharedDataMode); |
|
11937 } |
|
11938 |
|
11939 void CAknFepManager::TryChangeToModeBeforeL() |
|
11940 { |
|
11941 if (TryChangeModeL(iModeBefore)) |
|
11942 { |
|
11943 if (iModeBefore==ELatin) |
|
11944 { |
|
11945 if ( iCaseBefore ) |
|
11946 { |
|
11947 iCaseMan->SetCurrentCase(iCaseBefore); |
|
11948 } |
|
11949 else |
|
11950 { |
|
11951 iCaseMan->UpdateCase(ENullNaviEvent); |
|
11952 } |
|
11953 } |
|
11954 } |
|
11955 } |
|
11956 |
|
11957 #ifdef RD_HINDI_PHONETIC_INPUT |
|
11958 |
|
11959 TBool CAknFepManager::IsIndicPhoneticInputLanguage() const |
|
11960 { |
|
11961 MPtiLanguage* ptilang = iPtiEngine->CurrentLanguage(); |
|
11962 TInt currentPtiLang = (ptilang)? ptilang->LanguageCode() : 0; |
|
11963 return (TAknFepUiIndicInputManager::IsIndicPhoneticLanguage(TLanguage(currentPtiLang))); |
|
11964 } |
|
11965 |
|
11966 void CAknFepManager::TryChangePhoneticModeL() |
|
11967 { |
|
11968 MPtiLanguage* ptilang = iPtiEngine->CurrentLanguage(); |
|
11969 TInt currentPtiLang = (ptilang)? ptilang->LanguageCode() : 0; |
|
11970 TInt lang = 0; |
|
11971 |
|
11972 (TAknFepUiIndicInputManager :: IsIndicPhoneticLanguage(TLanguage(currentPtiLang)))? |
|
11973 lang = ELangEnglish : lang = iLanguageCapabilities.iInputLanguageCode; |
|
11974 |
|
11975 iPtiEngine->ActivateLanguageL(lang); |
|
11976 iLangMan->SetInputLanguageL(lang); |
|
11977 InternalFepUI()->SetMode(iMode, EFalse, iQwertyInputMode); |
|
11978 iCaseMan->UpdateCase(ENullNaviEvent); |
|
11979 UpdateIndicators(); |
|
11980 CommitInlineEditL(); |
|
11981 } |
|
11982 |
|
11983 TInt CAknFepManager::SetPhoneticIndicator(TLanguage aInputLanguage) |
|
11984 { |
|
11985 TInt newState = 0; |
|
11986 TInt currentCase = iCaseMan->CurrentCase(); |
|
11987 |
|
11988 switch(aInputLanguage) |
|
11989 { |
|
11990 case KLangHindiPhonetic: |
|
11991 if(currentCase == EAknEditorUpperCase) |
|
11992 { |
|
11993 newState = EIndicatorStateHindiPhoneticUpper; |
|
11994 } |
|
11995 else |
|
11996 { |
|
11997 newState = EIndicatorStateHindiPhoneticLower; |
|
11998 } |
|
11999 break; |
|
12000 default: |
|
12001 break; |
|
12002 } |
|
12003 return newState; |
|
12004 } |
|
12005 #endif |
|
12006 TBool CAknFepManager::TryChangeModeL(TInt aMode) |
|
12007 { |
|
12008 CAknEdwinState* editorState = EditorState(); |
|
12009 TInt sharedDataMode = iSharedDataInterface->InputMode(); |
|
12010 |
|
12011 if (aMode == EStroke && iQwertyInputMode && sharedDataMode == ECangJie) |
|
12012 { |
|
12013 iEditorStateStrokeUsed = editorState; |
|
12014 iStrokeUsedInQWERTY = ETrue; |
|
12015 } |
|
12016 else if (iEditorStateStrokeUsed == editorState) |
|
12017 { |
|
12018 iStrokeUsedInQWERTY = EFalse; |
|
12019 } |
|
12020 |
|
12021 if (aMode == ECangJie && !iQwertyInputMode && |
|
12022 (iFepPluginManager->PluginInputMode() != EPluginInputModeVkb |
|
12023 || iFepPluginManager->PluginInputMode() != EPluginInputModeFSQ)) |
|
12024 { |
|
12025 aMode = EStroke; |
|
12026 } |
|
12027 |
|
12028 if (aMode == ELatinText ||aMode == ELatinUpper || aMode == ELatinLower) |
|
12029 { |
|
12030 if (TryChangeModeL(ELatin)) |
|
12031 { |
|
12032 if ( !(iAknEditorFlags & EAknEditorFlagFixedCase) ) |
|
12033 { |
|
12034 if (aMode == ELatinText) |
|
12035 { |
|
12036 ClearFlag(EFlagSupressAutoUpdate); |
|
12037 } |
|
12038 else if (aMode == ELatinUpper) |
|
12039 { |
|
12040 //Modify for allow text case after entering a dot and space |
|
12041 ClearFlag(EFlagSupressAutoUpdate); |
|
12042 //Modify for allow text case after entering a dot and space |
|
12043 iCaseMan->SetCurrentCase(EAknEditorUpperCase); |
|
12044 } |
|
12045 else //lower |
|
12046 { |
|
12047 //Modify for allow text case after entering a dot and space |
|
12048 ClearFlag(EFlagSupressAutoUpdate); |
|
12049 //Modify for allow text case after entering a dot and space |
|
12050 iCaseMan->SetCurrentCase(EAknEditorLowerCase); |
|
12051 } |
|
12052 UpdateIndicators(); |
|
12053 } |
|
12054 return ETrue; |
|
12055 } |
|
12056 return EFalse; |
|
12057 } |
|
12058 |
|
12059 if ( iQwertyInputMode && ( aMode == ENumber || aMode == ENativeNumber ) && |
|
12060 !IsOnlyNumericPermitted() |
|
12061 // Add this condition to exclude all touch inputmethods. |
|
12062 // When change to number range on touch inputmethods, fn key state can't be locked. |
|
12063 && iFepPluginManager |
|
12064 && iFepPluginManager->PluginInputMode() == EPluginInputModeNone ) |
|
12065 { |
|
12066 if (TryChangeModeL(ELatin)) |
|
12067 { |
|
12068 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12069 // If editor should be launched in FnLock state, because in case of QWERTY keypad |
|
12070 // Current numeric mode converted to alphanumeric mode. |
|
12071 if( iFnKeyManager ) |
|
12072 { |
|
12073 iFnKeyManager->SetFnKeyState(CAknFepFnKeyManager::EFnKeyLock); |
|
12074 SetCase((TCase)EFnKeyLowerCase); |
|
12075 } |
|
12076 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
12077 return ETrue; |
|
12078 } |
|
12079 } |
|
12080 |
|
12081 if (IsModePermitted(aMode)) |
|
12082 { |
|
12083 if (aMode == ELatin) |
|
12084 { |
|
12085 if (iAknEditorFlags & EAknEditorFlagNoT9) |
|
12086 { |
|
12087 SetWesternPredictive(EFalse); |
|
12088 } |
|
12089 |
|
12090 if (iAknEditorFlags & EAknEditorFlagFixedCase) |
|
12091 { |
|
12092 iCaseMan->ConfigureCaseStateFromEditorState(); |
|
12093 } |
|
12094 } |
|
12095 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12096 if (!iQwertyInputMode && WesternPredictive() && iFepManState == EAknFepStateUIActive) |
|
12097 #else |
|
12098 if (WesternPredictive() && iFepManState == EAknFepStateUIActive) |
|
12099 #endif |
|
12100 { |
|
12101 TryRemoveNoMatchesIndicatorL(); |
|
12102 UpdateCbaL(NULL); |
|
12103 } |
|
12104 TryCloseUiL(); |
|
12105 |
|
12106 // getting a new ui manager object corresponded in aMode. |
|
12107 MAknFepManagerInterface* fepUI = iLangMan->GetFepUI(aMode, iCharWidth, |
|
12108 IsPredictive(aMode)); |
|
12109 // getting the currect language id from ptiengine. |
|
12110 MPtiLanguage* ptilang = iPtiEngine->CurrentLanguage(); |
|
12111 TInt currentPtiLang = (ptilang)? ptilang->LanguageCode() : 0; |
|
12112 // getting the supported language id in current ui manager. |
|
12113 TInt currentUiLang = fepUI->SupportLanguage(aMode); |
|
12114 |
|
12115 // changing language id both ptiengine and ui manager |
|
12116 // 1. check the currect ui manager for input mode |
|
12117 // 2. check the current ptiengine and ui manager |
|
12118 if (iCurrentFepUI != fepUI |
|
12119 || currentPtiLang != currentUiLang) |
|
12120 { |
|
12121 iCurrentFepUI = fepUI; |
|
12122 TInt err = iPtiEngine->ActivateLanguageL(currentUiLang); |
|
12123 if (err != KErrNone) |
|
12124 { |
|
12125 #ifdef _DEBUG |
|
12126 RDebug::Print(_L("ActivateLanguageL error return code=[%d] language id=[%d]"), |
|
12127 err, iLanguageCapabilities.iInputLanguageCode); |
|
12128 #endif |
|
12129 ChangeInputLanguageL(ELangEnglish); |
|
12130 return ETrue; |
|
12131 } |
|
12132 } |
|
12133 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12134 #ifdef FF_DUAL_LANGUAGE_SUPPORT |
|
12135 // Change secondary input |
|
12136 iPtiEngine->SetSecondaryInputL(iSharedDataInterface->InputTextLanguageSecondary()); |
|
12137 #endif //FF_DUAL_LANGUAGE_SUPPORT |
|
12138 #endif |
|
12139 |
|
12140 //#ifndef RD_INTELLIGENT_TEXT_INPUT |
|
12141 TBuf<50> mapData; |
|
12142 //Init Data |
|
12143 for (TInt i = 0; i < 50; i++) |
|
12144 { |
|
12145 mapData.Append(0); |
|
12146 } |
|
12147 |
|
12148 //Backup original input mode |
|
12149 TPtiEngineInputMode oriMode = iPtiEngine->InputMode(); |
|
12150 |
|
12151 //Change current input mode, since MappingDataForKey I/F only worked |
|
12152 //when in EPtiEngineMultitapping mode |
|
12153 iPtiEngine->SetInputMode(EPtiEngineMultitapping); |
|
12154 iPtiEngine->MappingDataForKey(EPtiKey1, mapData, iPtiEngine->Case()); |
|
12155 |
|
12156 //Restore |
|
12157 iPtiEngine->SetInputMode(oriMode); |
|
12158 |
|
12159 //Get first three symbols |
|
12160 if(mapData.Length() > 0) |
|
12161 { |
|
12162 iSymbolData.iSymbol1 = mapData[0]; |
|
12163 |
|
12164 if (mapData.Length() > 1) |
|
12165 iSymbolData.iSymbol2 = mapData[1]; |
|
12166 if (mapData.Length() > 2) |
|
12167 iSymbolData.iSymbol3 = mapData[2]; |
|
12168 } |
|
12169 |
|
12170 //Write data to stream |
|
12171 if (iFepPluginManager && iFepPluginManager->CurrentPluginInputFepUI()) |
|
12172 { |
|
12173 iFepPluginManager->CurrentPluginInputFepUI()->HandleCommandL( |
|
12174 ECmdPenInputSymbolOfHardKeyOne, reinterpret_cast<TInt>(&iSymbolData)); |
|
12175 } |
|
12176 //#endif |
|
12177 iMode = aMode; |
|
12178 |
|
12179 #ifdef RD_SCALABLE_UI_V2 |
|
12180 if ( IsChineseInputMode( aMode ) ) |
|
12181 { |
|
12182 iLastChineseInputMode = aMode; |
|
12183 } |
|
12184 #endif // RD_SCALABLE_UI_V2 |
|
12185 if(iMode == ENumber || iMode == ENativeNumber ) |
|
12186 { |
|
12187 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12188 ClearFlag(CAknFepManager::EFlagNewSharedDataInputLanguage); |
|
12189 ClearFlag(CAknFepManager::EFlagNewSharedDataInputMode); |
|
12190 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
12191 InternalFepUI()->SetNumberModeKeyMappingL(iAknEditorNumericKeymap); |
|
12192 } |
|
12193 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12194 InternalFepUI()->SetMode(iMode, IsPredictive(), iQwertyInputMode, KeyboardLayout()); |
|
12195 #else |
|
12196 InternalFepUI()->SetMode(iMode, IsPredictive(), iQwertyInputMode); |
|
12197 #endif |
|
12198 iHashKeyMan->SetMode(iMode, IsPredictive()); |
|
12199 // ensure editor is aware of new fep mode |
|
12200 TCursorSelection curSel; |
|
12201 if ( IsFepAwareTextEditor() ) |
|
12202 { |
|
12203 EditorState()->SetCurrentInputMode(EditorModeFromFepMode(aMode)); |
|
12204 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(curSel); |
|
12205 AdjustCursorTypeForCurrentPosition(); |
|
12206 } |
|
12207 |
|
12208 // when cursor is in between two words and SCT is launched and |
|
12209 // cancel key is pressed, dont move the cursor at the end of |
|
12210 // second word. |
|
12211 if (WesternPredictive(aMode) && !curSel.Length() |
|
12212 && CursorInsideWord() && !IsCcpuFlagSet(ECcpuStateSupressCursorMoveToEnd) |
|
12213 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12214 && (!iSupressCursorMoveToEndChrKeyPressed) |
|
12215 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
12216 ) |
|
12217 { |
|
12218 MoveCursorToEndOfWordL(); |
|
12219 } |
|
12220 else |
|
12221 { |
|
12222 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12223 iSupressCursorMoveToEndChrKeyPressed = EFalse; |
|
12224 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
12225 ClearCcpuFlag(ECcpuStateSupressCursorMoveToEnd); |
|
12226 } |
|
12227 |
|
12228 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12229 // Ensure that autocompletion state is updated |
|
12230 if (WesternPredictive()) |
|
12231 { |
|
12232 SetAutoCompletionState(iSharedDataInterface->PredictiveTextAutoCompleteOn()); |
|
12233 } |
|
12234 #endif |
|
12235 // Set multitap timer to PtiEngine for Japanese variant only |
|
12236 if (IsFeatureSupportedJapanese()) |
|
12237 { |
|
12238 TInt timeout = (iInputCapabilities.SupportsSecretText())? |
|
12239 KSyncPasswdTimeout : iMultiTapTimer; |
|
12240 iPtiEngine->HandleCommandL(EPtiCommandSetMultitapTimer, &timeout); |
|
12241 iPtiEngine->HandleCommandL(EPtiCommandSetJapaneseQwertyFlags, &iJapaneseQwertyFlags); |
|
12242 TInt clear = iSharedDataInterface->ClearDirection(); |
|
12243 iPtiEngine->HandleCommandL(EPtiCommandSetClearFunction, &clear); |
|
12244 // Send PtiEngine the command whether Pictograph is allowed in Candidate list |
|
12245 TInt allow = IsAbleToLaunchPCT(); |
|
12246 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
12247 iPtiEngine->HandleCommandL(EPtiCommandAllowPictographCandidate, &allow); |
|
12248 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
12249 } |
|
12250 |
|
12251 UpdateIndicators(); // moved to bottom to avoid extra indicator updates |
|
12252 |
|
12253 return ETrue; |
|
12254 } |
|
12255 return EFalse; |
|
12256 } |
|
12257 |
|
12258 void CAknFepManager::ChangeInputLanguageL(TInt aInputLanguage) |
|
12259 { |
|
12260 if(iLangMan) |
|
12261 { |
|
12262 iLangMan->SetInputLanguageL(aInputLanguage); |
|
12263 |
|
12264 SetInputLanguageCapabilities(aInputLanguage); |
|
12265 |
|
12266 ReadHashKeyLoopL(); |
|
12267 // we need to make sure that we commit the word to ptiengine, |
|
12268 // so that the word gets added to the UWD |
|
12269 SetCcpuFlag(ECcpuStataCommitPredictiveWord); |
|
12270 // Addition for ITI on FSQ |
|
12271 // When FSQ is opened with the ITI-supported input language, |
|
12272 // if switch to another language which doesn't support ITI, such as Korean, |
|
12273 // need to restore the previous configuration on FEP |
|
12274 if ( iFepPluginManager && !iFepPluginManager->IsSupportITIOnFSQ() ) |
|
12275 { |
|
12276 iFepPluginManager->ResetItiStateL(); |
|
12277 } |
|
12278 if ( !TryChangeModeL(NewInputModeAfterLanguageChange()) ) |
|
12279 { |
|
12280 if ( !TryChangeModeL(ELatin) ) |
|
12281 { |
|
12282 // If the editor does not support text input mode, we try number mode. |
|
12283 if( IsInputModeAvailable(ENativeNumber) && |
|
12284 ( iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic || |
|
12285 iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic || |
|
12286 iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari ) ) |
|
12287 { |
|
12288 TryChangeModeL(ENativeNumber);; |
|
12289 } |
|
12290 else |
|
12291 { |
|
12292 TryChangeModeL(ENumber); |
|
12293 } |
|
12294 } |
|
12295 } |
|
12296 |
|
12297 if (!iLanguageCapabilities.iLocalInputLanguageInUse) |
|
12298 { |
|
12299 switch (iSharedDataInterface->InputTextLanguage()) |
|
12300 { |
|
12301 case ELangPrcChinese: |
|
12302 { |
|
12303 iSharedDataInterface->SetInputMode(EPinyin); |
|
12304 SetFlag(EFlagNewSharedDataInputMode); |
|
12305 break; |
|
12306 } |
|
12307 case ELangTaiwanChinese: |
|
12308 { |
|
12309 iSharedDataInterface->SetInputMode(EZhuyin); |
|
12310 SetFlag(EFlagNewSharedDataInputMode); |
|
12311 break; |
|
12312 } |
|
12313 case ELangHongKongChinese: |
|
12314 { |
|
12315 iSharedDataInterface->SetInputMode(EStroke); |
|
12316 iSharedDataInterface->SetCangJieMode(ECangJieNormal); |
|
12317 SetFlag(EFlagNewSharedDataInputMode); |
|
12318 break; |
|
12319 } |
|
12320 default: |
|
12321 break; |
|
12322 } |
|
12323 } |
|
12324 |
|
12325 SetHashKeyStyle(); |
|
12326 UpdateEditorContext(); |
|
12327 } |
|
12328 //add notify to phrase creation udbmanagement view |
|
12329 |
|
12330 if(iUserdbdlg) |
|
12331 { |
|
12332 iUserdbdlg->OnChangeLanguageL( aInputLanguage ); |
|
12333 if ( aInputLanguage != ELangPrcChinese && |
|
12334 aInputLanguage != ELangTaiwanChinese && |
|
12335 aInputLanguage != ELangHongKongChinese ) |
|
12336 { |
|
12337 iUserdbdlg = NULL; |
|
12338 } |
|
12339 } |
|
12340 } |
|
12341 |
|
12342 void CAknFepManager::RemovePreviousCharacterL() |
|
12343 { |
|
12344 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
12345 { |
|
12346 CommitInlineEditL(); |
|
12347 } |
|
12348 |
|
12349 // Set cursor span on previous character |
|
12350 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
12351 if (iUncommittedText.iAnchorPos > 0) |
|
12352 { |
|
12353 iUncommittedText.iAnchorPos--; |
|
12354 } |
|
12355 |
|
12356 |
|
12357 // get text to replace |
|
12358 TBuf<ESingleCharacter> charToReplace; |
|
12359 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(charToReplace, |
|
12360 iUncommittedText.iAnchorPos, |
|
12361 ESingleCharacter); |
|
12362 |
|
12363 // delete the character with an inline edit |
|
12364 StartInlineEditL(iUncommittedText, charToReplace, ESingleCharacter, EFalse); |
|
12365 UpdateInlineEditL(KNullDesC, 0); |
|
12366 CommitInlineEditL(); |
|
12367 } |
|
12368 |
|
12369 void CAknFepManager::RemoveZWSCharacterL( TBool aIsViramaInputted, |
|
12370 TBool aIsInMultitappingHalant, |
|
12371 TBool aIsCharModifier, |
|
12372 TBool aIsLigaturePresent /*= EFalse*/) |
|
12373 { |
|
12374 CTextLayout* textLayout = TextLayout(); |
|
12375 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
12376 if(!textLayout && !docNavi) |
|
12377 return; |
|
12378 |
|
12379 if( aIsLigaturePresent ) |
|
12380 { |
|
12381 TTmDocPosSpec pos = DocPos(); |
|
12382 TTmPosInfo2 info; |
|
12383 TTmLineInfo lineInfo; |
|
12384 if (docNavi) |
|
12385 { |
|
12386 docNavi->FindDocPos(pos, info, lineInfo); |
|
12387 } |
|
12388 else |
|
12389 { |
|
12390 textLayout->TagmaTextLayout().FindDocPos(pos, info, lineInfo); |
|
12391 } |
|
12392 |
|
12393 if( IsZWSCharacterPresent( ETrue ) ) |
|
12394 { |
|
12395 TInt commitPoint = pos.iPos - 2; |
|
12396 if( IsFlagSet( EFlagInsideInlineEditingTransaction ) ) |
|
12397 { |
|
12398 CommitInlineEditL(); |
|
12399 } |
|
12400 |
|
12401 TCursorSelection sel( commitPoint, commitPoint ); |
|
12402 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel); |
|
12403 } |
|
12404 } |
|
12405 else |
|
12406 { |
|
12407 if ( IsFlagSet(EFlagInsideInlineEditingTransaction) && IsZWSCharacterPresent()) |
|
12408 { |
|
12409 CommitInlineEditL(); |
|
12410 } |
|
12411 } |
|
12412 |
|
12413 TTmDocPosSpec pos = DocPos(); |
|
12414 pos.iType = TTmDocPosSpec::ETrailing; |
|
12415 TTmPosInfo2 info; |
|
12416 TTmLineInfo lineInfo; |
|
12417 if ( ! iInputCapabilities.SupportsSecretText() ) |
|
12418 { |
|
12419 if (docNavi) |
|
12420 { |
|
12421 docNavi->FindDocPos(pos, info, lineInfo); |
|
12422 } |
|
12423 else |
|
12424 { |
|
12425 textLayout->TagmaTextLayout().FindDocPos(pos, info, lineInfo); |
|
12426 } |
|
12427 TBuf<2> previousCharacter; |
|
12428 TBuf<1> zwsPrevChar; |
|
12429 previousCharacter.FillZ(); |
|
12430 zwsPrevChar.FillZ(); |
|
12431 TBool found = EFalse; |
|
12432 |
|
12433 TCursorSelection curSel; |
|
12434 if ( IsFepAwareTextEditor() ) |
|
12435 { |
|
12436 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(curSel); |
|
12437 TInt lowerpos = curSel.LowerPos(); |
|
12438 if( lowerpos > 0) |
|
12439 { |
|
12440 if(lowerpos > 1) |
|
12441 iInputCapabilities.FepAwareTextEditor()-> |
|
12442 GetEditorContentForFep(previousCharacter, lowerpos - 2, 2); |
|
12443 else |
|
12444 iInputCapabilities.FepAwareTextEditor()-> |
|
12445 GetEditorContentForFep(previousCharacter, lowerpos - 1, 1); |
|
12446 |
|
12447 if( lowerpos > 1 ) |
|
12448 { |
|
12449 if(previousCharacter[1] == ZERO_WIDTH_SPACE) |
|
12450 { |
|
12451 zwsPrevChar.Append(previousCharacter[1]); |
|
12452 if( aIsInMultitappingHalant ) |
|
12453 { |
|
12454 curSel.iAnchorPos = lowerpos - 2; |
|
12455 } |
|
12456 else |
|
12457 { |
|
12458 curSel.iAnchorPos = lowerpos - 1; |
|
12459 } |
|
12460 found = ETrue; |
|
12461 } |
|
12462 else if( previousCharacter[0] == ZERO_WIDTH_SPACE ) |
|
12463 { |
|
12464 zwsPrevChar.Append(previousCharacter[0]); |
|
12465 curSel.iAnchorPos = lowerpos - 2; |
|
12466 curSel.iCursorPos = lowerpos - 1; |
|
12467 found = ETrue; |
|
12468 } |
|
12469 } |
|
12470 else |
|
12471 { |
|
12472 if(previousCharacter[0] == ZERO_WIDTH_SPACE) |
|
12473 { |
|
12474 zwsPrevChar.Append(previousCharacter[0]); |
|
12475 if( aIsInMultitappingHalant ) |
|
12476 { |
|
12477 curSel.iAnchorPos = lowerpos - 2; |
|
12478 } |
|
12479 else |
|
12480 { |
|
12481 curSel.iAnchorPos = lowerpos - 1; |
|
12482 } |
|
12483 found = ETrue; |
|
12484 } |
|
12485 } |
|
12486 |
|
12487 } |
|
12488 } |
|
12489 if( found ) |
|
12490 { |
|
12491 StartInlineEditL(curSel, zwsPrevChar, ESingleCharacter, ETrue); |
|
12492 UpdateInlineEditL(KNullDesC, 0); |
|
12493 CommitInlineEditL(); |
|
12494 if ( !aIsInMultitappingHalant && ! iInputCapabilities.SupportsSecretText() ) |
|
12495 { |
|
12496 if ( aIsViramaInputted ) |
|
12497 { |
|
12498 TTmDocPosSpec pos = DocPos(); |
|
12499 TTmPosInfo2 infotemp; |
|
12500 if (docNavi) |
|
12501 { |
|
12502 docNavi->FindDocPos(pos, info, lineInfo); |
|
12503 } |
|
12504 else |
|
12505 { |
|
12506 textLayout->TagmaTextLayout().FindDocPos(pos, info, lineInfo); |
|
12507 } |
|
12508 if(NextChar() && TAknFepUiIndicInputManager::IsCharBaseConsonant(NextChar(), |
|
12509 TLanguage(iLanguageCapabilities.iInputLanguageCode))) |
|
12510 { |
|
12511 TInt nextPos; |
|
12512 if (docNavi) |
|
12513 { |
|
12514 nextPos = docNavi->FindNextPos(pos.iPos); |
|
12515 } |
|
12516 else |
|
12517 { |
|
12518 nextPos = textLayout->TagmaTextLayout().FindNextPos(pos.iPos); |
|
12519 } |
|
12520 info.iDocPos.iPos = nextPos; |
|
12521 } |
|
12522 else if((TAknFepUiIndicInputManager::IsCharAnVowel(NextChar(), |
|
12523 TLanguage(iLanguageCapabilities.iInputLanguageCode))) |
|
12524 &&(aIsCharModifier && TAknFepUiIndicInputManager::IsCharVirama( |
|
12525 PreviousChar(), TLanguage(iLanguageCapabilities.iInputLanguageCode)))) |
|
12526 { |
|
12527 bool posFound; |
|
12528 if (docNavi) |
|
12529 { |
|
12530 posFound = docNavi->GetNextVisualCursorPos(pos, infotemp, EFalse); |
|
12531 } |
|
12532 else |
|
12533 { |
|
12534 posFound = textLayout->TagmaTextLayout().GetNextVisualCursorPos(pos, |
|
12535 infotemp, |
|
12536 EFalse); |
|
12537 } |
|
12538 |
|
12539 if (posFound) |
|
12540 { |
|
12541 info.iDocPos.iPos = infotemp.iDocPos.iPos; |
|
12542 } |
|
12543 } |
|
12544 TCursorSelection sel(info.iDocPos.iPos ,info.iDocPos.iPos ); |
|
12545 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel); |
|
12546 } |
|
12547 else |
|
12548 { |
|
12549 TCursorSelection sel(info.iDocPos.iPos - 1,info.iDocPos.iPos - 1); |
|
12550 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel); |
|
12551 } |
|
12552 |
|
12553 SendEventsToPluginManL( EPluginSyncFepAwareText ); |
|
12554 } |
|
12555 } |
|
12556 } |
|
12557 } |
|
12558 |
|
12559 void CAknFepManager::TryChangePredictiveInputModeL(TBool aFlag) |
|
12560 { |
|
12561 if(Japanese() && iMode != ELatin) |
|
12562 { |
|
12563 if(aFlag) |
|
12564 { |
|
12565 if (!(iAknEditorFlags & EAknEditorFlagNoT9) |
|
12566 && HasJapanesePredictionInputMode()) |
|
12567 { |
|
12568 iJapanesePredictive = aFlag; |
|
12569 iSharedDataInterface->SetJapanesePredictiveTextOn(); |
|
12570 } |
|
12571 } |
|
12572 else |
|
12573 { |
|
12574 iJapanesePredictive = aFlag; |
|
12575 iSharedDataInterface->ResetJapanesePredictiveTextOn(); |
|
12576 } |
|
12577 } |
|
12578 else |
|
12579 { |
|
12580 SetWesternPredictive(aFlag); |
|
12581 } |
|
12582 TryChangeModeL(iMode); |
|
12583 } |
|
12584 |
|
12585 MCoeFepAwareTextEditor* CAknFepManager::FepAwareTextEditor() const |
|
12586 { |
|
12587 return iInputCapabilities.FepAwareTextEditor(); |
|
12588 } |
|
12589 |
|
12590 TBool CAknFepManager::IsFepAwareTextEditor() const |
|
12591 { |
|
12592 #ifdef RD_SCALABLE_UI_V2 |
|
12593 return FullyFepAwareTextEditor(); |
|
12594 #else |
|
12595 return ( iInputCapabilities.FepAwareTextEditor() ? ETrue : EFalse ); |
|
12596 #endif |
|
12597 } |
|
12598 |
|
12599 TCursorSelection CAknFepManager::UncommittedText() const |
|
12600 { |
|
12601 return iUncommittedText; |
|
12602 } |
|
12603 |
|
12604 void CAknFepManager::SetCase(TCase aCase) |
|
12605 { |
|
12606 // For QWERTY only keypad, extended input state like FnLock is applicable. |
|
12607 // In case of ITU-T keypad, this flag should not be part of editor flag. |
|
12608 // In case of numeric only editor Only FnReverse state is valid and editor will be on EFnReverse |
|
12609 // State if FnKey is hold on state. |
|
12610 |
|
12611 //TODO: In case of other functionized input state like (FnNext), it should be stored in editor |
|
12612 |
|
12613 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12614 if(EditorState()) |
|
12615 { |
|
12616 if( iFnKeyManager && ( iFnKeyManager->FnKeyState()== CAknFepFnKeyManager::EFnKeyLock ) ) |
|
12617 { |
|
12618 EditorState()->SetFlags( EditorState()->Flags() | EAknEditorFlagFnLock ); |
|
12619 } |
|
12620 else |
|
12621 { |
|
12622 EditorState()->SetFlags( EditorState()->Flags() & ~EAknEditorFlagFnLock ); |
|
12623 } |
|
12624 } |
|
12625 #endif |
|
12626 |
|
12627 InternalFepUI()->SetCase(aCase); |
|
12628 } |
|
12629 |
|
12630 CAknEdwinState* CAknFepManager::EditorState() const |
|
12631 { |
|
12632 if ( IsFepAwareTextEditor() ) |
|
12633 { |
|
12634 MCoeFepAwareTextEditor* fepAvareTextEditor = iInputCapabilities.FepAwareTextEditor(); |
|
12635 |
|
12636 if ( fepAvareTextEditor && fepAvareTextEditor->Extension1() ) |
|
12637 { |
|
12638 return static_cast<CAknEdwinState*>( fepAvareTextEditor->Extension1()->State( KNullUid ) ); |
|
12639 } |
|
12640 } |
|
12641 return NULL; |
|
12642 } |
|
12643 |
|
12644 void CAknFepManager::SetPredictiveIndicatorState(TAknEditingState& aState) |
|
12645 { |
|
12646 |
|
12647 TInt currentCase = iCaseMan->CurrentCase(); |
|
12648 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
12649 if(iIsAutoCompleteOn && iLanguageCapabilities.iInputLanguageCode != ELangThai) |
|
12650 { |
|
12651 if (iLanguageCapabilities.iInputLanguageCode == ELangArabic) |
|
12652 aState=EAutoCompleteArabic; |
|
12653 |
|
12654 else if (iLanguageCapabilities.iInputLanguageCode == ELangHebrew) |
|
12655 aState=EAutoCompleteHebrew; |
|
12656 |
|
12657 else if (iLanguageCapabilities.iInputLanguageCode == ELangFarsi || |
|
12658 iLanguageCapabilities.iInputLanguageCode == ELangUrdu) |
|
12659 aState=EAutoCompleteFarsiAndUrdu; |
|
12660 /*Hindi*/ |
|
12661 else if ( (iLanguageCapabilities.iInputLanguageCode == ELangHindi) || (iLanguageCapabilities.iInputLanguageCode == ELangMarathi)) |
|
12662 aState = EAutoCompleteHindi; |
|
12663 |
|
12664 else if(iLanguageCapabilities.iInputLanguageCode == ELangVietnamese) |
|
12665 { |
|
12666 switch (currentCase) |
|
12667 { |
|
12668 case EAknEditorUpperCase: |
|
12669 aState = EAutoCompleteUpperVietnamese; |
|
12670 break; |
|
12671 case EAknEditorLowerCase: |
|
12672 aState = EAutoCompleteLowerVietnamese; |
|
12673 break; |
|
12674 case EAknEditorTextCase: |
|
12675 aState = EAutoCompleteShiftedVietnamese; |
|
12676 break; |
|
12677 default: |
|
12678 break; |
|
12679 } |
|
12680 } |
|
12681 else |
|
12682 { |
|
12683 switch (currentCase) |
|
12684 { |
|
12685 case EAknEditorUpperCase: |
|
12686 aState = EAutoCompleteUpper; |
|
12687 break; |
|
12688 case EAknEditorLowerCase: |
|
12689 aState = EAutoCompleteLower; |
|
12690 break; |
|
12691 case EAknEditorTextCase: |
|
12692 aState = EAutoCompleteShifted; |
|
12693 break; |
|
12694 default: |
|
12695 break; |
|
12696 } |
|
12697 } |
|
12698 |
|
12699 } |
|
12700 else |
|
12701 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
12702 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12703 if(iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNone) |
|
12704 { |
|
12705 aState = EFnKeyPressed; |
|
12706 if(iFnKeyManager->FnKeyState() == CAknFepFnKeyManager::EFnKeyLock) |
|
12707 aState = EFnKeyLocked; |
|
12708 } |
|
12709 else |
|
12710 #endif |
|
12711 { |
|
12712 if (iLanguageCapabilities.iInputLanguageCode == ELangArabic) |
|
12713 aState = ET9Arabic; |
|
12714 |
|
12715 else if (iLanguageCapabilities.iInputLanguageCode == ELangHebrew) |
|
12716 aState = ET9Hebrew; |
|
12717 |
|
12718 else if (iLanguageCapabilities.iInputLanguageCode == ELangFarsi || |
|
12719 iLanguageCapabilities.iInputLanguageCode == ELangUrdu) |
|
12720 aState = ET9FarsiAndUrdu; |
|
12721 |
|
12722 else if (iLanguageCapabilities.iInputLanguageCode == ELangThai) |
|
12723 aState = ET9Thai; |
|
12724 |
|
12725 /*Hindi*/ |
|
12726 #ifdef RD_MARATHI |
|
12727 /*Marathi*/ |
|
12728 else if ( iLanguageCapabilities.iInputLanguageCode == ELangMarathi ) |
|
12729 aState = EIndicatorStatePredictiveMarathi; |
|
12730 #endif // RD_MARATHI |
|
12731 |
|
12732 else if(iLanguageCapabilities.iInputLanguageCode == ELangVietnamese) |
|
12733 { |
|
12734 switch (currentCase) |
|
12735 { |
|
12736 case EAknEditorUpperCase: |
|
12737 aState = ET9UpperVietnamese; |
|
12738 break; |
|
12739 case EAknEditorLowerCase: |
|
12740 aState = ET9LowerVietnamese; |
|
12741 break; |
|
12742 case EAknEditorTextCase: |
|
12743 aState = ET9ShiftedVietnamese; |
|
12744 break; |
|
12745 default: |
|
12746 break; |
|
12747 } |
|
12748 } |
|
12749 |
|
12750 else if(iLanguageCapabilities.iInputLanguageCode == ELangGreek) |
|
12751 { |
|
12752 switch (currentCase) |
|
12753 { |
|
12754 case EAknEditorUpperCase: |
|
12755 aState = ET9UpperGreek; |
|
12756 break; |
|
12757 case EAknEditorLowerCase: |
|
12758 aState = ET9LowerGreek; |
|
12759 break; |
|
12760 case EAknEditorTextCase: |
|
12761 aState = ET9ShiftedGreek; |
|
12762 break; |
|
12763 default: |
|
12764 break; |
|
12765 } |
|
12766 } |
|
12767 |
|
12768 //Cyrillic alphabet is used for Russian, Bulgarian and |
|
12769 //Ukranian languages |
|
12770 else if(iLanguageCapabilities.iInputLanguageCode == ELangRussian || |
|
12771 iLanguageCapabilities.iInputLanguageCode == ELangBulgarian || |
|
12772 iLanguageCapabilities.iInputLanguageCode == ELangUkrainian ) |
|
12773 { |
|
12774 switch (currentCase) |
|
12775 { |
|
12776 case EAknEditorUpperCase: |
|
12777 aState = ET9UpperCyrillic; |
|
12778 break; |
|
12779 case EAknEditorLowerCase: |
|
12780 aState = ET9LowerCyrillic; |
|
12781 break; |
|
12782 case EAknEditorTextCase: |
|
12783 aState = ET9ShiftedCyrillic; |
|
12784 break; |
|
12785 default: |
|
12786 break; |
|
12787 } |
|
12788 } |
|
12789 else |
|
12790 { |
|
12791 switch (currentCase) |
|
12792 { |
|
12793 case EAknEditorUpperCase: |
|
12794 aState = ET9Upper; |
|
12795 break; |
|
12796 case EAknEditorLowerCase: |
|
12797 aState = ET9Lower; |
|
12798 break; |
|
12799 case EAknEditorTextCase: |
|
12800 aState = ET9Shifted; |
|
12801 break; |
|
12802 default: |
|
12803 break; |
|
12804 } |
|
12805 } |
|
12806 |
|
12807 } |
|
12808 } |
|
12809 void CAknFepManager::UpdateIndicators() |
|
12810 { |
|
12811 if(ELongKeyPress == iKeyRepeat) |
|
12812 return; |
|
12813 // If it is fepware editor update the Indicators |
|
12814 // otherwise not need excute remainig part of code. |
|
12815 if( !iInputCapabilities.FepAwareTextEditor() || !iFepFullyConstructed ) |
|
12816 { |
|
12817 //Ensure, If no idicator is require, make indicator state None |
|
12818 if (!IsFlagSet(EFlagForegroundUIComponentVisible | EFlagMenuPaneVisible)) |
|
12819 iIndicator->SetState(EStateNone); |
|
12820 return; |
|
12821 } |
|
12822 |
|
12823 TAknEditingState newState = EStateNone; |
|
12824 MPtiLanguage* ptiLang = PtiEngine()->CurrentLanguage(); |
|
12825 MAknEditingStateIndicator* editingStateIndicator = EditingStateIndicator(); |
|
12826 |
|
12827 TBool findPaneIndicator( |
|
12828 iAknEditorFlags & EAknEditorFlagNoEditIndicators && |
|
12829 iAknEditorFlags & EAknEditorFlagForceTransparentFepModes && |
|
12830 editingStateIndicator != (MAknEditingStateIndicator*)iIndicator ); |
|
12831 |
|
12832 #ifdef RD_SCALABLE_UI_V2 |
|
12833 TBool fingerItutIndicator = ( iFepPluginManager && |
|
12834 iFepPluginManager->PluginInputMode() == EPluginInputModeItut ); |
|
12835 // Portrait FSQ is added. |
|
12836 TBool fingerFSQIndicator = ( iFepPluginManager && |
|
12837 ( iFepPluginManager->PluginInputMode() == EPluginInputModeFSQ || |
|
12838 iFepPluginManager->PluginInputMode() == EPluginInputModePortraitFSQ ) ); |
|
12839 #else |
|
12840 TBool fingerItutIndicator = EFalse; |
|
12841 TBool fingerFSQIndicator = EFalse; |
|
12842 |
|
12843 #endif |
|
12844 if ( IsHybridAplhaEditor() && !iHybridAplphaChangedToAlphanumeric ) |
|
12845 { |
|
12846 newState = EHybridModeLatin; |
|
12847 } |
|
12848 //else if (!(iAknEditorFlags & EAknEditorFlagNoEditIndicators) |
|
12849 // || findPaneIndicator || fingerItutIndicator) |
|
12850 else if (!(iAknEditorFlags & EAknEditorFlagNoEditIndicators) |
|
12851 || findPaneIndicator || fingerItutIndicator || fingerFSQIndicator) |
|
12852 { |
|
12853 |
|
12854 #ifdef RD_SCALABLE_UI_V2 |
|
12855 if ( ( IsFlagSet(EFlagQwertyShiftMode) || IsFlagSet(EFlagLongShiftKeyPress)) && |
|
12856 ((iFepPluginManager && iFepPluginManager->PluginInputMode() == EPluginInputModeVkb) || |
|
12857 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
12858 iQwertyInputMode |
|
12859 #else |
|
12860 ( iQwertyInputMode && (IsFlagSet(EFlagQwertyShiftMode) ||IsFlagSet(EFlagLongShiftKeyPress)) |
|
12861 && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNext) |
|
12862 && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyLock) |
|
12863 && (iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyForced) |
|
12864 ) |
|
12865 #endif |
|
12866 )) |
|
12867 #else |
|
12868 if ( iQwertyInputMode && IsFlagSet(EFlagQwertyShiftMode)) |
|
12869 |
|
12870 #endif |
|
12871 { |
|
12872 newState = EQwertyShift; |
|
12873 |
|
12874 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12875 // To keep the shift key indicator in |
|
12876 // Check if fn/shift both key are pressed |
|
12877 if((iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNone) && |
|
12878 (IsFlagSet(EFlagQwertyShiftMode) || IsFlagSet(EFlagLongShiftKeyPress))) |
|
12879 { |
|
12880 newState = EFnKeyPressed; |
|
12881 } |
|
12882 #endif |
|
12883 |
|
12884 } |
|
12885 else |
|
12886 { |
|
12887 switch (iMode) |
|
12888 { |
|
12889 case EHiraganaKanji: |
|
12890 if (IsPredictive()) |
|
12891 { |
|
12892 newState = EIndicatorStateJapanesePredictive; |
|
12893 } |
|
12894 else |
|
12895 { |
|
12896 newState = EIndicatorStateHiraganaKanji; |
|
12897 } |
|
12898 break; |
|
12899 case EKatakana: |
|
12900 if (iCharWidth == EHalfWidthChar) |
|
12901 { |
|
12902 newState = EIndicatorStateHalfKatakana; |
|
12903 } |
|
12904 else if (iCharWidth == EFullWidthChar) |
|
12905 { |
|
12906 newState = EIndicatorStateFullKatakana; |
|
12907 } |
|
12908 break; |
|
12909 case EHiragana: |
|
12910 { |
|
12911 newState = EIndicatorStateHiragana; |
|
12912 } |
|
12913 break; |
|
12914 case EPinyin: |
|
12915 if (ptiLang->HasInputMode(EPtiEnginePinyinByPhrase)) |
|
12916 { |
|
12917 newState = EIndicatorStatePinyinPhrase; |
|
12918 } |
|
12919 else |
|
12920 { |
|
12921 newState = EIndicatorStatePinyin; |
|
12922 } |
|
12923 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12924 if ( iFnKeyManager->FnKeyState() |
|
12925 == CAknFepFnKeyManager::EFnKeyLock ) |
|
12926 newState = EFnKeyLocked; |
|
12927 else if ( iFnKeyManager->FnKeyState() |
|
12928 != CAknFepFnKeyManager::EFnKeyNone ) |
|
12929 newState = EFnKeyPressed; |
|
12930 #endif |
|
12931 break; |
|
12932 case EZhuyin: |
|
12933 if (ptiLang->HasInputMode(EPtiEngineZhuyinByPhrase)) |
|
12934 { |
|
12935 newState = EIndicatorStateZhuyinPhrase; |
|
12936 } |
|
12937 else |
|
12938 { |
|
12939 newState = EIndicatorStateZhuyin; |
|
12940 } |
|
12941 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12942 if ( iFnKeyManager->FnKeyState() |
|
12943 == CAknFepFnKeyManager::EFnKeyLock ) |
|
12944 newState = EFnKeyLocked; |
|
12945 else if ( iFnKeyManager->FnKeyState() |
|
12946 != CAknFepFnKeyManager::EFnKeyNone ) |
|
12947 newState = EFnKeyPressed; |
|
12948 #endif |
|
12949 break; |
|
12950 case EStroke: |
|
12951 { |
|
12952 TBool flag = ptiLang->HasInputMode(EPtiEngineStrokeByPhrase); |
|
12953 if (iLanguageCapabilities.iInputLanguageCode == ELangPrcChinese) |
|
12954 { |
|
12955 if (flag) |
|
12956 { |
|
12957 newState = EIndicatorStateStrokePhrase; |
|
12958 } |
|
12959 else |
|
12960 { |
|
12961 newState = EIndicatorStateStroke; |
|
12962 } |
|
12963 } |
|
12964 else |
|
12965 { |
|
12966 if (flag) |
|
12967 { |
|
12968 newState = EIndicatorStateStrokeTradPhrase; |
|
12969 } |
|
12970 else |
|
12971 { |
|
12972 newState = EIndicatorStateStrokeTrad; |
|
12973 } |
|
12974 } |
|
12975 } |
|
12976 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12977 if ( iFnKeyManager->FnKeyState() |
|
12978 == CAknFepFnKeyManager::EFnKeyLock ) |
|
12979 newState = EFnKeyLocked; |
|
12980 else if ( iFnKeyManager->FnKeyState() |
|
12981 != CAknFepFnKeyManager::EFnKeyNone ) |
|
12982 newState = EFnKeyPressed; |
|
12983 #endif |
|
12984 break; |
|
12985 case ECangJie: |
|
12986 newState = EIndicatorStateCangJie; |
|
12987 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
12988 if ( iFnKeyManager->FnKeyState() |
|
12989 == CAknFepFnKeyManager::EFnKeyLock ) |
|
12990 newState = EFnKeyLocked; |
|
12991 else if ( iFnKeyManager->FnKeyState() |
|
12992 != CAknFepFnKeyManager::EFnKeyNone ) |
|
12993 newState = EFnKeyPressed; |
|
12994 #endif |
|
12995 break; |
|
12996 case EZhuyinFind: |
|
12997 newState = EIndicatorStateZhuyinFind; |
|
12998 break; |
|
12999 case EStrokeFind: |
|
13000 newState = EIndicatorStateStrokeFind; |
|
13001 break; |
|
13002 case ENumber: |
|
13003 { |
|
13004 newState = ENumeric; |
|
13005 //iLanguageCapabilities.iLocalDigitType = EDigitTypeWestern; |
|
13006 } |
|
13007 break; |
|
13008 case ENativeNumber: |
|
13009 { |
|
13010 UpdateNumberIndicator( newState ); |
|
13011 } |
|
13012 break; |
|
13013 case EHangul: |
|
13014 { |
|
13015 newState = EIndicatorStateHangul; |
|
13016 } |
|
13017 break; |
|
13018 case ELatin: |
|
13019 { |
|
13020 UpdateLatinIndicator( newState ); |
|
13021 } |
|
13022 break; |
|
13023 case EHindi: |
|
13024 { |
|
13025 UpdateHindiIndicator( newState ); |
|
13026 } |
|
13027 break; |
|
13028 default: |
|
13029 break; |
|
13030 } |
|
13031 } |
|
13032 } |
|
13033 |
|
13034 if ( iFepPluginManager && iFepPluginManager->PluginInputMode() == EPluginInputModeVkb ) |
|
13035 { |
|
13036 newState = iFepPluginManager->VKBIndicatorState( newState ); |
|
13037 } |
|
13038 |
|
13039 // Update indicators only if the state has been changed, or if the indicator has swapped |
|
13040 if ((iPreviousEditingState != newState) || (editingStateIndicator != iEditIndicatorAtLastUpdate)) |
|
13041 { |
|
13042 if (editingStateIndicator) |
|
13043 { |
|
13044 // because current avkon have not find chinese phrase indicator, |
|
13045 // so change back to no-phrase |
|
13046 if (findPaneIndicator || iAknEditorFlags & EAknEditorFlagFindPane ) |
|
13047 { |
|
13048 switch(newState) |
|
13049 { |
|
13050 case EIndicatorStateStrokePhrase: |
|
13051 { |
|
13052 newState = EIndicatorStateStroke; |
|
13053 } |
|
13054 break; |
|
13055 case EIndicatorStateStrokeTradPhrase: |
|
13056 { |
|
13057 newState = EIndicatorStateStrokeTrad; |
|
13058 } |
|
13059 break; |
|
13060 case EIndicatorStatePinyinPhrase: |
|
13061 { |
|
13062 newState = EIndicatorStatePinyin; |
|
13063 } |
|
13064 break; |
|
13065 case EIndicatorStateZhuyinPhrase: |
|
13066 { |
|
13067 newState = EIndicatorStateZhuyin; |
|
13068 } |
|
13069 break; |
|
13070 default: |
|
13071 { |
|
13072 break; |
|
13073 } |
|
13074 } |
|
13075 } |
|
13076 // Add This condition for Phonebook, ReTe, PF52.50_2008_wk32: |
|
13077 // Navigation bar disappears after tapping find pane and then returning back to Names list view. |
|
13078 // Portrait FSQ is added. |
|
13079 if (!(editingStateIndicator == (MAknEditingStateIndicator*)iIndicator && |
|
13080 ( iFepPluginManager && |
|
13081 ( iFepPluginManager->PluginInputMode() == EPluginInputModeItut |
|
13082 || iFepPluginManager->PluginInputMode() == EPluginInputModeFSQ |
|
13083 || iFepPluginManager->PluginInputMode() == EPluginInputModePortraitFSQ ) ) && |
|
13084 IsFindPaneEditor())) |
|
13085 { |
|
13086 editingStateIndicator->SetState(newState); |
|
13087 } |
|
13088 |
|
13089 // Ensure that no indicator is shown in navi pane when other |
|
13090 // indicator is changed in use. |
|
13091 if ( editingStateIndicator != (MAknEditingStateIndicator*)iIndicator && |
|
13092 iPreviousEditingState == EStateNone && |
|
13093 (!IsFlagSet(EFlagForegroundUIComponentVisible | EFlagMenuPaneVisible)) ) |
|
13094 |
|
13095 { |
|
13096 iIndicator->SetState( EStateNone ); |
|
13097 } |
|
13098 |
|
13099 iPreviousEditingState = newState; |
|
13100 iEditIndicatorAtLastUpdate=editingStateIndicator; |
|
13101 } |
|
13102 } |
|
13103 } |
|
13104 |
|
13105 void CAknFepManager::UpdateNumberIndicator( TAknEditingState& aNewState ) |
|
13106 { |
|
13107 |
|
13108 // The fix is made only for Hindi |
|
13109 UpdateNumericEditorDigitType(); |
|
13110 TBool supportsWesternNumericIntegerOrReal = |
|
13111 ( iInputCapabilities.SupportsWesternNumericIntegerPositive() || |
|
13112 iInputCapabilities.SupportsWesternNumericIntegerNegative() || |
|
13113 iInputCapabilities.SupportsWesternNumericReal() ); |
|
13114 |
|
13115 #ifdef RD_SCALABLE_UI_V2 |
|
13116 iFepPluginManager->SetPluginNativeRange( ETrue ); |
|
13117 #endif // RD_SCALABLE_UI_V2 |
|
13118 // In usual case digit mode is Arabic-Indic digits if local digit mode is |
|
13119 // Arabic-Indic and current input language is Arabic. |
|
13120 if ( (!supportsWesternNumericIntegerOrReal && |
|
13121 iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic /* && |
|
13122 iLanguageCapabilities.iInputLanguageCode == ELangArabic*/ |
|
13123 ) |
|
13124 || |
|
13125 // But digit mode is Arabic-Indic digit in MFNE and real number |
|
13126 // editors if UI language is Arabic and global digit setting is |
|
13127 // Arabic-Indic digits. |
|
13128 ( !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) && |
|
13129 iLanguageCapabilities.iNumericEditorDigitType == EDigitTypeArabicIndic && // AknTextUtils::DigitModeQuery(AknTextUtils::EDigitModeShownToUser) && |
|
13130 supportsWesternNumericIntegerOrReal && |
|
13131 iUiLanguage == ELangArabic |
|
13132 ) |
|
13133 ) |
|
13134 { |
|
13135 aNewState=EArabicIndicNumeric; |
|
13136 |
|
13137 } |
|
13138 else if ( (!supportsWesternNumericIntegerOrReal && |
|
13139 iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic /* && |
|
13140 iLanguageCapabilities.iInputLanguageCode == ELangUrdu,Farasi*/ |
|
13141 ) |
|
13142 || |
|
13143 // But digit mode is Arabic-Indic digit in MFNE and real number |
|
13144 // editors if UI language is Arabic and global digit setting is |
|
13145 // Arabic-Indic digits. |
|
13146 ( !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) && |
|
13147 iLanguageCapabilities.iNumericEditorDigitType == EDigitTypeEasternArabicIndic && // AknTextUtils::DigitModeQuery(AknTextUtils::EDigitModeShownToUser) && |
|
13148 supportsWesternNumericIntegerOrReal && |
|
13149 (iUiLanguage == ELangUrdu || iUiLanguage == ELangFarsi))) |
|
13150 { |
|
13151 aNewState=EArabicIndicNumeric; |
|
13152 } |
|
13153 /* Devanagari Scripts */ |
|
13154 else if ( (!supportsWesternNumericIntegerOrReal && |
|
13155 iLanguageCapabilities.iLocalDigitType == EDigitTypeDevanagari //&& |
|
13156 //iLanguageCapabilities.iInputLanguageCode == ELangHindi |
|
13157 ) |
|
13158 || |
|
13159 ( !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) && |
|
13160 iLanguageCapabilities.iNumericEditorDigitType == EDigitTypeDevanagari && // AknTextUtils::DigitModeQuery(AknTextUtils::EDigitModeShownToUser) && |
|
13161 supportsWesternNumericIntegerOrReal && |
|
13162 TAknFepUiIndicInputManager::IsScriptDevanagari( iUiLanguage ) |
|
13163 ) |
|
13164 ) |
|
13165 { |
|
13166 aNewState= EDevanagariIndicNumeric; |
|
13167 } |
|
13168 else |
|
13169 { |
|
13170 if ( iLanguageCapabilities.iInputLanguageCode == ELangArabic ) |
|
13171 { |
|
13172 iLanguageCapabilities.iLocalDigitType = EDigitTypeArabicIndic; |
|
13173 aNewState=EArabicIndicNumeric; |
|
13174 } |
|
13175 else if ( iLanguageCapabilities.iInputLanguageCode == ELangFarsi |
|
13176 || iLanguageCapabilities.iInputLanguageCode == ELangUrdu ) |
|
13177 { |
|
13178 iLanguageCapabilities.iLocalDigitType = EDigitTypeEasternArabicIndic; |
|
13179 aNewState=EArabicIndicNumeric; |
|
13180 } |
|
13181 else if ( iLanguageCapabilities.iInputLanguageCode == ELangHindi ) |
|
13182 { |
|
13183 //iLanguageCapabilities.iLocalDigitType = EDigitTypeDevanagari; |
|
13184 aNewState= EDevanagariIndicNumeric; |
|
13185 } |
|
13186 } |
|
13187 } |
|
13188 |
|
13189 void CAknFepManager::UpdateLatinIndicator( TAknEditingState& aNewState ) |
|
13190 { |
|
13191 if (IsPredictive()) |
|
13192 { |
|
13193 //AutoComplete - Begin |
|
13194 SetPredictiveIndicatorState( aNewState ); |
|
13195 //AutoComplete - End |
|
13196 |
|
13197 return; |
|
13198 } |
|
13199 |
|
13200 TInt currentCase = iCaseMan->CurrentCase(); |
|
13201 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
13202 if(iFnKeyManager->FnKeyState() == CAknFepFnKeyManager::EFnKeyLock) |
|
13203 aNewState = EFnKeyLocked; |
|
13204 else if(iFnKeyManager->FnKeyState() != CAknFepFnKeyManager::EFnKeyNone) |
|
13205 aNewState = EFnKeyPressed; |
|
13206 else |
|
13207 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
13208 { |
|
13209 #ifdef RD_SCALABLE_UI_V2 |
|
13210 if( iFepPluginManager && |
|
13211 ( !iFepPluginManager->SyncWithPluginRange() || iFepPluginManager->PluginNativeRange() ) ) |
|
13212 { |
|
13213 iFepPluginManager->SetPluginNativeRange( ETrue ); |
|
13214 #endif // RD_SCALABLE_UI_V2 |
|
13215 switch ( iLanguageCapabilities.iInputLanguageCode ) |
|
13216 { |
|
13217 case ELangArabic: |
|
13218 { |
|
13219 aNewState=EMultitapArabic; |
|
13220 } |
|
13221 return; |
|
13222 case ELangHebrew: |
|
13223 { |
|
13224 aNewState=EMultitapHebrew; |
|
13225 } |
|
13226 return; |
|
13227 case ELangFarsi: |
|
13228 case ELangUrdu: |
|
13229 { |
|
13230 aNewState=EMultitapFarsiAndUrdu; |
|
13231 } |
|
13232 return; |
|
13233 case ELangThai: |
|
13234 { |
|
13235 aNewState = EMultitapThai; |
|
13236 } |
|
13237 return; |
|
13238 |
|
13239 #ifdef RD_MARATHI |
|
13240 case ELangMarathi: |
|
13241 { |
|
13242 aNewState = EIndicatorStateMultitapMarathi; |
|
13243 } |
|
13244 return; |
|
13245 #endif // RD_MARATHI |
|
13246 |
|
13247 #ifdef RD_HINDI_PHONETIC_INPUT |
|
13248 case KLangHindiPhonetic: |
|
13249 { |
|
13250 TInt currentPtiLang = (ptiLang)? ptiLang->LanguageCode() : 0; |
|
13251 |
|
13252 if(TAknFepUiIndicInputManager::IsIndicPhoneticLanguage(TLanguage(currentPtiLang))) |
|
13253 { |
|
13254 aNewState = TAknEditingState(SetPhoneticIndicator(TLanguage(currentPtiLang))); |
|
13255 } |
|
13256 else |
|
13257 { |
|
13258 switch ( currentCase ) |
|
13259 { |
|
13260 case EAknEditorUpperCase: |
|
13261 aNewState=EMultitapUpper; |
|
13262 if (iCharWidth == EFullWidthChar) |
|
13263 { |
|
13264 aNewState=EIndicatorStateFullLatinUpper; |
|
13265 } |
|
13266 break; |
|
13267 case EAknEditorLowerCase: |
|
13268 aNewState=EMultitapLower; |
|
13269 if (iCharWidth == EFullWidthChar) |
|
13270 { |
|
13271 aNewState=EIndicatorStateFullLatinLower; |
|
13272 } |
|
13273 break; |
|
13274 case EAknEditorTextCase: |
|
13275 aNewState=EMultitapShifted; |
|
13276 if (iCharWidth == EFullWidthChar) |
|
13277 { |
|
13278 aNewState=EIndicatorStateFullLatinText; |
|
13279 } |
|
13280 break; |
|
13281 default: |
|
13282 break; |
|
13283 } |
|
13284 } |
|
13285 |
|
13286 } |
|
13287 return; |
|
13288 #endif |
|
13289 case ELangVietnamese: |
|
13290 { |
|
13291 switch (currentCase) |
|
13292 { |
|
13293 case EAknEditorUpperCase: |
|
13294 aNewState = EMultitapUpperVietnamese; |
|
13295 break; |
|
13296 case EAknEditorLowerCase: |
|
13297 aNewState = EMultitapLowerVietnamese; |
|
13298 break; |
|
13299 case EAknEditorTextCase: |
|
13300 aNewState = EMultitapShiftedVietnamese; |
|
13301 break; |
|
13302 default: |
|
13303 break; |
|
13304 } |
|
13305 return; |
|
13306 } |
|
13307 |
|
13308 case ELangGreek: |
|
13309 { |
|
13310 switch (currentCase) |
|
13311 { |
|
13312 case EAknEditorUpperCase: |
|
13313 aNewState = EMultitapUpperGreek; |
|
13314 break; |
|
13315 case EAknEditorLowerCase: |
|
13316 aNewState = EMultitapLowerGreek; |
|
13317 break; |
|
13318 case EAknEditorTextCase: |
|
13319 aNewState = EMultitapShiftedGreek; |
|
13320 break; |
|
13321 default: |
|
13322 break; |
|
13323 } |
|
13324 return; |
|
13325 } |
|
13326 |
|
13327 //Cyrillic alphabet is used for Russian, Bulgarian and |
|
13328 //Ukranian languages. So fall through for all these languages - |
|
13329 case ELangRussian: |
|
13330 case ELangBulgarian: |
|
13331 case ELangUkrainian: |
|
13332 { |
|
13333 switch (currentCase) |
|
13334 { |
|
13335 case EAknEditorUpperCase: |
|
13336 aNewState = EMultitapUpperCyrillic; |
|
13337 break; |
|
13338 case EAknEditorLowerCase: |
|
13339 aNewState = EMultitapLowerCyrillic; |
|
13340 break; |
|
13341 case EAknEditorTextCase: |
|
13342 aNewState = EMultitapShiftedCyrillic; |
|
13343 break; |
|
13344 default: |
|
13345 break; |
|
13346 } |
|
13347 return; |
|
13348 } |
|
13349 } |
|
13350 #ifdef RD_SCALABLE_UI_V2 |
|
13351 } |
|
13352 // if plugin is not native range |
|
13353 |
|
13354 if(iFepPluginManager && iLanguageCapabilities.iInputLanguageCode != ELangRussian && |
|
13355 iLanguageCapabilities.iInputLanguageCode != ELangBulgarian && |
|
13356 iLanguageCapabilities.iInputLanguageCode != ELangUkrainian && |
|
13357 iLanguageCapabilities.iInputLanguageCode != ELangGreek ) |
|
13358 { |
|
13359 iFepPluginManager->SetPluginNativeRange( EFalse ); |
|
13360 } |
|
13361 |
|
13362 #endif // RD_SCALABLE_UI_V2 |
|
13363 } |
|
13364 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
13365 if(FnKeyState() == CAknFepFnKeyManager::EFnKeyNone) |
|
13366 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
13367 { |
|
13368 switch (currentCase) |
|
13369 { |
|
13370 case EAknEditorUpperCase: |
|
13371 aNewState=EMultitapUpper; |
|
13372 if (iCharWidth == EFullWidthChar) |
|
13373 { |
|
13374 aNewState=EIndicatorStateFullLatinUpper; |
|
13375 } |
|
13376 break; |
|
13377 case EAknEditorLowerCase: |
|
13378 aNewState=EMultitapLower; |
|
13379 if (iCharWidth == EFullWidthChar) |
|
13380 { |
|
13381 aNewState=EIndicatorStateFullLatinLower; |
|
13382 } |
|
13383 break; |
|
13384 case EAknEditorTextCase: |
|
13385 aNewState=EMultitapShifted; |
|
13386 if (iCharWidth == EFullWidthChar) |
|
13387 { |
|
13388 aNewState=EIndicatorStateFullLatinText; |
|
13389 } |
|
13390 break; |
|
13391 default: |
|
13392 break; |
|
13393 } |
|
13394 } |
|
13395 } |
|
13396 void CAknFepManager::UpdateHindiIndicator( TAknEditingState& aNewState ) |
|
13397 { |
|
13398 if ( IsPredictive() ) |
|
13399 { |
|
13400 if( iIsAutoCompleteOn ) |
|
13401 aNewState = EAutoCompleteHindi; |
|
13402 else |
|
13403 aNewState = EIndicatorStatePredictiveHindi; |
|
13404 } |
|
13405 else |
|
13406 { |
|
13407 aNewState = EIndicatorStateMultitapHindi; |
|
13408 } |
|
13409 } |
|
13410 |
|
13411 TInt CAknFepManager::CurrentInputLangCode() |
|
13412 { |
|
13413 ASSERT(iPtiEngine); |
|
13414 |
|
13415 MPtiLanguage* lang = iPtiEngine->CurrentLanguage(); |
|
13416 ASSERT(lang); |
|
13417 |
|
13418 return lang->LanguageCode(); |
|
13419 } |
|
13420 |
|
13421 TBool CAknFepManager::GetIndicatorImgID(TInt& aIndicatorImgID, TInt& aIndicatorTextID) |
|
13422 { |
|
13423 if (iPreviousEditingState == EStateNone) |
|
13424 { |
|
13425 UpdateIndicators(); |
|
13426 if (iPreviousEditingState == EStateNone) |
|
13427 { |
|
13428 return EFalse; |
|
13429 } |
|
13430 } |
|
13431 |
|
13432 TBool predictiveMode = QueryPredictiveState(iPreviousEditingState); |
|
13433 TBool predictiveAutoCompleteMode = EFalse; |
|
13434 if(!predictiveMode) |
|
13435 { |
|
13436 predictiveAutoCompleteMode = QueryPredictiveAutoCompleteState(iPreviousEditingState); |
|
13437 } |
|
13438 |
|
13439 if (predictiveMode) |
|
13440 { |
|
13441 aIndicatorImgID = EAknNaviPaneEditorIndicatorT9; |
|
13442 } |
|
13443 else if (predictiveAutoCompleteMode) |
|
13444 { |
|
13445 aIndicatorImgID = EAknNaviPaneEditorIndicatorAutoComplete; |
|
13446 } |
|
13447 else |
|
13448 { |
|
13449 aIndicatorImgID = EAknNaviPaneEditorIndicatorQuery; |
|
13450 } |
|
13451 |
|
13452 aIndicatorTextID = EvaluateState(iPreviousEditingState); |
|
13453 |
|
13454 return ETrue; |
|
13455 } |
|
13456 |
|
13457 TInt CAknFepManager::EvaluateState(const TAknEditingState aState) |
|
13458 { |
|
13459 TInt result = 0; |
|
13460 switch(aState) |
|
13461 { |
|
13462 case EArabicIndicNumeric: |
|
13463 result = EAknNaviPaneEditorIndicatorArabicIndicNumberCase; |
|
13464 break; |
|
13465 |
|
13466 case ET9Thai: |
|
13467 case EMultitapThai: |
|
13468 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
13469 case EAutoCompleteThai: |
|
13470 #endif |
|
13471 result = EAknNaviPaneEditorIndicatorThai; |
|
13472 break; |
|
13473 |
|
13474 case EIndicatorStatePredictiveHindi: |
|
13475 case EIndicatorStateMultitapHindi: |
|
13476 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
13477 case EAutoCompleteHindi: |
|
13478 #endif |
|
13479 #ifdef RD_MARATHI |
|
13480 case EIndicatorStateMultitapMarathi: |
|
13481 case EIndicatorStatePredictiveMarathi: |
|
13482 #endif // RD_MARATHI |
|
13483 result = EAknNaviPaneEditorIndicatorDevanagariCase; |
|
13484 break; |
|
13485 |
|
13486 case ET9Arabic: |
|
13487 case EMultitapArabic: |
|
13488 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
13489 case EAutoCompleteArabic: |
|
13490 #endif |
|
13491 result = EAknNaviPaneEditorIndicatorArabicCase; |
|
13492 break; |
|
13493 |
|
13494 case ET9Hebrew: |
|
13495 case EMultitapHebrew: |
|
13496 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
13497 case EAutoCompleteHebrew: |
|
13498 #endif |
|
13499 result = EAknNaviPaneEditorIndicatorHebrewCase; |
|
13500 break; |
|
13501 |
|
13502 case ET9FarsiAndUrdu: |
|
13503 case EMultitapFarsiAndUrdu: |
|
13504 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
13505 case EAutoCompleteFarsiAndUrdu: |
|
13506 #endif |
|
13507 result = EAknNaviPaneEditorIndicatorFarsiAndUrduCase; |
|
13508 break; |
|
13509 |
|
13510 |
|
13511 case ET9Upper: |
|
13512 case EMultitapUpper: |
|
13513 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
13514 case EAutoCompleteUpper: |
|
13515 #endif |
|
13516 result = EAknNaviPaneEditorIndicatorUpperCase; |
|
13517 break; |
|
13518 |
|
13519 case ET9Lower: |
|
13520 case EMultitapLower: |
|
13521 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
13522 case EAutoCompleteLower: |
|
13523 #endif |
|
13524 result = EAknNaviPaneEditorIndicatorLowerCase; |
|
13525 break; |
|
13526 |
|
13527 case ET9Shifted: |
|
13528 case EMultitapShifted: |
|
13529 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
13530 case EAutoCompleteShifted: |
|
13531 #endif |
|
13532 result = EAknNaviPaneEditorIndicatorTextCase; |
|
13533 break; |
|
13534 |
|
13535 case ENumeric: |
|
13536 result = EAknNaviPaneEditorIndicatorNumberCase; |
|
13537 break; |
|
13538 |
|
13539 |
|
13540 case EIndicatorStatePinyin: |
|
13541 result = EAknNaviPaneEditorIndicatorPinyin; |
|
13542 break; |
|
13543 case EIndicatorStatePinyinPhrase: |
|
13544 result = EAknNaviPaneEditorIndicatorPinyinPhrase; |
|
13545 break; |
|
13546 |
|
13547 case EIndicatorStateZhuyin: |
|
13548 result = EAknNaviPaneEditorIndicatorZhuyin; |
|
13549 break; |
|
13550 case EIndicatorStateZhuyinPhrase: |
|
13551 result = EAknNaviPaneEditorIndicatorZhuyinPhrase; |
|
13552 break; |
|
13553 |
|
13554 case EIndicatorStateZhuyinFind: |
|
13555 result = EAknNaviPaneEditorIndicatorZhuyinFind; |
|
13556 break; |
|
13557 |
|
13558 case EDevanagariIndicNumeric : |
|
13559 result = EAknNaviPaneEditorIndicatorDevanagariIndicNumberCase; |
|
13560 break; |
|
13561 |
|
13562 case EIndicatorStateHiraganaKanji: |
|
13563 case EIndicatorStateJapanesePredictive: |
|
13564 result = EAknNaviPaneEditorIndicatorJapaneseHiraganaKanji; |
|
13565 break; |
|
13566 |
|
13567 case EIndicatorStateFullKatakana: |
|
13568 result = EAknNaviPaneEditorIndicatorJapaneseFullKatakana; |
|
13569 break; |
|
13570 |
|
13571 case EIndicatorStateHalfKatakana: |
|
13572 result = EAknNaviPaneEditorIndicatorJapaneseHalfKatakana; |
|
13573 break; |
|
13574 |
|
13575 case EIndicatorStateFullLatinText: |
|
13576 result = EAknNaviPaneEditorIndicatorJapaneseFullTextAlphabet; |
|
13577 break; |
|
13578 |
|
13579 case EIndicatorStateFullLatinUpper: |
|
13580 result = EAknNaviPaneEditorIndicatorJapaneseFullUpperAlphabet; |
|
13581 break; |
|
13582 |
|
13583 case EIndicatorStateFullLatinLower: |
|
13584 result = EAknNaviPaneEditorIndicatorJapaneseFullLowerAlphabet; |
|
13585 break; |
|
13586 |
|
13587 case EIndicatorStateFullNumeric: |
|
13588 result = EAknNaviPaneEditorIndicatorJapaneseFullNumeric; |
|
13589 break; |
|
13590 |
|
13591 case EIndicatorStateHiragana: |
|
13592 result = EAknNaviPaneEditorIndicatorJapaneseHiragana; |
|
13593 break; |
|
13594 |
|
13595 case EIndicatorStateStroke: |
|
13596 result = EAknNaviPaneEditorIndicatorStroke; |
|
13597 break; |
|
13598 case EIndicatorStateStrokePhrase: |
|
13599 result = EAknNaviPaneEditorIndicatorStrokePhrase; |
|
13600 break; |
|
13601 |
|
13602 case EIndicatorStateStrokeTrad: |
|
13603 result = EAknNaviPaneEditorIndicatorStrokeTrad; |
|
13604 break; |
|
13605 case EIndicatorStateStrokeTradPhrase: |
|
13606 result = EAknNaviPaneEditorIndicatorStrokeTradPhrase; |
|
13607 break; |
|
13608 |
|
13609 case EQwertyShift: |
|
13610 result = EAknNaviPaneEditorIndicatorQwertyShift; |
|
13611 break; |
|
13612 |
|
13613 case EIndicatorStateStrokeFind: |
|
13614 result = EAknNaviPaneEditorIndicatorStrokeFind; |
|
13615 break; |
|
13616 |
|
13617 case EIndicatorStateCangJie: |
|
13618 result = EAknNaviPaneEditorIndicatorCangJie; |
|
13619 break; |
|
13620 |
|
13621 case ET9UpperVietnamese: |
|
13622 case EMultitapUpperVietnamese: |
|
13623 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
13624 case EAutoCompleteUpperVietnamese: |
|
13625 #endif |
|
13626 result = EAknNaviPaneEditorIndicatorVietnameseUpperCase; |
|
13627 break; |
|
13628 |
|
13629 case ET9LowerVietnamese: |
|
13630 case EMultitapLowerVietnamese: |
|
13631 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
13632 case EAutoCompleteLowerVietnamese: |
|
13633 #endif |
|
13634 result = EAknNaviPaneEditorIndicatorVietnameseLowerCase; |
|
13635 break; |
|
13636 |
|
13637 case ET9ShiftedVietnamese: |
|
13638 case EMultitapShiftedVietnamese: |
|
13639 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
13640 case EAutoCompleteShiftedVietnamese: |
|
13641 #endif |
|
13642 result = EAknNaviPaneEditorIndicatorVietnameseTextCase; |
|
13643 break; |
|
13644 #ifdef RD_HINDI_PHONETIC_INPUT |
|
13645 case EIndicatorStateHindiPhoneticUpper: |
|
13646 result = EAknNaviPaneEditorIndicatorDevanagariPhoneticUpperCase; |
|
13647 break; |
|
13648 case EIndicatorStateHindiPhoneticLower: |
|
13649 result = EAknNaviPaneEditorIndicatorDevanagariPhoneticLowerCase; |
|
13650 break; |
|
13651 #endif |
|
13652 case ET9UpperGreek: |
|
13653 case EMultitapUpperGreek: |
|
13654 result = EAknNaviPaneEditorIndicatorGreekUpperCase; |
|
13655 break; |
|
13656 |
|
13657 case ET9LowerGreek: |
|
13658 case EMultitapLowerGreek: |
|
13659 result = EAknNaviPaneEditorIndicatorGreekLowerCase; |
|
13660 break; |
|
13661 |
|
13662 case ET9ShiftedGreek: |
|
13663 case EMultitapShiftedGreek: |
|
13664 result = EAknNaviPaneEditorIndicatorGreekTextCase; |
|
13665 break; |
|
13666 |
|
13667 case ET9UpperCyrillic: |
|
13668 case EMultitapUpperCyrillic: |
|
13669 result = EAknNaviPaneEditorIndicatorCyrillicUpperCase; |
|
13670 break; |
|
13671 |
|
13672 case ET9LowerCyrillic: |
|
13673 case EMultitapLowerCyrillic: |
|
13674 result = EAknNaviPaneEditorIndicatorCyrillicLowerCase; |
|
13675 break; |
|
13676 |
|
13677 case ET9ShiftedCyrillic: |
|
13678 case EMultitapShiftedCyrillic: |
|
13679 result = EAknNaviPaneEditorIndicatorCyrillicTextCase; |
|
13680 break; |
|
13681 |
|
13682 case EHybridModeLatin: |
|
13683 result = EAknNaviPaneEditorIndicatorHybridLatin; |
|
13684 break; |
|
13685 case EIndicatorStateHangul: |
|
13686 result = EAknNaviPaneEditorIndicatorKoreanHangul; |
|
13687 break; |
|
13688 |
|
13689 } |
|
13690 return result; |
|
13691 |
|
13692 } |
|
13693 |
|
13694 TBool CAknFepManager::IsAbleToLaunchSCT() const |
|
13695 { |
|
13696 TBool ableToLaunchSCT = ETrue; |
|
13697 |
|
13698 if (ExtendedInputCapabilities() & CAknExtendedInputCapabilities::EDisableSCT && |
|
13699 PluginInputMode() == EPluginInputModeNone ) |
|
13700 { |
|
13701 // The editor doesn't allow SCT. |
|
13702 return EFalse; |
|
13703 } |
|
13704 |
|
13705 if (iMode == ENumber || iMode == ENativeNumber) |
|
13706 { |
|
13707 if (iPermittedInputModes == EAknEditorNumericInputMode || !NumericModeSCTResourceId()) |
|
13708 { |
|
13709 // SCT is not launched if the number mode is the only input mode or |
|
13710 // if there is not keymap resource for the current numeric keymap mode. |
|
13711 ableToLaunchSCT = EFalse; |
|
13712 } |
|
13713 if (iAknEditorFlags & EAknEditorFlagUseSCTNumericCharmap || |
|
13714 ( (iAknEditorNumericKeymap == EAknEditorAlphanumericNumberModeKeymap) && |
|
13715 (iPermittedInputModes != EAknEditorNumericInputMode) )) |
|
13716 { |
|
13717 // SCT is launched in the number mode if requested by editor flag |
|
13718 // EAknEditorFlagUseSCTNumericCharmap or if also text input modes are |
|
13719 // allowed and the keymap is EAknEditorAlphanumericNumberModeKeymap. |
|
13720 ableToLaunchSCT = ETrue; |
|
13721 } |
|
13722 } |
|
13723 if (!(EditorHasFreeSpace() && EditorState() |
|
13724 && EditorState()->SpecialCharacterTableResourceId())) |
|
13725 { |
|
13726 ableToLaunchSCT = EFalse; |
|
13727 } |
|
13728 |
|
13729 return ableToLaunchSCT; |
|
13730 } |
|
13731 |
|
13732 TBool CAknFepManager::QueryPredictiveState(const TAknEditingState aState) |
|
13733 { |
|
13734 return (( aState == EIndicatorStatePinyin) || |
|
13735 ( aState == EIndicatorStatePinyinPhrase) || |
|
13736 ( aState == EIndicatorStateZhuyin) || |
|
13737 ( aState == EIndicatorStateZhuyinPhrase) || |
|
13738 ( aState == EIndicatorStateZhuyinFind) || |
|
13739 ( aState == EIndicatorStateStrokeFind) || |
|
13740 ( aState == EIndicatorStateStroke) || |
|
13741 ( aState == EIndicatorStateStrokePhrase) || |
|
13742 ( aState == EIndicatorStateCangJie) || |
|
13743 ( aState == EIndicatorStateStrokeTrad) || |
|
13744 ( aState == EIndicatorStateStrokeTradPhrase) || |
|
13745 ( aState == ET9Upper) || |
|
13746 ( aState == ET9Shifted) || |
|
13747 ( aState == ET9Lower) || |
|
13748 ( aState == ET9Arabic) || |
|
13749 ( aState == ET9Hebrew) || |
|
13750 ( aState == ET9FarsiAndUrdu) || |
|
13751 ( aState == ET9Thai) || |
|
13752 ( aState == EIndicatorStatePredictiveHindi) || |
|
13753 #ifdef RD_MARATHI |
|
13754 ( aState == EIndicatorStatePredictiveMarathi) || |
|
13755 #endif // RD_MARATHI |
|
13756 ( aState == EIndicatorStateJapanesePredictive) || |
|
13757 ( aState == ET9UpperVietnamese) || |
|
13758 ( aState == ET9LowerVietnamese) || |
|
13759 ( aState == ET9ShiftedVietnamese) || |
|
13760 ( aState == ET9UpperGreek) || |
|
13761 ( aState == ET9LowerGreek) || |
|
13762 ( aState == ET9ShiftedGreek) || |
|
13763 ( aState == ET9UpperCyrillic) || |
|
13764 ( aState == ET9LowerCyrillic) || |
|
13765 ( aState == ET9ShiftedCyrillic) ); |
|
13766 } |
|
13767 |
|
13768 TBool CAknFepManager::QueryPredictiveAutoCompleteState(TAknEditingState aState) |
|
13769 { |
|
13770 |
|
13771 return (( aState == EAutoCompleteUpper ) || |
|
13772 ( aState == EAutoCompleteShifted ) || |
|
13773 ( aState == EAutoCompleteLower ) || |
|
13774 ( aState == EAutoCompleteHindi ) || |
|
13775 ( aState == EAutoCompleteArabic ) || |
|
13776 ( aState == EAutoCompleteHebrew ) || |
|
13777 ( aState == EAutoCompleteFarsiAndUrdu ) || |
|
13778 ( aState == EAutoCompleteThai ) || |
|
13779 ( aState == EAutoCompleteUpperVietnamese ) || |
|
13780 ( aState == EAutoCompleteLowerVietnamese ) || |
|
13781 ( aState == EAutoCompleteShiftedVietnamese )); |
|
13782 } |
|
13783 |
|
13784 void CAknFepManager::LaunchSpecialCharacterTableL(TInt aResourceId, TBool aLaunchedByTouchWin, TBool aSmileyFirst) |
|
13785 { |
|
13786 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
13787 // Set the iSupressCursorMoveToEndChrKeyPressed when cursor is in |
|
13788 // between two words and SCT is launched |
|
13789 iSupressCursorMoveToEndChrKeyPressed = ETrue; |
|
13790 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
13791 #ifdef RD_SCALABLE_UI_V2 |
|
13792 if ( iStarKeyPressed && iFepPluginManager && |
|
13793 iFepPluginManager->PluginInputMode() == EPluginInputModeItut ) |
|
13794 { |
|
13795 aLaunchedByTouchWin = ETrue; |
|
13796 } |
|
13797 iCancelPopupInQwerty = aLaunchedByTouchWin; |
|
13798 #endif //RD_SCALABLE_UI_V2 |
|
13799 DoLaunchSctAndPctL(aResourceId, aSmileyFirst ? EShowSmileyFirst : EShowSctFirst ); |
|
13800 #ifdef RD_SCALABLE_UI_V2 |
|
13801 iCancelPopupInQwerty = EFalse; |
|
13802 #endif //RD_SCALABLE_UI_V2 |
|
13803 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
13804 iSupressCursorMoveToEndChrKeyPressed = ETrue; |
|
13805 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
13806 } |
|
13807 |
|
13808 TBool CAknFepManager::IsAbleToLaunchPCT() const |
|
13809 { |
|
13810 TBool isAbleToLaunch = EFalse; |
|
13811 if (FeatureManager::FeatureSupported(KFeatureIdJapanesePicto) |
|
13812 && (iAknEditorFlags & EAknEditorFlagEnablePictographInput)) |
|
13813 { |
|
13814 isAbleToLaunch = ETrue; |
|
13815 } |
|
13816 return isAbleToLaunch; |
|
13817 } |
|
13818 |
|
13819 TBool CAknFepManager::IsAbleToLaunchSmiley() const |
|
13820 { |
|
13821 if(iLanguageCapabilities.iRightToLeftLanguage) |
|
13822 { |
|
13823 return EFalse; |
|
13824 } |
|
13825 |
|
13826 TBool ableToLaunchSmiley(EFalse); |
|
13827 |
|
13828 CAknEdwinState* edwinState = EditorState(); |
|
13829 if ( edwinState && EditorHasFreeSpace() ) |
|
13830 { |
|
13831 CAknEdwinFormAccessor* formAccessor = edwinState->FormAccessor(); |
|
13832 if(formAccessor) |
|
13833 { |
|
13834 CEikEdwin *edwin = static_cast<CEikEdwin*>(formAccessor->FormClientControl()); |
|
13835 if(edwin) |
|
13836 { |
|
13837 ableToLaunchSmiley = ((edwin->UserFlags()&CEikEdwin::EAvkonEnableSmileySupport) != 0); |
|
13838 } |
|
13839 } |
|
13840 } |
|
13841 |
|
13842 return ableToLaunchSmiley; |
|
13843 } |
|
13844 |
|
13845 TInt CAknFepManager::GetCurrentEditorSCTResId() const |
|
13846 { |
|
13847 if(!EditorState()) |
|
13848 { |
|
13849 return NumericModeSCTResourceId(); |
|
13850 } |
|
13851 TInt currentEditorSCTResId = EditorState()->SpecialCharacterTableResourceId(); |
|
13852 if ( FeatureManager::FeatureSupported(KFeatureIdChinese) ) |
|
13853 { |
|
13854 if (currentEditorSCTResId == R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG) |
|
13855 { |
|
13856 if (iMode == EZhuyin) |
|
13857 { |
|
13858 currentEditorSCTResId = |
|
13859 R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_FOR_ZHUYIN_SYMBOL_INPUT; |
|
13860 } |
|
13861 else |
|
13862 { |
|
13863 currentEditorSCTResId = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_CHINESE; |
|
13864 } |
|
13865 } |
|
13866 } |
|
13867 |
|
13868 if ( FeatureManager::FeatureSupported(KFeatureIdKorean) ) |
|
13869 { |
|
13870 // Use the special sct resource file for Korean variant. |
|
13871 if (currentEditorSCTResId == R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG) |
|
13872 { |
|
13873 currentEditorSCTResId = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_KOREAN; |
|
13874 } |
|
13875 } |
|
13876 |
|
13877 if (currentEditorSCTResId == EDefaultSCTResourceId) // -1 forces the default in SCT resource definition |
|
13878 { |
|
13879 if (iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) |
|
13880 { |
|
13881 currentEditorSCTResId = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_LATIN_ONLY; |
|
13882 } |
|
13883 else |
|
13884 { |
|
13885 // only ITU-T and when Bopomofo symbol input mode is supported, we use new sct table |
|
13886 TInt supportSCTToneMarks = EFalse; |
|
13887 MPtiCoreInfo* ptiCoreInfo = iPtiEngine->CoreInfo(EPtiEngineZhuyin); |
|
13888 |
|
13889 if(ptiCoreInfo) |
|
13890 { |
|
13891 supportSCTToneMarks = ptiCoreInfo->CapsBits() & ESupportSCTToneMarks; |
|
13892 } |
|
13893 |
|
13894 ptiCoreInfo = iPtiEngine->CoreInfo(EPtiEngineZhuyinByPhrase); |
|
13895 if(ptiCoreInfo) |
|
13896 { |
|
13897 supportSCTToneMarks = supportSCTToneMarks || |
|
13898 (ptiCoreInfo->CapsBits() & ESupportSCTToneMarks); |
|
13899 } |
|
13900 |
|
13901 if(!iQwertyInputMode && (iMode == EZhuyin) && supportSCTToneMarks) |
|
13902 { |
|
13903 currentEditorSCTResId = |
|
13904 R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_FOR_ZHUYIN_SYMBOL_INPUT; |
|
13905 } |
|
13906 else |
|
13907 { |
|
13908 if ( FeatureManager::FeatureSupported(KFeatureIdChinese) ) |
|
13909 { |
|
13910 currentEditorSCTResId = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_CHINESE; |
|
13911 } |
|
13912 else if( FeatureManager::FeatureSupported(KFeatureIdKorean) ) |
|
13913 { |
|
13914 // Use the special sct resource file for Korean variant. |
|
13915 currentEditorSCTResId = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_KOREAN; |
|
13916 } |
|
13917 else |
|
13918 { |
|
13919 currentEditorSCTResId = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG; |
|
13920 } |
|
13921 } |
|
13922 } |
|
13923 } |
|
13924 return currentEditorSCTResId; |
|
13925 } |
|
13926 |
|
13927 void CAknFepManager::LaunchPictographCharacterTableL() |
|
13928 { |
|
13929 DoLaunchSctAndPctL(NULL, EShowPctFirst); |
|
13930 } |
|
13931 |
|
13932 |
|
13933 void CAknFepManager::UpdateInlineEditL(const TDesC& aNewInlineText, |
|
13934 TInt aPositionOfInsertionPointInInlineText) |
|
13935 { |
|
13936 if ( ! IsFlagSet ( EFlagInsideInlineEditingTransaction ) ) |
|
13937 { |
|
13938 return; |
|
13939 } |
|
13940 // Japanese implementation needs to be merged with functionality of other languages. Now they are separate. |
|
13941 if (iLanguageCapabilities.iInputLanguageCode == ELangJapanese) |
|
13942 { |
|
13943 iUncommittedText.iCursorPos = iUncommittedText.iAnchorPos + |
|
13944 aPositionOfInsertionPointInInlineText; |
|
13945 |
|
13946 if (aNewInlineText.Length() == 1) |
|
13947 { |
|
13948 if (aNewInlineText[0] == KAknFEPLineFeedSymbol || |
|
13949 aNewInlineText[0] == KAknFEPMirroredLineFeedSymbol) |
|
13950 { |
|
13951 SetFlag(EFlagLineFeedCharacter); |
|
13952 ClearFlag(EFlagSpaceCharacter | EFlagFullWidthSpaceCharacter); |
|
13953 } |
|
13954 else if (aNewInlineText[0] == iSpaceCharacterCode) |
|
13955 { |
|
13956 SetFlag(EFlagSpaceCharacter); |
|
13957 ClearFlag(EFlagLineFeedCharacter | EFlagFullWidthSpaceCharacter); |
|
13958 } |
|
13959 else if (aNewInlineText[0] == iFullWidthSpaceCharacterCode) |
|
13960 { |
|
13961 SetFlag(EFlagFullWidthSpaceCharacter); |
|
13962 ClearFlag(EFlagLineFeedCharacter | EFlagSpaceCharacter); |
|
13963 } |
|
13964 else |
|
13965 { |
|
13966 ClearFlag(EFlagLineFeedCharacter |
|
13967 | EFlagSpaceCharacter |
|
13968 | EFlagFullWidthSpaceCharacter); |
|
13969 } |
|
13970 if (iInputCapabilities.SupportsSecretText()) |
|
13971 { |
|
13972 TBuf<1> buf; |
|
13973 buf.Append(aNewInlineText[0]); |
|
13974 NewCharacterL(buf); |
|
13975 } |
|
13976 else |
|
13977 { |
|
13978 SetFlag(EFlagInsideMultitapInlineEditingTransaction); |
|
13979 iInputCapabilities.FepAwareTextEditor()->UpdateFepInlineTextL(aNewInlineText, |
|
13980 aPositionOfInsertionPointInInlineText); |
|
13981 } |
|
13982 } |
|
13983 else |
|
13984 { |
|
13985 ClearFlag(EFlagLineFeedCharacter | EFlagSpaceCharacter | EFlagFullWidthSpaceCharacter); |
|
13986 iInputCapabilities.FepAwareTextEditor()->UpdateFepInlineTextL(aNewInlineText, |
|
13987 aPositionOfInsertionPointInInlineText); |
|
13988 } |
|
13989 #ifdef _DEBUG |
|
13990 RDebug::Print(_L("UpdateInlineEditL text=[%S] len=[%d] CurPos=[%d] AncPos=[%d] change=[%d]"), |
|
13991 &aNewInlineText, iUncommittedText.Length(), |
|
13992 iUncommittedText.iCursorPos, iUncommittedText.iAnchorPos, |
|
13993 aPositionOfInsertionPointInInlineText); |
|
13994 #endif |
|
13995 } |
|
13996 else |
|
13997 { |
|
13998 TInt curPos = iUncommittedText.iAnchorPos + aNewInlineText.Length(); |
|
13999 |
|
14000 TInt deltaCur = curPos - iUncommittedText.iCursorPos; |
|
14001 |
|
14002 TInt maxEdSize = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep(); |
|
14003 |
|
14004 TInt docLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
14005 |
|
14006 HBufC* newInlineText=NULL; |
|
14007 |
|
14008 TBool syncLater = ETrue; |
|
14009 // we have to restrict to a length that is permissible in the editor |
|
14010 // this situation comes when we select the max length condition is reached |
|
14011 // in the editor and we navigate to one of the words in the middle |
|
14012 // and select a longer word from the candidate list |
|
14013 |
|
14014 |
|
14015 if( (maxEdSize > 0) && ( deltaCur > 0 ) |
|
14016 && (( docLength + deltaCur) > maxEdSize ) ) |
|
14017 { |
|
14018 newInlineText= aNewInlineText.Left( aNewInlineText.Length() - (docLength + deltaCur - maxEdSize )).AllocLC(); |
|
14019 aPositionOfInsertionPointInInlineText=newInlineText->Length(); |
|
14020 } |
|
14021 else if((maxEdSize > 0) && (curPos > maxEdSize)) |
|
14022 { |
|
14023 newInlineText= aNewInlineText.Left(maxEdSize - iUncommittedText.iAnchorPos).AllocLC(); |
|
14024 aPositionOfInsertionPointInInlineText=newInlineText->Length(); |
|
14025 } |
|
14026 else |
|
14027 { |
|
14028 newInlineText=aNewInlineText.AllocLC(); |
|
14029 syncLater = EFalse; |
|
14030 } |
|
14031 // The Below code changes are made to sync iTextBuffer and the last word in the editor.When the |
|
14032 // cursor position reaches more than the max length of editor, tail length is modified according |
|
14033 // to truncated last word and Autocompletion bit length (Element count) value to display last |
|
14034 // word in the editor properly. |
|
14035 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14036 if(syncLater) |
|
14037 { |
|
14038 TBuf<CAknFepManager::EMaximumFepWordLength> currentText = iPtiEngine->CurrentWord(); |
|
14039 currentText.SetLength(newInlineText->Length()); |
|
14040 iPtiEngine->HandleCommandL( EPtiCommandSetCursorCrossedMaxLength ); |
|
14041 iPtiEngine->SetCurrentWord(currentText); |
|
14042 TransferFepStateToEditorL(); |
|
14043 iPtiEngine->HandleCommandL( EPtiCommandResetCursorCrossedMaxLength ); |
|
14044 } |
|
14045 #endif |
|
14046 // CleanupStack::PushL(TCleanupItem(ClearFepStateOnLeave,this)); |
|
14047 iUncommittedText.iCursorPos = iUncommittedText.iAnchorPos + aPositionOfInsertionPointInInlineText; |
|
14048 |
|
14049 HBufC* decoratedInlineEdit = HBufC::NewLC(aNewInlineText.Length()*3); |
|
14050 TPtr bufferPtr(decoratedInlineEdit->Des()); |
|
14051 |
|
14052 if ( EditorSupportsNeutralProtection() ) |
|
14053 { |
|
14054 if ( newInlineText->Length() > 0 ) |
|
14055 { |
|
14056 iInlineTextDecorator->DecorateInlineText( |
|
14057 newInlineText->Des(), |
|
14058 bufferPtr, |
|
14059 aPositionOfInsertionPointInInlineText, |
|
14060 static_cast<TChar>(PreviousChar()), |
|
14061 IsRightToLeftParagraph(DocPos() ), |
|
14062 ( CurrentInputDirectionality() == TBidiText::ERightToLeft ) ); |
|
14063 } |
|
14064 |
|
14065 // Because the length of the new inline edit may bear no relation to the old inline edit, |
|
14066 // the passed desired position of the cursor (which is hidden in S60 anyway) in the new |
|
14067 // inline edit is restricted to its Length(). The input value of parameter |
|
14068 // aPositionOfInsertionPointInInlineText is ignored, and its modified value |
|
14069 // from the DecorateInlineText routine is also ignored. |
|
14070 |
|
14071 aPositionOfInsertionPointInInlineText = decoratedInlineEdit->Length(); |
|
14072 |
|
14073 iUncommittedText.iCursorPos = iUncommittedText.iAnchorPos + aPositionOfInsertionPointInInlineText; |
|
14074 |
|
14075 iInputCapabilities.FepAwareTextEditor()->UpdateFepInlineTextL( |
|
14076 bufferPtr, aPositionOfInsertionPointInInlineText); |
|
14077 |
|
14078 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
14079 iUncommittedText.iAnchorPos-=decoratedInlineEdit->Length(); |
|
14080 } |
|
14081 |
|
14082 else |
|
14083 { |
|
14084 // Even without the issue of decoration, the length of the new inline edit may bear no |
|
14085 // relation to the old inline edit. It is always set to length (the end) of the new inline edit |
|
14086 aPositionOfInsertionPointInInlineText = newInlineText->Length(); |
|
14087 |
|
14088 iInputCapabilities.FepAwareTextEditor()->UpdateFepInlineTextL( |
|
14089 newInlineText->Des(), aPositionOfInsertionPointInInlineText); |
|
14090 |
|
14091 // This is needed here too because we should not insist that the new text is the same length |
|
14092 // as the old, and so the iUncommitted text should be reset. |
|
14093 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
14094 iUncommittedText.iAnchorPos-=newInlineText->Length(); |
|
14095 } |
|
14096 |
|
14097 |
|
14098 CleanupStack::PopAndDestroy(decoratedInlineEdit); |
|
14099 SendEventsToPluginManL( EPluginSyncFepAwareText, EPluginSyncUpdatedText ); |
|
14100 CleanupStack::PopAndDestroy(newInlineText); |
|
14101 //Send info to engine to set EPtiXt9FlagAutoCompletionSetOnToOff flag as false |
|
14102 TInt value = 0; |
|
14103 TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandAutoCompletionOnToOff,&value)); |
|
14104 } |
|
14105 } |
|
14106 |
|
14107 void CAknFepManager::StartInlineEditL() |
|
14108 { |
|
14109 if(iConcatenationTimer->IsActive()) |
|
14110 iConcatenationTimer->Cancel(); |
|
14111 |
|
14112 //currently western only, would need to sort out flags if this were to be used |
|
14113 //in multitap modes |
|
14114 switch (iMode) |
|
14115 { |
|
14116 case ELatin: |
|
14117 case EKatakana: |
|
14118 case EHiragana: |
|
14119 iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(KNullDesC, 0, EFalse, |
|
14120 NULL, *this, *this); |
|
14121 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
14122 break; |
|
14123 default: |
|
14124 iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL(KNullDesC, 0, EFalse, |
|
14125 NULL, *this, *this); |
|
14126 break; |
|
14127 } |
|
14128 #ifdef _DEBUG |
|
14129 RDebug::Print(_L("StartInlineEditL len=[%d] CurPos=[%d] AncPos=[%d]"), |
|
14130 iUncommittedText.Length(), |
|
14131 iUncommittedText.iCursorPos, iUncommittedText.iAnchorPos ); |
|
14132 #endif |
|
14133 |
|
14134 // have to calculate the number of free space on current EDITOR after StartFepInlineEditL(). |
|
14135 TInt maxEdSize = iInputCapabilities.FepAwareTextEditor()->DocumentMaximumLengthForFep(); |
|
14136 TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
14137 iFreeSpaceOfEditor = maxEdSize - edSize; |
|
14138 |
|
14139 SetFlag(EFlagInsideInlineEditingTransaction); |
|
14140 } |
|
14141 |
|
14142 void CAknFepManager::StartInlineEditL(const TDesC& aText) |
|
14143 { |
|
14144 if(iConcatenationTimer->IsActive()) |
|
14145 iConcatenationTimer->Cancel(); |
|
14146 |
|
14147 TInt textLength = aText.Length(); |
|
14148 |
|
14149 // CleanupStack::PushL(TCleanupItem(ClearFepStateOnLeave,this)); |
|
14150 |
|
14151 HBufC* decoratedInlineEdit = HBufC::NewLC(aText.Length()*3); |
|
14152 TPtr bufferPtr(decoratedInlineEdit->Des()); |
|
14153 |
|
14154 // decorate the inline edit |
|
14155 if( aText.Length() > 0 && EditorSupportsNeutralProtection() ) |
|
14156 { |
|
14157 iInlineTextDecorator->DecorateInlineText( |
|
14158 aText, |
|
14159 bufferPtr, |
|
14160 textLength, // aPositionOfInsertionPointInInlineText, |
|
14161 static_cast<TChar>(PreviousChar()), |
|
14162 IsRightToLeftParagraph( DocPos() ), |
|
14163 ( CurrentInputDirectionality() == TBidiText::ERightToLeft ) ); |
|
14164 } |
|
14165 else |
|
14166 { |
|
14167 |
|
14168 bufferPtr.Copy(aText); |
|
14169 } |
|
14170 |
|
14171 // Before starting editor inline, we cancel editor inline if by any chance editor ends up in inline edit and fep does not |
|
14172 TBool phoneIdle = (EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor); |
|
14173 |
|
14174 if(phoneIdle) |
|
14175 { |
|
14176 iInputCapabilities.FepAwareTextEditor()->CancelFepInlineEdit(); |
|
14177 } |
|
14178 |
|
14179 // operates at the current insertion point or selection |
|
14180 iInputCapabilities.FepAwareTextEditor()->StartFepInlineEditL( |
|
14181 |
|
14182 bufferPtr, |
|
14183 textLength, // aPositionOfInsertionPointInInlineText, |
|
14184 EFalse, // Cursor visibility |
|
14185 0, // MFormCustomDrawer* |
|
14186 *this, |
|
14187 *this); |
|
14188 |
|
14189 // CleanupStack::Pop(); // cleanupitem for FEP state. |
|
14190 |
|
14191 if (!iInputCapabilities.FepAwareTextEditor()) |
|
14192 { |
|
14193 // In case while starting the inline edit, 3rd party app removes the focus out of editor before the transaction |
|
14194 // completes, we return with an error. |
|
14195 User::Leave(KErrCorrupt); |
|
14196 } |
|
14197 // cursor span needs to be updated following potential modification |
|
14198 // of the inline edit content before it was started |
|
14199 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
14200 iUncommittedText.iAnchorPos-=decoratedInlineEdit->Length(); |
|
14201 CleanupStack::PopAndDestroy(decoratedInlineEdit); |
|
14202 |
|
14203 SetFlag(EFlagInsideInlineEditingTransaction); |
|
14204 } |
|
14205 |
|
14206 void CAknFepManager::StartInlineEditL(TCursorSelection aCursorSelection, |
|
14207 const TDesC& aInitialInlineText, |
|
14208 TInt aPositionOfInsertionPointInInlineText, |
|
14209 TBool aCursorVisibility) |
|
14210 { |
|
14211 |
|
14212 if(iConcatenationTimer->IsActive()) |
|
14213 iConcatenationTimer->Cancel(); |
|
14214 |
|
14215 TBool setToTrue=EFalse; |
|
14216 |
|
14217 // setToTrue parameter forces use of selection hiding inline edit editor API - |
|
14218 // this method also sets the cursor selection to the second parameter |
|
14219 // CleanupStack::PushL(TCleanupItem(ClearFepStateOnLeave,this)); |
|
14220 iInputCapabilities.FepAwareTextEditor()->Extension1()->StartFepInlineEditL( |
|
14221 setToTrue, |
|
14222 aCursorSelection, |
|
14223 aInitialInlineText, |
|
14224 aPositionOfInsertionPointInInlineText, |
|
14225 aCursorVisibility, |
|
14226 0, // MFormCustomDrawer* ? |
|
14227 *this, |
|
14228 *this); |
|
14229 // CleanupStack::Pop(); // cleanupitem for FEP state. |
|
14230 SetFlag(EFlagInsideInlineEditingTransaction); |
|
14231 //This will suppress Edit submenu from poping up |
|
14232 SetCcpuFlag(ECcpuStateIgnoreStarUp); |
|
14233 } |
|
14234 |
|
14235 TBool CAknFepManager::CloseUiIfWordDeletedL() |
|
14236 { |
|
14237 if (iUncommittedText.Length()==0) |
|
14238 { |
|
14239 // word has been totally deleted |
|
14240 ClearFlag(EFlagCompoundWord); |
|
14241 TryCloseUiL(); |
|
14242 return ETrue; |
|
14243 } |
|
14244 return EFalse; |
|
14245 } |
|
14246 |
|
14247 TBool CAknFepManager::TryGetTextToUncommitL(TDes& aText, TInt aCode, TBool& aComsumeKey) |
|
14248 { |
|
14249 TWesternNaviEvent naviEvent = ENullNaviEvent; |
|
14250 if (aCode == EKeyLeftArrow) |
|
14251 { |
|
14252 naviEvent = ELeftNaviEvent; |
|
14253 } |
|
14254 else if (aCode == EKeyRightArrow) |
|
14255 { |
|
14256 naviEvent = ERightNaviEvent; |
|
14257 } |
|
14258 else if (aCode == EKeyBackspace) |
|
14259 { |
|
14260 naviEvent = EBackspaceEvent; |
|
14261 } |
|
14262 |
|
14263 TInt nextCharPos = 0; // Character ordinal in logical memory (0 - n-1) |
|
14264 TBool hindibackspace = 0 ; |
|
14265 TBool nextPositionFound = EFalse; |
|
14266 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
14267 if ( naviEvent == ERightNaviEvent ) |
|
14268 { |
|
14269 nextPositionFound = GetNextVisualRightCharacter( nextCharPos ); |
|
14270 if( (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) || |
|
14271 (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai)) |
|
14272 { |
|
14273 FindStartOfWord(nextCharPos); |
|
14274 |
|
14275 if(nextCharPos < iUncommittedText.LowerPos()) |
|
14276 { |
|
14277 nextCharPos = iUncommittedText.LowerPos(); |
|
14278 } |
|
14279 } |
|
14280 } |
|
14281 else if ( naviEvent == ELeftNaviEvent ) |
|
14282 { |
|
14283 nextPositionFound = GetNextVisualLeftCharacter( nextCharPos ); |
|
14284 if( nextPositionFound && (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) || |
|
14285 (nextPositionFound && (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai))) |
|
14286 { |
|
14287 FindEndOfWord(nextCharPos); |
|
14288 if(nextCharPos > iUncommittedText.HigherPos()) |
|
14289 { |
|
14290 nextCharPos = iUncommittedText.HigherPos(); |
|
14291 } |
|
14292 } |
|
14293 |
|
14294 } |
|
14295 else if ( naviEvent == EBackspaceEvent ) |
|
14296 { |
|
14297 if (iLanguageCapabilities.iRightToLeftLanguage) |
|
14298 { |
|
14299 nextPositionFound = GetNextVisualRightCharacter( nextCharPos ); |
|
14300 } |
|
14301 else |
|
14302 { |
|
14303 if( (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) || |
|
14304 (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai)) |
|
14305 { |
|
14306 TCursorSelection curSel; |
|
14307 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(curSel); |
|
14308 nextCharPos = curSel.iCursorPos; |
|
14309 hindibackspace = ETrue; |
|
14310 } |
|
14311 else |
|
14312 { |
|
14313 nextPositionFound = GetNextVisualLeftCharacter( nextCharPos ); |
|
14314 } |
|
14315 } |
|
14316 } |
|
14317 |
|
14318 if ( !nextPositionFound && !hindibackspace ) |
|
14319 { |
|
14320 aComsumeKey = EFalse; |
|
14321 return EFalse; |
|
14322 } |
|
14323 |
|
14324 TInt anchorPos = 0; |
|
14325 TInt cursorPos = 0; |
|
14326 TTmDocPosSpec pos = DocPos(); |
|
14327 CTmTextLayout::TTmChunkDescription leftChunk; |
|
14328 CTmTextLayout::TTmChunkDescription rightChunk; |
|
14329 FindAdjacentChunks(pos, leftChunk, rightChunk); |
|
14330 |
|
14331 if (( naviEvent == ELeftNaviEvent && leftChunk.iRightToLeft ) || |
|
14332 ( naviEvent == ERightNaviEvent && !rightChunk.iRightToLeft )) |
|
14333 { |
|
14334 anchorPos = nextCharPos; |
|
14335 cursorPos = nextCharPos; |
|
14336 FindEndOfWord(cursorPos); |
|
14337 } |
|
14338 else |
|
14339 { |
|
14340 if( (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) || |
|
14341 (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai)) |
|
14342 { |
|
14343 cursorPos = nextCharPos; |
|
14344 } |
|
14345 else |
|
14346 { |
|
14347 cursorPos = nextCharPos + 1; |
|
14348 } |
|
14349 anchorPos = nextCharPos; |
|
14350 FindStartOfWord(anchorPos); |
|
14351 } |
|
14352 |
|
14353 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14354 TCursorSelection curSel; |
|
14355 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(curSel); |
|
14356 // if selection happens dont consume the event pass it to editor |
|
14357 if((naviEvent == EBackspaceEvent) |
|
14358 && (!IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) |
|
14359 && (curSel.iAnchorPos != curSel.iCursorPos)) |
|
14360 { |
|
14361 aComsumeKey = EFalse; |
|
14362 return EFalse; |
|
14363 } |
|
14364 #endif |
|
14365 |
|
14366 iUncommittedText.SetSelection(cursorPos, anchorPos); |
|
14367 |
|
14368 if (iUncommittedText.Length() <= EMaximumFepWordLength) |
|
14369 { |
|
14370 iInputCapabilities.FepAwareTextEditor()-> |
|
14371 GetEditorContentForFep(aText, iUncommittedText.iAnchorPos, iUncommittedText.Length()); |
|
14372 aComsumeKey = ETrue; |
|
14373 return ETrue; |
|
14374 } |
|
14375 else |
|
14376 { |
|
14377 if (naviEvent == EBackspaceEvent) |
|
14378 { |
|
14379 // delete the last character |
|
14380 cursorPos--; |
|
14381 iUncommittedText.SetSelection(cursorPos, cursorPos); |
|
14382 aComsumeKey = EFalse; |
|
14383 } |
|
14384 else |
|
14385 { |
|
14386 TInt newCursorPosition= (pos.iPos == cursorPos) ? anchorPos : cursorPos; |
|
14387 iUncommittedText.SetSelection(newCursorPosition, newCursorPosition); |
|
14388 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText); |
|
14389 aComsumeKey = ETrue; |
|
14390 } |
|
14391 // The word is longer than EMaximumFepWordLength. Ui is deactivated. |
|
14392 TryCloseUiL(); |
|
14393 return EFalse; |
|
14394 } |
|
14395 } |
|
14396 |
|
14397 |
|
14398 TBool CAknFepManager::TryGetTextToUncommitL(TDes& aText, TBool& aComsumeKey) |
|
14399 { |
|
14400 TInt nextCharRightPos = 0; // Character ordinal in logical memory (0 - n-1) |
|
14401 TInt nextCharLeftPos = 0; |
|
14402 TBool nextRightPosFound = EFalse; |
|
14403 TBool nextLeftPosFound = EFalse; |
|
14404 |
|
14405 nextRightPosFound = GetNextVisualRightCharacter( nextCharRightPos ); |
|
14406 if( (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) || |
|
14407 (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai)) |
|
14408 { |
|
14409 FindStartOfWord(nextCharRightPos); |
|
14410 |
|
14411 if(nextCharRightPos < iUncommittedText.LowerPos()) |
|
14412 { |
|
14413 nextCharRightPos = iUncommittedText.LowerPos(); |
|
14414 } |
|
14415 } |
|
14416 |
|
14417 |
|
14418 nextLeftPosFound = GetNextVisualLeftCharacter( nextCharLeftPos ); |
|
14419 if( nextLeftPosFound && (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) || |
|
14420 (nextLeftPosFound && (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai))) |
|
14421 { |
|
14422 FindEndOfWord(nextCharLeftPos); |
|
14423 if(nextCharLeftPos > iUncommittedText.HigherPos()) |
|
14424 { |
|
14425 nextCharLeftPos = iUncommittedText.HigherPos(); |
|
14426 } |
|
14427 } |
|
14428 |
|
14429 |
|
14430 |
|
14431 |
|
14432 if ( !nextRightPosFound && !nextLeftPosFound ) |
|
14433 { |
|
14434 aComsumeKey = EFalse; |
|
14435 return EFalse; |
|
14436 } |
|
14437 |
|
14438 TInt anchorPos = 0; |
|
14439 TInt cursorPos = 0; |
|
14440 |
|
14441 |
|
14442 |
|
14443 TTmDocPosSpec pos = DocPos(); |
|
14444 CTmTextLayout::TTmChunkDescription leftChunk; |
|
14445 CTmTextLayout::TTmChunkDescription rightChunk; |
|
14446 FindAdjacentChunks(pos, leftChunk, rightChunk); |
|
14447 |
|
14448 /* |
|
14449 if( (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode))) || |
|
14450 (TLanguage(iLanguageCapabilities.iInputLanguageCode) == ELangThai)) |
|
14451 { |
|
14452 cursorPos = pos.iPos; |
|
14453 } |
|
14454 else |
|
14455 { |
|
14456 cursorPos = pos.iPos + 1; |
|
14457 } |
|
14458 */ |
|
14459 |
|
14460 anchorPos = pos.iPos; |
|
14461 cursorPos = pos.iPos; |
|
14462 FindEndOfWord(cursorPos); |
|
14463 FindStartOfWord(anchorPos); |
|
14464 |
|
14465 |
|
14466 if(cursorPos == pos.iPos || anchorPos == pos.iPos) |
|
14467 { |
|
14468 iUncommittedText.SetSelection(pos.iPos, pos.iPos); |
|
14469 aComsumeKey = ETrue; |
|
14470 return EFalse; |
|
14471 } |
|
14472 else |
|
14473 { |
|
14474 iUncommittedText.SetSelection(cursorPos, anchorPos); |
|
14475 } |
|
14476 |
|
14477 if (iUncommittedText.Length() <= EMaximumFepWordLength) |
|
14478 { |
|
14479 iInputCapabilities.FepAwareTextEditor()-> |
|
14480 GetEditorContentForFep(aText, iUncommittedText.iAnchorPos, iUncommittedText.Length()); |
|
14481 aComsumeKey = ETrue; |
|
14482 return ETrue; |
|
14483 } |
|
14484 else |
|
14485 { |
|
14486 /* |
|
14487 TInt newCursorPosition= (pos.iPos == cursorPos) ? anchorPos : cursorPos; |
|
14488 iUncommittedText.SetSelection(newCursorPosition, newCursorPosition); |
|
14489 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText); |
|
14490 */ |
|
14491 aComsumeKey = ETrue; |
|
14492 // The word is longer than EMaximumFepWordLength. Ui is deactivated. |
|
14493 TryCloseUiL(); |
|
14494 return EFalse; |
|
14495 } |
|
14496 } |
|
14497 |
|
14498 void CAknFepManager::UpdateCbaL(TInt aResourceId) |
|
14499 { |
|
14500 if ( !IsFepAwareTextEditor() ) |
|
14501 { |
|
14502 return; |
|
14503 } |
|
14504 |
|
14505 if (IsCcpuFlagSet(ECcpuStateStartCopy | ECcpuStateCopy | ECcpuStateStartCut | ECcpuStateCut)) |
|
14506 { |
|
14507 return; |
|
14508 } |
|
14509 |
|
14510 if((iAknEditorFlags & EAknEditorFlagFindPane)&& IsChineseInputLanguage()&& aResourceId != NULL) |
|
14511 { |
|
14512 return; |
|
14513 } |
|
14514 |
|
14515 iUiInterface->UpdateSoftkeysL(aResourceId, EditorState(), this, |
|
14516 iSharedDataInterface->InputMode()); |
|
14517 } |
|
14518 |
|
14519 |
|
14520 TBool CAknFepManager::TryRemoveNoMatchesIndicatorL() |
|
14521 { |
|
14522 __ASSERT_DEBUG(IsFlagSet(EFlagInsideInlineEditingTransaction), |
|
14523 AknFepPanic(EAknFepPanicNotInsideInlineEdit)); |
|
14524 |
|
14525 if (IsFlagSet(CAknFepManager::EFlagNoMatches)) |
|
14526 { |
|
14527 ClearFlag(CAknFepManager::EFlagNoMatches); |
|
14528 TBuf<EMaximumFepWordLength> newText; |
|
14529 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(newText, |
|
14530 iUncommittedText.iAnchorPos, |
|
14531 iUncommittedText.Length()); |
|
14532 iInputCapabilities.FepAwareTextEditor()->UpdateFepInlineTextL(newText, |
|
14533 iUncommittedText.Length()); |
|
14534 SendEventsToPluginManL( EPluginSyncFepAwareText ); |
|
14535 return ETrue; |
|
14536 } |
|
14537 return EFalse; |
|
14538 } |
|
14539 |
|
14540 TBool CAknFepManager::IsMoreGoodWordsComing(TInt aNewWordLength) const |
|
14541 { |
|
14542 return (aNewWordLength == iUncommittedText.Length() + 1); |
|
14543 } |
|
14544 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
14545 TBool CAknFepManager::IsMoreGoodAutoCompleteWordsComing(TInt aInputMode,TInt aPreviousWordLength, |
|
14546 TInt aNewWordLength) const |
|
14547 { |
|
14548 return ((aInputMode == EPtiEngineWordCompletion) && (aPreviousWordLength != aNewWordLength )); |
|
14549 } |
|
14550 #endif |
|
14551 |
|
14552 void CAknFepManager::TryStartCompoundWord() |
|
14553 { |
|
14554 // check if this word constitutes a 'compound' word |
|
14555 // i.e. is either adjacent char is an alphabetic characeter |
|
14556 TBuf<ESingleCharacter> ch; |
|
14557 // check the previous character |
|
14558 if(iUncommittedText.iAnchorPos>0) |
|
14559 { |
|
14560 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(ch, |
|
14561 iUncommittedText.iAnchorPos-1, |
|
14562 ESingleCharacter); |
|
14563 if (ch.Length()>0 && STATIC_CAST(TChar, IsValidInLineCharacter(ch[0]))) |
|
14564 { |
|
14565 SetFlag(EFlagCompoundWord); |
|
14566 } |
|
14567 } |
|
14568 |
|
14569 // check the next character |
|
14570 TInt edSize = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
14571 if (!IsFlagSet(EFlagCompoundWord) && iUncommittedText.iAnchorPos < edSize) |
|
14572 { |
|
14573 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(ch, |
|
14574 iUncommittedText.iAnchorPos, |
|
14575 ESingleCharacter); |
|
14576 if (ch.Length()>0 && STATIC_CAST(TChar, IsValidInLineCharacter(ch[0]))) |
|
14577 { |
|
14578 SetFlag(EFlagCompoundWord); |
|
14579 } |
|
14580 } |
|
14581 } |
|
14582 |
|
14583 void CAknFepManager::AddCompoundWordToUdbL() |
|
14584 { |
|
14585 __ASSERT_DEBUG(WesternPredictive() , AknFepPanic(EAknFepPanicNonPermittedEditorMode)); |
|
14586 |
|
14587 HBufC* compoundWordBuf = |
|
14588 HBufC::NewLC(iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep()); // buffer for text |
|
14589 TPtr compoundWord=compoundWordBuf->Des(); |
|
14590 |
|
14591 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
14592 |
|
14593 // reset cursor span on word |
|
14594 FindStartOfWord(iUncommittedText.iAnchorPos); |
|
14595 FindEndOfWord(iUncommittedText.iCursorPos); |
|
14596 |
|
14597 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(compoundWord, |
|
14598 iUncommittedText.iAnchorPos, |
|
14599 iUncommittedText.Length()); |
|
14600 FepUI()->AddTextToUserDictionaryL(compoundWord); |
|
14601 CleanupStack::PopAndDestroy(); // compoundWordBuf |
|
14602 } |
|
14603 |
|
14604 void CAknFepManager::SetWesternPredictive( const TBool aWesternPredictive ) |
|
14605 { |
|
14606 const TInt previousValue = iWesternPredictive; |
|
14607 iWesternPredictive = aWesternPredictive && !(iAknEditorFlags & EAknEditorFlagNoT9) && |
|
14608 // Predictive QWERTY (XT9) changes ----> |
|
14609 ( |
|
14610 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14611 ( |
|
14612 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
14613 iLanguageCapabilities.iSupportsWesternPredictive |
|
14614 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14615 && !iQwertyInputMode) |
|
14616 || (iLanguageCapabilities.iSupportsWesternQwertyPredictive && iQwertyInputMode) |
|
14617 #ifdef __HALF_QWERTY_KEYPAD |
|
14618 || (iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive && iQwertyInputMode) |
|
14619 #endif //__HALF_QWERTY_KEYPAD |
|
14620 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
14621 ); |
|
14622 // Predictive QWERTY (XT9) changes <---- |
|
14623 if ( (previousValue != iWesternPredictive) && !(iAknEditorFlags & EAknEditorFlagNoT9) ) |
|
14624 { |
|
14625 if (iWesternPredictive) |
|
14626 { |
|
14627 iSharedDataInterface->SetPredictiveTextOn(); |
|
14628 } |
|
14629 else |
|
14630 { |
|
14631 iSharedDataInterface->ResetPredictiveTextOn(); |
|
14632 } |
|
14633 if ( iFepPluginManager && iFepPluginManager->IsSupportITIOnFSQ() ) |
|
14634 { |
|
14635 TRAP_IGNORE(SendEventsToPluginManL( EPluginUpdatePenInputITIStatus )); |
|
14636 } |
|
14637 } |
|
14638 } |
|
14639 |
|
14640 void CAknFepManager::SetWesternAutoComplete( const TBool aWesternAutoComplete ) |
|
14641 { |
|
14642 const TInt previousValue = iIsAutoCompleteOn; |
|
14643 iIsAutoCompleteOn = aWesternAutoComplete && !(iAknEditorFlags & EAknEditorFlagNoT9); |
|
14644 if ( (previousValue != iIsAutoCompleteOn) && !(iAknEditorFlags & EAknEditorFlagNoT9) ) |
|
14645 { |
|
14646 if (iIsAutoCompleteOn) |
|
14647 { |
|
14648 iSharedDataInterface->SetPredictiveTextAutoCompleteOn(); |
|
14649 } |
|
14650 else |
|
14651 { |
|
14652 iSharedDataInterface->ResetPredictiveTextAutoCompleteOn(); |
|
14653 } |
|
14654 } |
|
14655 } |
|
14656 |
|
14657 void CAknFepManager::SetJapanesePredictive(const TBool aJapanesePredictive) |
|
14658 { |
|
14659 if (iJapanesePredictive != aJapanesePredictive) |
|
14660 { |
|
14661 iJapanesePredictive = aJapanesePredictive; |
|
14662 } |
|
14663 if (iJapanesePredictive & iSharedDataInterface->PredictiveTextJapaneseOn() |
|
14664 || !iJapanesePredictive & !iSharedDataInterface->PredictiveTextJapaneseOn()) |
|
14665 { |
|
14666 if(iJapanesePredictive) |
|
14667 { |
|
14668 iSharedDataInterface->SetJapanesePredictiveTextOn(); |
|
14669 } |
|
14670 else |
|
14671 { |
|
14672 iSharedDataInterface->ResetJapanesePredictiveTextOn(); |
|
14673 } |
|
14674 } |
|
14675 } |
|
14676 |
|
14677 void CAknFepManager::SetQwertyMode(const TBool aQwertyInputMode) |
|
14678 { |
|
14679 #ifdef RD_SCALABLE_UI_V2 |
|
14680 if( aQwertyInputMode && iFepPluginManager && |
|
14681 iSharedDataInterface->PluginInputMode() != EPluginInputModeNone |
|
14682 // Add this condition for addtion of ITI features on FSQ. |
|
14683 // iSharedDataInterface->QwertyInputMode() == 1, means that |
|
14684 // hw keyboard is slided, then need to close touch inputmethods. |
|
14685 && iSharedDataInterface->QwertyInputMode() ) |
|
14686 { |
|
14687 iFepPluginManager->ResetMenuState(EFalse); |
|
14688 ExitPluginSpellModeByCancel(); |
|
14689 TRAP_IGNORE(iFepPluginManager->ClosePluginInputModeL( ETrue )); |
|
14690 if ( iCancelPopupInQwerty ) |
|
14691 { |
|
14692 TRAP_IGNORE( SimulateKeyEventL( EKeyCBA2 ) ); |
|
14693 } |
|
14694 } |
|
14695 SetQwertyModeToInputcapbility(); |
|
14696 #endif//RD_SCALABLE_UI_V2 |
|
14697 if (!COMPARE_BOOLS(aQwertyInputMode, iQwertyInputMode)) |
|
14698 { |
|
14699 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
14700 if(IsAutoCompleteOn()) |
|
14701 { |
|
14702 TRAP_IGNORE(RemoveSuggestedCompletionL()); |
|
14703 } |
|
14704 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
14705 iQwertyInputMode = aQwertyInputMode; |
|
14706 if (!iQwertyInputMode) |
|
14707 { |
|
14708 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14709 SetTypingCorrectionLevel(EPtiErrorCorrectionLevelHigh); |
|
14710 SetNumberCandidateState(ETrue); // ETrue |
|
14711 SetPrimaryCandidate(EFalse); // Best prediction |
|
14712 #endif |
|
14713 ClearFlag(EFlagQwertyShiftMode | EFlagNoActionDuringChrKeyPress); |
|
14714 } |
|
14715 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14716 else |
|
14717 { |
|
14718 iSharedDataInterface->HandlePredictiveTextNumberCandidateSettingChange(); |
|
14719 iSharedDataInterface->HandlePredictiveTextTypingCorrectionLevelChange(); |
|
14720 iSharedDataInterface->HandlePredictiveTextPrimaryCandidateChange(); |
|
14721 } |
|
14722 #endif |
|
14723 |
|
14724 if ( iFepManState != EAknFepStateNull && IsFepAwareTextEditor() ) |
|
14725 { |
|
14726 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14727 |
|
14728 // In case of layout remove the auto completion part |
|
14729 // Before transfer fep state to editor state. |
|
14730 if(IsAutoCompleteOn()) |
|
14731 { |
|
14732 #ifdef RD_SCALABLE_UI_V2 |
|
14733 if( iFepPluginManager |
|
14734 && iFepPluginManager->IsSupportITIOnFSQ() |
|
14735 && !iQwertyInputMode ) |
|
14736 { |
|
14737 TRAP_IGNORE( iPtiEngine->HandleCommandL( EPtiCommandLockCurrentCandidate ) ); |
|
14738 } |
|
14739 else |
|
14740 #endif //RD_SCALABLE_UI_V2 |
|
14741 { |
|
14742 TInt tailLength = 0; |
|
14743 TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength )); |
|
14744 if(tailLength > 0) |
|
14745 { |
|
14746 TRAP_IGNORE( |
|
14747 { |
|
14748 RemoveSuggestedAdvanceCompletionL(); |
|
14749 iPtiEngine->HandleCommandL( EPtiCommandLockCurrentCandidate ); |
|
14750 }); |
|
14751 } |
|
14752 } |
|
14753 } |
|
14754 #endif |
|
14755 if ( !iFocusedItemDestroy ) |
|
14756 { |
|
14757 TRAP_IGNORE( |
|
14758 { |
|
14759 TransferFepStateToEditorL(); |
|
14760 TryCloseUiL(); |
|
14761 ConfigureFEPFromEditorStateL(); |
|
14762 }); |
|
14763 } |
|
14764 } |
|
14765 } |
|
14766 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14767 if(iFnKeyManager) |
|
14768 iFnKeyManager->SetQwertyInputMode(aQwertyInputMode); |
|
14769 #endif |
|
14770 } |
|
14771 |
|
14772 TBool CAknFepManager::WesternPredictive(TInt aMode) const |
|
14773 { |
|
14774 TInt mode = iMode; |
|
14775 if ( aMode ) |
|
14776 { |
|
14777 mode = aMode; |
|
14778 } |
|
14779 return (mode == ELatin && iWesternPredictive && |
|
14780 // Predictive QWERTY (XT9) changes ----> |
|
14781 |
|
14782 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14783 (( |
|
14784 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
14785 iLanguageCapabilities.iSupportsWesternPredictive |
|
14786 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14787 && !iQwertyInputMode) |
|
14788 || (iLanguageCapabilities.iSupportsWesternQwertyPredictive && iQwertyInputMode) |
|
14789 #ifdef __HALF_QWERTY_KEYPAD |
|
14790 || (iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive && iQwertyInputMode) |
|
14791 #endif //__HALF_QWERTY_KEYPAD |
|
14792 ) |
|
14793 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
14794 ); |
|
14795 // Predictive QWERTY (XT9) changes <---- |
|
14796 } |
|
14797 |
|
14798 TBool CAknFepManager::IsPredictive(TInt aMode) const |
|
14799 { |
|
14800 TBool isPredictive = EFalse; |
|
14801 TInt mode = iMode; |
|
14802 if ( aMode ) |
|
14803 { |
|
14804 mode = aMode; |
|
14805 } |
|
14806 if (mode == EHiraganaKanji ) |
|
14807 { |
|
14808 if ((iPermittedInputModes & EAknEditorHiraganaKanjiInputMode) |
|
14809 && iJapanesePredictive |
|
14810 && !(iAknEditorFlags & EAknEditorFlagNoT9) |
|
14811 && HasJapanesePredictionInputMode()) |
|
14812 { |
|
14813 isPredictive = ETrue; |
|
14814 // Japanese predictive input is available on both Qwerty and not Qwerty |
|
14815 return isPredictive; |
|
14816 } |
|
14817 } |
|
14818 else if (mode == ELatin) |
|
14819 { |
|
14820 if ((iPermittedInputModes & (EAknEditorTextInputMode | EAknEditorHalfWidthTextInputMode)) |
|
14821 && !(iAknEditorFlags & EAknEditorFlagNoT9) |
|
14822 && iWesternPredictive && |
|
14823 (iLanguageCapabilities.iSupportsWesternPredictive |
|
14824 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14825 ||iLanguageCapabilities.iSupportsWesternQwertyPredictive |
|
14826 #ifdef __HALF_QWERTY_KEYPAD |
|
14827 ||iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive |
|
14828 #endif //__HALF_QWERTY_KEYPAD |
|
14829 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
14830 )) // Predictive QWERTY (XT9) changes |
|
14831 { |
|
14832 isPredictive = ETrue; |
|
14833 } |
|
14834 } |
|
14835 #ifdef RD_SCALABLE_UI_V2 |
|
14836 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14837 return isPredictive; //&& (iFepPluginManager->PluginInputMode() == EPluginInputModeNone); |
|
14838 #else |
|
14839 return isPredictive && !iQwertyInputMode |
|
14840 && ((iFepPluginManager->PluginInputMode() == EPluginInputModeItut) |
|
14841 || (iFepPluginManager->PluginInputMode() == EPluginInputModeNone)); |
|
14842 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
14843 #else |
|
14844 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
14845 return isPredictive; |
|
14846 #else |
|
14847 return isPredictive && !iQwertyInputMode; |
|
14848 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
14849 #endif //RD_SCALABLE_UI_V2 |
|
14850 } |
|
14851 |
|
14852 TBool CAknFepManager::Japanese() const |
|
14853 { |
|
14854 TBool rtn = EFalse; |
|
14855 switch (iMode) |
|
14856 { |
|
14857 case EHiraganaKanji: |
|
14858 case EKatakana: |
|
14859 case EHiragana: |
|
14860 rtn = ETrue; |
|
14861 break; |
|
14862 case ELatin: |
|
14863 if ((!WesternPredictive()) && iCharWidth == EFullWidthChar) |
|
14864 { |
|
14865 rtn = ETrue; |
|
14866 } |
|
14867 break; |
|
14868 case ENumber: |
|
14869 if (iCharWidth == EFullWidthChar) |
|
14870 { |
|
14871 rtn = ETrue; |
|
14872 } |
|
14873 break; |
|
14874 default: |
|
14875 break; |
|
14876 } |
|
14877 return rtn; |
|
14878 } |
|
14879 |
|
14880 TBool CAknFepManager::IsOnlyFullWidthCharacterPermitted() const |
|
14881 { |
|
14882 CAknEdwinState* editorState = EditorState(); |
|
14883 TUint permittedInputModes = editorState->PermittedInputModes(); |
|
14884 TUint fullWidthPermitted = (EAknEditorFullWidthTextInputMode |
|
14885 | EAknEditorFullWidthNumericInputMode |
|
14886 | EAknEditorFullWidthKatakanaInputMode); |
|
14887 TUint fullWidthNotPermitted = ~fullWidthPermitted; |
|
14888 TBool isfullchar = ETrue; |
|
14889 if (permittedInputModes & fullWidthNotPermitted) |
|
14890 { |
|
14891 isfullchar = EFalse; |
|
14892 } |
|
14893 |
|
14894 if (!(permittedInputModes & fullWidthPermitted)) |
|
14895 { |
|
14896 isfullchar = EFalse; |
|
14897 } |
|
14898 |
|
14899 return isfullchar; |
|
14900 } |
|
14901 |
|
14902 TBool CAknFepManager::IsOnlyHalfWidthCharacterPermitted() const |
|
14903 { |
|
14904 CAknEdwinState* editorState = EditorState(); |
|
14905 TUint permittedInputModes; |
|
14906 if( editorState ) |
|
14907 { |
|
14908 permittedInputModes= editorState->PermittedInputModes(); |
|
14909 } |
|
14910 else |
|
14911 { |
|
14912 permittedInputModes = EAknEditorNumericInputMode; |
|
14913 } |
|
14914 TUint halfWidthNotPermitted = (EAknEditorFullWidthTextInputMode |
|
14915 | EAknEditorFullWidthNumericInputMode |
|
14916 | EAknEditorFullWidthKatakanaInputMode |
|
14917 | EAknEditorHiraganaKanjiInputMode |
|
14918 | EAknEditorHiraganaInputMode); |
|
14919 |
|
14920 TUint halfWidthPermitted = ~halfWidthNotPermitted; |
|
14921 TBool ishalfchar = ETrue; |
|
14922 if (permittedInputModes & halfWidthNotPermitted) |
|
14923 { |
|
14924 ishalfchar = EFalse; |
|
14925 } |
|
14926 |
|
14927 if (!(permittedInputModes & halfWidthPermitted)) |
|
14928 { |
|
14929 ishalfchar = EFalse; |
|
14930 } |
|
14931 if (permittedInputModes & EAknEditorTextInputMode) |
|
14932 { |
|
14933 ishalfchar = EFalse; |
|
14934 } |
|
14935 if (editorState && (editorState->Flags() & EAknEditorFlagLatinInputModesOnly)) |
|
14936 { |
|
14937 ishalfchar = ETrue; |
|
14938 } |
|
14939 return ishalfchar; |
|
14940 } |
|
14941 |
|
14942 TBool CAknFepManager::IsHalfAndFullKatakanaPermitted() const |
|
14943 { |
|
14944 CAknEdwinState* editorState = EditorState(); |
|
14945 TUint permittedInputModes = editorState->PermittedInputModes(); |
|
14946 TUint katakanaInputMode = (EAknEditorKatakanaInputMode |
|
14947 | EAknEditorFullWidthKatakanaInputMode); |
|
14948 TBool iskatakana = EFalse; |
|
14949 if ((permittedInputModes & katakanaInputMode) == katakanaInputMode) |
|
14950 { |
|
14951 iskatakana = ETrue; |
|
14952 } |
|
14953 return iskatakana; |
|
14954 } |
|
14955 |
|
14956 TBool CAknFepManager::IsHalfAndFullLatinPermitted() const |
|
14957 { |
|
14958 CAknEdwinState* editorState = EditorState(); |
|
14959 TUint permittedInputModes = editorState->PermittedInputModes(); |
|
14960 TUint latinInputMode = (EAknEditorHalfWidthTextInputMode |
|
14961 | EAknEditorFullWidthTextInputMode); |
|
14962 TBool islatin = EFalse; |
|
14963 |
|
14964 if ((permittedInputModes & latinInputMode) == latinInputMode) |
|
14965 { |
|
14966 islatin = ETrue; |
|
14967 } |
|
14968 return islatin; |
|
14969 } |
|
14970 |
|
14971 TBool CAknFepManager::IsHalfAndFullNumberPermitted() const |
|
14972 { |
|
14973 CAknEdwinState* editorState = EditorState(); |
|
14974 TUint permittedInputModes = editorState->PermittedInputModes(); |
|
14975 TUint numInputMode = (EAknEditorNumericInputMode |
|
14976 | EAknEditorFullWidthNumericInputMode); |
|
14977 TBool isnum = EFalse; |
|
14978 if ((permittedInputModes & numInputMode) == numInputMode) |
|
14979 { |
|
14980 isnum = ETrue; |
|
14981 } |
|
14982 |
|
14983 return isnum; |
|
14984 } |
|
14985 |
|
14986 TWidthChar CAknFepManager::CharacterWidth() const |
|
14987 { |
|
14988 return iCharWidth; |
|
14989 } |
|
14990 |
|
14991 CPtiEngine* CAknFepManager::PtiEngine() const |
|
14992 { |
|
14993 return iPtiEngine; |
|
14994 } |
|
14995 |
|
14996 void CAknFepManager::SetInlineEditingCursorVisibilityL(TBool aCursorVisibility) |
|
14997 { |
|
14998 #ifdef RD_SCALABLE_UI_V2 |
|
14999 if ( SemiFepAwareTextEditor( ETrue ) ) |
|
15000 #else |
|
15001 if (iInputCapabilities.FepAwareTextEditor()) |
|
15002 #endif // RD_SCALABLE_UI_V2 |
|
15003 { |
|
15004 iInputCapabilities.FepAwareTextEditor()->SetInlineEditingCursorVisibilityL(aCursorVisibility); |
|
15005 } |
|
15006 } |
|
15007 |
|
15008 TInt CAknFepManager::InputMode() const |
|
15009 { |
|
15010 return iMode; |
|
15011 } |
|
15012 |
|
15013 TInt CAknFepManager::CangJieMode() const |
|
15014 { |
|
15015 TInt shareMode = iSharedDataInterface->CangJieMode(); |
|
15016 TInt cangjieMode = shareMode + EPtiEngineNormalCangjieQwerty; |
|
15017 return cangjieMode; |
|
15018 } |
|
15019 |
|
15020 TBool CAknFepManager::InputLanguageSupportsCaseChanges() const |
|
15021 { |
|
15022 return iLanguageCapabilities.iSupportsCase; |
|
15023 } |
|
15024 |
|
15025 TBool CAknFepManager::IsAbleScrollLatinPredictive() const |
|
15026 { |
|
15027 return iSharedDataInterface->ScrollLatinPredictiveCandidates(); |
|
15028 } |
|
15029 |
|
15030 TText CAknFepManager::PreviousChar( TBool /*aContextSensitive*/ ) |
|
15031 { |
|
15032 TBuf<ESingleCharacter> previousCharacter(ESingleCharacter); |
|
15033 previousCharacter.FillZ(); |
|
15034 |
|
15035 TCursorSelection curSel; |
|
15036 if ( IsFepAwareTextEditor() ) |
|
15037 { |
|
15038 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(curSel); |
|
15039 TInt lowerpos = curSel.LowerPos(); |
|
15040 if(lowerpos > 0) |
|
15041 { |
|
15042 iInputCapabilities.FepAwareTextEditor()-> |
|
15043 GetEditorContentForFep(previousCharacter, lowerpos-1, ESingleCharacter); |
|
15044 if (previousCharacter.Length()) |
|
15045 return previousCharacter[0]; |
|
15046 } |
|
15047 } |
|
15048 return NULL; |
|
15049 } |
|
15050 |
|
15051 TBool CAknFepManager::IsZWSCharacterPresent( TBool aLigaturePresent /* = EFalse*/ ) |
|
15052 { |
|
15053 TBuf<3> previousCharacter; |
|
15054 previousCharacter.Zero(); |
|
15055 TBool found = EFalse; |
|
15056 previousCharacter.FillZ(); |
|
15057 |
|
15058 TCursorSelection curSel; |
|
15059 if ( IsFepAwareTextEditor() ) |
|
15060 { |
|
15061 MCoeFepAwareTextEditor* fepAwareTextEditor = |
|
15062 iInputCapabilities.FepAwareTextEditor(); |
|
15063 fepAwareTextEditor->GetCursorSelectionForFep(curSel); |
|
15064 TInt lowerpos = curSel.LowerPos(); |
|
15065 if( lowerpos > 1 ) |
|
15066 { |
|
15067 if( aLigaturePresent && lowerpos > 3 ) |
|
15068 { |
|
15069 fepAwareTextEditor-> |
|
15070 GetEditorContentForFep(previousCharacter, |
|
15071 lowerpos - 4, 2); |
|
15072 } |
|
15073 else |
|
15074 { |
|
15075 fepAwareTextEditor-> |
|
15076 GetEditorContentForFep(previousCharacter, |
|
15077 lowerpos - 2, 2); |
|
15078 } |
|
15079 if( previousCharacter[0] == ZERO_WIDTH_SPACE |
|
15080 || previousCharacter[1] == ZERO_WIDTH_SPACE ) |
|
15081 { |
|
15082 found = ETrue; |
|
15083 } |
|
15084 } |
|
15085 } |
|
15086 return found; |
|
15087 } |
|
15088 |
|
15089 TText CAknFepManager::NextChar() |
|
15090 { |
|
15091 TBuf<ESingleCharacter> nextCharacter(ESingleCharacter); |
|
15092 nextCharacter.FillZ(); |
|
15093 |
|
15094 TCursorSelection curSel; |
|
15095 if ( IsFepAwareTextEditor() ) |
|
15096 { |
|
15097 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(curSel); |
|
15098 TInt higherpos = curSel.HigherPos(); |
|
15099 TInt maxLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
15100 if ( higherpos >= 0 && higherpos <= maxLength && maxLength >= 1 ) |
|
15101 { |
|
15102 iInputCapabilities.FepAwareTextEditor()-> |
|
15103 GetEditorContentForFep(nextCharacter, higherpos, ESingleCharacter); |
|
15104 if( nextCharacter.Length() ) |
|
15105 return nextCharacter[0]; |
|
15106 } |
|
15107 } |
|
15108 return NULL; |
|
15109 } |
|
15110 |
|
15111 void CAknFepManager::FindStartOfWord(TInt& aAnchorPos) const |
|
15112 { |
|
15113 TBuf<ESingleCharacter> characterBuffer; |
|
15114 FOREVER |
|
15115 { |
|
15116 if (aAnchorPos<=0) |
|
15117 { |
|
15118 break; // start of editor |
|
15119 } |
|
15120 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(characterBuffer, |
|
15121 aAnchorPos-1, |
|
15122 ESingleCharacter); |
|
15123 if (!IsValidInLineCharacter(characterBuffer[0])) |
|
15124 { |
|
15125 break; |
|
15126 } |
|
15127 aAnchorPos--; |
|
15128 } |
|
15129 } |
|
15130 |
|
15131 void CAknFepManager::FindEndOfWord(TInt& aCursorPos) const |
|
15132 { |
|
15133 TBuf<ESingleCharacter> characterBuffer; |
|
15134 FOREVER |
|
15135 { |
|
15136 if (aCursorPos>=iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep()) |
|
15137 { |
|
15138 break; // end of editor |
|
15139 } |
|
15140 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(characterBuffer, |
|
15141 aCursorPos, |
|
15142 ESingleCharacter); |
|
15143 if (!IsValidInLineCharacter(characterBuffer[0])) |
|
15144 { |
|
15145 break; |
|
15146 } |
|
15147 aCursorPos++; |
|
15148 } |
|
15149 } |
|
15150 |
|
15151 TBool CAknFepManager::CursorInsideWord() |
|
15152 { |
|
15153 TBuf<ESingleCharacter> characterBuffer; |
|
15154 TBool insideWord=ETrue; |
|
15155 |
|
15156 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
15157 TInt cursorPos=iUncommittedText.iCursorPos; |
|
15158 |
|
15159 if (cursorPos) |
|
15160 { |
|
15161 // check character before cursor |
|
15162 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(characterBuffer, |
|
15163 cursorPos-1, |
|
15164 ESingleCharacter); |
|
15165 if (characterBuffer.Length()) |
|
15166 { |
|
15167 if (!IsValidInLineCharacter(characterBuffer[0])) |
|
15168 { |
|
15169 insideWord=EFalse; |
|
15170 } |
|
15171 } |
|
15172 } |
|
15173 else // at start of editor |
|
15174 { |
|
15175 insideWord=EFalse; |
|
15176 } |
|
15177 |
|
15178 if (insideWord && cursorPos<iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep()) |
|
15179 { |
|
15180 // put character after cursor into buffer |
|
15181 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(characterBuffer, cursorPos, |
|
15182 ESingleCharacter); |
|
15183 if (characterBuffer.Length()) |
|
15184 { |
|
15185 if (!IsValidInLineCharacter(characterBuffer[0])) |
|
15186 { |
|
15187 insideWord=EFalse; |
|
15188 } |
|
15189 } |
|
15190 } |
|
15191 else // at end of editor |
|
15192 { |
|
15193 insideWord=EFalse; |
|
15194 } |
|
15195 |
|
15196 return insideWord; |
|
15197 } |
|
15198 |
|
15199 void CAknFepManager::MoveCursorToStartOfWordL() |
|
15200 { |
|
15201 TInt anchorPos=iUncommittedText.iAnchorPos; |
|
15202 FindStartOfWord(anchorPos); |
|
15203 iUncommittedText.SetSelection(anchorPos, anchorPos); |
|
15204 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText); |
|
15205 } |
|
15206 |
|
15207 void CAknFepManager::MoveCursorToEndOfWordL() |
|
15208 { |
|
15209 TInt cursorPos=iUncommittedText.iCursorPos; |
|
15210 |
|
15211 if(!IsExtendedFlagSet(EExtendedFlagOkKeyPressOnCandidatePopup)) |
|
15212 FindEndOfWord(cursorPos); |
|
15213 iUncommittedText.SetSelection(cursorPos, cursorPos); |
|
15214 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText); |
|
15215 } |
|
15216 |
|
15217 TKeyResponse CAknFepManager::HandleNaviEventOutsideInlineEditL(TUint aCode, |
|
15218 TKeyPressLength aLength) |
|
15219 { |
|
15220 TKeyResponse response = EKeyWasNotConsumed; |
|
15221 if ( iFepPluginManager && iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr |
|
15222 && aCode == EKeyBackspace ) |
|
15223 { |
|
15224 return response; |
|
15225 } |
|
15226 |
|
15227 if (TryHandleCommonArrowAndBackspaceFunctionalityL(aCode, response)) |
|
15228 { |
|
15229 return response; |
|
15230 } |
|
15231 |
|
15232 // You will not understand the flowing lines, |
|
15233 // for it is just a "hole stem" than normal logic. |
|
15234 // |
|
15235 // Let me explain: |
|
15236 // In HWR, 4x12 keyboard is used, and predictive should be disabled for it. |
|
15237 // unfortunately, the existed codes enable predictive in some special case. |
|
15238 // when you switch from FSQ to HWR, with ITI on, you will get that. |
|
15239 // then if you press arrow key, |
|
15240 // the code blow of "HandlePredictiveNaviEventOutsideInlineEditL" will be called. |
|
15241 // which is writen for FSQ, not HWR, that finally cause navi-event being consumed. |
|
15242 // No navigation action being performed. |
|
15243 // |
|
15244 // It is not a complete fix, just for simplicity. |
|
15245 if (iFepPluginManager && |
|
15246 iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr) |
|
15247 { |
|
15248 return EKeyWasNotConsumed; |
|
15249 } |
|
15250 |
|
15251 if (WesternPredictive()) |
|
15252 { |
|
15253 response = HandlePredictiveNaviEventOutsideInlineEditL(aCode, aLength); |
|
15254 } |
|
15255 |
|
15256 return response; |
|
15257 } |
|
15258 |
|
15259 TKeyResponse CAknFepManager::HandleWesternPredictiveArrowKeyL(TInt aCode, TKeyPressLength aLength) |
|
15260 { |
|
15261 TKeyResponse response = EKeyWasNotConsumed; |
|
15262 |
|
15263 if (IsFlagSet(EFlagLineFeedCharacter)) |
|
15264 { |
|
15265 // This event will stop the multitapping timer for enter chr. |
|
15266 // just return. |
|
15267 return EKeyWasConsumed; |
|
15268 } |
|
15269 |
|
15270 TCursorSelection selection; |
|
15271 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(selection); |
|
15272 if(!IsMfneEditor() && |
|
15273 ( iFepPluginManager->PluginInputMode() == EPluginInputModeItut) && |
|
15274 selection.Length() > 0) |
|
15275 { |
|
15276 // If open virtual ITUT and highlight some chars |
|
15277 return EKeyWasConsumed; |
|
15278 } |
|
15279 if (aCode == EKeyUpArrow || aCode == EKeyDownArrow) |
|
15280 { |
|
15281 ClearFlag(EFlagCompoundWord); |
|
15282 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
15283 { |
|
15284 // moving out of an inline edit |
|
15285 TryRemoveNoMatchesIndicatorL(); |
|
15286 UpdateCbaL(NULL); |
|
15287 // To rip off suggested word completion when user presses UP / DOWN arrow keys |
|
15288 if(IsAutoCompleteOn()) |
|
15289 { |
|
15290 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
15291 |
|
15292 RemoveSuggestedCompletionL(); |
|
15293 |
|
15294 #else |
|
15295 TInt tailLength = 0; |
|
15296 iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, |
|
15297 &tailLength ); |
|
15298 if(tailLength > 0) |
|
15299 { |
|
15300 RemoveSuggestedAdvanceCompletionL(); |
|
15301 return EKeyWasConsumed; |
|
15302 } |
|
15303 #endif |
|
15304 } |
|
15305 if (IsFlagSet(EFlagShiftKeyDepressed) || IsCcpuFlagSet(ECcpuStateHashDown)) |
|
15306 { |
|
15307 CommitInlineEditL(); |
|
15308 TryCloseUiL(); |
|
15309 SimulateKeyEventL(EKeyF19); // Asyncronous case update |
|
15310 // pass to editor for text selection. |
|
15311 response=EKeyWasNotConsumed; |
|
15312 } |
|
15313 } |
|
15314 if ((iInputCapabilities.FepAwareTextEditor() && !TryHandleTextSelectedNaviEventL(aCode, response)) && !IsFlagSet(EFlagShiftKeyDepressed)) |
|
15315 { |
|
15316 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
15317 { |
|
15318 ClearFlag(CAknFepManager::EFlagNoMatches); |
|
15319 TryRemoveNoMatchesIndicatorL(); |
|
15320 CommitInlineEditL(); |
|
15321 } |
|
15322 UpdateCbaL(NULL); |
|
15323 |
|
15324 // simulate a designated key event to catch and check if we're inside a word |
|
15325 if (aCode == EKeyDownArrow) |
|
15326 { |
|
15327 SimulateKeyEventL(EKeyF22); |
|
15328 } |
|
15329 else |
|
15330 { |
|
15331 SimulateKeyEventL(EKeyF23); |
|
15332 } |
|
15333 // pass to editor for text selection. |
|
15334 response=EKeyWasNotConsumed; |
|
15335 } |
|
15336 else if (IsFlagSet(EFlagShiftKeyDepressed) || IsCcpuFlagSet(ECcpuStateHashDown)) |
|
15337 { |
|
15338 // Need to update case indicator if text selection is made upwards. |
|
15339 SimulateKeyEventL(EKeyF19); |
|
15340 } |
|
15341 } |
|
15342 else // right or left |
|
15343 { |
|
15344 if (IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
15345 { |
|
15346 // moving out of an inline edit |
|
15347 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
15348 if(IsAutoCompleteOn()) |
|
15349 { |
|
15350 if((aCode == EKeyLeftArrow && |
|
15351 CurrentInputDirectionality() == TBidiText::ELeftToRight) || |
|
15352 (aCode == EKeyRightArrow && |
|
15353 CurrentInputDirectionality() == TBidiText::ERightToLeft)) |
|
15354 { |
|
15355 RemoveSuggestedCompletionL(); |
|
15356 } |
|
15357 } |
|
15358 #else |
|
15359 if(IsAutoCompleteOn()) |
|
15360 { |
|
15361 TInt tailLength = 0; |
|
15362 iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength ); |
|
15363 // In case the inline editing is ongoing and there is a word completion |
|
15364 // currently shown, the first backwards tap will remove the suggested |
|
15365 // completion. |
|
15366 if(tailLength > 0) |
|
15367 { |
|
15368 if (((CurrentInputDirectionality()==TBidiText::ERightToLeft) && aCode == EKeyLeftArrow) |
|
15369 || ((CurrentInputDirectionality()==TBidiText::ELeftToRight) && aCode == EKeyRightArrow )) |
|
15370 { |
|
15371 iPtiEngine->HandleCommandL( EPtiCommandLockCurrentCandidate); |
|
15372 TPtrC selectedWord = iPtiEngine->CurrentWord(); |
|
15373 UpdateInlineEditL( selectedWord, selectedWord.Length() ); //selection.iAnchorPosition |
|
15374 iPtiEngine->CommitCurrentWord(); |
|
15375 TryCloseUiL(); |
|
15376 // Asyncronous case update after the editor has handled the key |
|
15377 SimulateKeyEventL(EKeyF19); |
|
15378 response=EKeyWasConsumed; |
|
15379 } |
|
15380 else if(((CurrentInputDirectionality()== TBidiText::ERightToLeft ) && aCode == EKeyRightArrow) |
|
15381 || ((CurrentInputDirectionality()== TBidiText::ELeftToRight) && aCode == EKeyLeftArrow )) |
|
15382 { |
|
15383 RemoveSuggestedAdvanceCompletionL(); |
|
15384 response=EKeyWasConsumed; |
|
15385 } |
|
15386 return response; |
|
15387 } |
|
15388 else if (!IsQwerty()) |
|
15389 { |
|
15390 iPtiEngine->CommitCurrentWord(); |
|
15391 } |
|
15392 |
|
15393 } |
|
15394 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
15395 TryRemoveNoMatchesIndicatorL(); |
|
15396 UpdateCbaL(NULL); |
|
15397 if (IsFlagSet(EFlagShiftKeyDepressed) || IsCcpuFlagSet(ECcpuStateHashDown)) |
|
15398 { |
|
15399 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
15400 if(IsAutoCompleteOn()) // To rip off suggested completion when shift key is pressed |
|
15401 { |
|
15402 RemoveSuggestedCompletionL(); |
|
15403 } |
|
15404 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
15405 CommitInlineEditL(); |
|
15406 TryCloseUiL(); |
|
15407 SimulateKeyEventL(EKeyF19); // Asyncronous case update |
|
15408 // pass to editor for text selection. |
|
15409 response=EKeyWasNotConsumed; |
|
15410 } |
|
15411 else |
|
15412 { |
|
15413 TWesternNaviEvent naviEvent = ELeftNaviEvent; |
|
15414 if (aCode == EKeyRightArrow) |
|
15415 { |
|
15416 naviEvent = ERightNaviEvent; |
|
15417 } |
|
15418 // Find the visual left/right end of the current word |
|
15419 TTmDocPosSpec pos; |
|
15420 GetAvkonDefinedVisualLimitsOfSelection( |
|
15421 iUncommittedText, naviEvent, pos, NULL ); |
|
15422 |
|
15423 if (IsCcpuFlagSet(ECcpuStateNewPredictiveWord)) |
|
15424 { |
|
15425 // This is new predictive word which is being committed with arrow |
|
15426 // key. Force ::TryCloseUiL to commit PtiEngie word to keep |
|
15427 // frequency information in sync. |
|
15428 SetCcpuFlag(ECcpuStataCommitPredictiveWord); |
|
15429 } |
|
15430 |
|
15431 TryCloseUiL(); |
|
15432 |
|
15433 // Position should be dis-ambiguated based on last navigation and direction of blocks. |
|
15434 AdjustPosSpecForAmbiguityAfterLeftOrRightNavigation( pos, naviEvent ); |
|
15435 |
|
15436 SetCursorPositionL( pos ); |
|
15437 if (CursorInsideWord() && naviEvent == ERightNaviEvent) |
|
15438 { |
|
15439 MoveCursorToEndOfWordL(); |
|
15440 } |
|
15441 |
|
15442 iCaseMan->UpdateCase(ENullNaviEvent); |
|
15443 response=EKeyWasConsumed; |
|
15444 } |
|
15445 } |
|
15446 else |
|
15447 { |
|
15448 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
15449 if ( iLanguageCapabilities.iInputLanguageCode == ELangThai ) // Without this, t9 goes inside words |
|
15450 { // That is not allowed in Thai |
|
15451 response = EKeyWasNotConsumed; |
|
15452 } |
|
15453 else |
|
15454 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
15455 response = HandleNaviEventOutsideInlineEditL(aCode, aLength); |
|
15456 if (response == EKeyWasNotConsumed) |
|
15457 { |
|
15458 // moving over a space |
|
15459 if (aCode == EKeyLeftArrow && !IsFlagSet(EFlagShiftKeyDepressed)) |
|
15460 { |
|
15461 iCaseMan->UpdateCase(ELeftNaviEvent); |
|
15462 } |
|
15463 else if (!IsFlagSet(EFlagShiftKeyDepressed)) // EKeyRightArrow |
|
15464 { |
|
15465 iCaseMan->UpdateCase(ERightNaviEvent); |
|
15466 } |
|
15467 } |
|
15468 else |
|
15469 iCaseMan->UpdateCase(ENullNaviEvent); |
|
15470 } |
|
15471 } |
|
15472 return response; |
|
15473 } |
|
15474 |
|
15475 TBool CAknFepManager::TryHandleTextSelectedNaviEventL(TInt aCode, TKeyResponse& response) |
|
15476 { |
|
15477 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
15478 |
|
15479 if (!IsFlagSet(EFlagShiftKeyDepressed) && iUncommittedText.Length()) |
|
15480 { |
|
15481 if (aCode == EKeyBackspace) |
|
15482 { |
|
15483 iCaseMan->UpdateCase(EBackspaceEvent); |
|
15484 response = EKeyWasNotConsumed; |
|
15485 } |
|
15486 else |
|
15487 { |
|
15488 TInt newCursorPos = iUncommittedText.HigherPos(); //default, right or down |
|
15489 if (aCode == EKeyLeftArrow || aCode == EKeyUpArrow) |
|
15490 { |
|
15491 newCursorPos = iUncommittedText.LowerPos(); |
|
15492 } |
|
15493 iUncommittedText.SetSelection(newCursorPos, newCursorPos); |
|
15494 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText); |
|
15495 |
|
15496 if (WesternPredictive()) |
|
15497 { |
|
15498 if (CursorInsideWord()) |
|
15499 { |
|
15500 if (aCode == EKeyLeftArrow || aCode == EKeyUpArrow) |
|
15501 { |
|
15502 MoveCursorToStartOfWordL(); |
|
15503 } |
|
15504 else //right or down |
|
15505 { |
|
15506 MoveCursorToEndOfWordL(); |
|
15507 } |
|
15508 } |
|
15509 iCaseMan->UpdateCase(ENullNaviEvent); |
|
15510 } |
|
15511 response = EKeyWasConsumed; |
|
15512 } |
|
15513 return ETrue; |
|
15514 } |
|
15515 return EFalse; |
|
15516 } |
|
15517 |
|
15518 TBool CAknFepManager::TryHandleCommonArrowAndBackspaceFunctionalityL(TInt aCode, |
|
15519 TKeyResponse& aResponse) |
|
15520 { |
|
15521 TBool keyHandled = ETrue; |
|
15522 if ( !IsFepAwareTextEditor() ) |
|
15523 { |
|
15524 aResponse=EKeyWasNotConsumed; |
|
15525 return keyHandled; |
|
15526 } |
|
15527 #ifdef RD_HINDI_PHONETIC_INPUT |
|
15528 if(iLanguageCapabilities.iInputLanguageCode == KLangHindiPhonetic) |
|
15529 { |
|
15530 if (aCode == EKeyBackspace) |
|
15531 { |
|
15532 CommitInlineEditL(); |
|
15533 FepUI()->HandleKeyL(aCode, EShortKeyPress); |
|
15534 } |
|
15535 if(IsFlagSet(CAknFepManager::EFlagNoMatches)) |
|
15536 { |
|
15537 if(PreviousChar() == 0x003F && aCode != EKeyBackspace) |
|
15538 { |
|
15539 RemovePreviousCharacterL(); |
|
15540 } |
|
15541 ClearFlag(CAknFepManager::EFlagNoMatches); |
|
15542 FepUI()->ExpireMultitapTimer(); |
|
15543 } |
|
15544 iPtiEngine->HandleCommandL(EPtiCommandBreakSyllable, NULL ); |
|
15545 } |
|
15546 #endif |
|
15547 if (IsFlagSet(EFlagInsideMultitapInlineEditingTransaction)) |
|
15548 { |
|
15549 FepUI()->ExpireMultitapTimer(); |
|
15550 |
|
15551 if (aCode == EKeyBackspace) |
|
15552 { |
|
15553 aResponse = EKeyWasNotConsumed; // let editor handle the move |
|
15554 } |
|
15555 else |
|
15556 { |
|
15557 aResponse = EKeyWasConsumed; |
|
15558 } |
|
15559 } |
|
15560 else |
|
15561 { |
|
15562 //selecting text |
|
15563 if (IsFlagSet(EFlagShiftKeyDepressed) || IsCcpuFlagSet(ECcpuStateCopy | ECcpuStateCut)) |
|
15564 { |
|
15565 if (iShiftKeypressMonitor->IsActive()) |
|
15566 { |
|
15567 ResetShiftKeyMonitorL(); //don't want edit menu |
|
15568 } |
|
15569 ClearFlag(EFlagQwertyShiftMode); |
|
15570 SimulateKeyEventL(EKeyF19); // Asyncronous case update |
|
15571 aResponse = EKeyWasNotConsumed; |
|
15572 return keyHandled; |
|
15573 } |
|
15574 |
|
15575 TCursorSelection currentEditorSelection; |
|
15576 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(currentEditorSelection); |
|
15577 |
|
15578 TWesternNaviEvent naviEvent = ENullNaviEvent; |
|
15579 |
|
15580 // Translate key code to internal navi-event |
|
15581 switch( aCode ) |
|
15582 { |
|
15583 case EKeyUpArrow: |
|
15584 naviEvent = EUpNaviEvent; |
|
15585 break; |
|
15586 case EKeyDownArrow: |
|
15587 naviEvent = EDownNaviEvent; |
|
15588 break; |
|
15589 case EKeyRightArrow: |
|
15590 naviEvent = ERightNaviEvent; |
|
15591 break; |
|
15592 case EKeyLeftArrow: |
|
15593 naviEvent = ELeftNaviEvent; |
|
15594 break; |
|
15595 default: // just leave it as NULL |
|
15596 break; |
|
15597 } |
|
15598 |
|
15599 if (currentEditorSelection.Length()) |
|
15600 { |
|
15601 // we have text selected - set cursor to start/end of current selection |
|
15602 TTmDocPosSpec newPos; |
|
15603 aResponse = NavigateFromSelectionL( currentEditorSelection, naviEvent, newPos ); |
|
15604 |
|
15605 // You will not understand the following lines, |
|
15606 // for it is just a "hole stem" than normal logic. |
|
15607 // |
|
15608 // Let me explain: |
|
15609 // In HWR, 4x12 keyboard is used, and predictive should be disabled for it. |
|
15610 // unfortunately, the existing codes enable predictive in some special case. |
|
15611 // when you switch from FSQ to HWR, with ITI on, you will get that. |
|
15612 // then if you select some words and press arrow key, |
|
15613 // the if bratch of the code blow will be excuted. |
|
15614 // which is writen for FSQ, not HWR, |
|
15615 // MoveCursorToEndOfWordL or MoveCursorToStartOfWordL is called unexpected |
|
15616 // |
|
15617 // It is not a complete fix, just for simplicity. |
|
15618 TBool isFingerHwr = ( iFepPluginManager != NULL ) && |
|
15619 ( iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr ); |
|
15620 |
|
15621 if ( aCode != EKeyBackspace && !isFingerHwr && WesternPredictive() ) |
|
15622 { |
|
15623 if (CursorInsideWord()) |
|
15624 { |
|
15625 TBool rightToleftParagraph = IsRightToLeftParagraph(newPos); |
|
15626 if ( (rightToleftParagraph && naviEvent == ELeftNaviEvent) || |
|
15627 (!rightToleftParagraph && naviEvent == ERightNaviEvent) ) |
|
15628 { |
|
15629 MoveCursorToEndOfWordL(); |
|
15630 } |
|
15631 else |
|
15632 { |
|
15633 MoveCursorToStartOfWordL(); |
|
15634 } |
|
15635 } |
|
15636 |
|
15637 } |
|
15638 } |
|
15639 else if (!(EditorState()->Flags() & EAknEditorFlagNoLRNavigation)) |
|
15640 { |
|
15641 if ((naviEvent != ENullNaviEvent) && HandleLoopingInNaviEventL(naviEvent)) |
|
15642 { |
|
15643 aResponse=EKeyWasConsumed; |
|
15644 } |
|
15645 else |
|
15646 { |
|
15647 if (iMode == ELatin) |
|
15648 { |
|
15649 // normal operation of Down/Up scroll keypress action. |
|
15650 switch( aCode ) |
|
15651 { |
|
15652 case EKeyUpArrow: |
|
15653 case EKeyDownArrow: |
|
15654 SimulateKeyEventL(EKeyF22); |
|
15655 break; |
|
15656 case EKeyRightArrow: |
|
15657 case EKeyLeftArrow: |
|
15658 { |
|
15659 /*Hindi*/ |
|
15660 if( (TAknFepUiIndicInputManager :: IsIndicLangauge( |
|
15661 TLanguage(iLanguageCapabilities.iInputLanguageCode))) |
|
15662 && IsZWSCharacterPresent() ) |
|
15663 { |
|
15664 RemoveZWSCharacterL(EKeyLeftArrow); |
|
15665 } |
|
15666 } |
|
15667 break; |
|
15668 default: // nothing |
|
15669 break; |
|
15670 } |
|
15671 } |
|
15672 keyHandled = EFalse; |
|
15673 } |
|
15674 } |
|
15675 } |
|
15676 |
|
15677 return keyHandled; |
|
15678 } |
|
15679 |
|
15680 /** |
|
15681 * Routine handled navigation and also backspace events at "beginning" of document |
|
15682 * |
|
15683 */ |
|
15684 TBool CAknFepManager::HandleLoopingInNaviEventL(TWesternNaviEvent aNaviEvent) |
|
15685 { |
|
15686 TBool looping = EFalse; |
|
15687 TBool eventHandled = EFalse; |
|
15688 TTmDocPosSpec newCursorPos; |
|
15689 |
|
15690 // This routine may handle Left, Right and Backspace and nothing else |
|
15691 // Note that Up and Down cannot do any sort of document looping in FEP |
|
15692 if ( aNaviEvent != ELeftNaviEvent |
|
15693 && aNaviEvent != ERightNaviEvent |
|
15694 && aNaviEvent != EBackspaceEvent ) |
|
15695 return eventHandled; // not consumed |
|
15696 |
|
15697 TTmDocPosSpec pos = DocPos(); |
|
15698 TBool rightToLeftParagraph = IsRightToLeftParagraph(pos); |
|
15699 |
|
15700 TWesternNaviEvent incrementingNaviEvent = |
|
15701 rightToLeftParagraph ? ELeftNaviEvent : ERightNaviEvent; |
|
15702 TWesternNaviEvent decrementingNaviEvent = |
|
15703 rightToLeftParagraph ? ERightNaviEvent : ELeftNaviEvent; |
|
15704 |
|
15705 if (aNaviEvent == decrementingNaviEvent) |
|
15706 { |
|
15707 // Abandon early if we are not in the first line. |
|
15708 if ( InFirstLineAndFormatted( pos ) ) |
|
15709 { |
|
15710 TTmDocPosSpec startPos; |
|
15711 GetVisualDocStart( startPos ); |
|
15712 if( AtVisualStart( pos, startPos ) ) |
|
15713 { |
|
15714 TTmDocPosSpec endPos; |
|
15715 if ( !GetVisualDocEnd( endPos ) ) |
|
15716 { |
|
15717 // End of document is not formatted. Value returned is just pos at DocLength. |
|
15718 // So actually move the cursor there (this is guranteed to format the last line) |
|
15719 // and the end End position is found a 2nd time. |
|
15720 newCursorPos = endPos; |
|
15721 SetCursorPositionL( newCursorPos ); |
|
15722 GetVisualDocEnd( endPos ); |
|
15723 } |
|
15724 newCursorPos = endPos; |
|
15725 looping = ETrue; |
|
15726 } |
|
15727 } |
|
15728 } |
|
15729 else if (aNaviEvent == incrementingNaviEvent ) |
|
15730 { |
|
15731 if ( InLastLineAndFormatted( pos ) ) |
|
15732 { |
|
15733 TTmDocPosSpec endPos; |
|
15734 GetVisualDocEnd( endPos ); |
|
15735 if( AtVisualEnd( pos, endPos, |
|
15736 iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep() ) ) |
|
15737 { |
|
15738 TTmDocPosSpec startPos; |
|
15739 if ( !GetVisualDocStart( startPos ) ) |
|
15740 { |
|
15741 // Document was not formatted at docPos(0). So actually move the cursor |
|
15742 // to that line at least, and then ask for the start pos again. |
|
15743 newCursorPos = startPos; |
|
15744 SetCursorPositionL( newCursorPos ); |
|
15745 GetVisualDocStart( startPos ); |
|
15746 } |
|
15747 newCursorPos = startPos; |
|
15748 looping = ETrue; |
|
15749 } |
|
15750 } |
|
15751 } |
|
15752 else if ( aNaviEvent == EBackspaceEvent ) |
|
15753 { |
|
15754 // Deletion is always logical, so the condition is simply to test the logical pos. |
|
15755 if ( pos.iPos ==0 ) |
|
15756 { |
|
15757 eventHandled = ETrue; |
|
15758 } |
|
15759 } |
|
15760 |
|
15761 if (looping) |
|
15762 { |
|
15763 // This takes language issues into account, adjusting the cursor position: |
|
15764 AdjustPosSpecForInputLanguageAfterDocumentLoop( newCursorPos, aNaviEvent, |
|
15765 (aNaviEvent == incrementingNaviEvent) ); |
|
15766 SetCursorPositionL( newCursorPos ); |
|
15767 eventHandled = ETrue; |
|
15768 } |
|
15769 return eventHandled; |
|
15770 } |
|
15771 |
|
15772 void CAknFepManager::TransferFepStateToEditorL( TBool aFnLockSync ) |
|
15773 { |
|
15774 // If editor in Fnlock state, need to set actual input mode |
|
15775 // because, in case of qwerty keypad alphanumeric editor there is no numeric mode |
|
15776 // numeric mode handle as FnLock |
|
15777 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
15778 |
|
15779 if( aFnLockSync && iQwertyInputMode && iFnKeyManager && iFnKeyManager->FnKeyState()==CAknFepFnKeyManager::EFnKeyLock) |
|
15780 { |
|
15781 EditorState()->SetCurrentInputMode(EditorModeFromFepMode(ENumber)); |
|
15782 // Indicator should not be reset, if menu is displaying from editor. |
|
15783 if(!IsFlagSet(EFlagForegroundUIComponentVisible | EFlagMenuPaneVisible)) |
|
15784 iFnKeyManager->ClearFnKeyState(); |
|
15785 } |
|
15786 else |
|
15787 { |
|
15788 #endif |
|
15789 EditorState()->SetCurrentInputMode(EditorModeFromFepMode(iMode)); |
|
15790 |
|
15791 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
15792 } |
|
15793 if(iFnKeyManager && iFnKeyManager->FnKeyState()!=CAknFepFnKeyManager::EFnKeyLock) |
|
15794 iFnKeyManager->ClearFnKeyState(); |
|
15795 |
|
15796 #endif |
|
15797 |
|
15798 |
|
15799 if ((iMode == ELatin && iWesternPredictive && |
|
15800 IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
15801 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
15802 ||(IsLanguageSupportPrediction() && IsFlagSet(EFlagInsideInlineEditingTransaction)) |
|
15803 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
15804 ) |
|
15805 { |
|
15806 EditorState()->SetInlineEditSpan(iUncommittedText); |
|
15807 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
15808 if (IsFlagSet(CAknFepManager::EFlagNoMatches)) |
|
15809 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
15810 TryRemoveNoMatchesIndicatorL(); |
|
15811 UpdateCbaL(NULL); |
|
15812 } |
|
15813 else |
|
15814 { |
|
15815 EditorState()->SetInlineEditSpan(TCursorSelection(0,0)); |
|
15816 } |
|
15817 EditorState()->SetCurrentCaseWithNoInitialisation(iCaseMan->CurrentCase()); |
|
15818 if ( IsFlagSet( EFlagSupressAutoUpdate ) ) |
|
15819 { |
|
15820 EditorState()->SetFlags( EditorState()->Flags() | EFlagSupressAutoUpdate ); |
|
15821 } |
|
15822 else |
|
15823 { |
|
15824 EditorState()->SetFlags( EditorState()->Flags() & ~EFlagSupressAutoUpdate ); |
|
15825 } |
|
15826 SetQwertyModeToInputcapbility(); |
|
15827 } |
|
15828 |
|
15829 MAknFepManagerInterface* CAknFepManager::FepUI() const |
|
15830 { |
|
15831 #ifdef RD_SCALABLE_UI_V2 |
|
15832 if ( iFepFullyConstructed && ( iFepPluginManager->PluginInputMode() != EPluginInputModeNone ) ) |
|
15833 { |
|
15834 if (iFepPluginManager->PluginInputMode() == EPluginInputModeItut) |
|
15835 { |
|
15836 return iFepPluginManager->CurrentFepInputUI() ? |
|
15837 iFepPluginManager->CurrentFepInputUI() : iCurrentFepUI; |
|
15838 } |
|
15839 if ( iFepPluginManager->EnableITIOnFSQ() ) |
|
15840 { |
|
15841 return iCurrentFepUI; |
|
15842 } |
|
15843 return iFepPluginManager->CurrentPluginInputFepUI(); |
|
15844 } |
|
15845 #endif |
|
15846 return iCurrentFepUI; |
|
15847 } |
|
15848 |
|
15849 void CAknFepManager::LaunchLanguagesPopupListL(TBool aLaunchedByTouchWin) |
|
15850 { |
|
15851 #ifdef RD_SCALABLE_UI_V2 |
|
15852 if( iFepPluginManager->PluginInputMode() != EPluginInputModeNone && |
|
15853 iFepPluginManager->PluginInputMode() != EPluginInputModeItut |
|
15854 // Add this condition for correction of dim features on FSQ |
|
15855 && iFepPluginManager->PluginInputMode() != EPluginInputModeFSQ |
|
15856 && iFepPluginManager->PluginInputMode() != EPluginInputModePortraitFSQ ) |
|
15857 { |
|
15858 iFepPluginManager->LaunchPenInputLanguageSelectionL(aLaunchedByTouchWin); |
|
15859 return; |
|
15860 } |
|
15861 #endif //RD_SCALABLE_UI_V2 |
|
15862 |
|
15863 CArrayFixFlat<TInt>* languages = |
|
15864 new( ELeave )CArrayFixFlat<TInt>( ELanguageArrayGranularity ); |
|
15865 CleanupStack::PushL( languages ); |
|
15866 iPtiEngine->GetAvailableLanguagesL( languages ); |
|
15867 |
|
15868 // Create a list of languages for the dialog |
|
15869 CDesCArrayFlat* languagesList = |
|
15870 new( ELeave )CDesCArrayFlat( ELanguageArrayGranularity ); |
|
15871 CleanupStack::PushL( languagesList ); |
|
15872 |
|
15873 // Item format should be "<icon_index>\t<item_text>" |
|
15874 _LIT( KIconIndexSelected, "0\t" ); |
|
15875 _LIT( KIconIndexNotSelected, "\t" );// No icon |
|
15876 |
|
15877 MPtiLanguage* lang = NULL; |
|
15878 TInt currentLanguage = iSharedDataInterface->InputTextLanguage(); |
|
15879 TInt selectedLanguageIndex = 0; |
|
15880 |
|
15881 for (TInt ii=0; ii < languages->Count(); ii++) |
|
15882 { |
|
15883 lang = iPtiEngine->GetLanguage( ( *languages )[ii] ); |
|
15884 if (!lang) |
|
15885 { |
|
15886 User::Leave( KErrCorrupt ); |
|
15887 } |
|
15888 // Buffer should contain both tabulator string and localized name: |
|
15889 HBufC* langStrBuf = HBufC::NewL( lang->LocalizedName().Length() + 3 ); |
|
15890 CleanupStack::PushL( langStrBuf ); |
|
15891 |
|
15892 TPtr langStrPtr = langStrBuf->Des(); |
|
15893 |
|
15894 // If language is current language - use selected icon in lbx: |
|
15895 if( lang->LanguageCode() == currentLanguage ) |
|
15896 { |
|
15897 langStrPtr.Append( KIconIndexSelected ); |
|
15898 selectedLanguageIndex = ii; |
|
15899 } |
|
15900 else |
|
15901 { |
|
15902 langStrPtr.Append( KIconIndexNotSelected ); |
|
15903 } |
|
15904 langStrPtr.Append( lang->LocalizedName() ); |
|
15905 languagesList->AppendL( langStrPtr ); |
|
15906 CleanupStack::PopAndDestroy( langStrBuf ); |
|
15907 } |
|
15908 |
|
15909 // Add icons to the listbox: |
|
15910 CArrayPtr<CGulIcon>* icons = new( ELeave ) CArrayPtrFlat<CGulIcon>(10); |
|
15911 CleanupStack::PushL( icons ); |
|
15912 LoadIconL( icons, EMbmAvkonQgn_prop_sub_current, |
|
15913 EMbmAvkonQgn_prop_sub_current_mask ); |
|
15914 |
|
15915 TInt index = 0; |
|
15916 SetFlag( EFlagForegroundUIComponentVisible ); |
|
15917 CleanupStack::Pop( icons ); // iUiInterface->LaunchListPopupL takes ownership immediately |
|
15918 #ifdef RD_SCALABLE_UI_V2 |
|
15919 if( iFepFullyConstructed && iFepPluginManager && !iFepPluginManager->IsInMenuOpen() ) |
|
15920 { |
|
15921 iFepPluginManager->SetMenuState(); |
|
15922 } |
|
15923 #endif |
|
15924 // Fire up the dialog |
|
15925 #ifdef RD_SCALABLE_UI_V2 |
|
15926 iCancelPopupInQwerty = aLaunchedByTouchWin; |
|
15927 #endif //RD_SCALABLE_UI_V2 |
|
15928 TUid fepUid = CCoeEnv::Static()->FepUid(); |
|
15929 ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
15930 SendEventsToPluginManL(EPluginEnablePriorityChangeOnOriChange,EFalse); |
|
15931 TInt returnValue = iUiInterface->LaunchListPopupL(R_AVKON_T9_LANGUAGES_QUERY, index, |
|
15932 selectedLanguageIndex, languagesList, icons); |
|
15933 #ifdef RD_SCALABLE_UI_V2 |
|
15934 iCancelPopupInQwerty = EFalse; |
|
15935 #endif //RD_SCALABLE_UI_V2 |
|
15936 PrepareFepAfterDialogExitL(fepUid); |
|
15937 CleanupStack::PopAndDestroy( languagesList ); |
|
15938 |
|
15939 if(returnValue == EAknSoftkeyOk) |
|
15940 { |
|
15941 // Selected item index from the languages array |
|
15942 HandleChangeInFocusL(); |
|
15943 |
|
15944 // The user has changed language and the local language is not used any more. |
|
15945 iLanguageCapabilities.iLocalInputLanguageInUse = EFalse; |
|
15946 if (EditorState()) |
|
15947 { |
|
15948 EditorState()->SetLocalLanguage( ELangTest ); |
|
15949 } |
|
15950 |
|
15951 TBool westernPredictiveInUse = WesternPredictive(); |
|
15952 |
|
15953 // Truncate autocompletion portion on change of writing language |
|
15954 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
15955 RemoveSuggestedAdvanceCompletionL(); |
|
15956 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
15957 //Hindi Change Bug Fix |
|
15958 iSharedDataInterface->SetInputTextLanguage(languages->At(index)); |
|
15959 CAknEnv::Static()->SettingCache().Update(KEikInputLanguageChange); |
|
15960 SetActiveInputLanguage( languages->At(index) ); |
|
15961 ChangeInputLanguageL(languages->At(index)); |
|
15962 SetFlag( EFlagNewSharedDataInputLanguage | EFlagNewSharedDataInputMode ); |
|
15963 // This pice of code TSW Fute error fixing. |
|
15964 // Display the confirmation msg if the dictionary is not available for |
|
15965 // Current language. |
|
15966 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
15967 // Display the confirmation msg only for Western languages |
|
15968 if (!IsChineseInputLanguage()) |
|
15969 { |
|
15970 if (!IsLanguageSupportPrediction()) |
|
15971 { |
|
15972 LaunchConfirmationNoteL(R_AVKON_T9_NOTE_NO_AVAILABLE); |
|
15973 } |
|
15974 } |
|
15975 #endif |
|
15976 |
|
15977 |
|
15978 } |
|
15979 SendEventsToPluginManL(EPluginEnablePriorityChangeOnOriChange,ETrue); |
|
15980 CleanupStack::PopAndDestroy( languages ); |
|
15981 } |
|
15982 |
|
15983 void CAknFepManager::LaunchRecognitionWithDictionaryPopupListL() |
|
15984 { |
|
15985 #ifdef RD_SCALABLE_UI_V2 |
|
15986 if( iFepPluginManager && (iFepPluginManager->PluginInputMode() == EPluginInputModeHwr) ) |
|
15987 { |
|
15988 iFepPluginManager->LaunchPenInputRecognitionWithDictionarySelectionL(); |
|
15989 return; |
|
15990 } |
|
15991 #endif //RD_SCALABLE_UI_V2 |
|
15992 } |
|
15993 void CAknFepManager::LaunchWritingSpeedPopupListL() |
|
15994 { |
|
15995 #ifdef RD_SCALABLE_UI_V2 |
|
15996 if( iFepPluginManager && (iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr) ) |
|
15997 { |
|
15998 iFepPluginManager->LaunchPenInputWritingSpeedSelectionL(); |
|
15999 return; |
|
16000 } |
|
16001 #endif //RD_SCALABLE_UI_V2 |
|
16002 } |
|
16003 void CAknFepManager::LaunchGuidingLinePopupListL() |
|
16004 { |
|
16005 #ifdef RD_SCALABLE_UI_V2 |
|
16006 if( iFepPluginManager && (iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr) ) |
|
16007 { |
|
16008 iFepPluginManager->LaunchPenInputGuidingLineSelectionL(); |
|
16009 return; |
|
16010 } |
|
16011 #endif //RD_SCALABLE_UI_V2 |
|
16012 } |
|
16013 void CAknFepManager::LoadIconL( CArrayPtr<CGulIcon>* aIcons, |
|
16014 TInt aBitmapId, |
|
16015 TInt aMaskId ) |
|
16016 { |
|
16017 CGulIcon* icon = CGulIcon::NewLC(); |
|
16018 CFbsBitmap* bitmap = 0; |
|
16019 CFbsBitmap* mask = 0; |
|
16020 AknIconUtils::CreateIconL( bitmap, mask, KAvkonBitmapFile, aBitmapId, aMaskId ); |
|
16021 icon->SetBitmap( bitmap ); |
|
16022 icon->SetMask( mask ); |
|
16023 aIcons->AppendL( icon ); |
|
16024 CleanupStack::Pop( icon ); |
|
16025 } |
|
16026 |
|
16027 |
|
16028 TBool CAknFepManager::IsInputModeAvailable(TInt aMode) const |
|
16029 { |
|
16030 TBool isAvailable = ETrue; |
|
16031 const TInt inputLanguage = iLanguageCapabilities.iInputLanguageCode; |
|
16032 switch (aMode) |
|
16033 { |
|
16034 case ELatin: |
|
16035 isAvailable = !( ( inputLanguage == ELangPrcChinese ) && |
|
16036 (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes)); |
|
16037 break; |
|
16038 case EPinyin: |
|
16039 isAvailable = ( inputLanguage == ELangPrcChinese ); |
|
16040 break; |
|
16041 case EStroke: |
|
16042 isAvailable = ( inputLanguage == ELangPrcChinese || |
|
16043 inputLanguage == ELangHongKongChinese || |
|
16044 inputLanguage == ELangTaiwanChinese); |
|
16045 break; |
|
16046 case ECangJie: |
|
16047 { |
|
16048 isAvailable = ( ( inputLanguage == ELangHongKongChinese ) && |
|
16049 iQwertyInputMode ); |
|
16050 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
16051 #ifdef __HALF_QWERTY_KEYPAD |
|
16052 isAvailable = isAvailable && (EPtiKeyboardHalfQwerty != KeyboardLayout()); |
|
16053 #endif //__HALF_QWERTY_KEYPAD |
|
16054 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
16055 } |
|
16056 |
|
16057 break; |
|
16058 case EZhuyin: |
|
16059 isAvailable = ( inputLanguage == ELangTaiwanChinese ); |
|
16060 break; |
|
16061 case EPRCFind: |
|
16062 isAvailable = ( ( inputLanguage == ELangPrcChinese ) && |
|
16063 (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes)); |
|
16064 break; |
|
16065 case EZhuyinFind: |
|
16066 isAvailable = ( ( inputLanguage == ELangTaiwanChinese ) && |
|
16067 (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes)); |
|
16068 break; |
|
16069 case EStrokeFind: |
|
16070 isAvailable = ( ( inputLanguage == ELangHongKongChinese ) && |
|
16071 (iAknEditorFlags & EAknEditorFlagForceTransparentFepModes)); |
|
16072 break; |
|
16073 case EHiraganaKanji: |
|
16074 isAvailable = (inputLanguage == ELangJapanese); |
|
16075 break; |
|
16076 case EKatakana: |
|
16077 isAvailable = (inputLanguage == ELangJapanese ); |
|
16078 break; |
|
16079 case EHindi: |
|
16080 isAvailable = (inputLanguage == ELangHindi ); |
|
16081 break; |
|
16082 case EHangul: |
|
16083 isAvailable = (inputLanguage == ELangKorean ); |
|
16084 break; |
|
16085 case ENativeNumber: |
|
16086 isAvailable = (inputLanguage == ELangHindi |
|
16087 || inputLanguage == ELangArabic |
|
16088 || inputLanguage == ELangUrdu |
|
16089 || inputLanguage == ELangFarsi/* |
|
16090 || ( inputLanguage == ELangThai && iFepPluginManager && |
|
16091 iFepPluginManager->PluginInputMode() != EPluginInputModeItut && |
|
16092 iFepPluginManager->PluginInputMode() != EPluginInputModeNone)*/ ); |
|
16093 default: |
|
16094 break; |
|
16095 } |
|
16096 return isAvailable; |
|
16097 } |
|
16098 |
|
16099 TInt CAknFepManager::NewInputModeAfterLanguageChange() const |
|
16100 { |
|
16101 TInt inputMode = 0; |
|
16102 switch (iLanguageCapabilities.iInputLanguageCode) |
|
16103 { |
|
16104 case ELangPrcChinese: |
|
16105 if ( iAknEditorFlags & EAknEditorFlagForceTransparentFepModes ) |
|
16106 { |
|
16107 inputMode = ELatin; // EPRCFind from hashkey loop |
|
16108 } |
|
16109 else |
|
16110 { |
|
16111 inputMode = EPinyin; |
|
16112 } |
|
16113 break; |
|
16114 case ELangHongKongChinese: |
|
16115 if ( iAknEditorFlags & EAknEditorFlagForceTransparentFepModes ) |
|
16116 { |
|
16117 inputMode = EStrokeFind; |
|
16118 } |
|
16119 else |
|
16120 { |
|
16121 TInt sharedDataMode = iSharedDataInterface->InputMode(); |
|
16122 if (iQwertyInputMode && |
|
16123 sharedDataMode == ECangJie) |
|
16124 { |
|
16125 inputMode = ECangJie; |
|
16126 } |
|
16127 else |
|
16128 { |
|
16129 inputMode = EStroke; |
|
16130 } |
|
16131 } |
|
16132 break; |
|
16133 case ELangTaiwanChinese: |
|
16134 if ( iAknEditorFlags & EAknEditorFlagForceTransparentFepModes ) |
|
16135 { |
|
16136 inputMode = EZhuyinFind; |
|
16137 } |
|
16138 else |
|
16139 { |
|
16140 inputMode = EZhuyin; |
|
16141 } |
|
16142 break; |
|
16143 case ELangJapanese: |
|
16144 inputMode = EHiraganaKanji; |
|
16145 break; |
|
16146 case ELangKorean: |
|
16147 inputMode = EHangul; |
|
16148 break; |
|
16149 default: |
|
16150 inputMode = ELatin; |
|
16151 break; |
|
16152 } |
|
16153 return inputMode; |
|
16154 } |
|
16155 |
|
16156 void CAknFepManager::SetInputLanguageCapabilities(const TInt aInputLanguage) |
|
16157 { |
|
16158 iLanguageCapabilities.iInputLanguageCode = aInputLanguage; |
|
16159 |
|
16160 if ( aInputLanguage == ELangArabic || aInputLanguage == ELangHebrew || |
|
16161 aInputLanguage == ELangFarsi || aInputLanguage == ELangUrdu ) |
|
16162 { |
|
16163 iLanguageCapabilities.iSupportsCase = EFalse; |
|
16164 iLanguageCapabilities.iRightToLeftLanguage = ETrue; |
|
16165 SetCursorTypeForInputDirection(EFalse); |
|
16166 } |
|
16167 else |
|
16168 { |
|
16169 /*Hindi*/ |
|
16170 if ( aInputLanguage == ELangThai |
|
16171 || (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(aInputLanguage))) |
|
16172 ) |
|
16173 { |
|
16174 iLanguageCapabilities.iSupportsCase = EFalse; |
|
16175 } |
|
16176 else |
|
16177 { |
|
16178 iLanguageCapabilities.iSupportsCase = ETrue; |
|
16179 } |
|
16180 iLanguageCapabilities.iRightToLeftLanguage = EFalse; |
|
16181 SetCursorTypeForInputDirection(ETrue); |
|
16182 } |
|
16183 |
|
16184 TLanguage uiLanguage = User::Language(); |
|
16185 iLanguageCapabilities.iArabicIndicDigitsAllowed = |
|
16186 ( aInputLanguage == ELangArabic || uiLanguage == ELangArabic); |
|
16187 iLanguageCapabilities.iEasternArabicIndicDigitsAllowed = ( |
|
16188 ( aInputLanguage == ELangUrdu || uiLanguage == ELangUrdu ) || |
|
16189 ( aInputLanguage == ELangFarsi|| uiLanguage == ELangFarsi ) ); |
|
16190 /*Hindi*/ |
|
16191 iLanguageCapabilities.iIndicDigitsAllowed = |
|
16192 ( (TAknFepUiIndicInputManager :: IsIndicDigitsSupported(TLanguage(aInputLanguage))) ); |
|
16193 UpdateLocalDigitMode(); |
|
16194 |
|
16195 MAknFepManagerInterface* fepUI = iLangMan->GetFepUI(ELatin, iCharWidth, ETrue); |
|
16196 MPtiLanguage* ptiLanguage = iPtiEngine->GetLanguage(fepUI->SupportLanguage(ELatin)); |
|
16197 if (ptiLanguage) // can be NULL in some uncommon situations |
|
16198 { |
|
16199 iLanguageCapabilities.iSupportsWesternPredictive = |
|
16200 ptiLanguage->HasInputMode(EPtiEnginePredictive); |
|
16201 // tp teleca change Korean lang does not support predictive |
|
16202 // and we want to disable predictive even with local editors |
|
16203 if(/*IsKoreanInputLanguage()*/GetInputLanguageFromSharedDataInterface() == ELangKorean ) |
|
16204 { |
|
16205 iLanguageCapabilities.iSupportsWesternPredictive = EFalse; |
|
16206 } |
|
16207 |
|
16208 |
|
16209 // tp teleca change end |
|
16210 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
16211 // Predictive QWERTY (XT9) changes ----> |
|
16212 iLanguageCapabilities.iSupportsWesternQwertyPredictive = |
|
16213 ptiLanguage->HasInputMode(EPtiEngineQwertyPredictive ); |
|
16214 if ( GetInputLanguageFromSharedDataInterface() == ELangKorean ) |
|
16215 { |
|
16216 iLanguageCapabilities.iSupportsWesternQwertyPredictive = EFalse; |
|
16217 } |
|
16218 |
|
16219 // Predictive QWERTY (XT9) changes <---- |
|
16220 #ifdef __HALF_QWERTY_KEYPAD |
|
16221 iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive = ptiLanguage->HasInputMode(EPtiEngineHalfQwertyPredictive ); |
|
16222 #endif |
|
16223 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
16224 } |
|
16225 |
|
16226 if (!iLanguageCapabilities.iSupportsWesternPredictive |
|
16227 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
16228 && !iLanguageCapabilities.iSupportsWesternQwertyPredictive |
|
16229 // Predictive QWERTY changes |
|
16230 #ifdef __HALF_QWERTY_KEYPAD |
|
16231 && !iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive |
|
16232 #endif //__HALF_QWERTY_KEYPAD |
|
16233 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
16234 ) // Predictive QWERTY changes |
|
16235 { |
|
16236 SetWesternPredictive(EFalse); |
|
16237 } |
|
16238 } |
|
16239 |
|
16240 TInt CAknFepManager::SubstituteSublanguageId(const TInt aUiLanguage) const |
|
16241 { |
|
16242 return DefaultInputLanguageFromUILanguage(aUiLanguage); |
|
16243 } |
|
16244 |
|
16245 TTmDocPosSpec CAknFepManager::DocPos() |
|
16246 { |
|
16247 TTmDocPosSpec docPos = TTmDocPosSpec(); |
|
16248 TTmDocPos rawDocPos; |
|
16249 TBool gotPos = EFalse; |
|
16250 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
16251 if (docNavi) |
|
16252 { |
|
16253 docNavi->GetDocPos(rawDocPos); |
|
16254 gotPos = ETrue; |
|
16255 } |
|
16256 else |
|
16257 { |
|
16258 // Use Edwin (FepAwareTextEditor() ) to get the position of document |
|
16259 if ( FepAwareTextEditor() ) |
|
16260 { |
|
16261 TCursorSelection cursorSel( 0, 0 ); |
|
16262 // Get the postion of document |
|
16263 FepAwareTextEditor()->GetCursorSelectionForFep( cursorSel ); |
|
16264 |
|
16265 // Set the leading edge of the document. |
|
16266 rawDocPos.iPos = cursorSel.iCursorPos; |
|
16267 CAknEdwinState* state( EditorState() ); |
|
16268 rawDocPos.iLeadingEdge = ( state && |
|
16269 state->Flags() & EAknEditorFlagCursorLedingEdge ); |
|
16270 gotPos = ETrue; |
|
16271 } |
|
16272 } |
|
16273 if (gotPos) |
|
16274 { |
|
16275 docPos.iPos = rawDocPos.iPos; |
|
16276 TTmDocPosSpec::TType docPosType = |
|
16277 rawDocPos.iLeadingEdge ? TTmDocPosSpec::ELeading : TTmDocPosSpec::ETrailing; |
|
16278 docPos.iType = docPosType; |
|
16279 } |
|
16280 return docPos; |
|
16281 } |
|
16282 |
|
16283 /** |
|
16284 * This method needs EditorState() to exist |
|
16285 * |
|
16286 */ |
|
16287 CTextView* CAknFepManager::TextView() const |
|
16288 { |
|
16289 if (EditorState()) |
|
16290 { |
|
16291 CAknEdwinFormAccessor* formAccessor = EditorState()->FormAccessor(); |
|
16292 if (formAccessor) |
|
16293 { |
|
16294 return formAccessor->GetTextView(); |
|
16295 } |
|
16296 } |
|
16297 return NULL; |
|
16298 } |
|
16299 |
|
16300 CTextLayout* CAknFepManager::TextLayout() const |
|
16301 { |
|
16302 if( EditorState() ) |
|
16303 { |
|
16304 CAknEdwinFormAccessor* formAccessor = EditorState()->FormAccessor(); |
|
16305 if (formAccessor) |
|
16306 { |
|
16307 return formAccessor->GetTextLayout(); |
|
16308 } |
|
16309 } |
|
16310 return NULL; |
|
16311 } |
|
16312 |
|
16313 CPlainText* CAknFepManager::PlainText() const |
|
16314 { |
|
16315 return iUiInterface->PlainText(EditorState()); |
|
16316 } |
|
16317 |
|
16318 /** |
|
16319 * Checks if the paragraph containing aPos is Right to left. |
|
16320 * This routine will return nonsense if |
|
16321 * - TextLayout() does not return a pointer |
|
16322 * - the position passed is not in the formatted region |
|
16323 * |
|
16324 * Note, the return value from FindDocPos is thrown away |
|
16325 */ |
|
16326 TBool CAknFepManager::IsRightToLeftParagraph(TTmDocPosSpec aPos) const |
|
16327 { |
|
16328 TTmPosInfo2 posInfo; |
|
16329 TTmLineInfo lineInfo; |
|
16330 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
16331 if (docNavi) |
|
16332 { |
|
16333 docNavi->FindDocPos(aPos, posInfo, lineInfo); |
|
16334 } |
|
16335 else |
|
16336 { |
|
16337 CTextLayout* textLayout = TextLayout(); |
|
16338 if (textLayout) |
|
16339 { |
|
16340 textLayout->TagmaTextLayout().FindDocPos(aPos, posInfo, lineInfo); |
|
16341 } |
|
16342 } |
|
16343 |
|
16344 return lineInfo.iFlags & TTmLineInfo::EParRightToLeft; |
|
16345 } |
|
16346 |
|
16347 |
|
16348 void CAknFepManager::FindAdjacentChunks(const TTmDocPosSpec& aPos, |
|
16349 CTmTextLayout::TTmChunkDescription& aLeft, |
|
16350 CTmTextLayout::TTmChunkDescription& aRight) const |
|
16351 { |
|
16352 aLeft.iStart = -1; |
|
16353 aLeft.iEnd = -1; |
|
16354 aLeft.iRightToLeft = EFalse; |
|
16355 aRight.iStart = -1; |
|
16356 aRight.iEnd = -1; |
|
16357 aRight.iRightToLeft = EFalse; |
|
16358 |
|
16359 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
16360 if (docNavi) |
|
16361 { |
|
16362 docNavi->FindAdjacentChunks(aPos, aLeft, aRight); |
|
16363 } |
|
16364 else |
|
16365 { |
|
16366 CTextLayout* textLayout = TextLayout(); |
|
16367 if (textLayout) |
|
16368 { |
|
16369 textLayout->TagmaTextLayout().FindAdjacentChunks(aPos, aLeft, aRight); |
|
16370 } |
|
16371 } |
|
16372 } |
|
16373 |
|
16374 |
|
16375 TBool CAknFepManager::GetNextVisualRightCharacter( TInt& aPosition ) |
|
16376 { |
|
16377 TTmDocPosSpec pos = DocPos(); |
|
16378 TTmPosInfo2 info; |
|
16379 TBool nextPositionFound = EFalse; |
|
16380 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
16381 if (docNavi) |
|
16382 { |
|
16383 nextPositionFound = docNavi->GetNextVisualCursorPos(pos, info, EFalse); |
|
16384 } |
|
16385 else |
|
16386 { |
|
16387 CTextLayout* textLayout = TextLayout(); |
|
16388 if (textLayout) |
|
16389 { |
|
16390 nextPositionFound = textLayout->TagmaTextLayout().GetNextVisualCursorPos(pos, |
|
16391 info, |
|
16392 EFalse); |
|
16393 } |
|
16394 } |
|
16395 if (nextPositionFound) |
|
16396 { |
|
16397 aPosition = info.iDocPos.iPos; |
|
16398 |
|
16399 CTmTextLayout::TTmChunkDescription leftChunk; |
|
16400 CTmTextLayout::TTmChunkDescription rightChunk; |
|
16401 FindAdjacentChunks(pos, leftChunk, rightChunk); |
|
16402 |
|
16403 if ( !rightChunk.iRightToLeft ) |
|
16404 { |
|
16405 aPosition -= 1; |
|
16406 } |
|
16407 } |
|
16408 return nextPositionFound; |
|
16409 } |
|
16410 |
|
16411 TBool CAknFepManager::GetNextVisualLeftCharacter( TInt& aPosition ) |
|
16412 { |
|
16413 TTmDocPosSpec pos = DocPos(); |
|
16414 TTmPosInfo2 info; |
|
16415 TBool nextPositionFound = EFalse; |
|
16416 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
16417 if (docNavi) |
|
16418 { |
|
16419 nextPositionFound = docNavi->GetNextVisualCursorPos(pos, info, ETrue); |
|
16420 } |
|
16421 else |
|
16422 { |
|
16423 CTextLayout* textLayout = TextLayout(); |
|
16424 if (textLayout) |
|
16425 { |
|
16426 nextPositionFound = TextLayout()->TagmaTextLayout().GetNextVisualCursorPos(pos, |
|
16427 info, |
|
16428 ETrue); |
|
16429 } |
|
16430 } |
|
16431 if (nextPositionFound) |
|
16432 { |
|
16433 aPosition = info.iDocPos.iPos; |
|
16434 CTmTextLayout::TTmChunkDescription leftChunk; |
|
16435 CTmTextLayout::TTmChunkDescription rightChunk; |
|
16436 FindAdjacentChunks(pos, leftChunk, rightChunk); |
|
16437 |
|
16438 if ( leftChunk.iRightToLeft ) |
|
16439 { |
|
16440 aPosition -= 1; |
|
16441 } |
|
16442 if (iLanguageCapabilities.iInputLanguageCode == ELangVietnamese) |
|
16443 { |
|
16444 aPosition = pos.iPos -1; |
|
16445 } |
|
16446 } |
|
16447 return nextPositionFound; |
|
16448 } |
|
16449 |
|
16450 void CAknFepManager::FindVisualRightOfWord(TInt& aPosition) |
|
16451 { |
|
16452 TTmDocPosSpec pos = DocPos(); |
|
16453 CTmTextLayout::TTmChunkDescription leftChunk; |
|
16454 CTmTextLayout::TTmChunkDescription rightChunk; |
|
16455 FindAdjacentChunks(pos, leftChunk, rightChunk); |
|
16456 |
|
16457 if ( rightChunk.iRightToLeft ) |
|
16458 { |
|
16459 FindStartOfWord(aPosition); |
|
16460 } |
|
16461 else |
|
16462 { |
|
16463 FindEndOfWord(aPosition); |
|
16464 } |
|
16465 } |
|
16466 |
|
16467 void CAknFepManager::FindVisualLeftOfWord(TInt& aPosition) |
|
16468 { |
|
16469 TTmDocPosSpec pos = DocPos(); |
|
16470 CTmTextLayout::TTmChunkDescription leftChunk; |
|
16471 CTmTextLayout::TTmChunkDescription rightChunk; |
|
16472 FindAdjacentChunks(pos, leftChunk, rightChunk); |
|
16473 |
|
16474 if ( leftChunk.iRightToLeft) |
|
16475 { |
|
16476 FindEndOfWord(aPosition); |
|
16477 } |
|
16478 else |
|
16479 { |
|
16480 FindStartOfWord(aPosition); |
|
16481 } |
|
16482 } |
|
16483 |
|
16484 |
|
16485 |
|
16486 TBool CAknFepManager::GetVisualDocStart( TTmDocPosSpec& aPos) const |
|
16487 { |
|
16488 // Set up the initial try as leading to the first logical character |
|
16489 // It is a requirement that this position is at least in the first line |
|
16490 TTmDocPosSpec pos(0, TTmDocPosSpec::ELeading); |
|
16491 |
|
16492 // Need to record if we are in aleft to right paragraph or not |
|
16493 TBool leftToRightParagraph = !IsRightToLeftParagraph(pos); |
|
16494 |
|
16495 TBool success(EFalse); |
|
16496 CTextLayout* textLayout = TextLayout(); |
|
16497 TTmDocPosSpec docPos; |
|
16498 if (AknFepDocumentNavigation() || textLayout) |
|
16499 { |
|
16500 // This was written because Tagma's LineExtreme() method did not seem to work |
|
16501 success = GetAknFepLineExtreme( pos, !leftToRightParagraph, docPos ); |
|
16502 } |
|
16503 |
|
16504 if (success) |
|
16505 aPos = docPos; |
|
16506 else // Possible cleanup; action for when there is insufficient information |
|
16507 { |
|
16508 aPos.iPos = 0; |
|
16509 aPos.iType = TTmDocPosSpec::ELeading; |
|
16510 } |
|
16511 |
|
16512 return success; |
|
16513 } |
|
16514 |
|
16515 TBool CAknFepManager::GetVisualDocEnd( TTmDocPosSpec& aPos) const |
|
16516 { |
|
16517 // Set EAknEditorFlagNeedWholeTextData to Editor State |
|
16518 // EAknEditorFlagNeedWholeTextData means needing to get whole document data to editor |
|
16519 UpdateEditorStateFlags( EAknEditorFlagNeedWholeTextData ); |
|
16520 |
|
16521 TInt docLength = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
16522 |
|
16523 // Set up the initial try as trailing after the last logical character |
|
16524 // It is a requirement that this position is at least in the last line |
|
16525 TTmDocPosSpec pos(docLength, TTmDocPosSpec::ETrailing); |
|
16526 |
|
16527 // Need to record if we are in a left to right paragraph or not |
|
16528 TBool leftToRightParagraph = !IsRightToLeftParagraph(pos); |
|
16529 |
|
16530 TBool success(EFalse); |
|
16531 CTextLayout* textLayout = TextLayout(); |
|
16532 TTmDocPosSpec docPos; |
|
16533 if (AknFepDocumentNavigation() || textLayout) |
|
16534 { |
|
16535 // This was written because Tagma's LineExtreme() method did not seem to work |
|
16536 success = GetAknFepLineExtreme( pos, leftToRightParagraph, docPos ); |
|
16537 } |
|
16538 |
|
16539 if (success) |
|
16540 aPos = docPos; |
|
16541 else // Possible cleanup; action for when there is insufficient information |
|
16542 { |
|
16543 aPos.iPos = docLength; |
|
16544 aPos.iType = TTmDocPosSpec::ETrailing; |
|
16545 } |
|
16546 |
|
16547 // Remove EAknEditorFlagNeedWholeTextData fromEditor State |
|
16548 UpdateEditorStateFlags( EAknEditorFlagNeedWholeTextData, EFalse ); |
|
16549 return success; |
|
16550 } |
|
16551 |
|
16552 |
|
16553 TBool CAknFepManager::GetAknFepLineExtreme( const TTmDocPosSpec& aPos, TBool aToRight, |
|
16554 TTmDocPosSpec& aExtreme) const |
|
16555 { |
|
16556 TBool success(EFalse); |
|
16557 |
|
16558 TTmPosInfo2 posInfo; |
|
16559 TTmLineInfo lineInfo; |
|
16560 TBool found = EFalse; |
|
16561 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
16562 if (docNavi) |
|
16563 { |
|
16564 found = docNavi->FindDocPos(aPos, posInfo, lineInfo); |
|
16565 } |
|
16566 else |
|
16567 { |
|
16568 CTextLayout* textLayout = TextLayout(); |
|
16569 if ( textLayout ) |
|
16570 { |
|
16571 found = textLayout->TagmaTextLayout().FindDocPos(aPos, posInfo, lineInfo); |
|
16572 } |
|
16573 } |
|
16574 |
|
16575 if ( found ) |
|
16576 { |
|
16577 // Make a selection of the line info. Cursor first, Anchar 2nd: |
|
16578 TCursorSelection theWholeLine( lineInfo.iEnd-1, lineInfo.iStart ); |
|
16579 |
|
16580 TWesternNaviEvent event; |
|
16581 if ( aToRight ) |
|
16582 event = ERightNaviEvent; |
|
16583 else |
|
16584 event = ELeftNaviEvent; |
|
16585 |
|
16586 GetAvkonDefinedVisualLimitsOfSelection( theWholeLine, event, aExtreme, NULL ); |
|
16587 success = ETrue; |
|
16588 } |
|
16589 |
|
16590 return success; |
|
16591 } |
|
16592 |
|
16593 |
|
16594 /** |
|
16595 * This routine analyses a selection (Does not have to be a real selection, but the datastructure |
|
16596 * is used as input) to find its visual start or end, according to the passed parameter |
|
16597 * The algo used is: |
|
16598 * - First find the top line of the selection. |
|
16599 * - Then find the bottom line of the selection. |
|
16600 * - Look at the two lines' directionality (from the paragraph they belong to) and decide what the overall |
|
16601 * directionality of the selection is. Thus right/left can be translated to increment/decrement. |
|
16602 * (Note that Up is always decrement; down is always increment). So that allows the key actions to be |
|
16603 * correctly grouped, and allows it to be determined which keys act from the top or the bottom line |
|
16604 * (Decrement always acts from the top line; Increment always acts from the bottom line) |
|
16605 * |
|
16606 * - When the keys are handled, the action is again translated back to right/left according to the key- |
|
16607 * grouping and whether you are acting from the top line or from the bottom line. Eg, decrement in RTL |
|
16608 * line is visually to the Right. |
|
16609 * - the appropriate "ExtremePos" API is called passing in the position on the line in which we are acting |
|
16610 * |
|
16611 */ |
|
16612 void CAknFepManager::GetAvkonDefinedVisualLimitsOfSelection( |
|
16613 const TCursorSelection& aSelection, |
|
16614 TWesternNaviEvent aEvent, |
|
16615 TTmDocPosSpec& aLimitPos, |
|
16616 TWesternNaviEvent* aEffectiveRightOrLeftEvent ) const |
|
16617 { |
|
16618 // in case an irrelvant event is sent, initialize aLimitPos to something safe |
|
16619 aLimitPos.iPos = 0; |
|
16620 aLimitPos.iType = TTmDocPosSpec::ELeading; |
|
16621 |
|
16622 TTmDocPosSpec lowLogicalPos( aSelection.LowerPos(), TTmDocPosSpec::ELeading ); |
|
16623 TTmDocPosSpec highLogicalPos( aSelection.HigherPos(), TTmDocPosSpec::ETrailing ); |
|
16624 |
|
16625 // this records what the resulting Right/left direction (for optional return) |
|
16626 TWesternNaviEvent effectiveEvent = aEvent; |
|
16627 |
|
16628 // Get line and paragraph of the lower limit of the selection: |
|
16629 TTmPosInfo2 posInfo; |
|
16630 TTmLineInfo lineInfo; |
|
16631 TBool lowIsRightToLeft; |
|
16632 TBool highIsRightToLeft; |
|
16633 TBool layoutExists = EFalse; |
|
16634 |
|
16635 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
16636 if (docNavi) |
|
16637 { |
|
16638 docNavi->FindDocPos(lowLogicalPos, posInfo, lineInfo); |
|
16639 lowIsRightToLeft = lineInfo.iFlags & TTmLineInfo::EParRightToLeft; |
|
16640 docNavi->FindDocPos(highLogicalPos, posInfo, lineInfo); |
|
16641 highIsRightToLeft = lineInfo.iFlags & TTmLineInfo::EParRightToLeft; |
|
16642 layoutExists = ETrue; |
|
16643 } |
|
16644 else |
|
16645 { |
|
16646 CTextLayout* textLayout = TextLayout(); |
|
16647 if (textLayout) |
|
16648 { |
|
16649 textLayout->TagmaTextLayout().FindDocPos(lowLogicalPos, posInfo, lineInfo); |
|
16650 lowIsRightToLeft = lineInfo.iFlags & TTmLineInfo::EParRightToLeft; |
|
16651 textLayout->TagmaTextLayout().FindDocPos(highLogicalPos, posInfo, lineInfo); |
|
16652 highIsRightToLeft = lineInfo.iFlags & TTmLineInfo::EParRightToLeft; |
|
16653 layoutExists = ETrue; |
|
16654 } |
|
16655 } |
|
16656 |
|
16657 if (layoutExists) |
|
16658 { |
|
16659 // Decide on the net directionality. This if looks a bit laboured, but it |
|
16660 // exhibits the Averell policy. |
|
16661 TBool netDirectionIsRightToLeft(EFalse); |
|
16662 if ( lowIsRightToLeft == highIsRightToLeft ) |
|
16663 netDirectionIsRightToLeft = lowIsRightToLeft; |
|
16664 else |
|
16665 netDirectionIsRightToLeft = lowIsRightToLeft;// ambiguous - Take first paragraph |
|
16666 |
|
16667 if ( netDirectionIsRightToLeft ) |
|
16668 switch ( aEvent ) |
|
16669 { |
|
16670 case ELeftNaviEvent: |
|
16671 case EDownNaviEvent: |
|
16672 effectiveEvent = ELeftNaviEvent; |
|
16673 aLimitPos = LeftVisualExtremePos( highLogicalPos, lowLogicalPos.iPos, |
|
16674 highLogicalPos.iPos ); |
|
16675 break; |
|
16676 case ERightNaviEvent: |
|
16677 case EUpNaviEvent: |
|
16678 effectiveEvent = ERightNaviEvent; |
|
16679 aLimitPos = RightVisualExtremePos(lowLogicalPos, lowLogicalPos.iPos, |
|
16680 highLogicalPos.iPos ); |
|
16681 break; |
|
16682 default: |
|
16683 // No action. Only the events above are handled. |
|
16684 break; |
|
16685 } |
|
16686 else |
|
16687 switch (aEvent) |
|
16688 { |
|
16689 case ELeftNaviEvent: |
|
16690 case EUpNaviEvent: |
|
16691 effectiveEvent = ELeftNaviEvent; |
|
16692 aLimitPos = LeftVisualExtremePos( lowLogicalPos, lowLogicalPos.iPos, |
|
16693 highLogicalPos.iPos); |
|
16694 break; |
|
16695 case ERightNaviEvent: |
|
16696 case EDownNaviEvent: |
|
16697 effectiveEvent = ERightNaviEvent; |
|
16698 aLimitPos = RightVisualExtremePos( highLogicalPos, lowLogicalPos.iPos, |
|
16699 highLogicalPos.iPos ); |
|
16700 break; |
|
16701 default: |
|
16702 // No action. Only the events above are handled. |
|
16703 break; |
|
16704 } |
|
16705 } |
|
16706 |
|
16707 else |
|
16708 { |
|
16709 // No text layout: Left or Up naviEvent gives low end; Right or down give high end |
|
16710 switch ( aEvent ) |
|
16711 { |
|
16712 case ELeftNaviEvent: |
|
16713 case EUpNaviEvent: |
|
16714 effectiveEvent = ELeftNaviEvent; |
|
16715 aLimitPos = lowLogicalPos; |
|
16716 break; |
|
16717 case ERightNaviEvent: |
|
16718 case EDownNaviEvent: |
|
16719 effectiveEvent = ERightNaviEvent; |
|
16720 aLimitPos = highLogicalPos; |
|
16721 break; |
|
16722 default: |
|
16723 // No action. Only the events above are handled. |
|
16724 break; |
|
16725 } |
|
16726 } |
|
16727 // return the effective direction (Right or Left) |
|
16728 if ( aEffectiveRightOrLeftEvent ) |
|
16729 *aEffectiveRightOrLeftEvent = effectiveEvent; |
|
16730 |
|
16731 } |
|
16732 |
|
16733 |
|
16734 TTmDocPosSpec CAknFepManager::LeftVisualExtremePos( const TTmDocPosSpec& aStartPos, |
|
16735 TInt aMinPos, TInt aMaxPos ) const |
|
16736 { |
|
16737 // Start at start and find adjacent left chunks repeatedly until we find no more chunks, or our max or min |
|
16738 // is within a chunk |
|
16739 TTmDocPosSpec currentPos = aStartPos; |
|
16740 CTextLayout* textLayout = TextLayout(); |
|
16741 if (AknFepDocumentNavigation() || textLayout) |
|
16742 { |
|
16743 CTmTextLayout::TTmChunkDescription leftChunk; |
|
16744 CTmTextLayout::TTmChunkDescription rightChunk; |
|
16745 |
|
16746 TInt iterations(0); |
|
16747 TBool endFound(EFalse); |
|
16748 |
|
16749 while( !endFound && iterations < KMaxChunkWalkIterations ) |
|
16750 { |
|
16751 iterations++; |
|
16752 FindAdjacentChunks(currentPos, leftChunk, rightChunk); |
|
16753 // Try to move to left end of left chunk |
|
16754 endFound = LeftEndOfChunkWithinRange( leftChunk, aMinPos, aMaxPos, currentPos ); |
|
16755 } |
|
16756 } |
|
16757 return currentPos; |
|
16758 } |
|
16759 |
|
16760 TTmDocPosSpec CAknFepManager::RightVisualExtremePos( const TTmDocPosSpec& aStartPos, |
|
16761 TInt aMinPos, TInt aMaxPos ) const |
|
16762 { |
|
16763 // Start at start and find adjacent right chunks repeatedly until we find no more chunks, or our max or min |
|
16764 // is within a chunk |
|
16765 TTmDocPosSpec currentPos = aStartPos; |
|
16766 CTextLayout* textLayout = TextLayout(); |
|
16767 if (AknFepDocumentNavigation() || textLayout) |
|
16768 { |
|
16769 CTmTextLayout::TTmChunkDescription leftChunk; |
|
16770 CTmTextLayout::TTmChunkDescription rightChunk; |
|
16771 |
|
16772 TInt iterations(0); |
|
16773 TBool endFound(EFalse); |
|
16774 |
|
16775 while( !endFound && iterations < KMaxChunkWalkIterations ) |
|
16776 { |
|
16777 iterations++; |
|
16778 FindAdjacentChunks(currentPos, leftChunk, rightChunk); |
|
16779 // Try to move to left end of left chunk |
|
16780 endFound = RightEndOfChunkWithinRange( rightChunk, aMinPos, aMaxPos, currentPos ); |
|
16781 } |
|
16782 } |
|
16783 return currentPos; |
|
16784 } |
|
16785 |
|
16786 TBool CAknFepManager::LeftEndOfChunkWithinRange( const CTmTextLayout::TTmChunkDescription& aChunk, |
|
16787 TInt aMinPos, TInt aMaxPos, TTmDocPosSpec& aNewPos) const |
|
16788 { |
|
16789 TBool constrained = EFalse; |
|
16790 TInt leftEnd; |
|
16791 if ( !ChunkIsValid( aChunk ) ) |
|
16792 { |
|
16793 constrained = ETrue; // leave the aNewPos as it is |
|
16794 } |
|
16795 else if ( aChunk.iStart >= iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep() ) |
|
16796 { |
|
16797 constrained = ETrue; // That chunk was a ficticious one: |
|
16798 } |
|
16799 else if ( aChunk.iEnd <= aMinPos || aChunk.iStart >= aMaxPos ) |
|
16800 { |
|
16801 constrained = ETrue; // That chunk found does not actually overlap with valid range. Don't go there |
|
16802 } |
|
16803 else |
|
16804 { |
|
16805 if ( aChunk.iRightToLeft ) |
|
16806 { |
|
16807 leftEnd = aChunk.iEnd; |
|
16808 if ( leftEnd >= aMaxPos ) |
|
16809 { |
|
16810 constrained = ETrue; |
|
16811 aNewPos.iPos = aMaxPos; |
|
16812 } |
|
16813 else |
|
16814 { |
|
16815 aNewPos.iPos = leftEnd; |
|
16816 } |
|
16817 aNewPos.iType = TTmDocPosSpec::ETrailing; |
|
16818 } |
|
16819 else |
|
16820 { |
|
16821 leftEnd = aChunk.iStart; |
|
16822 if ( leftEnd <= aMinPos ) |
|
16823 { |
|
16824 constrained = ETrue; |
|
16825 aNewPos.iPos = aMinPos; |
|
16826 } |
|
16827 else |
|
16828 { |
|
16829 aNewPos.iPos = leftEnd; |
|
16830 } |
|
16831 aNewPos.iType = TTmDocPosSpec::ELeading; |
|
16832 } |
|
16833 } |
|
16834 return constrained; |
|
16835 } |
|
16836 |
|
16837 TBool CAknFepManager::RightEndOfChunkWithinRange( const CTmTextLayout::TTmChunkDescription& aChunk, |
|
16838 TInt aMinPos, TInt aMaxPos, TTmDocPosSpec& aNewPos) const |
|
16839 { |
|
16840 TBool constrained = EFalse; |
|
16841 TInt rightEnd; |
|
16842 if ( !ChunkIsValid( aChunk ) ) |
|
16843 { |
|
16844 constrained = ETrue; // leave the aNewPos as it is |
|
16845 } |
|
16846 else if ( aChunk.iStart >= iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep() ) |
|
16847 { |
|
16848 constrained = ETrue; // That chunk was a ficticious one: |
|
16849 } |
|
16850 else if ( aChunk.iEnd <= aMinPos || aChunk.iStart >= aMaxPos ) |
|
16851 { |
|
16852 constrained = ETrue; // That chunk found does not actually overlap with valid range. Don't go there |
|
16853 } |
|
16854 else |
|
16855 { |
|
16856 if ( aChunk.iRightToLeft ) |
|
16857 { |
|
16858 rightEnd = aChunk.iStart; |
|
16859 if ( rightEnd <= aMinPos ) |
|
16860 { |
|
16861 constrained = ETrue; |
|
16862 aNewPos.iPos = aMinPos; |
|
16863 } |
|
16864 else |
|
16865 { |
|
16866 aNewPos.iPos = rightEnd; |
|
16867 } |
|
16868 aNewPos.iType = TTmDocPosSpec::ELeading; |
|
16869 } |
|
16870 else |
|
16871 { |
|
16872 rightEnd = aChunk.iEnd; |
|
16873 if ( rightEnd >= aMaxPos ) |
|
16874 { |
|
16875 constrained = ETrue; |
|
16876 aNewPos.iPos = aMaxPos; |
|
16877 } |
|
16878 else |
|
16879 { |
|
16880 aNewPos.iPos = rightEnd; |
|
16881 } |
|
16882 aNewPos.iType = TTmDocPosSpec::ETrailing; |
|
16883 } |
|
16884 } |
|
16885 return constrained; |
|
16886 } |
|
16887 |
|
16888 /** |
|
16889 * This method handles the attachment to the chunk being navigated toward. |
|
16890 * Should only be used for Right and Left navigation. |
|
16891 * The actual direction of that chunk does not need to be looked at. Even if |
|
16892 * is the same direction as the one being moved from, you still attach to it, as it may not |
|
16893 * be logically contiguous. |
|
16894 */ |
|
16895 void CAknFepManager::AdjustPosSpecForAmbiguityAfterLeftOrRightNavigation( TTmDocPosSpec& aPos, |
|
16896 TWesternNaviEvent aEvent ) const |
|
16897 { |
|
16898 |
|
16899 CTmTextLayout::TTmChunkDescription leftChunk; |
|
16900 CTmTextLayout::TTmChunkDescription rightChunk; |
|
16901 FindAdjacentChunks(aPos, leftChunk, rightChunk); |
|
16902 |
|
16903 TBool inputDirectionIsRTL = ( CurrentInputDirectionality() == TBidiText::ERightToLeft ); |
|
16904 |
|
16905 switch (aEvent) |
|
16906 { |
|
16907 case ELeftNaviEvent: |
|
16908 { |
|
16909 // Do not attach to the left chunk if its directionality is not the same as aDirection |
|
16910 if ( ChunkIsValid( leftChunk ) ) |
|
16911 if ( COMPARE_BOOLS(inputDirectionIsRTL, leftChunk.iRightToLeft) ) |
|
16912 AttachToLeftChunk( aPos, leftChunk ); |
|
16913 break; |
|
16914 } |
|
16915 case ERightNaviEvent: |
|
16916 { |
|
16917 if ( ChunkIsValid( rightChunk ) ) |
|
16918 if ( COMPARE_BOOLS(inputDirectionIsRTL, rightChunk.iRightToLeft) ) |
|
16919 AttachToRightChunk( aPos, rightChunk ); |
|
16920 break; |
|
16921 } |
|
16922 default: |
|
16923 break; |
|
16924 } |
|
16925 |
|
16926 } |
|
16927 |
|
16928 |
|
16929 void CAknFepManager::AttachToRightChunk( TTmDocPosSpec& aPos, |
|
16930 const CTmTextLayout::TTmChunkDescription& aRightChunk ) |
|
16931 { |
|
16932 if ( aRightChunk.iRightToLeft ) |
|
16933 { |
|
16934 aPos.iPos = aRightChunk.iEnd; |
|
16935 aPos.iType = TTmDocPosSpec::ETrailing; |
|
16936 } |
|
16937 else |
|
16938 { |
|
16939 aPos.iPos = aRightChunk.iStart; |
|
16940 aPos.iType = TTmDocPosSpec::ELeading; |
|
16941 } |
|
16942 } |
|
16943 |
|
16944 void CAknFepManager::AttachToLeftChunk( TTmDocPosSpec& aPos, |
|
16945 const CTmTextLayout::TTmChunkDescription& aLeftChunk ) |
|
16946 { |
|
16947 if ( aLeftChunk.iRightToLeft ) |
|
16948 { |
|
16949 aPos.iPos = aLeftChunk.iStart; |
|
16950 aPos.iType = TTmDocPosSpec::ELeading; |
|
16951 } |
|
16952 else |
|
16953 { |
|
16954 aPos.iPos = aLeftChunk.iEnd; |
|
16955 aPos.iType = TTmDocPosSpec::ETrailing; |
|
16956 } |
|
16957 } |
|
16958 |
|
16959 /** |
|
16960 * This routine ensures that the cursor position is not attached to a chunk of opposite direction. |
|
16961 * For end of document, the normal routine can be used. |
|
16962 * For the start, usually do nothing, but there is the possibility of forcing position 0/Trailing, when |
|
16963 * the edge chunk and the input directionality are opposite. |
|
16964 */ |
|
16965 void CAknFepManager::AdjustPosSpecForInputLanguageAfterDocumentLoop( TTmDocPosSpec& aPos, |
|
16966 TWesternNaviEvent /*aNaviEvent*/, TBool aLoopToTop ) const |
|
16967 { |
|
16968 |
|
16969 // Looping based on a Left event should adjust the cursor position as if that point had |
|
16970 // been reached by navigation to that same visual position outwards from the body |
|
16971 // Define this as the effective navigation that has just happened: |
|
16972 TWesternNaviEvent effectiveEvent(ELeftNaviEvent); |
|
16973 |
|
16974 // Rule for this effective navigation is |
|
16975 // move to top of document : if paradirection is LTR then treat it as a LEFT navi |
|
16976 // move to top of document : if paradirection is RTL then treat it as RIGHT navi |
|
16977 // move to bottom of document : if paradirection is LTR then treat is as RIGHT navi |
|
16978 // move to bottom of document : if paradirection is RTL then treat as LEFT navi |
|
16979 // However, NOTE that decrementing events leads to looping to the END! (and vice versa) |
|
16980 TBool newParaIsRTL = IsRightToLeftParagraph(aPos); |
|
16981 if ( aLoopToTop && newParaIsRTL ) // move to top; RTL |
|
16982 effectiveEvent = ERightNaviEvent; |
|
16983 else if ( !aLoopToTop && !newParaIsRTL ) // move to bottom; LTR |
|
16984 effectiveEvent = ERightNaviEvent; |
|
16985 |
|
16986 if ( aLoopToTop ) |
|
16987 { |
|
16988 // There is no ficticious block of the paragraph direction at -1 to 0. So we have to |
|
16989 // behave as if there is one: |
|
16990 // |
|
16991 CTmTextLayout::TTmChunkDescription leftChunk; |
|
16992 CTmTextLayout::TTmChunkDescription rightChunk; |
|
16993 CTmTextLayout::TTmChunkDescription& edgeChunk = leftChunk; |
|
16994 |
|
16995 FindAdjacentChunks(aPos, leftChunk, rightChunk); |
|
16996 |
|
16997 // Get input language direction |
|
16998 TBool inputDirectionIsRTL = ( CurrentInputDirectionality() == TBidiText::ERightToLeft ); |
|
16999 if ( effectiveEvent == ELeftNaviEvent ) |
|
17000 edgeChunk = leftChunk; |
|
17001 else |
|
17002 edgeChunk = rightChunk; |
|
17003 |
|
17004 // Check edgechunk for its direction |
|
17005 if ( !COMPARE_BOOLS( edgeChunk.iRightToLeft, inputDirectionIsRTL ) ) |
|
17006 { |
|
17007 // Input language disagrees with the chunk that we are on, |
|
17008 aPos.iPos = 0; |
|
17009 aPos.iType = TTmDocPosSpec::ETrailing; |
|
17010 } |
|
17011 |
|
17012 } |
|
17013 else // Looping to the end of document |
|
17014 { |
|
17015 // There IS a ficticious block at the doc end, so use the usual routine. |
|
17016 AdjustPosSpecForAmbiguityAfterLeftOrRightNavigation( aPos, effectiveEvent ); |
|
17017 } |
|
17018 |
|
17019 } |
|
17020 |
|
17021 TBool CAknFepManager::ChunkIsValid( const CTmTextLayout::TTmChunkDescription& aChunk ) |
|
17022 { |
|
17023 TBool isValid(ETrue); |
|
17024 |
|
17025 const TInt KNotValid = -1; |
|
17026 if ( aChunk.iRightToLeft == KNotValid ) |
|
17027 isValid = EFalse; |
|
17028 else if (aChunk.iStart == KNotValid ) |
|
17029 isValid = EFalse; |
|
17030 else if (aChunk.iEnd == KNotValid ) |
|
17031 isValid = EFalse; |
|
17032 |
|
17033 #ifdef _DEBUG |
|
17034 if (isValid) |
|
17035 __ASSERT_DEBUG( aChunk.iStart <= aChunk.iEnd, |
|
17036 AknFepPanic( EAknFepPanicBadCursorNavigationState ) ); |
|
17037 #endif |
|
17038 |
|
17039 return isValid; |
|
17040 } |
|
17041 /** |
|
17042 * Finds the current input direction. This is determined as best as it can using |
|
17043 * - T9Interface as the preferred source of information |
|
17044 * - shared data (via AknTextUtils) if that fails |
|
17045 * - localLanguage overrides the above sources of information |
|
17046 * - when fep is in numeric mode it returns LTR |
|
17047 * - if FEP is in an irelevant mode, then LTR is returned |
|
17048 * |
|
17049 * @return TDirectionality::ELeftToRight for LTR alpha mode or numeric mode |
|
17050 */ |
|
17051 TBidiText::TDirectionality CAknFepManager::CurrentInputDirectionality() const |
|
17052 { |
|
17053 TBidiText::TDirectionality directionality(TBidiText::ELeftToRight); |
|
17054 |
|
17055 // See if we are in a mode where the directionality is defined: |
|
17056 TBool checkForRTLValid(EFalse); |
|
17057 |
|
17058 switch (iMode ) |
|
17059 { |
|
17060 case ELatin: |
|
17061 case ENumber: |
|
17062 checkForRTLValid = ETrue; |
|
17063 break; |
|
17064 default: |
|
17065 break; |
|
17066 } |
|
17067 |
|
17068 if ( checkForRTLValid ) |
|
17069 { |
|
17070 MPtiLanguage* ptilang = iPtiEngine->CurrentLanguage(); // No need to get language from PtiEngine ? |
|
17071 TInt inputLanguage = (ptilang)? ptilang->LanguageCode() : 0; |
|
17072 if ( inputLanguage ) |
|
17073 { |
|
17074 directionality = TBidiText::ScriptDirectionality( (TLanguage)inputLanguage ); |
|
17075 checkForRTLValid = EFalse; |
|
17076 } |
|
17077 } |
|
17078 |
|
17079 // if no T9 interface information is available, then go for other sources |
|
17080 // Note that you have to check for local language in this case (belt-and-braces) |
|
17081 if ( checkForRTLValid ) |
|
17082 { |
|
17083 TLanguage localLanguage = ELangTest; |
|
17084 if ( GetLocalLanguage( localLanguage ) ) |
|
17085 directionality = TBidiText::ScriptDirectionality( localLanguage ); |
|
17086 else |
|
17087 directionality = AknTextUtils::CurrentScriptDirectionality(); |
|
17088 } |
|
17089 |
|
17090 return directionality; |
|
17091 } |
|
17092 |
|
17093 |
|
17094 TBool CAknFepManager::GetLocalLanguage( TLanguage& aLanguage ) const |
|
17095 { |
|
17096 TBool result(EFalse); |
|
17097 // Check for a local language override |
|
17098 if ( IsFepAwareTextEditor() ) |
|
17099 { |
|
17100 // For ITU-T keyboard we always use english in latin-only editors. |
|
17101 // In case of qwerty keyboard, some languages can be used in latin |
|
17102 // only-editors, some require that english is used instead. That |
|
17103 // is decided here. |
|
17104 const TInt globalLang = iSharedDataInterface->InputTextLanguage(); |
|
17105 TBool allowTest = |
|
17106 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
17107 !iQwertyInputMode || |
|
17108 #endif |
|
17109 globalLang == ELangPrcChinese || |
|
17110 globalLang == ELangHongKongChinese || |
|
17111 globalLang == ELangTaiwanChinese || |
|
17112 globalLang == ELangThai || |
|
17113 globalLang == ELangGreek || |
|
17114 globalLang == ELangArabic || |
|
17115 globalLang == ELangFarsi || |
|
17116 globalLang == ELangUrdu || |
|
17117 globalLang == ELangHebrew || |
|
17118 globalLang == ELangRussian || |
|
17119 globalLang == ELangUkrainian || |
|
17120 globalLang == ELangHindi || |
|
17121 #ifdef RD_MARATHI |
|
17122 globalLang == ELangMarathi || |
|
17123 #endif // RD_MARATHI |
|
17124 |
|
17125 #ifdef RD_HINDI_PHONETIC_INPUT |
|
17126 globalLang == KLangHindiPhonetic || |
|
17127 #endif |
|
17128 globalLang == ELangBulgarian || |
|
17129 globalLang == ELangVietnamese; |
|
17130 |
|
17131 if (allowTest && iAknEditorFlags & EAknEditorFlagLatinInputModesOnly && |
|
17132 iLanguageCapabilities.iInputLanguageCode != ELangJapanese) |
|
17133 { |
|
17134 aLanguage = ELangEnglish; |
|
17135 } |
|
17136 else |
|
17137 { |
|
17138 aLanguage = EditorState()->LocalLanguage(); |
|
17139 |
|
17140 // Change local language to ELangEnglish if application, e.g. Search Widget, |
|
17141 // sets local language to ELangEnglish_Taiwan, ELangEnglish_HongKong |
|
17142 // and ELangEnglish_Prc. |
|
17143 if( aLanguage == ELangEnglish_Taiwan || |
|
17144 aLanguage == ELangEnglish_HongKong || |
|
17145 aLanguage == ELangEnglish_Prc ) |
|
17146 { |
|
17147 aLanguage = ELangEnglish; |
|
17148 } |
|
17149 } |
|
17150 |
|
17151 if ( aLanguage != ELangTest ) |
|
17152 { |
|
17153 MPtiLanguage* languageObject = NULL; |
|
17154 languageObject = iPtiEngine->GetLanguage(aLanguage); |
|
17155 if (languageObject) // Check if the input language is supported. |
|
17156 { |
|
17157 result = ETrue; |
|
17158 } |
|
17159 else |
|
17160 { |
|
17161 aLanguage = ELangTest; |
|
17162 } |
|
17163 } |
|
17164 } |
|
17165 return result; |
|
17166 } |
|
17167 |
|
17168 |
|
17169 TBool CAknFepManager::GetExposedDirectionOfText( TInt aPos, TBool aForward, |
|
17170 TBool& aIsRightToLeft ) const |
|
17171 { |
|
17172 TBool hasStrongCharacter(EFalse); |
|
17173 |
|
17174 // Access the plain text from the editor, getting a little bit at a time. |
|
17175 |
|
17176 TInt docLen = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
17177 |
|
17178 // Init with defaults for aForward = ETrue |
|
17179 TInt limit = docLen; |
|
17180 TInt increment = 1; |
|
17181 if ( !aForward ) |
|
17182 { |
|
17183 limit = -1; // Loop does not execute if == limit |
|
17184 increment = -1; |
|
17185 } |
|
17186 |
|
17187 for ( TInt index = aPos; index != limit ; index += increment ) |
|
17188 { |
|
17189 TChar ch = CharAt(index); |
|
17190 if ( iInlineTextDecorator->CharacterIsStrongRightToLeft( (TText)ch ) ) |
|
17191 { |
|
17192 hasStrongCharacter = ETrue; |
|
17193 aIsRightToLeft = ETrue; |
|
17194 break; |
|
17195 } |
|
17196 else if ( iInlineTextDecorator->CharacterIsStrongLeftToRight( (TText)ch ) ) |
|
17197 { |
|
17198 hasStrongCharacter = ETrue; |
|
17199 aIsRightToLeft = EFalse; |
|
17200 break; |
|
17201 } |
|
17202 } |
|
17203 |
|
17204 return hasStrongCharacter; |
|
17205 } |
|
17206 |
|
17207 TBool CAknFepManager::GetExposedDirectionOfTextInDescriptor( const TDesC& aText, TBool aForward, |
|
17208 TBool& aIsRightToLeft ) const |
|
17209 { |
|
17210 TBool hasStrongCharacter(EFalse); |
|
17211 |
|
17212 TInt textLen = aText.Length(); |
|
17213 |
|
17214 TInt start = 0; |
|
17215 TInt limit = textLen; |
|
17216 TInt increment = 1; |
|
17217 if ( !aForward ) |
|
17218 { |
|
17219 start = textLen-1; |
|
17220 limit = -1; // Loop does not execute if == limit |
|
17221 increment = -1; |
|
17222 } |
|
17223 |
|
17224 for ( TInt index = start; index != limit ; index += increment ) |
|
17225 { |
|
17226 if ( iInlineTextDecorator->CharacterIsStrongRightToLeft( (TText)aText[index] ) ) |
|
17227 { |
|
17228 hasStrongCharacter = ETrue; |
|
17229 aIsRightToLeft = ETrue; |
|
17230 break; |
|
17231 } |
|
17232 else if ( iInlineTextDecorator->CharacterIsStrongLeftToRight( (TText)aText[index] ) ) |
|
17233 { |
|
17234 hasStrongCharacter = ETrue; |
|
17235 aIsRightToLeft = EFalse; |
|
17236 break; |
|
17237 } |
|
17238 } |
|
17239 |
|
17240 return hasStrongCharacter; |
|
17241 } |
|
17242 |
|
17243 TChar CAknFepManager::CharAt( TInt aPos ) const |
|
17244 { |
|
17245 TBuf<ESingleCharacter> chDes; |
|
17246 #ifdef RD_SCALABLE_UI_V2 |
|
17247 if ( SemiFepAwareTextEditor( ETrue ) ) |
|
17248 #else |
|
17249 if ( iInputCapabilities.FepAwareTextEditor() ) |
|
17250 #endif // RD_SCALABLE_UI_V2 |
|
17251 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep( chDes, aPos, |
|
17252 ESingleCharacter); |
|
17253 if( chDes.Length() > 0 ) |
|
17254 return chDes[0]; |
|
17255 else |
|
17256 return TChar(0); |
|
17257 } |
|
17258 |
|
17259 |
|
17260 /** |
|
17261 * Navigate off of selected text using an Up/Down/Right/Left navigation event |
|
17262 * |
|
17263 * The code takes account of the paragraph directionality that the passed selection is |
|
17264 * found in. |
|
17265 * |
|
17266 * The new cursor position is resolved for ambuguity and set using SetCursorPosition and |
|
17267 * so it has the same side-effects: |
|
17268 * iUncommittedText is set to the zero-width "cursor" state with the new cursor position |
|
17269 * iUncommittedText is set into the FepAwareTextEditor state |
|
17270 * iCaseManager is updated with a ENullNaviEvent |
|
17271 * the doc pos is set in TextView object if present |
|
17272 */ |
|
17273 TKeyResponse CAknFepManager::NavigateFromSelectionL( |
|
17274 const TCursorSelection& aSelection, |
|
17275 TWesternNaviEvent aNaviEvent, |
|
17276 TTmDocPosSpec& aPos) |
|
17277 { |
|
17278 if (IsCcpuFlagSet(ECcpuStateCopy | ECcpuStateCut | ECcpuStateHashDown)) |
|
17279 { |
|
17280 return EKeyWasNotConsumed; |
|
17281 } |
|
17282 |
|
17283 switch( aNaviEvent ) |
|
17284 { |
|
17285 case EUpNaviEvent: |
|
17286 case EDownNaviEvent: |
|
17287 case ERightNaviEvent: |
|
17288 case ELeftNaviEvent: |
|
17289 // Carry on. Handle this event |
|
17290 break; |
|
17291 default: // just leave it as NULL |
|
17292 return EKeyWasNotConsumed; |
|
17293 } |
|
17294 // Find the visual end of the selection |
|
17295 TWesternNaviEvent effectiveEvent; // used to return either Right or Left event from next call: |
|
17296 GetAvkonDefinedVisualLimitsOfSelection( aSelection, aNaviEvent, aPos, &effectiveEvent ); |
|
17297 AdjustPosSpecForAmbiguityAfterLeftOrRightNavigation( aPos, effectiveEvent ); |
|
17298 |
|
17299 // Set this as the current position |
|
17300 SetCursorPositionL( aPos ); |
|
17301 |
|
17302 return EKeyWasConsumed; |
|
17303 } |
|
17304 |
|
17305 |
|
17306 void CAknFepManager::SetCursorPositionL( const TTmDocPosSpec& aNewCursorPos, TBool aDragSelectOn ) |
|
17307 { |
|
17308 if ( !iInputCapabilities.FepAwareTextEditor() ) |
|
17309 return; |
|
17310 |
|
17311 TInt newAnchorPos = aNewCursorPos.iPos; |
|
17312 |
|
17313 if ( aDragSelectOn ) |
|
17314 { |
|
17315 TCursorSelection selection; |
|
17316 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(selection); |
|
17317 if ( selection.Length() > 0 ) // there is a selection. Keep the anchor |
|
17318 newAnchorPos = selection.iAnchorPos; |
|
17319 } |
|
17320 |
|
17321 iUncommittedText.SetSelection( aNewCursorPos.iPos, newAnchorPos ); |
|
17322 |
|
17323 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(iUncommittedText); |
|
17324 iCaseMan->UpdateCase(ENullNaviEvent); |
|
17325 |
|
17326 // This is able to set the directional attachment of the cursor in a way that the FepAwareTextEditor interface cannot |
|
17327 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
17328 if (docNavi) |
|
17329 { |
|
17330 docNavi->SetDocPosL(aNewCursorPos, aDragSelectOn); |
|
17331 } |
|
17332 else |
|
17333 { |
|
17334 CAknEdwinFormAccessor* formAccessor = EditorState()->FormAccessor(); |
|
17335 if (formAccessor) |
|
17336 { |
|
17337 CEikEdwin *edwin = static_cast<CEikEdwin *>( formAccessor->FormClientControl() ); |
|
17338 if (edwin) |
|
17339 edwin->SetCursorPosL( aNewCursorPos.iPos, aDragSelectOn ); |
|
17340 } |
|
17341 } |
|
17342 } |
|
17343 |
|
17344 |
|
17345 |
|
17346 TBool CAknFepManager::InFirstLineAndFormatted( const TTmDocPosSpec& aPos ) const |
|
17347 { |
|
17348 return DocPosInFirstOrLastLineAndFormatted( aPos, ETrue); |
|
17349 } |
|
17350 |
|
17351 TBool CAknFepManager::InLastLineAndFormatted( const TTmDocPosSpec& aPos ) const |
|
17352 { |
|
17353 return DocPosInFirstOrLastLineAndFormatted( aPos, EFalse ); |
|
17354 } |
|
17355 |
|
17356 TBool CAknFepManager::DocPosInFirstOrLastLineAndFormatted( const TTmDocPosSpec& aPos, |
|
17357 TBool aCheckFirstLine ) const |
|
17358 { |
|
17359 TBool success(EFalse); |
|
17360 TTmLineInfo lineInfo; |
|
17361 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
17362 if (docNavi) |
|
17363 { |
|
17364 success = docNavi->DocPosToLine( aPos, lineInfo); |
|
17365 } |
|
17366 else |
|
17367 { |
|
17368 CTextLayout* textLayout = TextLayout(); |
|
17369 if ( textLayout ) |
|
17370 { |
|
17371 success = textLayout->TagmaTextLayout().DocPosToLine( aPos, lineInfo); |
|
17372 } |
|
17373 } |
|
17374 |
|
17375 if ( success ) |
|
17376 { |
|
17377 if ( aCheckFirstLine ) |
|
17378 success = (lineInfo.iLineNumber == 0 ); |
|
17379 else |
|
17380 { |
|
17381 // Current position has yielded line information. But how to tell if it is the last line? |
|
17382 // Use the fact that the docpos of the last character will be in the last line. |
|
17383 // Also account for the fact that these APIs report a character at docLength itself, a |
|
17384 // ficticious end of paragraph character. So use a >= docLength |
|
17385 success = (lineInfo.iEnd >= |
|
17386 iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep() ); |
|
17387 } |
|
17388 } |
|
17389 |
|
17390 return success; |
|
17391 } |
|
17392 |
|
17393 TBool CAknFepManager::AtVisualStart( const TTmDocPosSpec& aCurrentPos, |
|
17394 const TTmDocPosSpec& aLimitPos ) const |
|
17395 { |
|
17396 TBool positionsAreTheSame(EFalse); |
|
17397 if ( aCurrentPos.iPos == aLimitPos.iPos && aCurrentPos.iType == aLimitPos.iType ) |
|
17398 positionsAreTheSame = ETrue; |
|
17399 else if ( aCurrentPos.iPos == 0 && aCurrentPos.iType == TTmDocPosSpec::ETrailing ) |
|
17400 positionsAreTheSame = ETrue; |
|
17401 |
|
17402 return positionsAreTheSame; |
|
17403 } |
|
17404 |
|
17405 TBool CAknFepManager::AtVisualEnd( const TTmDocPosSpec& aCurrentPos, |
|
17406 const TTmDocPosSpec& aLimitPos, TInt aDocLength ) const |
|
17407 { |
|
17408 TBool positionsAreTheSame(EFalse); |
|
17409 if ( aCurrentPos.iPos == aLimitPos.iPos && aCurrentPos.iType == aLimitPos.iType ) |
|
17410 positionsAreTheSame = ETrue; |
|
17411 else if ( aCurrentPos.iPos == aDocLength && aCurrentPos.iType == TTmDocPosSpec::ELeading ) |
|
17412 positionsAreTheSame = ETrue; |
|
17413 else if ( aCurrentPos.iPos > aDocLength ) |
|
17414 positionsAreTheSame = ETrue; |
|
17415 |
|
17416 return positionsAreTheSame; |
|
17417 } |
|
17418 |
|
17419 |
|
17420 void CAknFepManager::SetCursorType(TBool aIsLeftToRight) |
|
17421 { |
|
17422 if ( !BidiCursorRequired() ) |
|
17423 return; |
|
17424 |
|
17425 // Optimization to prevent excessive Wserv communication: |
|
17426 if ( IsFlagSet( EFlagBidiCursorIsInitialized ) |
|
17427 && COMPARE_BOOLS( !aIsLeftToRight, IsFlagSet( EFlagCursorPointsRightToLeft ) ) ) |
|
17428 return; |
|
17429 |
|
17430 SetFlag( EFlagBidiCursorIsInitialized ); |
|
17431 |
|
17432 MCoeFepAwareTextEditor* editor = iInputCapabilities.FepAwareTextEditor(); |
|
17433 if (editor && editor->Extension1()) |
|
17434 { |
|
17435 TCharFormat format; |
|
17436 TInt docPos = DocPos().iPos; |
|
17437 editor->GetFormatForFep(format, docPos); |
|
17438 |
|
17439 // Use Avkon routine to make all the layout decisions. It returns a TTextCursor object |
|
17440 TTextCursor newCursor; |
|
17441 AknCustomCursorSupport::GetBidiTextCursorFromFontSpec( format.iFontSpec, |
|
17442 !aIsLeftToRight, newCursor ); |
|
17443 TBool setToTrue(ETrue); |
|
17444 editor->Extension1()->SetCursorType(setToTrue, newCursor); |
|
17445 |
|
17446 // Keep flag in step for optimization |
|
17447 if ( aIsLeftToRight ) |
|
17448 ClearFlag( EFlagCursorPointsRightToLeft ); |
|
17449 else |
|
17450 SetFlag( EFlagCursorPointsRightToLeft ); |
|
17451 } |
|
17452 } |
|
17453 |
|
17454 TBool CAknFepManager::DeviceSupportsRTLLanguageL() |
|
17455 { |
|
17456 CArrayFixFlat<TInt>* languages = new (ELeave) CArrayFixFlat<TInt>(ELanguageArrayGranularity); |
|
17457 CleanupStack::PushL(languages); |
|
17458 iPtiEngine->GetAvailableLanguagesL(languages); |
|
17459 |
|
17460 TBool bidiCursorSuppressed(EFalse); |
|
17461 #if defined(__WINS__) |
|
17462 bidiCursorSuppressed = ETrue; |
|
17463 // Test (Disabled) mode (fake) UID, key and its value |
|
17464 const TInt KTestModeValue = 1; // 1 = show Bidi cursor |
|
17465 |
|
17466 CRepository* repository = NULL; |
|
17467 TRAPD(ret, repository = CRepository::NewL(KCRUidAknFep)); |
|
17468 if (ret == KErrNone) |
|
17469 { |
|
17470 TInt modeValue = 0; |
|
17471 if (repository->Get(KAknFepTestModeKey, modeValue) == KErrNone) |
|
17472 { |
|
17473 if (modeValue == KTestModeValue) |
|
17474 { |
|
17475 bidiCursorSuppressed = EFalse; // show bidi cursor |
|
17476 } |
|
17477 } |
|
17478 } |
|
17479 delete repository; |
|
17480 #endif |
|
17481 |
|
17482 TBool result = EFalse; |
|
17483 if (!bidiCursorSuppressed) |
|
17484 { |
|
17485 for (TInt jj = 0; jj < languages->Count(); jj++) |
|
17486 { |
|
17487 if (languages->At(jj) == ELangArabic || |
|
17488 languages->At(jj) == ELangHebrew || |
|
17489 languages->At(jj) == ELangFarsi || |
|
17490 languages->At(jj) == ELangUrdu ) |
|
17491 // + others... |
|
17492 { |
|
17493 result = ETrue; |
|
17494 break; |
|
17495 } |
|
17496 } |
|
17497 } |
|
17498 |
|
17499 CleanupStack::PopAndDestroy(); // languages |
|
17500 return result; |
|
17501 } |
|
17502 |
|
17503 void CAknFepManager::CalculateEditorDigitType(TDigitType& aDestination) |
|
17504 { |
|
17505 // When current range is latin number mode |
|
17506 if ( iMode == ENumber ) |
|
17507 { |
|
17508 // Set the Local Digit Type flag to EDigitTypeWestern |
|
17509 aDestination = EDigitTypeWestern; |
|
17510 return; |
|
17511 } |
|
17512 |
|
17513 TBool ASCIIDigits = EFalse; |
|
17514 MObjectProvider* mop = iInputCapabilities.ObjectProvider(); |
|
17515 |
|
17516 if ( mop ) |
|
17517 { |
|
17518 CAknExtendedInputCapabilities* extendedInputCapabilities = |
|
17519 mop->MopGetObject( extendedInputCapabilities ); |
|
17520 |
|
17521 if ( extendedInputCapabilities ) |
|
17522 { |
|
17523 if ( extendedInputCapabilities->SupportsCapabilities( |
|
17524 CAknExtendedInputCapabilities::ESupportsOnlyASCIIDigits ) ) |
|
17525 { |
|
17526 // If this is true, then the inputcaps wants only ascii |
|
17527 // digits -> you can, when the editor is seen as numeric, |
|
17528 // be sure that only latin indicator is then wanted. |
|
17529 ASCIIDigits = ETrue; |
|
17530 } |
|
17531 } |
|
17532 } |
|
17533 |
|
17534 if (iAknEditorFlags & EAknEditorFlagLatinInputModesOnly) |
|
17535 { |
|
17536 // use of only latin characters implies that numbers are also western |
|
17537 ASCIIDigits = ETrue; |
|
17538 } |
|
17539 |
|
17540 AknTextUtils::TDigitModeQueryType editorType = AknTextUtils::EDigitModeEditorDefault; |
|
17541 TBool numberOnlyEditor = iPermittedInputModes == EAknEditorNumericInputMode; |
|
17542 if ( numberOnlyEditor ) |
|
17543 { |
|
17544 editorType = AknTextUtils::EDigitModeNumberEditor; |
|
17545 if (ASCIIDigits) |
|
17546 { |
|
17547 editorType = AknTextUtils::EDigitModeLatinNumberEditor; |
|
17548 } |
|
17549 } |
|
17550 |
|
17551 if (iLanguageCapabilities.iArabicIndicDigitsAllowed && |
|
17552 (AknTextUtils::DigitModeQuery(editorType) || iMode == ENativeNumber) && |
|
17553 !ASCIIDigits) |
|
17554 { |
|
17555 aDestination = EDigitTypeArabicIndic; |
|
17556 } |
|
17557 else if (iLanguageCapabilities.iEasternArabicIndicDigitsAllowed && |
|
17558 (AknTextUtils::DigitModeQuery(editorType) || iMode == ENativeNumber) && |
|
17559 !ASCIIDigits) |
|
17560 { |
|
17561 aDestination = EDigitTypeEasternArabicIndic; |
|
17562 } |
|
17563 /*Hindi*/ |
|
17564 else if ( iLanguageCapabilities.iIndicDigitsAllowed && |
|
17565 (AknTextUtils::DigitModeQuery(editorType) || iMode == ENativeNumber) && |
|
17566 !ASCIIDigits) |
|
17567 { |
|
17568 aDestination = EDigitTypeDevanagari; |
|
17569 } |
|
17570 else |
|
17571 { |
|
17572 aDestination = EDigitTypeWestern; |
|
17573 } |
|
17574 } |
|
17575 |
|
17576 |
|
17577 void CAknFepManager::UpdateNumericEditorDigitType() |
|
17578 { |
|
17579 if (iLanguageCapabilities.iNumericEditorDigitType == EDigitTypeUnknown) |
|
17580 { |
|
17581 CalculateEditorDigitType(iLanguageCapabilities.iNumericEditorDigitType); |
|
17582 } |
|
17583 } |
|
17584 |
|
17585 void CAknFepManager::UpdateLocalDigitMode() |
|
17586 { |
|
17587 TInt oldLocalDigitType = iLanguageCapabilities.iLocalDigitType; |
|
17588 CalculateEditorDigitType(iLanguageCapabilities.iLocalDigitType); |
|
17589 |
|
17590 if (oldLocalDigitType != iLanguageCapabilities.iLocalDigitType && |
|
17591 iCaseMan) // happens in destructor |
|
17592 { |
|
17593 UpdateIndicators(); |
|
17594 } |
|
17595 } |
|
17596 |
|
17597 /** |
|
17598 * This routine should be called if the flag is set that says that the last navigation was to an |
|
17599 * ambiguous point. |
|
17600 * The routine checks to see if the event passed is |
|
17601 * - Right or Left Arrow |
|
17602 * - Would be the event to "jump" across the ambiguity. That is |
|
17603 * - if at the "left" side of a LTR | RTL point, you need a Right arrow |
|
17604 * - if at the "right" side of a LTR | RTL point, you need a Left arrow. |
|
17605 * - if at the "left" side of a RTL | LTR point, you need a Right arrow |
|
17606 * - if at the "right" side of a RTL | LTR point, you need a Left arrow. |
|
17607 * |
|
17608 */ |
|
17609 // TKeyResponse CAknFepManager::AttemptCursorFlipAtAmbiguousPointL( const TKeyEvent& aKeyEvent, TEventCode aEventCode ) |
|
17610 TKeyResponse CAknFepManager::AttemptCursorFlipAtAmbiguousPointL( const TUint aCode ) |
|
17611 { |
|
17612 TKeyResponse response = EKeyWasNotConsumed; |
|
17613 |
|
17614 if ( IsFlagSet(EFlagAtDirectionallyAmbiguousPoint) // only perform if already at ambi-point? |
|
17615 && !IsFlagSet(EFlagInsideInlineEditingTransaction) ) // do not flip if inside inline edit |
|
17616 { |
|
17617 if ( aCode == EKeyRightArrow || aCode == EKeyLeftArrow ) |
|
17618 { |
|
17619 // Never use TextView() to get editor data, |
|
17620 // use FepAwareTextEditor() condition instead of TextView() |
|
17621 if ( iInputCapabilities.FepAwareTextEditor() && EditorState() |
|
17622 && AknFepDocumentNavigation() ) |
|
17623 { |
|
17624 TTmDocPosSpec docPos = DocPos(); |
|
17625 TTextDirectionalInfo status = LocalTextDirectionalStatus( docPos ); |
|
17626 |
|
17627 CTmTextLayout::TTmChunkDescription leftChunk; |
|
17628 CTmTextLayout::TTmChunkDescription rightChunk; |
|
17629 FindAdjacentChunks(docPos, leftChunk, rightChunk); |
|
17630 |
|
17631 if ( status.iBlockEnvironment == |
|
17632 TTextDirectionalInfo::EAtRightEndOfBlockFacingOppositeDirectionalBlock |
|
17633 && aCode == EKeyRightArrow ) |
|
17634 { |
|
17635 response = EKeyWasConsumed; |
|
17636 // Set cursor to new directionality ( opposite to current ) |
|
17637 SetCursorTypeForTextDirection( status.iDirectionalStatus == |
|
17638 TTextDirectionalInfo::ERightToLeft ); |
|
17639 // Must actually change the docpos! |
|
17640 AttachToRightChunk( docPos, rightChunk ); |
|
17641 SetCursorPositionL( docPos, ETrue ); // Drag any existing selection |
|
17642 } |
|
17643 else if ( status.iBlockEnvironment == |
|
17644 TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock |
|
17645 && aCode == EKeyLeftArrow ) |
|
17646 { |
|
17647 response = EKeyWasConsumed; |
|
17648 // Effectively this toggles the direction of the cursor |
|
17649 SetCursorTypeForTextDirection( status.iDirectionalStatus == |
|
17650 TTextDirectionalInfo::ERightToLeft ); |
|
17651 // Must actually change the docpos! |
|
17652 AttachToLeftChunk( docPos, leftChunk ); |
|
17653 SetCursorPositionL( docPos, ETrue ); // Drag any existing selection |
|
17654 } |
|
17655 } |
|
17656 } |
|
17657 } |
|
17658 return response; |
|
17659 } |
|
17660 |
|
17661 |
|
17662 TInt CAknFepManager::PostEventCheckCallback(TAny* aObj) |
|
17663 { |
|
17664 TRAP_IGNORE(static_cast<CAknFepManager*>(aObj)->DoCursorDirectionCheckL()); |
|
17665 return KErrNone; |
|
17666 } |
|
17667 |
|
17668 TBool CAknFepManager::BidiCursorRequired() const |
|
17669 { |
|
17670 return iDeviceSupportsRtlLanguage; |
|
17671 } |
|
17672 |
|
17673 void CAknFepManager::DoCursorDirectionCheckL() |
|
17674 { |
|
17675 iPostEventCheck->Cancel(); |
|
17676 if(BidiCursorRequired()) |
|
17677 { |
|
17678 AdjustCursorTypeForCurrentPosition(); |
|
17679 } |
|
17680 |
|
17681 if ( !BidiCursorRequired() |
|
17682 || (TAknFepUiIndicInputManager :: IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode)) )) |
|
17683 { |
|
17684 /*Hindi*/ |
|
17685 if( ( !WesternPredictive() ) && |
|
17686 ( TAknFepUiIndicInputManager::IsIndicLangauge( |
|
17687 TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) ) && |
|
17688 ( ( TAknFepUiIndicInputManager::IsCharVirama( |
|
17689 PreviousChar( ETrue ), TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) ) |
|
17690 #ifdef RD_MARATHI |
|
17691 || ( IsEyeLashRaPresentL() && |
|
17692 TAknFepUiIndicInputManager::IsCharVirama( |
|
17693 PreviousToPreviousChar( ETrue ), TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) ) |
|
17694 #endif |
|
17695 ) |
|
17696 && !( iInputCapabilities.SupportsSecretText() ) |
|
17697 ) |
|
17698 { |
|
17699 TTmDocPosSpec pos = DocPos(); |
|
17700 pos.iType = TTmDocPosSpec::ETrailing; |
|
17701 TTmPosInfo2 info; |
|
17702 TTmLineInfo lineInfo; |
|
17703 TBool findAvailable = EFalse; |
|
17704 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
17705 if (docNavi) |
|
17706 { |
|
17707 docNavi->FindDocPos(pos, info, lineInfo); |
|
17708 findAvailable = ETrue; |
|
17709 } |
|
17710 else |
|
17711 { |
|
17712 CTextLayout* textLayout = TextLayout(); |
|
17713 if ( textLayout ) |
|
17714 { |
|
17715 textLayout->TagmaTextLayout().FindDocPos(pos, info, lineInfo); |
|
17716 findAvailable = ETrue; |
|
17717 } |
|
17718 } |
|
17719 if (findAvailable) |
|
17720 { |
|
17721 TCursorSelection sel(info.iDocPos.iPos ,info.iDocPos.iPos ); |
|
17722 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel); |
|
17723 } |
|
17724 } |
|
17725 } |
|
17726 } |
|
17727 |
|
17728 void CAknFepManager::AdjustCursorTypeForCurrentPosition() |
|
17729 { |
|
17730 |
|
17731 // Never use TextView() to get editor data, |
|
17732 // use FepAwareTextEditor() condition instead of TextView() |
|
17733 if ( iInputCapabilities.FepAwareTextEditor() && EditorState() |
|
17734 && AknFepDocumentNavigation()) |
|
17735 AdjustCursorTypeForPosition( DocPos() ); |
|
17736 } |
|
17737 |
|
17738 void CAknFepManager::SchedulePostEventCheckL( TUint aCode ) |
|
17739 { |
|
17740 |
|
17741 TBool isToPostEvent = EFalse; |
|
17742 TBool isIndicLanguage = TAknFepUiIndicInputManager :: |
|
17743 IsIndicLangauge(TLanguage(iLanguageCapabilities.iInputLanguageCode)); |
|
17744 |
|
17745 if ( BidiCursorRequired() ) |
|
17746 { |
|
17747 switch ( aCode ) |
|
17748 { |
|
17749 // Navigation cases: |
|
17750 case EKeyDownArrow: |
|
17751 case EKeyUpArrow: |
|
17752 case EPtiKey1: |
|
17753 case EPtiKey2: |
|
17754 case EPtiKey3: |
|
17755 case EPtiKey4: |
|
17756 case EPtiKey5: |
|
17757 case EPtiKey6: |
|
17758 case EPtiKey7: |
|
17759 case EPtiKey8: |
|
17760 case EPtiKey9: |
|
17761 case EPtiKey0: |
|
17762 { |
|
17763 isToPostEvent = ETrue; |
|
17764 } |
|
17765 break; |
|
17766 case EKeyBackspace: |
|
17767 case EKeyDelete: |
|
17768 { |
|
17769 if(!isIndicLanguage) |
|
17770 { |
|
17771 isToPostEvent = ETrue; |
|
17772 } |
|
17773 } |
|
17774 break; |
|
17775 case EKeyLeftArrow: |
|
17776 case EKeyRightArrow: |
|
17777 { |
|
17778 if(!isIndicLanguage) |
|
17779 { |
|
17780 isToPostEvent = ETrue; |
|
17781 } |
|
17782 } |
|
17783 break; |
|
17784 default: |
|
17785 break; |
|
17786 } |
|
17787 |
|
17788 // If Repha has been inserted then do not post event. |
|
17789 if( isIndicLanguage ) |
|
17790 { |
|
17791 if( aCode == EPtiKey1 && ( !iQwertyInputMode ) ) |
|
17792 { |
|
17793 if( IsRephaPresent() |
|
17794 #ifdef RD_MARATHI |
|
17795 || IsEyeLashRaPresentL() |
|
17796 #endif |
|
17797 ) |
|
17798 { |
|
17799 isToPostEvent = EFalse; |
|
17800 } |
|
17801 } |
|
17802 } |
|
17803 } |
|
17804 |
|
17805 if(isIndicLanguage) // iQwertyInputMode check is added so as to ensure that the event is not posted for Qwerty mode. |
|
17806 { |
|
17807 if((aCode == EKeyBackspace || aCode == EKeyDelete) && (!iQwertyInputMode)) |
|
17808 { |
|
17809 isToPostEvent = ETrue; |
|
17810 } |
|
17811 } |
|
17812 |
|
17813 if(isToPostEvent) |
|
17814 { |
|
17815 if ( iPostEventCheck->IsActive() ) |
|
17816 iPostEventCheck->Cancel(); |
|
17817 iPostEventCheck->Start( TCallBack(PostEventCheckCallback, this) ); |
|
17818 } |
|
17819 } |
|
17820 |
|
17821 void CAknFepManager::AdjustCursorTypeForPosition( const TTmDocPosSpec& aDocPos ) |
|
17822 { |
|
17823 |
|
17824 TTextDirectionalInfo dirInfo = LocalTextDirectionalStatus( aDocPos ); |
|
17825 // default clearing of this flag |
|
17826 ClearFlag( EFlagAtDirectionallyAmbiguousPoint ); |
|
17827 |
|
17828 switch ( dirInfo.iBlockEnvironment ) |
|
17829 { |
|
17830 case TTextDirectionalInfo::EUndefined: |
|
17831 // Set according to input direction |
|
17832 SetCursorTypeForTextDirection( CurrentInputDirectionality() == |
|
17833 TBidiText::ELeftToRight ); |
|
17834 break; // do nothing |
|
17835 |
|
17836 // All unambiguous cases |
|
17837 case TTextDirectionalInfo::EInsideBlock: |
|
17838 case TTextDirectionalInfo::EAtRightEndOfLine: |
|
17839 case TTextDirectionalInfo::EAtLeftEndOfLine: |
|
17840 case TTextDirectionalInfo::EAtRightEndOfBlockFacingSameDirectionBlock: |
|
17841 case TTextDirectionalInfo::EAtLeftEndOfBlockFacingSameDirectionBlock: |
|
17842 SetCursorTypeForTextDirection( dirInfo.iDirectionalStatus == |
|
17843 TTextDirectionalInfo::ELeftToRight ); |
|
17844 break; |
|
17845 |
|
17846 // Ambiguous. Navigation has resulted in an ambiguous visual position. Set cursor according |
|
17847 // to current direction |
|
17848 case TTextDirectionalInfo::EAtRightEndOfBlockFacingOppositeDirectionalBlock: |
|
17849 case TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock: |
|
17850 SetCursorTypeForTextDirection( dirInfo.iDirectionalStatus == |
|
17851 TTextDirectionalInfo::ELeftToRight ); |
|
17852 SetFlag( EFlagAtDirectionallyAmbiguousPoint ); |
|
17853 break; |
|
17854 default: |
|
17855 // Do nothing |
|
17856 break; |
|
17857 } |
|
17858 } |
|
17859 |
|
17860 void CAknFepManager::SetCursorTypeForTextDirection( TBool aLeftToRight ) |
|
17861 { |
|
17862 SetCursorType( aLeftToRight ); |
|
17863 } |
|
17864 |
|
17865 void CAknFepManager::SetCursorTypeForInputDirection( TBool /*aLeftToRight*/ ) |
|
17866 { |
|
17867 // Do nothing |
|
17868 } |
|
17869 |
|
17870 CAknFepManager::TTextDirectionalInfo CAknFepManager:: |
|
17871 LocalTextDirectionalStatus( const TTmDocPosSpec& aDocPos ) const |
|
17872 { |
|
17873 TTextDirectionalInfo directionalInfo; |
|
17874 |
|
17875 MCoeFepAwareTextEditor* fepAwareTextEditor = iInputCapabilities.FepAwareTextEditor(); |
|
17876 if ( !fepAwareTextEditor ) |
|
17877 return directionalInfo; |
|
17878 |
|
17879 if ( aDocPos.iPos < 0 ) // somehow, we are before the first character |
|
17880 directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ENotInDocument; |
|
17881 else if ( aDocPos.iPos > fepAwareTextEditor->DocumentLengthForFep() ) // (iPos = docLen still is within document) |
|
17882 directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ENotInDocument; |
|
17883 else if ( fepAwareTextEditor->DocumentLengthForFep() == 0 ) // zero length; no document |
|
17884 directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ENotInDocument; |
|
17885 |
|
17886 if ( directionalInfo.iDirectionalStatus == TTextDirectionalInfo::EUnknown ) |
|
17887 { |
|
17888 CTmTextLayout::TTmChunkDescription leftChunk; |
|
17889 CTmTextLayout::TTmChunkDescription rightChunk; |
|
17890 FindAdjacentChunks(aDocPos, leftChunk, rightChunk); |
|
17891 |
|
17892 // Cases: |
|
17893 // position is within a chunk (chunks are continuous in logical index and same directionality. |
|
17894 // ->Return directionality |
|
17895 // position is betweeen two chunks of opposite directionality |
|
17896 // -> return simple ambiguity |
|
17897 // position is between two chnks of same directionality, but logical index is not contiguous |
|
17898 // -> return complex ambiguity ; return directionality |
|
17899 |
|
17900 if ( leftChunk.iStart == -1 && rightChunk.iStart == -1 ) // 2 chunks invalid; direction stays EUnkonwn |
|
17901 { |
|
17902 directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ENoDirectionalChunks; |
|
17903 } |
|
17904 else if ( leftChunk.iStart == -1 ) // no left block |
|
17905 { |
|
17906 directionalInfo.iBlockEnvironment = TTextDirectionalInfo::EAtLeftEndOfLine; |
|
17907 directionalInfo.SetDirectionFromChunk( rightChunk ); |
|
17908 } |
|
17909 else if ( rightChunk.iStart == -1 ) // no right block |
|
17910 { |
|
17911 directionalInfo.iBlockEnvironment = TTextDirectionalInfo::EAtRightEndOfLine; |
|
17912 directionalInfo.SetDirectionFromChunk( leftChunk ); |
|
17913 } |
|
17914 // Both chunks are the same direction. |
|
17915 // We are either nicely inside a block or the two blocks are at +/- 2, 4, etc levels |
|
17916 else if ( COMPARE_BOOLS( leftChunk.iRightToLeft, rightChunk.iRightToLeft ) ) |
|
17917 { |
|
17918 // Can set direction from either chunk; use left one |
|
17919 directionalInfo.SetDirectionFromChunk( leftChunk ); |
|
17920 |
|
17921 if (leftChunk.iRightToLeft ) |
|
17922 { |
|
17923 if ( leftChunk.iStart == rightChunk.iEnd ) // chunks are continguous |
|
17924 directionalInfo.iBlockEnvironment = TTextDirectionalInfo::EInsideBlock; |
|
17925 else // Chunks are separated by 2, 4 etc. levels |
|
17926 directionalInfo.iBlockEnvironment = ( aDocPos.iPos == leftChunk.iStart ) ? |
|
17927 TTextDirectionalInfo::EAtRightEndOfBlockFacingSameDirectionBlock : |
|
17928 TTextDirectionalInfo::EAtLeftEndOfBlockFacingSameDirectionBlock; |
|
17929 } |
|
17930 else |
|
17931 { |
|
17932 if ( leftChunk.iEnd == rightChunk.iStart ) // chunks are continguous |
|
17933 directionalInfo.iBlockEnvironment = TTextDirectionalInfo::EInsideBlock; |
|
17934 else // Chunks are separated by 2, 4 etc. levels |
|
17935 directionalInfo.iBlockEnvironment = ( aDocPos.iPos == leftChunk.iEnd ) ? |
|
17936 TTextDirectionalInfo::EAtRightEndOfBlockFacingSameDirectionBlock : |
|
17937 TTextDirectionalInfo::EAtLeftEndOfBlockFacingSameDirectionBlock; |
|
17938 } |
|
17939 } |
|
17940 else // Blocks are in opposite direction. Have to deal with all the values of the iType enum |
|
17941 { |
|
17942 TInt charPos; |
|
17943 switch( aDocPos.iType ) |
|
17944 { |
|
17945 case TTmDocPosSpec::ETrailing: // position follows a block End |
|
17946 { |
|
17947 charPos = aDocPos.iPos - 1; // attachment is to character[iPos-1] - now find it |
|
17948 if ( leftChunk.iStart <= charPos && charPos < leftChunk.iEnd ) // pos is in left chunk |
|
17949 { |
|
17950 directionalInfo.SetDirectionFromChunk( leftChunk ); |
|
17951 directionalInfo.iBlockEnvironment = |
|
17952 TTextDirectionalInfo::EAtRightEndOfBlockFacingOppositeDirectionalBlock; |
|
17953 } |
|
17954 else if( rightChunk.iStart <= charPos && charPos < rightChunk.iEnd ) // pos is in right chunk |
|
17955 { |
|
17956 directionalInfo.SetDirectionFromChunk( rightChunk ); |
|
17957 directionalInfo.iBlockEnvironment = |
|
17958 TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock; |
|
17959 } |
|
17960 else // Probably impossible situation. Supply reasonable defaults rather than panicking |
|
17961 { |
|
17962 directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ELeftToRight; |
|
17963 directionalInfo.iBlockEnvironment = |
|
17964 TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock; |
|
17965 } |
|
17966 break; |
|
17967 } |
|
17968 case TTmDocPosSpec::ELeading: // position precedes a block start |
|
17969 { |
|
17970 charPos = aDocPos.iPos; // attachment is to character[iPos] - now find it |
|
17971 if ( leftChunk.iStart <= charPos && charPos < leftChunk.iEnd ) // pos is in left chunk |
|
17972 { |
|
17973 directionalInfo.SetDirectionFromChunk( leftChunk ); |
|
17974 directionalInfo.iBlockEnvironment = |
|
17975 TTextDirectionalInfo::EAtRightEndOfBlockFacingOppositeDirectionalBlock; |
|
17976 } |
|
17977 else if( rightChunk.iStart <= charPos && charPos < rightChunk.iEnd ) // pos is in right chunk |
|
17978 { |
|
17979 directionalInfo.SetDirectionFromChunk( rightChunk ); |
|
17980 directionalInfo.iBlockEnvironment = |
|
17981 TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock; |
|
17982 } |
|
17983 else // Probably impossible situation. Supply reasonable defaults rather than panicking |
|
17984 { |
|
17985 directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ELeftToRight; |
|
17986 directionalInfo.iBlockEnvironment = |
|
17987 TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock; |
|
17988 } |
|
17989 break; |
|
17990 } |
|
17991 case TTmDocPosSpec::ELeftToRight: // Is attached to a Left to right block |
|
17992 { |
|
17993 directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ELeftToRight; |
|
17994 // If left chunk is RTL, then we are NOT attached to that left block |
|
17995 // (ie. we are at left end of the right block) |
|
17996 directionalInfo.iBlockEnvironment = leftChunk.iRightToLeft ? |
|
17997 TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock : // must be in right chunk then (left end of it) |
|
17998 TTextDirectionalInfo::EAtRightEndOfBlockFacingOppositeDirectionalBlock; // else in left chunk (right end of it) |
|
17999 break; |
|
18000 } |
|
18001 case TTmDocPosSpec::ERightToLeft: |
|
18002 { |
|
18003 directionalInfo.iDirectionalStatus = TTextDirectionalInfo::ERightToLeft; |
|
18004 // If left chunk if RTL, then we are attached to that left block (ie. at right end of it) |
|
18005 directionalInfo.iBlockEnvironment = leftChunk.iRightToLeft ? // is it in left chunk? |
|
18006 TTextDirectionalInfo::EAtRightEndOfBlockFacingOppositeDirectionalBlock : // right end of left chunk |
|
18007 TTextDirectionalInfo::EAtLeftEndOfBlockFacingOppositeDirectionalBlock; |
|
18008 break; |
|
18009 } |
|
18010 } |
|
18011 |
|
18012 } |
|
18013 } |
|
18014 return directionalInfo; |
|
18015 } |
|
18016 |
|
18017 |
|
18018 /** |
|
18019 * Redecoration is carried out if a neutral is exposed by the deletion to a directionality |
|
18020 * different to that which is was already marked. |
|
18021 * |
|
18022 * The routine leaves iUncommittedText again set to the (possibly new) cursor position. |
|
18023 * |
|
18024 */ |
|
18025 void CAknFepManager::RedecorateAfterDeletionL( const TDesC& aTextThatWasDeleted ) |
|
18026 { |
|
18027 if (!EditorSupportsNeutralProtection()) |
|
18028 return; |
|
18029 |
|
18030 if ( aTextThatWasDeleted.Length() == 0 ) |
|
18031 return; |
|
18032 |
|
18033 TBool protect = ETrue; |
|
18034 |
|
18035 // Set up iUncommittedText with the current cursor position so that PreviousChar will work: |
|
18036 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
18037 |
|
18038 TTmDocPosSpec docPos = DocPos(); |
|
18039 TInt docLen = iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
18040 |
|
18041 TInt previousPos = docPos.iPos; |
|
18042 // Trailing iType actually points to character at index iPos - 1 |
|
18043 if( docPos.iType == TTmDocPosSpec::ETrailing ) |
|
18044 previousPos = previousPos -= 1; |
|
18045 TInt nextPos = previousPos + 1; |
|
18046 |
|
18047 // Perform no neutral protection if the beginning of the text is deleted. |
|
18048 // Note that there MAY be protection occuring if the delete is from the end so there is |
|
18049 // no corresponding test on DocLength. That is handled later where the paragraph direction |
|
18050 // is used for the "forward" directionality. |
|
18051 if ( previousPos < 0 ) |
|
18052 return; |
|
18053 |
|
18054 // Up to 2 protection characters, one RTL and one LTR |
|
18055 TBuf<2> textToInsert; |
|
18056 |
|
18057 TBool adjacentPrecedingIsNeutral(EFalse); |
|
18058 TBool adjacentTrailingIsNeutral(EFalse); |
|
18059 |
|
18060 // See if either preceding or next is neutral |
|
18061 adjacentPrecedingIsNeutral = iInlineTextDecorator->CharacterIsNeutral( CharAt(previousPos) ); |
|
18062 if ( nextPos < docLen ) |
|
18063 adjacentTrailingIsNeutral = iInlineTextDecorator->CharacterIsNeutral( CharAt(nextPos) ); |
|
18064 |
|
18065 if ( !adjacentPrecedingIsNeutral && !adjacentTrailingIsNeutral ) |
|
18066 protect = EFalse; |
|
18067 |
|
18068 // Inits actually correspond to LTR, but they are only used if the bools indicating |
|
18069 // strong directionality found get set |
|
18070 TBool directionPrecedingDeleteIsRTL(EFalse); |
|
18071 TBool directionTrailingDeleteIsRTL(EFalse); |
|
18072 if ( protect ) |
|
18073 { |
|
18074 TBool strongPreceding = GetExposedDirectionOfText( previousPos, EFalse, |
|
18075 directionPrecedingDeleteIsRTL ); |
|
18076 TBool strongTrailing = GetExposedDirectionOfText( nextPos, ETrue, |
|
18077 directionTrailingDeleteIsRTL ); |
|
18078 if (!strongTrailing) |
|
18079 { |
|
18080 TBool isRTLPara = IsRightToLeftParagraph(docPos); |
|
18081 directionTrailingDeleteIsRTL = isRTLPara; |
|
18082 strongTrailing = ETrue; |
|
18083 } |
|
18084 if ( !strongPreceding || !strongTrailing) // Must have strong in both directions |
|
18085 protect = EFalse; |
|
18086 else if ( COMPARE_BOOLS( directionPrecedingDeleteIsRTL, directionTrailingDeleteIsRTL ) ) // Must differ |
|
18087 protect = EFalse; |
|
18088 } |
|
18089 |
|
18090 TBool forwardProtection(EFalse); |
|
18091 |
|
18092 if ( protect ) |
|
18093 { |
|
18094 protect = EFalse; |
|
18095 TBool deletedWasRTL; |
|
18096 |
|
18097 // Check for and do reverse protection |
|
18098 if ( adjacentPrecedingIsNeutral ) |
|
18099 { |
|
18100 TBool deletedTextIsStrong = GetExposedDirectionOfTextInDescriptor( aTextThatWasDeleted, |
|
18101 ETrue, |
|
18102 deletedWasRTL ); // search forward into deleted stuff |
|
18103 if ( deletedTextIsStrong && (directionPrecedingDeleteIsRTL == deletedWasRTL)) |
|
18104 { |
|
18105 protect = ETrue; |
|
18106 forwardProtection = EFalse; |
|
18107 if ( deletedWasRTL ) |
|
18108 textToInsert.Append( CAknFepInlineTextDecorator::ERightToLeftMark ); |
|
18109 else |
|
18110 textToInsert.Append( CAknFepInlineTextDecorator::ELeftToRightMark ); |
|
18111 } |
|
18112 } |
|
18113 |
|
18114 // Check for and do forward protection |
|
18115 // Note it is possible to have both forward and reverse redecoration. |
|
18116 if ( adjacentTrailingIsNeutral ) |
|
18117 { |
|
18118 TBool deletedTextIsStrong = GetExposedDirectionOfTextInDescriptor( aTextThatWasDeleted, |
|
18119 EFalse, |
|
18120 deletedWasRTL ); // search backward in deleted stuff |
|
18121 if (deletedTextIsStrong && (directionTrailingDeleteIsRTL == deletedWasRTL) ) |
|
18122 { |
|
18123 protect = ETrue; |
|
18124 forwardProtection = ETrue; |
|
18125 if ( deletedWasRTL ) |
|
18126 textToInsert.Append( CAknFepInlineTextDecorator::ERightToLeftMark ); |
|
18127 else |
|
18128 textToInsert.Append( CAknFepInlineTextDecorator::ELeftToRightMark ); |
|
18129 } |
|
18130 } |
|
18131 } |
|
18132 |
|
18133 |
|
18134 if ( protect ) |
|
18135 { |
|
18136 StartInlineEditL(textToInsert); |
|
18137 CommitInlineEditWithoutResolutionL(*(iInputCapabilities.FepAwareTextEditor()), ETrue); |
|
18138 // iUncommittedText is now set to correct value by the Commitxxxx method |
|
18139 // Document position is adjusted to as to keep the cursor stable. |
|
18140 // Make a docPos. If reverse protection, then the position should trail |
|
18141 TTmDocPosSpec docPos( iUncommittedText.LowerPos() , TTmDocPosSpec::ETrailing ); |
|
18142 // But if there has been forward Protection, then we have to back up the cursor by 1 |
|
18143 // and lead. (This is OK too, if there is simultaneous reversse and forward protection) |
|
18144 if ( forwardProtection ) |
|
18145 { |
|
18146 docPos.iPos = Max(docPos.iPos - 1, 0 ); |
|
18147 docPos.iType = TTmDocPosSpec::ELeading; |
|
18148 } |
|
18149 SetCursorPositionL( docPos ); |
|
18150 } |
|
18151 } |
|
18152 |
|
18153 TBool CAknFepManager::EditorSupportsNeutralProtection() |
|
18154 { |
|
18155 TBool ret = ETrue; |
|
18156 if ( !IsFepAwareTextEditor() ) |
|
18157 ret = EFalse; |
|
18158 |
|
18159 else if (iInputCapabilities.SupportsSecretText()) |
|
18160 ret = EFalse; |
|
18161 |
|
18162 else if ( iAknEditorFlags & EAknEditorFlagLatinInputModesOnly ) |
|
18163 ret = EFalse; |
|
18164 |
|
18165 else if (iPermittedInputModes == EAknEditorNumericInputMode) |
|
18166 ret = EFalse; |
|
18167 |
|
18168 else if ( !CharIsValidInEditor( CAknFepInlineTextDecorator::ERightToLeftMark ) ) |
|
18169 ret = EFalse; |
|
18170 |
|
18171 return ret; |
|
18172 } |
|
18173 |
|
18174 void CAknFepManager::CommitInlineEditWithoutResolutionL(MCoeFepAwareTextEditor& aFepAwareTextEditor, |
|
18175 TBool aCursorVisibility , TBool aClearPti ) |
|
18176 { |
|
18177 aFepAwareTextEditor.SetInlineEditingCursorVisibilityL(aCursorVisibility); |
|
18178 /* |
|
18179 On any call to CommitFepInlineEditL, the mode will change |
|
18180 even when a leave event occurs. |
|
18181 */ |
|
18182 ClearFlag(EFlagInsideInlineEditingTransaction | EFlagInsideMultitapInlineEditingTransaction); |
|
18183 ClearCcpuFlag(ECcpuStateNewPredictiveWord); |
|
18184 |
|
18185 if(aClearPti) |
|
18186 { |
|
18187 iPtiEngine->CommitCurrentWord(); |
|
18188 } |
|
18189 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
18190 aFepAwareTextEditor.CommitFepInlineEditL(*coeEnv); |
|
18191 aFepAwareTextEditor.GetCursorSelectionForFep(iUncommittedText); |
|
18192 // iMatchState=EWordMatchFirst; |
|
18193 iCaseMan->UpdateCase(ENullNaviEvent); |
|
18194 } |
|
18195 |
|
18196 void CAknFepManager::WordConcatenationTimerTimeoutL() |
|
18197 { |
|
18198 iConcatenationTimer->Cancel(); |
|
18199 |
|
18200 // add concatenated word to the UDB (a concatenated word is a compound word) |
|
18201 AddCompoundWordToUdbL(); |
|
18202 |
|
18203 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
18204 MoveCursorToEndOfWordL(); |
|
18205 #endif |
|
18206 } |
|
18207 |
|
18208 |
|
18209 TKeyResponse CAknFepManager::HandlePredictiveNaviEventOutsideInlineEditL(TUint aCode, |
|
18210 TKeyPressLength aLength) |
|
18211 { |
|
18212 TKeyResponse response = EKeyWasNotConsumed; |
|
18213 |
|
18214 TWesternNaviEvent naviEvent = ENullNaviEvent; |
|
18215 if (aCode == EKeyLeftArrow) |
|
18216 { |
|
18217 naviEvent = ELeftNaviEvent; |
|
18218 } |
|
18219 else if (aCode == EKeyRightArrow) |
|
18220 { |
|
18221 naviEvent = ERightNaviEvent; |
|
18222 } |
|
18223 else if (aCode == EKeyBackspace) |
|
18224 { |
|
18225 naviEvent = EBackspaceEvent; |
|
18226 } |
|
18227 |
|
18228 TInt nextCharPos = 0; // Character ordinal in logical memory (0 - n-1) |
|
18229 TBool nextPositionFound = EFalse; |
|
18230 if ( naviEvent == ERightNaviEvent ) |
|
18231 { |
|
18232 nextPositionFound = GetNextVisualRightCharacter( nextCharPos ); |
|
18233 } |
|
18234 else if ( naviEvent == ELeftNaviEvent ) |
|
18235 { |
|
18236 nextPositionFound = GetNextVisualLeftCharacter( nextCharPos ); |
|
18237 } |
|
18238 else if ( naviEvent == EBackspaceEvent ) |
|
18239 { |
|
18240 if (iLanguageCapabilities.iRightToLeftLanguage) |
|
18241 { |
|
18242 TChar character = PreviousChar(); |
|
18243 TChar::TBdCategory bdCategory = character.GetBdCategory(); |
|
18244 // In case last character in buffer is number or Latin characters, needs to delete |
|
18245 // character from left. |
|
18246 if (TChar::EEuropeanNumber == bdCategory || TChar::EArabicNumber == bdCategory || |
|
18247 TChar::ELeftToRight == bdCategory ) |
|
18248 { |
|
18249 nextPositionFound = GetNextVisualLeftCharacter( nextCharPos ); |
|
18250 } |
|
18251 else |
|
18252 { |
|
18253 nextPositionFound = GetNextVisualRightCharacter( nextCharPos ); |
|
18254 } |
|
18255 } |
|
18256 else |
|
18257 { |
|
18258 nextPositionFound = GetNextVisualLeftCharacter( nextCharPos ); |
|
18259 } |
|
18260 } |
|
18261 |
|
18262 if ( !nextPositionFound ) |
|
18263 { |
|
18264 response = EKeyWasNotConsumed; |
|
18265 } |
|
18266 else // not looping - lets see what to do |
|
18267 { |
|
18268 TBuf<ESingleCharacter> characterBuffer; |
|
18269 iInputCapabilities.FepAwareTextEditor()->GetEditorContentForFep(characterBuffer, |
|
18270 nextCharPos, |
|
18271 ESingleCharacter); |
|
18272 |
|
18273 if ( !IsValidInLineCharacter( STATIC_CAST(TChar, characterBuffer[0])) ) |
|
18274 { |
|
18275 // if the character is a non-alpha character; let it go |
|
18276 response=EKeyWasNotConsumed; |
|
18277 if (IsFlagSet(EFlagCompoundWord)) |
|
18278 { |
|
18279 if (STATIC_CAST(TChar, characterBuffer[0]).IsSpace()) |
|
18280 // we are navigating over a space so add any current compond word to the udb |
|
18281 AddCompoundWordToUdbL(); |
|
18282 ClearFlag(EFlagCompoundWord); |
|
18283 } |
|
18284 //allow to popup editsubmenu |
|
18285 ClearCcpuFlag(ECcpuStateIgnoreStarUp); |
|
18286 } |
|
18287 else |
|
18288 { |
|
18289 if (FepUI()->HandleKeyL(aCode, aLength)) |
|
18290 { |
|
18291 response=EKeyWasConsumed; |
|
18292 } |
|
18293 } |
|
18294 } |
|
18295 return response; |
|
18296 } |
|
18297 |
|
18298 /** |
|
18299 * Call back function: |
|
18300 */ |
|
18301 TInt CAknFepManager::DoSimulateKey(TAny* aThisPtr) |
|
18302 { |
|
18303 CAknFepManager* myobj = static_cast<CAknFepManager*>(aThisPtr); |
|
18304 TRAPD(error, myobj->HandleOwnedSimulateKeyL()); |
|
18305 return error; |
|
18306 } |
|
18307 |
|
18308 void CAknFepManager::HandleOwnedSimulateKeyL() |
|
18309 { |
|
18310 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
18311 #ifdef __HALF_QWERTY_KEYPAD |
|
18312 if( KeyboardLayout() == EPtiKeyboardHalfQwerty ) |
|
18313 { |
|
18314 CCoeEnv::Static()->SimulateKeyEventL( iHalfQwertyLastKeyEvent, EEventKey ); |
|
18315 } |
|
18316 else |
|
18317 #endif //__HALF_QWERTY_KEYPAD |
|
18318 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
18319 if (iSimulateKey > 0) |
|
18320 { |
|
18321 HandleKeyEventL(iSimulateKey, EShortKeyPress); |
|
18322 iSimulateKey = 0; |
|
18323 } |
|
18324 } |
|
18325 |
|
18326 /** |
|
18327 * This method is that the label of CBA is updated by aTextResId. |
|
18328 * @param aPosition CBA position, either ELeftSoftkeyIndex or ERightSoftkeyIndex |
|
18329 * @param aCommandId command id for softkey |
|
18330 * @param aTextResId resource id to set string on label. |
|
18331 * @return TBool The return value is ETrue in case it is necessary to update CBA. |
|
18332 */ |
|
18333 TBool CAknFepManager::UpdateCBALabelL(TInt aPosition, TInt aCommandId, TInt aTextResId) |
|
18334 { |
|
18335 return iUiInterface->UpdateSoftkeyLabelL(aPosition, aCommandId, aTextResId); |
|
18336 } |
|
18337 |
|
18338 void CAknFepManager::DoLaunchSctAndPctL(TInt aResourceId, TShowSctMode aShowSctMode) |
|
18339 { |
|
18340 TBool replace = EFalse; |
|
18341 TBool disableRecentItemRow = EFalse; |
|
18342 |
|
18343 if (ExtendedInputCapabilities() & CAknExtendedInputCapabilities::EDisableSCT) |
|
18344 { |
|
18345 // The editor doesn't allow SCT. |
|
18346 return; |
|
18347 } |
|
18348 if ( EditorType() == CAknExtendedInputCapabilities::EEikSecretEditorBased ) |
|
18349 { |
|
18350 |
|
18351 disableRecentItemRow = ETrue; |
|
18352 } |
|
18353 |
|
18354 if (IsCcpuFlagSet(ECcpuStateCbaSymbol) && |
|
18355 iMode == ELatin && WesternPredictive(ELatin) && |
|
18356 iPtiEngine->LastEnteredKey() == EPtiKey1) |
|
18357 { |
|
18358 // User is entering special character as result of pressing key '1' and |
|
18359 // cycling through candidates until left softkey turns into "Symbol". In |
|
18360 // that case we want to replace last cahracter instead of adding new one. |
|
18361 replace = ETrue; |
|
18362 } |
|
18363 |
|
18364 //Commit characters in latin multitap as some editors may call CancelFepTransaction() |
|
18365 //which will be received before the focus change notification. |
|
18366 if (IsFeatureSupportedJapanese()) |
|
18367 { |
|
18368 TryCloseUiL(); |
|
18369 } |
|
18370 else |
|
18371 { |
|
18372 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
18373 if(!(WesternPredictive())) |
|
18374 #endif |
|
18375 CommitInlineEditL(); |
|
18376 } |
|
18377 |
|
18378 if (!EditorHasFreeSpace()) |
|
18379 { |
|
18380 return; |
|
18381 } |
|
18382 |
|
18383 // get the SCT resource id from editor default settings |
|
18384 TInt currentEditorSCTResId = GetCurrentEditorSCTResId(); |
|
18385 TInt charMap = aResourceId; |
|
18386 if ( FeatureManager::FeatureSupported(KFeatureIdChinese) ) |
|
18387 { |
|
18388 if (charMap == R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG) |
|
18389 { |
|
18390 charMap = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_CHINESE; |
|
18391 } |
|
18392 } |
|
18393 else if ( FeatureManager::FeatureSupported(KFeatureIdKorean) ) |
|
18394 { |
|
18395 // Use the special sct resource file for Korean variant. |
|
18396 if (charMap == R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG) |
|
18397 { |
|
18398 charMap = R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG_KOREAN; |
|
18399 } |
|
18400 } |
|
18401 if (!charMap) |
|
18402 { |
|
18403 // override numeric keymap if necessary. flag is for non standard charmaps |
|
18404 TInt standardNumericCharMap = EDefaultNumericCharMapResId; |
|
18405 if ((iMode == ENumber || iMode == ENativeNumber) && |
|
18406 !(iAknEditorFlags & EAknEditorFlagUseSCTNumericCharmap) && |
|
18407 (iCharWidth == EHalfWidthChar) && |
|
18408 ( (iAknEditorNumericKeymap != EAknEditorAlphanumericNumberModeKeymap) || |
|
18409 (iPermittedInputModes == EAknEditorNumericInputMode) )) |
|
18410 { |
|
18411 standardNumericCharMap = NumericModeSCTResourceId(); |
|
18412 } |
|
18413 charMap = standardNumericCharMap; |
|
18414 } |
|
18415 |
|
18416 if ( charMap == ENoCharacters && !IsAbleToLaunchSCT()) |
|
18417 { |
|
18418 currentEditorSCTResId = charMap; |
|
18419 } |
|
18420 if(R_AKNFEP_SCT_NUMERIC_MODE_CHARS_PLAIN == charMap) |
|
18421 { |
|
18422 TBool isEmpty = ETrue; |
|
18423 TRAP_IGNORE(isEmpty = GetSctLengthL(charMap)); |
|
18424 if(isEmpty) |
|
18425 { |
|
18426 return; |
|
18427 } |
|
18428 } |
|
18429 |
|
18430 if (currentEditorSCTResId) |
|
18431 { |
|
18432 TBuf<32> specialChars; |
|
18433 |
|
18434 TInt sctChars = EAknSCTChiChineseInputModes; |
|
18435 TInt afterSctChars = EAknSCTHalfCase; |
|
18436 |
|
18437 if (iCharWidth == EFullWidthChar) |
|
18438 { |
|
18439 sctChars = EAknSCTFullCase; |
|
18440 if (iMode == ELatin) |
|
18441 { |
|
18442 afterSctChars = EAknSCTUpperCase; |
|
18443 if (iCaseMan->CurrentCase() == EAknEditorLowerCase) |
|
18444 { |
|
18445 afterSctChars = EAknSCTLowerCase; |
|
18446 } |
|
18447 } |
|
18448 else if (iMode == ENumber||iMode == ENativeNumber) |
|
18449 { |
|
18450 afterSctChars = EAknSCTLowerCase; |
|
18451 } |
|
18452 } |
|
18453 else |
|
18454 { |
|
18455 if (iMode == ELatin) |
|
18456 { |
|
18457 if ( FeatureManager::FeatureSupported(KFeatureIdChinese) ) |
|
18458 { |
|
18459 sctChars = EAknSCTChiLatinInputModes; |
|
18460 } |
|
18461 else |
|
18462 { |
|
18463 if (iQwertyInputMode) |
|
18464 { |
|
18465 sctChars = EAknSCTQwerty; |
|
18466 afterSctChars = EAknSCTFullCase; |
|
18467 } |
|
18468 else |
|
18469 { |
|
18470 sctChars = EAknSCTUpperCase; |
|
18471 afterSctChars = EAknSCTFullCase; |
|
18472 if (iCaseMan->CurrentCase() == EAknEditorLowerCase) |
|
18473 { |
|
18474 sctChars = EAknSCTLowerCase; |
|
18475 } |
|
18476 } |
|
18477 } |
|
18478 } |
|
18479 else if (iMode == ENumber||iMode == ENativeNumber) |
|
18480 { |
|
18481 sctChars = EAknSCTNumeric; |
|
18482 if ( ((iAknEditorFlags & EAknEditorFlagUseSCTNumericCharmap) || |
|
18483 (iAknEditorNumericKeymap == EAknEditorAlphanumericNumberModeKeymap)) && |
|
18484 !IsOnlyHalfWidthCharacterPermitted() ) |
|
18485 { |
|
18486 sctChars = EAknSCTLowerCase; |
|
18487 afterSctChars = EAknSCTFullCase; |
|
18488 } |
|
18489 } |
|
18490 else if (iMode == EHiraganaKanji) |
|
18491 { |
|
18492 sctChars = EAknSCTFullCase; |
|
18493 } |
|
18494 else if(iMode == EKatakana) |
|
18495 { |
|
18496 sctChars = EAknSCTHalfCase; |
|
18497 afterSctChars = EAknSCTFullCase; |
|
18498 } |
|
18499 } |
|
18500 |
|
18501 SetFlag(EFlagForegroundUIComponentVisible); |
|
18502 |
|
18503 TBool showAnotherTable = EFalse; |
|
18504 if (IsFeatureSupportedJapanese()) |
|
18505 { |
|
18506 if (sctChars == EAknSCTFullCase) |
|
18507 { |
|
18508 if (!IsOnlyFullWidthCharacterPermitted()) |
|
18509 { |
|
18510 showAnotherTable = ETrue; |
|
18511 } |
|
18512 } |
|
18513 else if (sctChars == EAknSCTHalfCase || sctChars == EAknSCTUpperCase |
|
18514 || sctChars == EAknSCTLowerCase) |
|
18515 { |
|
18516 if (!IsOnlyHalfWidthCharacterPermitted() |
|
18517 && !(iAknEditorFlags & EAknEditorFlagLatinInputModesOnly)) |
|
18518 { |
|
18519 showAnotherTable = ETrue; |
|
18520 } |
|
18521 } |
|
18522 } |
|
18523 #ifdef RD_SCALABLE_UI_V2 |
|
18524 if( iFepFullyConstructed && !iFepPluginManager->IsGlobleNotes()) |
|
18525 { |
|
18526 if (iFepPluginManager->PluginInputMode() == EPluginInputModeItut || |
|
18527 iFepPluginManager->PluginInputMode() == EPluginInputModeFSQ || |
|
18528 iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr || |
|
18529 iFepPluginManager->PluginInputMode() == EPluginInputModePortraitFSQ ) |
|
18530 |
|
18531 { |
|
18532 SetStopProcessFocus(ETrue, EFalse); |
|
18533 iFepPluginManager->SetMenuState(); |
|
18534 } |
|
18535 else if (!iFepPluginManager->IsGlobleNotes()) |
|
18536 { |
|
18537 iFepPluginManager->ClosePluginInputUiL( ETrue ); |
|
18538 } |
|
18539 } |
|
18540 #endif |
|
18541 |
|
18542 TBool lockNumericKeys = ( iPtiEngine->IsQwertyBasedMode(iPtiEngine->InputMode())) |
|
18543 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
18544 || ( iPtiEngine->InputMode() == EPtiEngineHalfQwerty ) || |
|
18545 ( iPtiEngine->InputMode() == EPtiEngineHalfQwertyPredictive ) |
|
18546 #endif |
|
18547 ; |
|
18548 TUid fepUid = CCoeEnv::Static()->FepUid(); |
|
18549 |
|
18550 if(IsAbleToLaunchSmiley()) |
|
18551 { |
|
18552 if(aShowSctMode == EShowSmileyFirst) |
|
18553 { |
|
18554 sctChars |= EAknCharMapEmotionFirst; |
|
18555 } |
|
18556 else |
|
18557 { |
|
18558 sctChars |= EAknCharMapEmotionUse; |
|
18559 } |
|
18560 } |
|
18561 ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
18562 |
|
18563 if ( iFepPluginManager && iFepPluginManager->IsSpellVisible() ) |
|
18564 { |
|
18565 iFepPluginManager->SetLaunchSCTInSpell( ETrue ); |
|
18566 } |
|
18567 SendEventsToPluginManL(EPluginEnablePriorityChangeOnOriChange,EFalse); |
|
18568 if (iUiInterface->CharMapDialogL( |
|
18569 sctChars, |
|
18570 specialChars, |
|
18571 charMap, |
|
18572 lockNumericKeys, |
|
18573 aShowSctMode==EShowPctFirst, |
|
18574 !IsAbleToLaunchPCT(), |
|
18575 showAnotherTable, |
|
18576 afterSctChars, |
|
18577 currentEditorSCTResId, |
|
18578 disableRecentItemRow)) |
|
18579 { |
|
18580 PrepareFepAfterDialogExitL(fepUid); |
|
18581 SetCcpuFlag(ECcpuStateSupressCursorMoveToEnd); |
|
18582 // after closing SCT, need change dim state. |
|
18583 SendEventsToPluginManL(EPluginEnableFetchDimState); |
|
18584 #ifdef RD_SCALABLE_UI_V2 |
|
18585 iNotifyPlugin = EFalse; |
|
18586 if( iFepFullyConstructed && iFepPluginManager) |
|
18587 { |
|
18588 if (iFepPluginManager->PluginInputMode() == EPluginInputModeItut || |
|
18589 iFepPluginManager->PluginInputMode() == EPluginInputModeFSQ || |
|
18590 iFepPluginManager->PluginInputMode() == EPluginInputModeFingerHwr || |
|
18591 iFepPluginManager->PluginInputMode() == EPluginInputModePortraitFSQ ) |
|
18592 { |
|
18593 SetStopProcessFocus(EFalse); |
|
18594 } |
|
18595 else |
|
18596 { |
|
18597 HandleChangeInFocus(); |
|
18598 } |
|
18599 } |
|
18600 else |
|
18601 { |
|
18602 HandleChangeInFocus(); |
|
18603 } |
|
18604 // Set the flag, not change focus for next. |
|
18605 iNotifyPlugin = ETrue; |
|
18606 #endif |
|
18607 |
|
18608 //Removes auto-complition part if SCT is launched and any special character is selected |
|
18609 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
18610 if( specialChars.Length() > 0 ) |
|
18611 { |
|
18612 RemoveSuggestedAdvanceCompletionL(); |
|
18613 } |
|
18614 #endif // RD_INTELLIGENT_TEXT_INPUT |
|
18615 TBuf<ESingleCharacter> charAsDesc(ESingleCharacter); |
|
18616 for ( TInt ii = 0; ii < specialChars.Length(); ii++) |
|
18617 { |
|
18618 charAsDesc[0]=(TText)specialChars[ii]; |
|
18619 |
|
18620 if (iInputCapabilities.SupportsSecretText()) |
|
18621 { |
|
18622 TChar ch = charAsDesc[0]; |
|
18623 if (ch == TText(0x000A) || ch == TText(CEditableText::EParagraphDelimiter)) |
|
18624 // 0x000A is ascii, EParagraphDelimiter is unicode - future |
|
18625 // proofs against sct changing to unicode |
|
18626 ch = EKeyEnter; |
|
18627 if (CharIsValidInEditor(ch)) |
|
18628 { |
|
18629 //we receive an extra key press if we simulate a key that is also a device key |
|
18630 if (ch.IsDigit() || TUint(ch) == EStarKeyUnicodeValue |
|
18631 || TUint(ch) == EHashKeyUnicodeValue) |
|
18632 SetFlag(EFlagPassNextKey); |
|
18633 SimulateKeyEventL(ch); |
|
18634 } |
|
18635 } |
|
18636 else |
|
18637 { |
|
18638 if (charAsDesc[0] == TText(0x000A)) // 0x000A is line feed |
|
18639 { |
|
18640 charAsDesc[0] = CEditableText::EParagraphDelimiter; |
|
18641 } |
|
18642 |
|
18643 if (CharIsValidInEditor(charAsDesc[0])) |
|
18644 { |
|
18645 TCursorSelection cursorSelection(0,0); |
|
18646 if ((iAknEditorFlags & EAknEditorFlagMTAutoOverwrite) && iMode == ELatin |
|
18647 && !WesternPredictive()) |
|
18648 { |
|
18649 TInt edSize = |
|
18650 iInputCapabilities.FepAwareTextEditor()->DocumentLengthForFep(); |
|
18651 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
18652 if (iUncommittedText.iCursorPos < edSize |
|
18653 && iUncommittedText.Length() == 0) |
|
18654 { |
|
18655 cursorSelection = TCursorSelection(iUncommittedText.iCursorPos + 1, |
|
18656 iUncommittedText.iAnchorPos); |
|
18657 } |
|
18658 } |
|
18659 if (EditorState()) |
|
18660 { |
|
18661 if (charAsDesc[0] == CEditableText::EParagraphDelimiter) |
|
18662 { |
|
18663 // This is line feed character. Post it to editor and let it decide |
|
18664 // if it is valid. |
|
18665 if (!(iAknEditorFlags & EAknEditorFlagFindPane) |
|
18666 && specialChars.Length() == 1) |
|
18667 { |
|
18668 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
18669 CommitInlineEditL(); |
|
18670 #endif |
|
18671 |
|
18672 SimulateKeyEventL(EKeyEnter); |
|
18673 SimulateKeyEventL(EKeyF19); // Asyncronous case update |
|
18674 } |
|
18675 } |
|
18676 else |
|
18677 { |
|
18678 if (replace) |
|
18679 { |
|
18680 TKeyEvent delKey = {8, EStdKeyBackspace, 1, 0}; |
|
18681 CCoeEnv::Static()->SimulateKeyEventL(delKey, EEventKey); |
|
18682 } |
|
18683 //There may be several char to be inserted, need disable Focus change to avoid multi-focus change. |
|
18684 #ifdef RD_SCALABLE_UI_V2 |
|
18685 #endif |
|
18686 InsertTextFromDialogL(charAsDesc, cursorSelection); |
|
18687 } |
|
18688 // Clear dead key, vowel sequence and vietnamese tone mark states. |
|
18689 iPtiEngine->HandleCommandL(EPtiCommandGetAndClearLastVietnameseChar, |
|
18690 NULL); |
|
18691 iPtiEngine->HandleCommandL(EPtiCommandClearVowelSeq, |
|
18692 NULL); |
|
18693 iPtiEngine->HandleCommandL(EPtiCommandGetAndClearDeadKeyRootChar, |
|
18694 NULL); |
|
18695 } |
|
18696 } |
|
18697 } |
|
18698 } |
|
18699 } |
|
18700 else |
|
18701 { |
|
18702 iClosePeninputUi = EFalse; |
|
18703 iStopProcessFocus = EFalse; |
|
18704 } |
|
18705 PrepareFepAfterDialogExitL(fepUid); |
|
18706 SendEventsToPluginManL(EPluginEnablePriorityChangeOnOriChange,ETrue); |
|
18707 } |
|
18708 } |
|
18709 |
|
18710 /** |
|
18711 * Queries supportting of SecretText |
|
18712 * |
|
18713 * @since 2.6 |
|
18714 * @return ETrue if SecretText was supported |
|
18715 */ |
|
18716 TBool CAknFepManager::IsSupportsSecretText() const |
|
18717 { |
|
18718 TBool bSecret = iInputCapabilities.SupportsSecretText(); |
|
18719 if( !bSecret ) |
|
18720 { |
|
18721 //test java editor |
|
18722 MObjectProvider* mop = iInputCapabilities.ObjectProvider(); |
|
18723 if ( mop ) |
|
18724 { |
|
18725 CAknExtendedInputCapabilities* extendedInputCapabilities; |
|
18726 extendedInputCapabilities = mop->MopGetObject( extendedInputCapabilities ); |
|
18727 if ( extendedInputCapabilities ) |
|
18728 { |
|
18729 TUint constraints = extendedInputCapabilities->MIDPConstrainst(); |
|
18730 if( constraints & 0x10000 ) |
|
18731 { |
|
18732 bSecret = ETrue; |
|
18733 } |
|
18734 } |
|
18735 } |
|
18736 } |
|
18737 |
|
18738 return bSecret; |
|
18739 } |
|
18740 |
|
18741 void CAknFepManager::SendEventsToPluginManL( TInt aEventType, TInt aEventData ) |
|
18742 { |
|
18743 #ifdef RD_SCALABLE_UI_V2 |
|
18744 if ( iFepFullyConstructed ) |
|
18745 { |
|
18746 iFepPluginManager->HandleEventsFromFepL( aEventType, aEventData ); |
|
18747 } |
|
18748 #endif //RD_SCALABLE_UI_V2 |
|
18749 } |
|
18750 |
|
18751 void CAknFepManager::UpdateCangJieState(TInt aNewMode) |
|
18752 { |
|
18753 CAknFepUIManagerChinese* fepUiMgr = STATIC_CAST(CAknFepUIManagerChinese*, |
|
18754 iLangMan->GetFepUI(ECangJie, ENoneWidthChar, EFalse)); |
|
18755 |
|
18756 if (aNewMode >= 0) |
|
18757 { |
|
18758 if ( fepUiMgr ) |
|
18759 { |
|
18760 fepUiMgr->UpdateCangJieState(); |
|
18761 } |
|
18762 |
|
18763 // Store CangJie settings into the sharedata |
|
18764 iSharedDataInterface->SetCangJieMode(aNewMode); |
|
18765 } |
|
18766 } |
|
18767 |
|
18768 TInt CAknFepManager::LaunchCangJieOptionDlgL() |
|
18769 { |
|
18770 // Get the CangJie level from the GS |
|
18771 TInt currentLevel = iSharedDataInterface->CangJieMode(); |
|
18772 |
|
18773 if ((currentLevel != ECangJieNormal) |
|
18774 && (currentLevel != ECangJieEasy) |
|
18775 && (currentLevel != ECangJieAdvanced)) |
|
18776 return KErrGeneral; |
|
18777 |
|
18778 // Launch the CangJie setting menu |
|
18779 CDesCArrayFlat* items = CCoeEnv::Static()->ReadDesC16ArrayResourceL(R_AVKON_CANGJIE_OPTIONS_LBX); |
|
18780 CleanupStack::PushL(items); |
|
18781 |
|
18782 TUid fepUid = CCoeEnv::Static()->FepUid(); |
|
18783 ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
18784 TInt ret = iUiInterface->LaunchCangJieOptionDlgL( |
|
18785 R_AVKON_CANGJIE_MODE_OPTIONS_SETTING_PAGE, |
|
18786 currentLevel, |
|
18787 items |
|
18788 ); |
|
18789 PrepareFepAfterDialogExitL(fepUid); |
|
18790 |
|
18791 CleanupStack::PopAndDestroy(items); |
|
18792 |
|
18793 return ret ? currentLevel : KErrGeneral; |
|
18794 } |
|
18795 |
|
18796 GLDEF_C void AknFepPanic(TAknFepPanic aPanic) |
|
18797 { |
|
18798 User::Panic(_L("AKNFEP"),aPanic); |
|
18799 } |
|
18800 |
|
18801 /** |
|
18802 * Set Multitap timer value. |
|
18803 * |
|
18804 * @since 3.0 |
|
18805 * @param Value of KAknFepMultiTapTimer setting |
|
18806 */ |
|
18807 void CAknFepManager::SetMultiTapTimer(const TInt aMultiTapTimer) |
|
18808 { |
|
18809 if (iMultiTapTimer != aMultiTapTimer) |
|
18810 { |
|
18811 iMultiTapTimer = aMultiTapTimer; |
|
18812 } |
|
18813 } |
|
18814 |
|
18815 /** |
|
18816 * Set Japanese Qwerty Flags value. |
|
18817 * |
|
18818 * @since 3.0 |
|
18819 * @param Value of KAknFepJapaneseSpecialCharFlag setting |
|
18820 */ |
|
18821 void CAknFepManager::SetJapaneseQwertyFlags(const TInt aJapaneseQwertyFlags) |
|
18822 { |
|
18823 if (iJapaneseQwertyFlags != aJapaneseQwertyFlags) |
|
18824 { |
|
18825 iJapaneseQwertyFlags = aJapaneseQwertyFlags; |
|
18826 } |
|
18827 } |
|
18828 |
|
18829 /** |
|
18830 * Handle the Chr Key Monitor |
|
18831 * for Japanese variant only. |
|
18832 * |
|
18833 * @since 3.0 |
|
18834 * @return KErrNone if succeed, KErrDied if failed |
|
18835 */ |
|
18836 TInt CAknFepManager::HandleChrKeyMonitorCallback(TAny* aObj) |
|
18837 { |
|
18838 TRAPD(err, static_cast<CAknFepManager*>(aObj)->HandleChrKeyMonitorL()); |
|
18839 if (err) |
|
18840 { |
|
18841 static_cast<CAknFepManager*>(aObj)->CleanUpFep(); |
|
18842 return KErrDied; |
|
18843 } |
|
18844 return KErrNone; |
|
18845 } |
|
18846 |
|
18847 /** |
|
18848 * Handle the Chr Key Monitor |
|
18849 * for Japanese variant only. |
|
18850 * |
|
18851 * @since 3.0 |
|
18852 */ |
|
18853 void CAknFepManager::HandleChrKeyMonitorL() |
|
18854 { |
|
18855 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
18856 #ifdef __HALF_QWERTY_KEYPAD |
|
18857 if ( IsFlagSet(EFlagQwertyChrKeyDepressed) && |
|
18858 IsFlagSet(EFlagNoActionDuringChrKeyPress) && |
|
18859 (EPtiKeyboardHalfQwerty == KeyboardLayout() ) && |
|
18860 ( iWesternPredictive || iMode == EPinyin || |
|
18861 iMode == EStroke || iMode == EZhuyin ) ) |
|
18862 { |
|
18863 // Clear the chr key depressed flag |
|
18864 TBool validchr = FepUI()->IsValidLongChrKeyPress(); |
|
18865 |
|
18866 if(!validchr || !IsAbleToLaunchSCT() ) |
|
18867 { |
|
18868 FepUI()->HandleKeyL( EStdKeyLeftFunc, EShortKeyPress ); |
|
18869 ClearFlag( EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress); |
|
18870 } |
|
18871 else |
|
18872 { |
|
18873 // will launch SCT later |
|
18874 iChrLongKeyPress = ETrue; |
|
18875 } |
|
18876 |
|
18877 } |
|
18878 else |
|
18879 #endif |
|
18880 #endif |
|
18881 if (IsFlagSet(EFlagQwertyChrKeyDepressed) && IsFlagSet(EFlagNoActionDuringChrKeyPress) |
|
18882 && iCurrentFepUI->IsValidShiftKeyPress()) |
|
18883 { |
|
18884 // Timer cancel |
|
18885 iChrKeypressMonitor->Cancel(); |
|
18886 // Commit characters |
|
18887 HandleChangeInFocus(); |
|
18888 // Clear flags |
|
18889 ClearFlag(EFlagQwertyChrKeyDepressed | EFlagNoActionDuringChrKeyPress); |
|
18890 // Open editting menu |
|
18891 LaunchSelectModeMenuL(); |
|
18892 } |
|
18893 } |
|
18894 |
|
18895 |
|
18896 // ----------------------------------------------------------------------------- |
|
18897 // CAknFepManager::SetCursorSelectionL |
|
18898 // Set editor cursor selection. |
|
18899 // (other items were commented in a header). |
|
18900 // ----------------------------------------------------------------------------- |
|
18901 // |
|
18902 void CAknFepManager::SetCursorSelectionL(const TCursorSelection& /*aCurSel*/, TBool /*aSyncCursor*/) |
|
18903 { |
|
18904 } |
|
18905 |
|
18906 TInt CAknFepManager::HandleResourceChangedCallback(TAny* aObj) |
|
18907 { |
|
18908 TRAPD(err, static_cast<CAknFepManager*>(aObj)->ResourceChangedTimeroutL()); |
|
18909 if (err) |
|
18910 { |
|
18911 static_cast<CAknFepManager*>(aObj)->CleanUpFep(); |
|
18912 return KErrNoMemory; |
|
18913 } |
|
18914 return KErrNone; |
|
18915 } |
|
18916 |
|
18917 void CAknFepManager::ResourceChangedTimeroutL() |
|
18918 { |
|
18919 if(iCurrentFepUI) |
|
18920 { |
|
18921 iCurrentFepUI->ResourceChanged(1); |
|
18922 } |
|
18923 } |
|
18924 |
|
18925 |
|
18926 // ----------------------------------------------------------------------------- |
|
18927 // pen related inplementation |
|
18928 // ----------------------------------------------------------------------------- |
|
18929 #ifdef RD_SCALABLE_UI_V2 |
|
18930 |
|
18931 // ----------------------------------------------------------------------------- |
|
18932 // CAknFepManager::HandleLayoutChange |
|
18933 // Update plugin UI case mode. |
|
18934 // (other items were commented in a header). |
|
18935 // ----------------------------------------------------------------------------- |
|
18936 // |
|
18937 void CAknFepManager::HandleResourceChange(TInt aType) |
|
18938 { |
|
18939 if(iCurrentFepUI) |
|
18940 { |
|
18941 iAsyncResouceChanged.CallBack(); |
|
18942 } |
|
18943 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
18944 |
|
18945 if(aType == KEikDynamicLayoutVariantSwitch) |
|
18946 { |
|
18947 if ( iAvkonAppUi->IsDisplayingDialog() && iMatchesListLaunched ) |
|
18948 { |
|
18949 iUiInterface->DeleteDialogs(); |
|
18950 } |
|
18951 |
|
18952 //When there is a change of layout, the inline text position changes and hence the candidate |
|
18953 //list position also needs to change accordingly. |
|
18954 //We need the editor to be brought back to focus, this is because we need the position of |
|
18955 //the inline text. |
|
18956 if( iCandidatePopup && iPtiEngine ) |
|
18957 { |
|
18958 iCandidatePopup->UnFocus(); |
|
18959 //Need to get the editor state back after it is brought back to focus. |
|
18960 TRAP_IGNORE( HandleChangeInFocusL()); |
|
18961 |
|
18962 // Add candidate list control stack to get the layout change event |
|
18963 // after dialog control...... |
|
18964 TRAP_IGNORE( iCandidatePopup->SetFocusAddStackReducePriorityL() ); |
|
18965 } |
|
18966 } |
|
18967 #endif |
|
18968 TRAP_IGNORE(SendEventsToPluginManL( EPluginResourceChanged, aType )); |
|
18969 } |
|
18970 void CAknFepManager::HandlePointerEventL(const TPointerEvent& aPointerEvent) |
|
18971 { |
|
18972 if (IsFlagSet(CAknFepManager::EFlagNoMatches)) |
|
18973 { |
|
18974 ClearFlag(CAknFepManager::EFlagNoMatches); |
|
18975 } |
|
18976 |
|
18977 if(aPointerEvent.iType == TPointerEvent::EDrag) |
|
18978 { |
|
18979 SetExtendedFlag(EExtendedFlagPointerEventTypeEDrag); |
|
18980 } |
|
18981 if (aPointerEvent.iType == TPointerEvent::EButton1Up) |
|
18982 { |
|
18983 ClearExtendedFlag(EExtendedFlagPointerEventTypeEDrag); |
|
18984 |
|
18985 // Remember last up-click in case it is needed for displaying |
|
18986 // stylus ccpu-menu. |
|
18987 iClickPoint = aPointerEvent.iPosition; |
|
18988 } |
|
18989 } |
|
18990 |
|
18991 // ----------------------------------------------------------------------------- |
|
18992 // CAknFepManager::HandleSelModeArrowKeyEventL |
|
18993 // Set text selection when tap on the arrow keys. |
|
18994 // (other items were commented in a header). |
|
18995 // ----------------------------------------------------------------------------- |
|
18996 // |
|
18997 TBool CAknFepManager::HandleSelModeArrowKeyEventL(const TKeyEvent& aKeyEvent, |
|
18998 TEventCode aEventCode, |
|
18999 TKeyResponse& aRetCode) |
|
19000 { |
|
19001 aRetCode = EKeyWasNotConsumed; |
|
19002 TBool used = EFalse; |
|
19003 |
|
19004 // only arrow keys are potentially handled |
|
19005 if ( ( aKeyEvent.iScanCode == EStdKeyLeftArrow |
|
19006 || aKeyEvent.iScanCode == EStdKeyRightArrow ) |
|
19007 && iInputCapabilities.FepAwareTextEditor() ) |
|
19008 { |
|
19009 TInt inputMode = PluginInputMode(); |
|
19010 TBool isArabicFingerHwr = ( inputMode == EPluginInputModeFingerHwr && |
|
19011 GetInputLanguageFromSharedDataInterface() == ELangArabic ); |
|
19012 TCursorSelection currentEditorSelection( 0, 0 ); |
|
19013 |
|
19014 iInputCapabilities.FepAwareTextEditor()-> |
|
19015 GetCursorSelectionForFep( currentEditorSelection ); |
|
19016 |
|
19017 if ( !IsMfneEditor() && ( inputMode == EPluginInputModeItut || |
|
19018 inputMode == EPluginInputModeFSQ || |
|
19019 inputMode == EPluginInputModePortraitFSQ || |
|
19020 isArabicFingerHwr ) |
|
19021 && currentEditorSelection.Length() != 0 ) |
|
19022 { |
|
19023 used = ETrue; |
|
19024 |
|
19025 if ( !( aKeyEvent.iModifiers & EModifierShift ) ) |
|
19026 { |
|
19027 TKeyEvent ccpuStart = aKeyEvent; |
|
19028 ccpuStart.iModifiers |= EModifierShift; |
|
19029 ccpuStart.iModifiers |= EModifierRightShift; |
|
19030 CCoeEnv::Static()->SimulateKeyEventL( ccpuStart, aEventCode ); |
|
19031 aRetCode = EKeyWasConsumed; |
|
19032 } |
|
19033 } |
|
19034 } |
|
19035 |
|
19036 return used; |
|
19037 } |
|
19038 |
|
19039 #else // !RD_SCALABLE_UI_V2 |
|
19040 // ----------------------------------------------------------------------------- |
|
19041 // CAknFepManager::HandleResourceChange |
|
19042 // Update plugin UI case mode. |
|
19043 // (other items were commented in a header). |
|
19044 // ----------------------------------------------------------------------------- |
|
19045 // |
|
19046 void CAknFepManager::HandleResourceChange(TInt aType) |
|
19047 { |
|
19048 if (iFepFullyConstructed && Japanese() ) |
|
19049 { |
|
19050 // Japaneseinput should handle the event of changing layout or screen. |
|
19051 FepUI()->ResourceChanged(aType); |
|
19052 } |
|
19053 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
19054 if(iCandidatePopup && iPtiEngine && (aType == KEikDynamicLayoutVariantSwitch)) |
|
19055 { |
|
19056 //When there is a change of layout, the inline text position changes and hence the candidate |
|
19057 //list position also needs to change accordingly. |
|
19058 //We need the editor to be brought back to focus, this is because we need the position of |
|
19059 //the inline text. |
|
19060 iCandidatePopup->UnFocus(); |
|
19061 //Need to get the editor state back after it is brought back to focus. |
|
19062 TRAP_IGNORE(HandleChangeInFocusL()); |
|
19063 //Can not do anything if FEP is not constructed fully |
|
19064 if(iFepFullyConstructed) |
|
19065 { |
|
19066 //Now we read the position of the inline text |
|
19067 TPoint inlineEditorTl; |
|
19068 TPoint inlineEditorBr; |
|
19069 TInt height; |
|
19070 TInt ascent; |
|
19071 TInt documentOffset = iPtiEngine->CurrentWord().Length(); |
|
19072 // Popup Position for RTL |
|
19073 if(iLanguageCapabilities.iRightToLeftLanguage) |
|
19074 documentOffset = 0; |
|
19075 // Popup Position for RTL |
|
19076 TRAP_IGNORE( GetScreenCoordinatesL( inlineEditorTl, height, ascent, documentOffset )); |
|
19077 inlineEditorTl.iY -= height; |
|
19078 TRAP_IGNORE( GetScreenCoordinatesL( inlineEditorBr, height, ascent )); |
|
19079 |
|
19080 //Let the candidate list know about a change of resource and update the |
|
19081 //inline text rectangle. |
|
19082 //Now show the candidate list at the re-calculated position |
|
19083 iCandidatePopup->ShowAtNewPosition(TRect(inlineEditorTl,inlineEditorBr)); |
|
19084 } |
|
19085 } |
|
19086 #endif |
|
19087 } |
|
19088 |
|
19089 #endif //RD_SCALABLE_UI_V2 |
|
19090 |
|
19091 TDigitType CAknFepManager::LocalDigit() |
|
19092 { |
|
19093 return iLanguageCapabilities.iLocalDigitType; |
|
19094 } |
|
19095 |
|
19096 /** |
|
19097 * Returns ETrue if arabic indic digit setting is on. |
|
19098 * |
|
19099 * @since 3.0 |
|
19100 */ |
|
19101 TBool CAknFepManager::ArabicIndicDigitsInUse() const |
|
19102 { |
|
19103 return (iLanguageCapabilities.iLocalDigitType == EDigitTypeArabicIndic); |
|
19104 } |
|
19105 |
|
19106 TBool CAknFepManager::EasternArabicIndicDigitsInUse() const |
|
19107 { |
|
19108 return (iLanguageCapabilities.iLocalDigitType == EDigitTypeEasternArabicIndic); |
|
19109 } |
|
19110 |
|
19111 /** |
|
19112 * Sets delayed commit on (predicitve word will be commited in |
|
19113 * next call to TryCloseUiL. This is needed because of Japanese ReadingTextL). |
|
19114 * |
|
19115 * @since 3.1 |
|
19116 */ |
|
19117 void CAknFepManager::SetDelayedCommit() |
|
19118 { |
|
19119 iCcpuMode |= ECcpuStataCommitPredictiveWord; |
|
19120 } |
|
19121 |
|
19122 // ----------------------------------------------------------------------------- |
|
19123 // CAknFepManager::SetDefaultNumberMode |
|
19124 // |
|
19125 // Set default number mode for non-latin languagues |
|
19126 // |
|
19127 // Copied from CGSLangModel::SetDefaultNumberMode |
|
19128 // ----------------------------------------------------------------------------- |
|
19129 // |
|
19130 void CAknFepManager::SetDefaultNumberMode( TInt aMode, TInt aNbrModeType ) |
|
19131 { |
|
19132 //As aMode comes from the UI, it can either be 0 or 1. This needs |
|
19133 //special handling for Indic mode as it has been defined as an enum |
|
19134 //constant and has a value of 2. This applies to any values defined |
|
19135 //in the enum and have a value > 1. |
|
19136 if ( aNbrModeType == ENbrModeTypeArabic || |
|
19137 aNbrModeType == ENbrModeTypeEasternArabic ) |
|
19138 { |
|
19139 iSharedDataInterface->SetDefaultNumberMode( KSettingsDefaultNumberMode, aMode ); |
|
19140 } |
|
19141 else |
|
19142 { |
|
19143 iSharedDataInterface->SetDefaultNumberMode( KSettingsIndicDefaultNumberMode, aMode ); |
|
19144 } |
|
19145 |
|
19146 TLocale locale; |
|
19147 if ( aMode == ENbrModeLatin ) |
|
19148 { |
|
19149 locale.SetDigitType( EDigitTypeWestern ); |
|
19150 } |
|
19151 else |
|
19152 { |
|
19153 //if aMode != EGSNbrModeLatin, then it should be either latin or arabic. However |
|
19154 //as EGSNbrModeArabic and EGsNbrModeIndic both have a value = 1, we can't use |
|
19155 //that constant for below comparison. Hence, need to depend on the 2nd param. |
|
19156 switch ( aNbrModeType ) |
|
19157 { |
|
19158 case ENbrModeTypeArabic: |
|
19159 locale.SetDigitType( EDigitTypeArabicIndic ); |
|
19160 break; |
|
19161 case ENbrModeTypeIndic: |
|
19162 locale.SetDigitType( EDigitTypeDevanagari ); |
|
19163 break; |
|
19164 case ENbrModeTypeEasternArabic: |
|
19165 locale.SetDigitType( EDigitTypeEasternArabicIndic ); |
|
19166 break; |
|
19167 default: |
|
19168 break; |
|
19169 } |
|
19170 } |
|
19171 |
|
19172 locale.Set(); |
|
19173 } |
|
19174 |
|
19175 // ----------------------------------------------------------------------------- |
|
19176 // CAknFepManager::ResolveCurrentCandidateListIndex |
|
19177 // |
|
19178 // Calculates correct selection index for matches popup list. |
|
19179 // ----------------------------------------------------------------------------- |
|
19180 // |
|
19181 TInt CAknFepManager::ResolveCurrentCandidateListIndex(CDesCArrayFlat* aCandList) |
|
19182 { |
|
19183 if (iPtiEngine && aCandList) |
|
19184 { |
|
19185 TBuf<EMaximumFepWordLength> currentCand; |
|
19186 |
|
19187 currentCand.Copy(iPtiEngine->CurrentWord()); |
|
19188 for (TInt i = 0; i < aCandList->Count(); i++) |
|
19189 { |
|
19190 if (currentCand == aCandList->MdcaPoint(i)) |
|
19191 { |
|
19192 if (i == aCandList->Count() - 1) |
|
19193 { |
|
19194 return 0; |
|
19195 } |
|
19196 return i + 1; |
|
19197 } |
|
19198 } |
|
19199 } |
|
19200 |
|
19201 return 0; |
|
19202 } |
|
19203 |
|
19204 void CAknFepManager::AlignLogicalAndVisualCursorL( TTmDocPosSpec::TType aType, |
|
19205 TBool aToLeft ) |
|
19206 { |
|
19207 if( !( iInputCapabilities.SupportsSecretText() ) ) |
|
19208 { |
|
19209 if( IsFlagSet( EFlagInsideInlineEditingTransaction ) && |
|
19210 IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ) ) |
|
19211 { |
|
19212 CommitInlineEditL(); |
|
19213 } |
|
19214 |
|
19215 MCoeFepAwareTextEditor* fepAwareTextEditor = |
|
19216 iInputCapabilities.FepAwareTextEditor(); |
|
19217 |
|
19218 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
19219 if( (docNavi || TextLayout()) && fepAwareTextEditor ) |
|
19220 { |
|
19221 TTmDocPosSpec pos = DocPos(); |
|
19222 pos.iType = aType; |
|
19223 TTmPosInfo2 info; |
|
19224 if (docNavi) |
|
19225 { |
|
19226 docNavi->GetNextVisualCursorPos( pos, info, aToLeft ); |
|
19227 } |
|
19228 else |
|
19229 { |
|
19230 TextLayout()->TagmaTextLayout().GetNextVisualCursorPos( pos, info, aToLeft ); |
|
19231 } |
|
19232 TCursorSelection curSel( info.iDocPos.iPos, info.iDocPos.iPos ); |
|
19233 fepAwareTextEditor->SetCursorSelectionForFepL( curSel ); |
|
19234 } |
|
19235 } |
|
19236 } |
|
19237 |
|
19238 void CAknFepManager::RemoveRephaCharacterL() |
|
19239 { |
|
19240 MCoeFepAwareTextEditor* fepAwareTextEditor = |
|
19241 iInputCapabilities.FepAwareTextEditor(); |
|
19242 |
|
19243 if( fepAwareTextEditor ) |
|
19244 { |
|
19245 TInt previousCharPos = 0; |
|
19246 TBool leftFlag = GetNextVisualLeftCharacter( previousCharPos ); |
|
19247 |
|
19248 if( !leftFlag ) |
|
19249 { |
|
19250 return; |
|
19251 } |
|
19252 |
|
19253 TCursorSelection curSel; |
|
19254 fepAwareTextEditor->GetCursorSelectionForFep( curSel ); |
|
19255 |
|
19256 TInt lowerPos = curSel.LowerPos(); |
|
19257 if( lowerPos > 1 ) |
|
19258 { |
|
19259 const TInt rephaLength( 2 ); |
|
19260 TBuf<rephaLength> previousCharacter; |
|
19261 previousCharacter.FillZ(); |
|
19262 |
|
19263 fepAwareTextEditor-> |
|
19264 GetEditorContentForFep( previousCharacter, |
|
19265 previousCharPos, rephaLength ); |
|
19266 |
|
19267 if (rephaLength == previousCharacter.Length()) |
|
19268 { |
|
19269 if( previousCharacter[0] == TAknFepUiIndicInputManager::RaCharacter( |
|
19270 TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) && |
|
19271 previousCharacter[1] == TAknFepUiIndicInputManager::Virama( |
|
19272 TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) ) |
|
19273 { |
|
19274 curSel.iAnchorPos = previousCharPos; |
|
19275 curSel.iCursorPos = previousCharPos + rephaLength; |
|
19276 |
|
19277 // Remove the repha |
|
19278 |
|
19279 if( IsFlagSet( EFlagInsideInlineEditingTransaction ) && |
|
19280 IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ) ) |
|
19281 { |
|
19282 CommitInlineEditL(); |
|
19283 } |
|
19284 StartInlineEditL( curSel, previousCharacter, rephaLength, ETrue ); |
|
19285 UpdateInlineEditL( KNullDesC, 0 ); |
|
19286 CommitInlineEditL(); |
|
19287 |
|
19288 // Go to the visual right position of current ligature as the |
|
19289 // repha has been deleted. |
|
19290 AlignLogicalAndVisualCursorL( TTmDocPosSpec::ELeading, EFalse ); |
|
19291 } |
|
19292 } |
|
19293 } |
|
19294 } |
|
19295 } |
|
19296 |
|
19297 TBool CAknFepManager::IsRephaPresent() |
|
19298 { |
|
19299 TBool result = EFalse; |
|
19300 |
|
19301 MCoeFepAwareTextEditor* fepAwareTextEditor = |
|
19302 iInputCapabilities.FepAwareTextEditor(); |
|
19303 |
|
19304 if( fepAwareTextEditor ) |
|
19305 { |
|
19306 TCursorSelection curSel; |
|
19307 |
|
19308 fepAwareTextEditor->GetCursorSelectionForFep( curSel ); |
|
19309 |
|
19310 TInt previousCharPos = 0; |
|
19311 TBool leftFlag = GetNextVisualLeftCharacter( previousCharPos ); |
|
19312 |
|
19313 if( !leftFlag ) |
|
19314 { |
|
19315 return result; |
|
19316 } |
|
19317 |
|
19318 TInt lowerPos = curSel.LowerPos(); |
|
19319 if( lowerPos > 1 ) |
|
19320 { |
|
19321 const TInt rephaLength( 2 ); |
|
19322 TBuf<rephaLength> previousCharacter; |
|
19323 previousCharacter.FillZ(); |
|
19324 |
|
19325 fepAwareTextEditor-> |
|
19326 GetEditorContentForFep( previousCharacter, |
|
19327 previousCharPos, rephaLength ); |
|
19328 |
|
19329 // Verify whether the length of the string is equal to the length |
|
19330 // of repha before doing further checks. |
|
19331 if( previousCharacter.Length() == rephaLength ) |
|
19332 { |
|
19333 if( previousCharacter[0] == TAknFepUiIndicInputManager::RaCharacter( |
|
19334 TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) && |
|
19335 previousCharacter[1] == TAknFepUiIndicInputManager::Virama( |
|
19336 TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) ) |
|
19337 { |
|
19338 result = ETrue; |
|
19339 } |
|
19340 } |
|
19341 } |
|
19342 } |
|
19343 |
|
19344 return result; |
|
19345 } |
|
19346 |
|
19347 TText CAknFepManager::PreviousToPreviousChar( TBool aContextSensitive ) |
|
19348 { |
|
19349 TBuf<ESingleCharacter> prevToPrevChar( ESingleCharacter ); |
|
19350 prevToPrevChar.FillZ(); |
|
19351 |
|
19352 if( !aContextSensitive ) |
|
19353 { |
|
19354 TTmDocPosSpec pos = DocPos(); |
|
19355 |
|
19356 // Pos=0 means it is before the first character and there is no previous character |
|
19357 if (pos.iPos > 0 ) |
|
19358 { |
|
19359 if( iInputCapabilities.FepAwareTextEditor() ) |
|
19360 { |
|
19361 iInputCapabilities.FepAwareTextEditor()-> |
|
19362 GetEditorContentForFep( prevToPrevChar, pos.iPos - 1, ESingleCharacter ); |
|
19363 } |
|
19364 } |
|
19365 } |
|
19366 else |
|
19367 { |
|
19368 TCursorSelection curSel; |
|
19369 |
|
19370 MCoeFepAwareTextEditor* fepAwareTextEditor = |
|
19371 iInputCapabilities.FepAwareTextEditor(); |
|
19372 |
|
19373 if( fepAwareTextEditor ) |
|
19374 { |
|
19375 fepAwareTextEditor->GetCursorSelectionForFep( curSel ); |
|
19376 TInt lowerpos = curSel.LowerPos(); |
|
19377 |
|
19378 if( lowerpos > 1 ) |
|
19379 { |
|
19380 fepAwareTextEditor-> |
|
19381 GetEditorContentForFep( prevToPrevChar, lowerpos - 2, ESingleCharacter ); |
|
19382 } |
|
19383 } |
|
19384 } |
|
19385 if (prevToPrevChar.Length()) |
|
19386 return prevToPrevChar[0]; |
|
19387 else |
|
19388 return NULL; |
|
19389 } |
|
19390 |
|
19391 void CAknFepManager::RemoveRakarCharacterL() |
|
19392 { |
|
19393 MCoeFepAwareTextEditor* fepAwareTextEditor = |
|
19394 iInputCapabilities.FepAwareTextEditor(); |
|
19395 |
|
19396 if( fepAwareTextEditor ) |
|
19397 { |
|
19398 TCursorSelection curSel; |
|
19399 |
|
19400 fepAwareTextEditor->GetCursorSelectionForFep( curSel ); |
|
19401 |
|
19402 TInt lowerpos = curSel.LowerPos(); |
|
19403 |
|
19404 if( lowerpos > 1 ) |
|
19405 { |
|
19406 const TInt rakarLength( 2 ); |
|
19407 TBuf<rakarLength> buffer; |
|
19408 buffer.FillZ(); |
|
19409 |
|
19410 fepAwareTextEditor-> |
|
19411 GetEditorContentForFep( buffer, lowerpos - rakarLength, rakarLength ); |
|
19412 |
|
19413 if (rakarLength == buffer.Length()) |
|
19414 { |
|
19415 if( buffer[0] == TAknFepUiIndicInputManager::Virama( |
|
19416 TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) && |
|
19417 buffer[1] == TAknFepUiIndicInputManager::RaCharacter( |
|
19418 TLanguage( iLanguageCapabilities.iInputLanguageCode ) ) ) |
|
19419 { |
|
19420 curSel.iAnchorPos = lowerpos - rakarLength; |
|
19421 curSel.iCursorPos = lowerpos; |
|
19422 |
|
19423 // Remove the repha |
|
19424 |
|
19425 if( IsFlagSet( EFlagInsideInlineEditingTransaction ) && |
|
19426 IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ) ) |
|
19427 { |
|
19428 CommitInlineEditL(); |
|
19429 } |
|
19430 StartInlineEditL( curSel, buffer, rakarLength, ETrue ); |
|
19431 UpdateInlineEditL( KNullDesC, 0 ); |
|
19432 CommitInlineEditL(); |
|
19433 } |
|
19434 } |
|
19435 } |
|
19436 } |
|
19437 } |
|
19438 |
|
19439 /** |
|
19440 * Returns the status of predictive input. |
|
19441 * |
|
19442 * @since 3.2 |
|
19443 * @return ETrue is available predictive input. |
|
19444 */ |
|
19445 TBool CAknFepManager::IsAbleToChangePrediction() const |
|
19446 { |
|
19447 TBool ret = EFalse; |
|
19448 if (!(iAknEditorFlags & EAknEditorFlagNoT9)) |
|
19449 { |
|
19450 if (iMode == EHiraganaKanji) |
|
19451 { |
|
19452 if (HasJapanesePredictionInputMode()) |
|
19453 { |
|
19454 ret = ETrue; |
|
19455 } |
|
19456 } |
|
19457 else |
|
19458 { |
|
19459 ret = ETrue; |
|
19460 } |
|
19461 } |
|
19462 return ret; |
|
19463 } |
|
19464 |
|
19465 TLanguage CAknFepManager :: GetInputLanguageFromSharedDataInterface() |
|
19466 { |
|
19467 return ((TLanguage)(iSharedDataInterface->InputTextLanguage())); |
|
19468 } |
|
19469 |
|
19470 |
|
19471 void CAknFepManager::DeactivatePredicitveWordAndMoveCursorL() |
|
19472 { |
|
19473 if (WesternPredictive()) |
|
19474 { |
|
19475 TWesternNaviEvent naviEvent = ERightNaviEvent; |
|
19476 |
|
19477 if (iLanguageCapabilities.iRightToLeftLanguage) |
|
19478 { |
|
19479 naviEvent = ELeftNaviEvent; |
|
19480 } |
|
19481 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
19482 // This function is called at time of Cut/Copy command |
|
19483 // TryCloseUiL will remove the auto completion part |
|
19484 // To adjust the visual cursor position commit the text with |
|
19485 // auto completion part. |
|
19486 if( IsAutoCompleteOn()) |
|
19487 { |
|
19488 TInt tailLength = 0; |
|
19489 iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength ); |
|
19490 |
|
19491 if( tailLength > 0) |
|
19492 { |
|
19493 // Sync the key sequence and editor text. |
|
19494 iPtiEngine->HandleCommandL( EPtiCommandLockCurrentCandidate ); |
|
19495 } |
|
19496 } |
|
19497 #endif |
|
19498 |
|
19499 // Find the visual left/right end of the current word |
|
19500 TTmDocPosSpec pos; |
|
19501 GetAvkonDefinedVisualLimitsOfSelection( |
|
19502 iUncommittedText, naviEvent, pos, NULL ); |
|
19503 |
|
19504 TryCloseUiL(); |
|
19505 |
|
19506 // Position should be dis-ambiguated based on last navigation and direction of blocks. |
|
19507 AdjustPosSpecForAmbiguityAfterLeftOrRightNavigation( pos, naviEvent ); |
|
19508 |
|
19509 SetCursorPositionL( pos ); |
|
19510 |
|
19511 iCaseMan->UpdateCase(ENullNaviEvent); |
|
19512 } |
|
19513 } |
|
19514 |
|
19515 |
|
19516 // ----------------------------------------------------------------------------- |
|
19517 // CAknFepManager::EditorCcpuStatus |
|
19518 // |
|
19519 // Returns the Ccpu status of given editor state as a flag combination. |
|
19520 // ----------------------------------------------------------------------------- |
|
19521 // |
|
19522 TInt CAknFepManager::EditorCcpuStatus(CAknEdwinState* aEdwinState) |
|
19523 { |
|
19524 TInt ret = 0; |
|
19525 |
|
19526 if (aEdwinState && aEdwinState->CcpuState()) |
|
19527 { |
|
19528 if (aEdwinState->CcpuState()->CcpuCanCopy()) |
|
19529 { |
|
19530 ret |= ECcpuStatusFlagCanCopy; |
|
19531 } |
|
19532 if (aEdwinState->CcpuState()->CcpuCanCut()) |
|
19533 { |
|
19534 ret |= ECcpuStatusFlagCanCut; |
|
19535 } |
|
19536 if (aEdwinState->CcpuState()->CcpuCanPaste()) |
|
19537 { |
|
19538 ret |= ECcpuStatusFlagCanPaste; |
|
19539 } |
|
19540 } |
|
19541 return ret; |
|
19542 } |
|
19543 |
|
19544 void CAknFepManager::NewLigatureL( const TDesC& aText ) |
|
19545 { |
|
19546 if( !iInputCapabilities.SupportsSecretText() && |
|
19547 ( EditorHasFreeSpace() || |
|
19548 IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ) ) ) |
|
19549 { |
|
19550 if ( iFepManState == EAknFepStateInitial ) //multitapping |
|
19551 { |
|
19552 if ( !IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ) ) |
|
19553 { |
|
19554 ClearFlag( EFlagLineFeedCharacter ); |
|
19555 StartInlineEditL( aText ); |
|
19556 SetFlag( EFlagInsideMultitapInlineEditingTransaction ); |
|
19557 SetFlag( EFlagInsideInlineEditingTransaction ); |
|
19558 } |
|
19559 } |
|
19560 } |
|
19561 } |
|
19562 |
|
19563 |
|
19564 |
|
19565 // ----------------------------------------------------------------------------- |
|
19566 // CAknFepManager::CancelCcpuMode |
|
19567 // |
|
19568 // Cancels the copy / cut mode initiated from editing options -submenu. |
|
19569 // ----------------------------------------------------------------------------- |
|
19570 // |
|
19571 void CAknFepManager::CancelCcpuMode() |
|
19572 { |
|
19573 iIndicator->SetCopyMode(EFalse); |
|
19574 if (IsCcpuFlagSet(ECcpuStateStartCopy | ECcpuStateCopy | ECcpuStateStartCut | ECcpuStateCut)) |
|
19575 { |
|
19576 iUiInterface->DeleteSoftkeys(); |
|
19577 } |
|
19578 |
|
19579 ResetCcpuFlags(); |
|
19580 } |
|
19581 |
|
19582 // ----------------------------------------------------------------------------- |
|
19583 // CAknFepManager::CancelShiftKeyTimer |
|
19584 // |
|
19585 // Cancels shift key timer. |
|
19586 // ----------------------------------------------------------------------------- |
|
19587 // |
|
19588 void CAknFepManager::CancelShiftKeyTimer() |
|
19589 { |
|
19590 ClearFlag(EFlagShiftKeyDepressed); |
|
19591 if (iShiftKeypressMonitor) |
|
19592 { |
|
19593 iShiftKeypressMonitor->Cancel(); |
|
19594 } |
|
19595 } |
|
19596 |
|
19597 void CAknFepManager::RemoveTextFromEditorL( TInt aNumOfCharacters, |
|
19598 TInt aPos /*= 0*/, |
|
19599 TBool aIsToAlignCursor /* = ETrue */) |
|
19600 { |
|
19601 if( IsFlagSet( EFlagInsideInlineEditingTransaction ) && |
|
19602 IsFlagSet( EFlagInsideMultitapInlineEditingTransaction ) ) |
|
19603 { |
|
19604 // Update the inline buffer with NULL descriptor. |
|
19605 // Inline buffer can be only at position 0, i.e. |
|
19606 // where the cursor stands. |
|
19607 if( aNumOfCharacters == UncommittedText().Length() |
|
19608 && aPos == 0 ) |
|
19609 { |
|
19610 UpdateInlineEditL( KNullDesC, 0 ); |
|
19611 } |
|
19612 CommitInlineEditL(); |
|
19613 } |
|
19614 else |
|
19615 { |
|
19616 MCoeFepAwareTextEditor* fepAwareTextEditor = |
|
19617 iInputCapabilities.FepAwareTextEditor(); |
|
19618 |
|
19619 if( fepAwareTextEditor && aPos >= 0 ) |
|
19620 { |
|
19621 // Get the previous cursor position. |
|
19622 TCursorSelection cursorSelPrevious; |
|
19623 fepAwareTextEditor->GetCursorSelectionForFep( cursorSelPrevious ); |
|
19624 |
|
19625 // Place the cursor at the desired position. |
|
19626 TCursorSelection sel( cursorSelPrevious.iCursorPos - aPos, |
|
19627 cursorSelPrevious.iCursorPos - aPos ); |
|
19628 fepAwareTextEditor->SetCursorSelectionForFepL( sel ); |
|
19629 |
|
19630 // Set cursor span on previous N characters |
|
19631 if ( sel.iAnchorPos >= aNumOfCharacters ) |
|
19632 { |
|
19633 sel.iAnchorPos -= aNumOfCharacters; |
|
19634 |
|
19635 // get text to clear |
|
19636 TBuf<EMaximumFepWordLength> bufToClear; |
|
19637 fepAwareTextEditor->GetEditorContentForFep( bufToClear, sel.iAnchorPos, |
|
19638 aNumOfCharacters ); |
|
19639 |
|
19640 // delete the character with an inline edit |
|
19641 StartInlineEditL( sel, bufToClear, aNumOfCharacters, EFalse ); |
|
19642 UpdateInlineEditL( KNullDesC, 0 ); |
|
19643 CommitInlineEditL(); |
|
19644 |
|
19645 if( aIsToAlignCursor ) |
|
19646 { |
|
19647 // Move the cursor to the original position considering the |
|
19648 // aNumOfCharacters |
|
19649 cursorSelPrevious.iCursorPos -= aNumOfCharacters; |
|
19650 cursorSelPrevious.iAnchorPos = cursorSelPrevious.iCursorPos; |
|
19651 fepAwareTextEditor->SetCursorSelectionForFepL( cursorSelPrevious ); |
|
19652 } |
|
19653 } |
|
19654 } |
|
19655 } |
|
19656 } |
|
19657 |
|
19658 #ifdef RD_MARATHI |
|
19659 |
|
19660 TBool CAknFepManager::IsChandraAPresentL() |
|
19661 { |
|
19662 TBool result = EFalse; |
|
19663 |
|
19664 MCoeFepAwareTextEditor* fepAwareTextEditor = |
|
19665 iInputCapabilities.FepAwareTextEditor(); |
|
19666 |
|
19667 if( fepAwareTextEditor ) |
|
19668 { |
|
19669 TCursorSelection curSel; |
|
19670 |
|
19671 fepAwareTextEditor->GetCursorSelectionForFep( curSel ); |
|
19672 |
|
19673 TInt lowerpos = curSel.LowerPos(); |
|
19674 |
|
19675 TInt chandraALength = 2; |
|
19676 TBuf<2> buf; |
|
19677 TAknFepUiIndicInputManager::GetChandraA( buf ); |
|
19678 |
|
19679 if( lowerpos > ( chandraALength - 1 ) ) |
|
19680 { |
|
19681 TBuf<2>previousCharacter; |
|
19682 |
|
19683 fepAwareTextEditor->GetEditorContentForFep( |
|
19684 previousCharacter, lowerpos-chandraALength, chandraALength ); |
|
19685 |
|
19686 if( buf.CompareC( previousCharacter ) == 0 ) |
|
19687 { |
|
19688 // Chandra-A found |
|
19689 result = ETrue; |
|
19690 } |
|
19691 } |
|
19692 } |
|
19693 return result; |
|
19694 } |
|
19695 |
|
19696 TBool CAknFepManager::IsEyeLashRaPresentL() |
|
19697 { |
|
19698 TBool result = EFalse; |
|
19699 |
|
19700 MCoeFepAwareTextEditor* fepAwareTextEditor = |
|
19701 iInputCapabilities.FepAwareTextEditor(); |
|
19702 |
|
19703 if( fepAwareTextEditor ) |
|
19704 { |
|
19705 TCursorSelection curSel; |
|
19706 |
|
19707 fepAwareTextEditor->GetCursorSelectionForFep( curSel ); |
|
19708 |
|
19709 TInt lowerpos = curSel.LowerPos(); |
|
19710 |
|
19711 |
|
19712 TBuf<3> buf; |
|
19713 TAknFepUiIndicInputManager::GetEyeLashRa( buf, |
|
19714 (TLanguage)iLanguageCapabilities.iInputLanguageCode ); |
|
19715 TInt eyeLashRaLength = buf.Length(); |
|
19716 |
|
19717 if( ( lowerpos - eyeLashRaLength ) >= 0 ) |
|
19718 { |
|
19719 TBuf<3>previousCharacter; |
|
19720 |
|
19721 fepAwareTextEditor->GetEditorContentForFep( |
|
19722 previousCharacter, lowerpos-eyeLashRaLength, eyeLashRaLength ); |
|
19723 |
|
19724 if( previousCharacter.Length() >=2 && |
|
19725 buf.CompareC( previousCharacter ) == 0 ) |
|
19726 { |
|
19727 // EyeLashRa found |
|
19728 result = ETrue; |
|
19729 } |
|
19730 } |
|
19731 } |
|
19732 return result; |
|
19733 } |
|
19734 |
|
19735 #endif // RD_MARATHI |
|
19736 #ifndef RD_INTELLIGENT_TEXT_INPUT |
|
19737 void CAknFepManager::RemoveSuggestedCompletionL() |
|
19738 { |
|
19739 if(iPtiEngine->InputMode() == EPtiEngineWordCompletion && |
|
19740 IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) |
|
19741 { |
|
19742 TBuf<CAknFepManager::EMaximumFepWordLength> currentText = iPtiEngine->CurrentWord(); |
|
19743 if(currentText.Length() > iPtiEngine->CurrentInputSequence().Length()) |
|
19744 { |
|
19745 currentText.SetLength(iPtiEngine->CurrentInputSequence().Length()); |
|
19746 iPtiEngine->SetCurrentWord(currentText); |
|
19747 UpdateInlineEditL(currentText,currentText.Length()); |
|
19748 TransferFepStateToEditorL(); |
|
19749 } |
|
19750 |
|
19751 } |
|
19752 } |
|
19753 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
19754 |
|
19755 |
|
19756 // ----------------------------------------------------------------------------- |
|
19757 // CAknFepManager::ExtendedInputCapabilities |
|
19758 // |
|
19759 // Returns the extended input bapabilities bitvector. |
|
19760 // ----------------------------------------------------------------------------- |
|
19761 // |
|
19762 TUint CAknFepManager::ExtendedInputCapabilities() const |
|
19763 { |
|
19764 MObjectProvider* mop = iInputCapabilities.ObjectProvider(); |
|
19765 |
|
19766 if ( mop && iInputCapabilities.FepAwareTextEditor() )//IsFepAwareTextEditor() |
|
19767 { |
|
19768 CAknExtendedInputCapabilities* extendedInputCapabilities = |
|
19769 mop->MopGetObject( extendedInputCapabilities ); |
|
19770 |
|
19771 if ( extendedInputCapabilities ) |
|
19772 { |
|
19773 return extendedInputCapabilities->Capabilities(); |
|
19774 } |
|
19775 } |
|
19776 |
|
19777 return 0; |
|
19778 } |
|
19779 |
|
19780 |
|
19781 #ifdef RD_SCALABLE_UI_V2 |
|
19782 // ----------------------------------------------------------------------------- |
|
19783 // CAknFepManager::LaunchStylusCcpuMenuL |
|
19784 // |
|
19785 // Displays stylus ccpu-menu. |
|
19786 // ----------------------------------------------------------------------------- |
|
19787 // |
|
19788 void CAknFepManager::LaunchStylusCcpuMenuL(TPoint &aClickPoint) |
|
19789 { |
|
19790 const TInt KItemCopy = 0x01; |
|
19791 const TInt KItemCut = 0x02; |
|
19792 const TInt KItemPaste = 0x04; |
|
19793 |
|
19794 delete iStylusCcpuMenu; |
|
19795 iStylusCcpuMenu = NULL; |
|
19796 |
|
19797 // It is assume that this method is called only if there is selected |
|
19798 // text in suitable editor, ie. there will be at least "copy"-item available. |
|
19799 TInt items = KItemCopy; |
|
19800 |
|
19801 CAknEdwinState* editorState = EditorState(); |
|
19802 if (editorState && editorState->CcpuState()) |
|
19803 { |
|
19804 if (editorState->CcpuState()->CcpuCanCut()) |
|
19805 { |
|
19806 items |= KItemCut; |
|
19807 } |
|
19808 if (editorState->CcpuState()->CcpuCanPaste()) |
|
19809 { |
|
19810 items |= KItemPaste; |
|
19811 } |
|
19812 } |
|
19813 |
|
19814 if (items) |
|
19815 { |
|
19816 TBuf<CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength> itemStr; |
|
19817 iStylusCcpuMenu = iUiInterface->NewStylusPopUpMenuL(this, aClickPoint); |
|
19818 |
|
19819 if (items & KItemCopy) |
|
19820 { |
|
19821 StringLoader::Load(itemStr, R_AKNFEP_SOFTKEY_COPY); |
|
19822 iStylusCcpuMenu->AddMenuItemL(itemStr.Mid(1, itemStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength), EEikCmdEditCopy); |
|
19823 } |
|
19824 if (items & KItemCut) |
|
19825 { |
|
19826 itemStr.Zero(); |
|
19827 StringLoader::Load(itemStr, R_AKNFEP_SOFTKEY_CUT); |
|
19828 iStylusCcpuMenu->AddMenuItemL(itemStr.Mid(1, itemStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength), EEikCmdEditCut); |
|
19829 } |
|
19830 if (items & KItemPaste) |
|
19831 { |
|
19832 itemStr.Zero(); |
|
19833 StringLoader::Load(itemStr, R_AKNFEP_STYLUS_CCPU_MENU_PASTE); |
|
19834 iStylusCcpuMenu->AddMenuItemL(itemStr.Mid(1, itemStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength), EEikCmdEditPaste); |
|
19835 } |
|
19836 |
|
19837 SetCcpuFlag(ECcpuStateCopy); // This forces ProcessCommandL to handle the events. |
|
19838 iStylusCcpuMenu->SetPosition(aClickPoint); |
|
19839 iStylusCcpuMenu->ShowMenu(); |
|
19840 } |
|
19841 } |
|
19842 #endif |
|
19843 |
|
19844 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
19845 TBool CAknFepManager::IsFnKeyMappedL(TPtiKeyboardType aKeyboardType) |
|
19846 { |
|
19847 MPtiLanguage *lang = NULL; |
|
19848 RArray < TPtiNumericKeyBinding > keybinding; |
|
19849 TBool ret = EFalse; |
|
19850 if(iPtiEngine) |
|
19851 { |
|
19852 lang = iPtiEngine->CurrentLanguage(); |
|
19853 if(lang) |
|
19854 { |
|
19855 iPtiEngine->GetNumericModeKeysForQwertyL(lang->LanguageCode(), keybinding, aKeyboardType); |
|
19856 TInt numericKeysCount = keybinding.Count(); |
|
19857 while ( numericKeysCount-- ) |
|
19858 { |
|
19859 TPtiNumericKeyBinding numKeyBind = keybinding[numericKeysCount]; |
|
19860 if ( numKeyBind.iCase == EPtiCaseFnLower || numKeyBind.iCase == EPtiCaseFnUpper) |
|
19861 { |
|
19862 ret = ETrue; |
|
19863 break; |
|
19864 } |
|
19865 } |
|
19866 } |
|
19867 } |
|
19868 keybinding.Reset(); |
|
19869 return ret; |
|
19870 } |
|
19871 TBool CAknFepManager::IsFnKeyMapped() |
|
19872 { |
|
19873 return iIsFnKeyMapped; |
|
19874 } |
|
19875 |
|
19876 void CAknFepManager::SetFnKeyMappingState() |
|
19877 { |
|
19878 TRAP_IGNORE(iIsFnKeyMapped = IsFnKeyMappedL()); |
|
19879 } |
|
19880 |
|
19881 TBool CAknFepManager::KeyMapsDifferentCharacterWithFn( TPtiKey aKey ) const |
|
19882 { |
|
19883 // we are interested only about the first mapped character => buffer length 1 is adequate |
|
19884 TBuf<1> lowerMapping; |
|
19885 TBuf<1> upperMapping; |
|
19886 TBuf<1> lowerFnMapping; |
|
19887 TBuf<1> upperFnMapping; |
|
19888 iPtiEngine->MappingDataForKey( aKey, lowerMapping, EPtiCaseLower ); |
|
19889 iPtiEngine->MappingDataForKey( aKey, upperMapping, EPtiCaseUpper ); |
|
19890 iPtiEngine->MappingDataForKey( aKey, lowerFnMapping, EPtiCaseFnLower ); |
|
19891 iPtiEngine->MappingDataForKey( aKey, upperFnMapping, EPtiCaseFnUpper ); |
|
19892 |
|
19893 if ( lowerFnMapping.Length() ) |
|
19894 { |
|
19895 if ( !lowerMapping.Length() || // < key maps character only with Fn |
|
19896 lowerMapping[0] != lowerFnMapping[0] ) // < Fn changes the character of the key |
|
19897 { |
|
19898 return ETrue; |
|
19899 } |
|
19900 } |
|
19901 else if ( upperFnMapping.Length() ) |
|
19902 { |
|
19903 if ( !upperMapping.Length() || // < key maps character only with Fn |
|
19904 upperMapping[0] != upperFnMapping[0] ) // < Fn changes the character of the key |
|
19905 { |
|
19906 return ETrue; |
|
19907 } |
|
19908 } |
|
19909 |
|
19910 return EFalse; // The key doesn't have symbol behind Fn or the symbol is the same as without Fn |
|
19911 } |
|
19912 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
19913 MAknFepDocumentNavigation* CAknFepManager::AknFepDocumentNavigation() const |
|
19914 { |
|
19915 MAknFepDocumentNavigation* navi = NULL; |
|
19916 |
|
19917 MObjectProvider* mop = iInputCapabilities.ObjectProvider(); |
|
19918 if ( mop ) |
|
19919 { |
|
19920 mop->MopGetObject( navi ); |
|
19921 } |
|
19922 |
|
19923 return navi; |
|
19924 } |
|
19925 |
|
19926 CAknFepUIInterface* CAknFepManager::UiInterface() |
|
19927 { |
|
19928 return iUiInterface; |
|
19929 } |
|
19930 |
|
19931 void CAknFepManager::AlignLogicalAndVisualCursorL() |
|
19932 { |
|
19933 TBool isIndicLang = |
|
19934 TAknFepUiIndicInputManager:: |
|
19935 IsIndicLangauge( TLanguage( iLanguageCapabilities.iInputLanguageCode ) ); |
|
19936 |
|
19937 if( isIndicLang ) |
|
19938 { |
|
19939 TTmDocPosSpec pos = DocPos(); |
|
19940 pos.iType = TTmDocPosSpec::ETrailing; |
|
19941 TTmPosInfo2 info; |
|
19942 TTmLineInfo lineInfo; |
|
19943 |
|
19944 TBool findAvailable = EFalse; |
|
19945 |
|
19946 MAknFepDocumentNavigation* docNavi = AknFepDocumentNavigation(); |
|
19947 |
|
19948 if ( docNavi ) |
|
19949 { |
|
19950 docNavi->FindDocPos( pos, info, lineInfo ); |
|
19951 findAvailable = ETrue; |
|
19952 } |
|
19953 else |
|
19954 { |
|
19955 CTextLayout* textLayout = TextLayout(); |
|
19956 if ( textLayout ) |
|
19957 { |
|
19958 textLayout->TagmaTextLayout().FindDocPos( pos, info, lineInfo ); |
|
19959 findAvailable = ETrue; |
|
19960 } |
|
19961 } |
|
19962 |
|
19963 if ( findAvailable ) |
|
19964 { |
|
19965 TCursorSelection sel( info.iDocPos.iPos, info.iDocPos.iPos ); |
|
19966 iInputCapabilities.FepAwareTextEditor()->SetCursorSelectionForFepL(sel); |
|
19967 } |
|
19968 } |
|
19969 } |
|
19970 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
19971 TKeyResponse CAknFepManager::HandleFnKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aEventCode ) |
|
19972 { |
|
19973 TKeyResponse ret; |
|
19974 |
|
19975 #ifdef __HALF_QWERTY_KEYPAD |
|
19976 if ( IsFlagSet( EFlagShiftKeyDepressed ) && |
|
19977 ( EPtiKeyboardHalfQwerty == KeyboardLayout() )&& |
|
19978 ( aEventCode != EEventKeyUp ) ) |
|
19979 { |
|
19980 return EKeyWasNotConsumed; |
|
19981 } |
|
19982 #endif |
|
19983 |
|
19984 if (!iCurrentFepUI->IsValidFnKeyPress() && EStdKeyRightFunc == aKeyEvent.iScanCode) |
|
19985 { |
|
19986 TBool Uiret = ETrue; |
|
19987 if (EEventKeyDown == aEventCode ) |
|
19988 { |
|
19989 Uiret = FepUI()->HandleKeyL(EKeyRightFunc, EShortKeyPress); |
|
19990 } |
|
19991 |
|
19992 if (Uiret) |
|
19993 { |
|
19994 ret = EKeyWasConsumed; |
|
19995 } |
|
19996 else |
|
19997 { |
|
19998 ret = iFnKeyManager->HandleFnKeyEventL( aKeyEvent, aEventCode, |
|
19999 iInputCapabilities ) ; |
|
20000 } |
|
20001 } |
|
20002 else |
|
20003 { |
|
20004 //Handle Fn key and consider long press case |
|
20005 if( EStdKeyRightFunc == aKeyEvent.iScanCode ) |
|
20006 { |
|
20007 switch(aEventCode) |
|
20008 { |
|
20009 case EEventKeyDown: |
|
20010 ActivateFnkeyPressMonitor(); |
|
20011 break; |
|
20012 case EEventKeyUp: |
|
20013 { |
|
20014 if(!iFnKeypressMonitor->IsActive()) |
|
20015 { |
|
20016 //when long pressing event occurrs, |
|
20017 //event has been already handled in HandleFnKeyPressMonitorCallback() |
|
20018 return EKeyWasConsumed; |
|
20019 } |
|
20020 //when short pressing event occurs, |
|
20021 //only deactive fn Key press monitor and normal event handle flow will work |
|
20022 DeactivateFnkeyPressMonitor(); |
|
20023 } |
|
20024 break; |
|
20025 default: |
|
20026 break; |
|
20027 } |
|
20028 } |
|
20029 ret = iFnKeyManager->HandleFnKeyEventL( aKeyEvent, aEventCode, |
|
20030 iInputCapabilities ) ; |
|
20031 } |
|
20032 if(IsHybridAplhaEditor() && !iHybridAplphaChangedToAlphanumeric) |
|
20033 { |
|
20034 if(FnKeyState() != CAknFepFnKeyManager::EFnKeyLock) |
|
20035 iHybridAplphaChangedToAlphanumeric = ETrue; |
|
20036 } |
|
20037 |
|
20038 return ret; |
|
20039 } |
|
20040 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
20041 |
|
20042 // ----------------------------------------------------------------------------- |
|
20043 // CAknFepManager::HasJapanesePredictionInputMode |
|
20044 // Has Japanese prediction input mode in PtiEngine |
|
20045 // ----------------------------------------------------------------------------- |
|
20046 // |
|
20047 TBool CAknFepManager::HasJapanesePredictionInputMode() const |
|
20048 { |
|
20049 // Is it supported Japanese predictive input |
|
20050 TBool ret = EFalse; |
|
20051 MPtiLanguage* ptilang = iPtiEngine->GetLanguage(ELangJapanese); |
|
20052 if ( ptilang |
|
20053 && ( (!iQwertyInputMode && ptilang->HasInputMode(EPtiEngineHiraganaKanjiPredictive)) |
|
20054 ||(iQwertyInputMode && ptilang->HasInputMode(EPtiEngineHiraganaKanjiPredictiveQwerty)) ) ) |
|
20055 { |
|
20056 ret = ETrue; |
|
20057 } |
|
20058 return ret; |
|
20059 } |
|
20060 #ifdef RD_HINDI_PHONETIC_INPUT |
|
20061 void CAknFepManager::HandleIndicCaseL() |
|
20062 { |
|
20063 iHashKeyMan->HandleSetIndicStateL(); |
|
20064 } |
|
20065 #endif |
|
20066 |
|
20067 // ----------------------------------------------------------------------------- |
|
20068 // CAknFepManager::IsCursorAtEndOfWord |
|
20069 // |
|
20070 // ----------------------------------------------------------------------------- |
|
20071 // |
|
20072 TBool CAknFepManager::IsCursorAtEndOfWord() |
|
20073 { |
|
20074 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(iUncommittedText); |
|
20075 TInt origPos = iUncommittedText.iCursorPos; |
|
20076 |
|
20077 FindEndOfWord(iUncommittedText.iCursorPos); |
|
20078 |
|
20079 if (origPos != iUncommittedText.iCursorPos) |
|
20080 { |
|
20081 return EFalse; |
|
20082 } |
|
20083 |
|
20084 return ETrue; |
|
20085 } |
|
20086 |
|
20087 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
20088 TInt CAknFepManager::GetCurrentCase() |
|
20089 { |
|
20090 TCase returnCase; |
|
20091 |
|
20092 switch( iCaseMan->CurrentCase() ) |
|
20093 { |
|
20094 case EAknEditorUpperCase: |
|
20095 case EAknEditorTextCase: |
|
20096 { |
|
20097 returnCase = EUpperCase; |
|
20098 } |
|
20099 break; |
|
20100 |
|
20101 case EAknEditorLowerCase: |
|
20102 { |
|
20103 returnCase = ELowerCase; |
|
20104 } |
|
20105 break; |
|
20106 |
|
20107 default: |
|
20108 returnCase = ELowerCase; |
|
20109 break; |
|
20110 } |
|
20111 return returnCase; |
|
20112 } |
|
20113 // Predictive QWERTY changes (XT9) ----> |
|
20114 |
|
20115 void CAknFepManager::GetCandidatesL( CDesCArray& aArray, TInt& aActiveIdx ) |
|
20116 { |
|
20117 iPtiEngine->GetCandidateListL(aArray); |
|
20118 iPtiEngine->HandleCommandL( |
|
20119 EPtiCommandUserActionGetCurrentIndexOfCandidates, &aActiveIdx); |
|
20120 } |
|
20121 |
|
20122 void CAknFepManager::GetUpdateCandidatePositionL(TRect& aRect) |
|
20123 { |
|
20124 if(iCandidatePopup && iFepFullyConstructed && iPtiEngine) |
|
20125 { |
|
20126 //Now we read the position of the inline text |
|
20127 TPoint inlineEditorTl; |
|
20128 TPoint inlineEditorBr; |
|
20129 TInt height; |
|
20130 TInt ascent; |
|
20131 TInt documentOffset = iPtiEngine->CurrentWord().Length(); |
|
20132 // Popup Position for RTL |
|
20133 if(iLanguageCapabilities.iRightToLeftLanguage) |
|
20134 documentOffset = 0; |
|
20135 // Popup Position for RTL |
|
20136 GetScreenCoordinatesL(inlineEditorTl, height, ascent, documentOffset); |
|
20137 inlineEditorTl.iY -= height; |
|
20138 GetScreenCoordinatesL(inlineEditorBr, height, ascent); |
|
20139 aRect.iTl = inlineEditorTl; |
|
20140 aRect.iBr = inlineEditorBr; |
|
20141 } |
|
20142 } |
|
20143 |
|
20144 TBool CAknFepManager::IsRightToLeftLanguage() |
|
20145 { |
|
20146 return iLanguageCapabilities.iRightToLeftLanguage ; |
|
20147 } |
|
20148 |
|
20149 /** |
|
20150 * Setter for the advanced predictive typing correction. |
|
20151 * @param aLevel The level to be set. |
|
20152 */ |
|
20153 void CAknFepManager::SetTypingCorrectionLevel(TInt aLevel) |
|
20154 { |
|
20155 iTypingCorrectionLevel = aLevel; |
|
20156 |
|
20157 if(iFepFullyConstructed) |
|
20158 { |
|
20159 TPtiErrorCorrectionLevel correctionLevel = (TPtiErrorCorrectionLevel)aLevel; |
|
20160 TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandSetCorrectionLevel, &correctionLevel )); |
|
20161 } |
|
20162 } |
|
20163 |
|
20164 /** |
|
20165 * Resetter for the advanced predictive Number Candidate setting. |
|
20166 * @param aValue The value to be set. |
|
20167 */ |
|
20168 void CAknFepManager::SetNumberCandidateState(TInt aValue) |
|
20169 { |
|
20170 if(aValue == 0) |
|
20171 iIsNumberCandidateShown = EFalse; |
|
20172 else if(aValue == 1) |
|
20173 iIsNumberCandidateShown = ETrue; |
|
20174 |
|
20175 if(iFepFullyConstructed) |
|
20176 { |
|
20177 TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandSetNumberCandidateStatus, |
|
20178 &iIsNumberCandidateShown )); |
|
20179 } |
|
20180 } |
|
20181 |
|
20182 void CAknFepManager::RemoveSuggestedAdvanceCompletionL() |
|
20183 { |
|
20184 if( IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) && |
|
20185 iPtiEngine->CurrentWord().Length() ) |
|
20186 { |
|
20187 TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandUserActionShorten )); |
|
20188 TPtrC currentText = iPtiEngine->CurrentWord(); |
|
20189 UpdateInlineEditL( currentText, currentText.Length() ); |
|
20190 } |
|
20191 } |
|
20192 /** |
|
20193 * Setes the current state from GS to the local state |
|
20194 */ |
|
20195 |
|
20196 void CAknFepManager::SetAutoCompletionState(TInt aValue) |
|
20197 { |
|
20198 if(aValue == 0) |
|
20199 { |
|
20200 iIsAutoCompleteOn = EFalse; |
|
20201 } |
|
20202 else if(aValue == 1) |
|
20203 { |
|
20204 iIsAutoCompleteOn = ETrue; |
|
20205 } |
|
20206 |
|
20207 if(iFepFullyConstructed) |
|
20208 { |
|
20209 if(iIsAutoCompleteOn) |
|
20210 { |
|
20211 TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandEnableAutoCompletion )); |
|
20212 } |
|
20213 else |
|
20214 { |
|
20215 TInt tailLength = 0; |
|
20216 TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength )); |
|
20217 if(tailLength > 0) |
|
20218 { |
|
20219 // send an update to engine to signify change in autocompletion from on to off while tail exists |
|
20220 // This will set EPtiXt9FlagAutoCompletionSetOnToOff flag as true in engine |
|
20221 TInt value = 1; |
|
20222 TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandAutoCompletionOnToOff,&value)); |
|
20223 } |
|
20224 |
|
20225 |
|
20226 TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandDisableAutoCompletion )); |
|
20227 } |
|
20228 } |
|
20229 } |
|
20230 |
|
20231 /** |
|
20232 * Sets the primary candidate from GS to the local state |
|
20233 */ |
|
20234 |
|
20235 void CAknFepManager::SetPrimaryCandidate(TInt aValue) |
|
20236 { |
|
20237 if(aValue == 0) |
|
20238 iPrimaryCandidate = ETrue; |
|
20239 else if(aValue == 1) |
|
20240 iPrimaryCandidate = EFalse; |
|
20241 if(iFepFullyConstructed) |
|
20242 { |
|
20243 TRAP_IGNORE(iPtiEngine->HandleCommandL( EPtiCommandSetProactiveCorrection, |
|
20244 &iPrimaryCandidate )); |
|
20245 } |
|
20246 } |
|
20247 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
20248 |
|
20249 CAknFepPluginManager* CAknFepManager::PluginUIManager() |
|
20250 { |
|
20251 #ifdef RD_SCALABLE_UI_V2 |
|
20252 |
|
20253 return iFepPluginManager; |
|
20254 #else |
|
20255 return NULL; |
|
20256 #endif //RD_SCALABLE_UI_V2 |
|
20257 } |
|
20258 |
|
20259 // add for phrase creation |
|
20260 MZhuyinKeyHandler* CAknFepManager::ZhuyinKeyHandler() |
|
20261 { |
|
20262 return iZhuyinKeyHandler; |
|
20263 } |
|
20264 // add for phrase creation |
|
20265 CAknFepZhuyinAnalyser* CAknFepManager::ZhuyinAnalyser() |
|
20266 { |
|
20267 return iZhuyinAnalyser; |
|
20268 } |
|
20269 |
|
20270 #ifdef RD_SCALABLE_UI_V2 |
|
20271 void CAknFepManager::UpdateTouchCaseMode() |
|
20272 { |
|
20273 if (iFepFullyConstructed && |
|
20274 iFepPluginManager |
|
20275 // case should be updated even if current input mode is none because iPreviousCoseMode |
|
20276 // still need to be updated. |
|
20277 /*&& |
|
20278 iFepPluginManager->PluginInputMode() != EPluginInputModeNone*/) |
|
20279 { |
|
20280 iFepPluginManager->UpdateCaseMode(); |
|
20281 } |
|
20282 } |
|
20283 #endif// RD_SCALABLE_UI_V2 |
|
20284 |
|
20285 void CAknFepManager::SetStopProcessFocus(TBool aStop, TBool aClose) |
|
20286 { |
|
20287 iClosePeninputUi = aClose; |
|
20288 iStopProcessFocus = aStop; |
|
20289 if (!aStop) |
|
20290 { |
|
20291 HandleChangeInFocus(); |
|
20292 } |
|
20293 } |
|
20294 |
|
20295 TBool CAknFepManager::StopProcessFocus() |
|
20296 { |
|
20297 return iStopProcessFocus; |
|
20298 } |
|
20299 |
|
20300 TBool CAknFepManager::CloseUiOnFocusChange() |
|
20301 { |
|
20302 return iClosePeninputUi; |
|
20303 } |
|
20304 void CAknFepManager::HandleCopyCutStateL() |
|
20305 { |
|
20306 if (IsCcpuFlagSet(ECcpuStateCopy | ECcpuStateCut)) |
|
20307 { |
|
20308 TCursorSelection selection; |
|
20309 iInputCapabilities.FepAwareTextEditor()->GetCursorSelectionForFep(selection); |
|
20310 TBool update; |
|
20311 if (selection.Length() > 0) |
|
20312 { |
|
20313 if (!IsCcpuFlagSet(ECcpuStateButton)) |
|
20314 { |
|
20315 __ASSERT_DEBUG(iUiInterface->SoftkeysExist(), |
|
20316 AknFepPanic(EAknFepPanicNoHandleToFepAwareTextEditor)); |
|
20317 if (IsCcpuFlagSet(ECcpuStateCopy)) |
|
20318 { |
|
20319 update = UpdateCBALabelL(ELeftSoftkeyIndex, EEikCmdEditCopy, R_AKNFEP_SOFTKEY_COPY); |
|
20320 update |= UpdateCBALabelL( EMiddleSoftkeyIndex, EEikCmdEditCopy, R_AVKON_SOFTKEY_SELECT_TEXT ); |
|
20321 } |
|
20322 else |
|
20323 { |
|
20324 update = UpdateCBALabelL(ELeftSoftkeyIndex, EEikCmdEditCut, R_AKNFEP_SOFTKEY_CUT); |
|
20325 update |= UpdateCBALabelL( EMiddleSoftkeyIndex, EEikCmdEditCut, R_AVKON_SOFTKEY_SELECT_TEXT ); |
|
20326 } |
|
20327 if (update) |
|
20328 { |
|
20329 iUiInterface->DrawSoftkeysNow(); |
|
20330 } |
|
20331 SetCcpuFlag(ECcpuStateButton); |
|
20332 } |
|
20333 } |
|
20334 else if (IsCcpuFlagSet(ECcpuStateButton)) |
|
20335 { |
|
20336 ClearCcpuFlag(ECcpuStateButton); |
|
20337 update = EFalse; |
|
20338 update = UpdateCBALabelL(ELeftSoftkeyIndex, KNullCommandId, R_TEXT_SOFTKEY_EMPTY); |
|
20339 update |= UpdateCBALabelL( EMiddleSoftkeyIndex, KNullCommandId, R_TEXT_SOFTKEY_EMPTY ); |
|
20340 if (update) |
|
20341 { |
|
20342 iUiInterface->DrawSoftkeysNow(); |
|
20343 } |
|
20344 } |
|
20345 } |
|
20346 } |
|
20347 #ifdef RD_SCALABLE_UI_V2 |
|
20348 TInt GetForegroundTaskAppWgId() |
|
20349 { |
|
20350 TApaTaskList tList(CCoeEnv::Static()->WsSession()); |
|
20351 |
|
20352 TApaTask task = tList.FindByPos(0); |
|
20353 return task.WgId(); |
|
20354 } |
|
20355 |
|
20356 void CAknFepManager::DimInputmodeTouchMenuItems(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
20357 { |
|
20358 DimEditMenuModeItems(aMenuPane); |
|
20359 |
|
20360 if ( IsChineseInputLanguage() ) |
|
20361 { |
|
20362 DoChineseTouchMenu(aMenuPane); |
|
20363 } |
|
20364 else if ( iLanguageCapabilities.iInputLanguageCode == ELangJapanese) |
|
20365 { |
|
20366 DoJapaneseMenu(aMenuPane); |
|
20367 } |
|
20368 else |
|
20369 { |
|
20370 DoWesternTouchMenu(aMenuPane); |
|
20371 } |
|
20372 } |
|
20373 #endif |
|
20374 |
|
20375 void CAknFepManager::DimInputmodeMenuItems(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
20376 { |
|
20377 DimEditMenuModeItems(aMenuPane); |
|
20378 |
|
20379 if ( IsChineseInputLanguage() ) |
|
20380 { |
|
20381 DoChineseMenu(aMenuPane); |
|
20382 } |
|
20383 else if ( iLanguageCapabilities.iInputLanguageCode == ELangJapanese) |
|
20384 { |
|
20385 DoJapaneseMenu(aMenuPane); |
|
20386 } |
|
20387 else |
|
20388 { |
|
20389 DoWesternMenu(aMenuPane); |
|
20390 } |
|
20391 } |
|
20392 |
|
20393 void CAknFepManager::HandleCopyCutEventL(TInt aCommandId) |
|
20394 { |
|
20395 if (iCcpuMode != ECcpuStateNone) |
|
20396 { |
|
20397 ResetCcpuFlags(); |
|
20398 iUiInterface->DeleteSoftkeys(); |
|
20399 |
|
20400 SetCcpuFlag(ECcpuStatePosted); |
|
20401 |
|
20402 #ifdef RD_SCALABLE_UI_V2 |
|
20403 if (aCommandId == EEikCmdEditCopy) |
|
20404 { |
|
20405 // Send copy event to AknCcpuSupport. |
|
20406 CCoeEnv::Static()->SimulateKeyEventL(KAknCcpuCopyEvent, EEventKey); |
|
20407 } |
|
20408 else |
|
20409 { |
|
20410 // Send cut event to AknCcpuSupport. |
|
20411 CCoeEnv::Static()->SimulateKeyEventL(KAknCcpuCutEvent, EEventKey); |
|
20412 } |
|
20413 #else |
|
20414 /*As part of build warnings commenting this perticular code it might require when touch is enabled. |
|
20415 if (aCommandId == EEikCmdEditCopy) |
|
20416 { |
|
20417 // Send copy-event to editor. |
|
20418 CCoeEnv::Static()->SimulateKeyEventL(KEditorCopyEvent, EEventKey); |
|
20419 } |
|
20420 else |
|
20421 { |
|
20422 // send cut-event to editor. |
|
20423 CCoeEnv::Static()->SimulateKeyEventL(KEditorCutEvent, EEventKey); |
|
20424 } |
|
20425 */ |
|
20426 #endif // RD_SCALABLE_UI_V2 |
|
20427 |
|
20428 if (iInputCapabilities.FepAwareTextEditor()) |
|
20429 { |
|
20430 // update indicators only if this is editable component. |
|
20431 iIndicator->SetCopyMode(EFalse); |
|
20432 UpdateIndicators(); |
|
20433 } |
|
20434 #ifdef RD_SCALABLE_UI_V2 |
|
20435 HandleChangeInFocus(); |
|
20436 #endif |
|
20437 |
|
20438 } |
|
20439 |
|
20440 } |
|
20441 |
|
20442 TInt CAknFepManager::FepShowVkbPreviewStatus() |
|
20443 { |
|
20444 return iSharedDataInterface->FepShowVkbPreviewStatus(); |
|
20445 } |
|
20446 |
|
20447 void CAknFepManager::InitPreviewMenuPane(CAknFepUiInterfaceMenuPane* aMenuPane) |
|
20448 { |
|
20449 if (FepShowVkbPreviewStatus() > 0) |
|
20450 { |
|
20451 aMenuPane->GetMenuPane()->SetItemButtonState(EPenInputCmdPreviewOn, |
|
20452 EEikMenuItemSymbolOn ); |
|
20453 } |
|
20454 else |
|
20455 { |
|
20456 aMenuPane->GetMenuPane()->SetItemButtonState(EPenInputCmdPreviewOff, |
|
20457 EEikMenuItemSymbolOn ); |
|
20458 } |
|
20459 } |
|
20460 |
|
20461 void CAknFepManager::SynCCPSoftKey() |
|
20462 { |
|
20463 TRAP_IGNORE(HandleCopyCutStateL()); |
|
20464 } |
|
20465 |
|
20466 TInt CAknFepManager::PluginInputMode() const |
|
20467 { |
|
20468 #ifdef RD_SCALABLE_UI_V2 |
|
20469 return iFepPluginManager ? iFepPluginManager->PluginInputMode() : EPluginInputModeNone; |
|
20470 #else |
|
20471 return EPluginInputModeNone; |
|
20472 #endif |
|
20473 } |
|
20474 |
|
20475 void CAknFepManager::HandleEndKeyL() |
|
20476 { |
|
20477 #ifdef RD_SCALABLE_UI_V2 |
|
20478 |
|
20479 if (iFepPluginManager) |
|
20480 { |
|
20481 return; |
|
20482 } |
|
20483 |
|
20484 RWsSession &ws = CCoeEnv::Static()->WsSession(); |
|
20485 //TInt wgId =ws.GetFocusWindowGroup(); |
|
20486 CApaWindowGroupName* wg = CApaWindowGroupName::NewLC(ws, |
|
20487 CCoeEnv::Static()->WsSession().GetFocusWindowGroup()); |
|
20488 |
|
20489 TUid id = wg->AppUid(); |
|
20490 CleanupStack::PopAndDestroy(wg); |
|
20491 |
|
20492 if (0x10207218 == id.iUid || |
|
20493 0x10281EF2 == id.iUid) |
|
20494 { |
|
20495 RPeninputServer iPenInputServer; |
|
20496 |
|
20497 TInt err = iPenInputServer.Connect(); |
|
20498 if(err == KErrNone) |
|
20499 { |
|
20500 iPenInputServer.SetForeground(ETrue); |
|
20501 iPenInputServer.ActivateLayout( EFalse ); |
|
20502 iPenInputServer.HandleCommand(ECmdPenInputWindowClose); |
|
20503 |
|
20504 iPenInputServer.ClearServerEvent(); |
|
20505 iPenInputServer.LoseForeground(); |
|
20506 iPenInputServer.Close(); |
|
20507 } |
|
20508 } |
|
20509 #endif //RD_SCALABLE_UI_V2 |
|
20510 } |
|
20511 void CAknFepManager::NeedDisableKeySound(const TKeyEvent& aKeyEvent, TEventCode aEventCode) |
|
20512 { |
|
20513 #ifdef RD_SCALABLE_UI_V2 |
|
20514 TInt keyCode = aKeyEvent.iScanCode; |
|
20515 TBool interestKey = EFalse; |
|
20516 if ( keyCode == EPtiKey0 || |
|
20517 keyCode == EPtiKey1 || |
|
20518 keyCode == EPtiKey2 || |
|
20519 keyCode == EPtiKey3 || |
|
20520 keyCode == EPtiKey4 || |
|
20521 keyCode == EPtiKey5 || |
|
20522 keyCode == EPtiKey6 || |
|
20523 keyCode == EPtiKey7 || |
|
20524 keyCode == EPtiKey8 || |
|
20525 keyCode == EPtiKey9 || |
|
20526 keyCode == EStdKeyDownArrow || |
|
20527 keyCode == EStdKeyRightArrow || |
|
20528 keyCode == EStdKeyLeftArrow || |
|
20529 keyCode == EStdKeyUpArrow || |
|
20530 keyCode == EStdKeyBackspace |
|
20531 ) |
|
20532 { |
|
20533 interestKey = ETrue; |
|
20534 } |
|
20535 if( interestKey && iFepPluginManager && |
|
20536 iFepPluginManager->PluginInputMode() == EPluginInputModeItut) |
|
20537 { |
|
20538 if( aEventCode == EEventKeyDown ) |
|
20539 { |
|
20540 static_cast<CAknAppUi*>(CEikonEnv::Static()->EikAppUi())-> |
|
20541 DisableNextKeySound( keyCode ); |
|
20542 } |
|
20543 else if( aEventCode == EEventKey ) |
|
20544 { |
|
20545 #ifdef RD_TACTILE_FEEDBACK |
|
20546 MTouchFeedback::Instance()-> |
|
20547 InstantFeedback(ETouchFeedbackSensitive); |
|
20548 #endif |
|
20549 } |
|
20550 } |
|
20551 #endif |
|
20552 } |
|
20553 |
|
20554 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
20555 void CAknFepManager::SetComposChrFlag( TBool aFlag ) |
|
20556 { |
|
20557 iComposChrFlag = aFlag; |
|
20558 } |
|
20559 TBool CAknFepManager::GetComposChrFlag( ) |
|
20560 { |
|
20561 return iComposChrFlag; |
|
20562 } |
|
20563 #endif |
|
20564 |
|
20565 // add for phrase creation User db view |
|
20566 void CAknFepManager::AddUserDBDlgItemL( CAknFepUiInterfaceMenuPane* aMenuPane, TInt aIndex ) |
|
20567 { |
|
20568 CAknFepUiInterfaceMenuPane::SItemData mData; |
|
20569 |
|
20570 TBuf<KMaxFileName> langStr; |
|
20571 TInt Inputlangindex; |
|
20572 if (!aMenuPane->MenuItemExists(EAknCmdUserDBDlg, Inputlangindex)) |
|
20573 { |
|
20574 StringLoader::Load(langStr, R_AKNFEP_OPTIONS_USER_DB_DLG); |
|
20575 |
|
20576 mData.iCommandId = EAknCmdUserDBDlg; |
|
20577 mData.iCascadeId = 0; |
|
20578 mData.iFlags = 0; |
|
20579 mData.iText.Copy(langStr.Mid(1, langStr.Length() - 1).Left(CAknFepUiInterfaceMenuPane::SItemData::ENominalTextLength)); |
|
20580 |
|
20581 aMenuPane->InsertMenuItemL(mData, aIndex); |
|
20582 } |
|
20583 } |
|
20584 // add for phrase creation |
|
20585 void CAknFepManager::LaunchUserDBDlgL( ) |
|
20586 { |
|
20587 TInt itemIndex = 0; |
|
20588 |
|
20589 //Change title text |
|
20590 CEikStatusPane* statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane(); |
|
20591 CAknTitlePane* title = static_cast< CAknTitlePane* >( |
|
20592 statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle) ) ); |
|
20593 |
|
20594 //Save the old title tet |
|
20595 HBufC* Oldtitletext = title->Text()->AllocLC(); |
|
20596 //Load the new title text |
|
20597 HBufC* titletext = StringLoader::LoadLC( R_AKNFEP_USER_DB_MANAGEMENT_TITLE ); |
|
20598 //Set title to the new text |
|
20599 title->SetTextL( *titletext ); |
|
20600 |
|
20601 CDesCArray* items = new( ELeave ) CDesCArrayFlat( KSelectItemSize ); |
|
20602 CleanupStack::PushL( items ); |
|
20603 CArrayFix<TInt>* selectedItems = new( ELeave ) CArrayFixFlat<TInt>( KSelectItemSize ); |
|
20604 CleanupStack::PushL( selectedItems ); |
|
20605 |
|
20606 CAknToolbar* toolbar = iAvkonAppUi->CurrentFixedToolbar(); |
|
20607 |
|
20608 if( toolbar && toolbar->IsShown() && toolbar->CountComponentControls()>0 ) |
|
20609 { |
|
20610 toolbar->SetDimmed( ETrue ); |
|
20611 toolbar->DrawDeferred(); |
|
20612 } |
|
20613 |
|
20614 TUid naviPaneUid; |
|
20615 naviPaneUid.iUid = EEikStatusPaneUidNavi; |
|
20616 |
|
20617 CEikStatusPaneBase::TPaneCapabilities subPane = |
|
20618 statusPane->PaneCapabilities(naviPaneUid); |
|
20619 // if we can access the navigation pane |
|
20620 if (subPane.IsPresent() && subPane.IsAppOwned()) |
|
20621 { |
|
20622 CAknNavigationControlContainer |
|
20623 * naviPane = |
|
20624 (CAknNavigationControlContainer *) statusPane->ControlL(naviPaneUid); |
|
20625 iTapGroup = naviPane->CreateTabGroupL(); |
|
20626 iTapGroup->MakeVisible( EFalse ); |
|
20627 naviPane->PushL( *iTapGroup ); |
|
20628 } |
|
20629 |
|
20630 iUserdbdlg = CAknFepUserdbDlg::NewL( itemIndex, |
|
20631 selectedItems, items, R_AKNFEP_USERDB_DLG_MENUBAR, iPtiEngine, this ); |
|
20632 |
|
20633 iIsUserdbdlgActive = 1; |
|
20634 |
|
20635 iUserdbdlg->RunLD(); |
|
20636 |
|
20637 iIsUserdbdlgActive = 0; |
|
20638 |
|
20639 // if we can access the navigation pane |
|
20640 if (subPane.IsPresent() && subPane.IsAppOwned()) |
|
20641 { |
|
20642 |
|
20643 CAknNavigationControlContainer |
|
20644 * naviPane = |
|
20645 (CAknNavigationControlContainer *) statusPane->ControlL(naviPaneUid); |
|
20646 naviPane->Pop(); |
|
20647 delete iTapGroup; |
|
20648 iTapGroup = NULL; |
|
20649 } |
|
20650 |
|
20651 //Set the title to old text |
|
20652 title->SetTextL( *Oldtitletext ); |
|
20653 |
|
20654 if( toolbar ) |
|
20655 { |
|
20656 toolbar->SetDimmed( EFalse ); |
|
20657 toolbar->DrawNow(); |
|
20658 } |
|
20659 |
|
20660 CleanupStack::PopAndDestroy( selectedItems ); |
|
20661 CleanupStack::PopAndDestroy( items ); |
|
20662 CleanupStack::PopAndDestroy( titletext ); |
|
20663 CleanupStack::PopAndDestroy( Oldtitletext ); |
|
20664 iUserdbdlg = NULL; |
|
20665 } |
|
20666 // add for phrase creation |
|
20667 TBool CAknFepManager::IsPinyinPhraseCreation() const |
|
20668 { |
|
20669 return iPinyinPhraseCreation; |
|
20670 } |
|
20671 |
|
20672 void CAknFepManager::PinyinPhraseCreation( TBool aPinyinPhraseCreation ) |
|
20673 { |
|
20674 if ( iPinyinPhraseCreation != aPinyinPhraseCreation ) |
|
20675 { |
|
20676 iPinyinPhraseCreation = aPinyinPhraseCreation; |
|
20677 } |
|
20678 } |
|
20679 // add for phrase creation |
|
20680 TBool CAknFepManager::IsPhraseCreation() const |
|
20681 { |
|
20682 return iPhraseCreation; |
|
20683 } |
|
20684 // add for phrase creation |
|
20685 void CAknFepManager::PhraseCreation( TBool aPhraseCreation ) |
|
20686 { |
|
20687 if ( iPhraseCreation != aPhraseCreation ) |
|
20688 { |
|
20689 iPhraseCreation = aPhraseCreation; |
|
20690 } |
|
20691 } |
|
20692 // add for phrase creation |
|
20693 TBool CAknFepManager::IsEntryPhrase() const |
|
20694 { |
|
20695 return iEntryPhrase; |
|
20696 } |
|
20697 // add for phrase creation |
|
20698 void CAknFepManager::EntryPhrase( TBool aEntryPhrase ) |
|
20699 { |
|
20700 if ( iEntryPhrase != aEntryPhrase ) |
|
20701 { |
|
20702 iEntryPhrase = aEntryPhrase; |
|
20703 } |
|
20704 } |
|
20705 // add for phrase creation |
|
20706 void CAknFepManager::EnableKeyStar( TBool aEnable ) |
|
20707 { |
|
20708 if ( iKeyStar != aEnable ) |
|
20709 { |
|
20710 iKeyStar = aEnable; |
|
20711 } |
|
20712 } |
|
20713 // add for phrase creation |
|
20714 TBool CAknFepManager::IsEnableKeyStar( ) const |
|
20715 { |
|
20716 return iKeyStar; |
|
20717 } |
|
20718 #ifdef RD_INTELLIGENT_TEXT_INPUT |
|
20719 |
|
20720 |
|
20721 #ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ |
|
20722 /** |
|
20723 * @return ETrue If the number entry with long key press is supported on QWERTY keyboard. |
|
20724 */ |
|
20725 TBool CAknFepManager::LongPressNumberEntryOnQwerty() const |
|
20726 { |
|
20727 TBool value = EFalse; |
|
20728 if ( iSharedDataInterface ) |
|
20729 { |
|
20730 value = iSharedDataInterface->LongPressNumberEntryOnQwerty(); |
|
20731 } |
|
20732 return value; |
|
20733 } |
|
20734 |
|
20735 #endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ |
|
20736 |
|
20737 |
|
20738 void CAknFepManager::MultitapThroughSCTCharL(TCallBack aCallBack) |
|
20739 { |
|
20740 |
|
20741 TInt res = GetNumericSCTResID(); |
|
20742 |
|
20743 if(!res) |
|
20744 { |
|
20745 return; |
|
20746 } |
|
20747 |
|
20748 if(!iNumericResourceTimer) |
|
20749 { |
|
20750 iNumericResourceTimer = CChrMultiTapTimer::NewL(aCallBack); |
|
20751 } |
|
20752 |
|
20753 if(!iResourceString || iNumericResourceId !=res ) |
|
20754 { |
|
20755 // either the resource string has not be created or the resource ID has changed |
|
20756 if(iResourceString) |
|
20757 { |
|
20758 delete iResourceString; |
|
20759 iResourceString = NULL; |
|
20760 } |
|
20761 iNumericResourceId = res; |
|
20762 TResourceReader reader; |
|
20763 CEikonEnv::Static()->CreateResourceReaderLC(reader,iNumericResourceId); |
|
20764 reader.ReadInt32(); // skip sct id |
|
20765 iResourceString = reader.ReadHBufC16L(); |
|
20766 CleanupStack::PopAndDestroy(); |
|
20767 } |
|
20768 if(!iResourceString) |
|
20769 { |
|
20770 return; |
|
20771 } |
|
20772 if(iNumericResourceTimer->IsActive()) |
|
20773 { |
|
20774 if( iChrCharIndex == iResourceString->Length() ) |
|
20775 { |
|
20776 iChrCharIndex = 0; |
|
20777 } |
|
20778 |
|
20779 iNumericResourceTimer->Cancel(); |
|
20780 iNumericResourceTimer->After(KChrKeyMultitapTimeout); |
|
20781 } |
|
20782 else |
|
20783 { |
|
20784 iChrCharIndex = 0; |
|
20785 iNumericResourceTimer->After(KChrKeyMultitapTimeout); |
|
20786 } |
|
20787 TBuf<1> buf; |
|
20788 buf.Append((*iResourceString)[iChrCharIndex]); |
|
20789 NewCharacterL(buf); |
|
20790 iChrCharIndex++; |
|
20791 if (iResourceString->Length() == 1) |
|
20792 { |
|
20793 NumericResourceMultiTapTimerTimeoutL(); |
|
20794 } |
|
20795 |
|
20796 } |
|
20797 TBool CAknFepManager::NumericResourceMultiTapTimerTimeoutL() |
|
20798 { |
|
20799 if(iNumericResourceTimer->IsActive()) |
|
20800 { |
|
20801 iNumericResourceTimer->Cancel(); |
|
20802 if(IsFlagSet(CAknFepManager::EFlagInsideMultitapInlineEditingTransaction)) |
|
20803 { |
|
20804 CommitInlineEditL(); |
|
20805 return ETrue; |
|
20806 } |
|
20807 } |
|
20808 return EFalse; |
|
20809 } |
|
20810 void CAknFepManager::ChangeMfneAmPm() |
|
20811 { |
|
20812 //trigger when touch at "AM" or "PM" in ICF |
|
20813 if (iInputCapabilities.FepAwareTextEditor() && IsMfneEditor() ) |
|
20814 { |
|
20815 MObjectProvider* mop = iInputCapabilities.ObjectProvider(); |
|
20816 if ( mop && iInputCapabilities.FepAwareTextEditor() ) |
|
20817 { |
|
20818 CAknExtendedInputCapabilities* extendedInputCapabilities = |
|
20819 mop->MopGetObject( extendedInputCapabilities ); |
|
20820 if ( extendedInputCapabilities->Capabilities() && CAknExtendedInputCapabilities::EInputEditorAmPm )// if support AM/PM toggle |
|
20821 { |
|
20822 extendedInputCapabilities->ReportEventL( |
|
20823 CAknExtendedInputCapabilities::MAknEventObserver::EChangeAmPm, NULL); |
|
20824 } |
|
20825 } |
|
20826 } |
|
20827 } |
|
20828 |
|
20829 //------------------------------------------------------------------- |
|
20830 |
|
20831 // |
|
20832 // CChrMultiTapTimer |
|
20833 // |
|
20834 |
|
20835 // --------------------------------------------------------------------------- |
|
20836 // CChrMultiTapTimer::NewL |
|
20837 // |
|
20838 // --------------------------------------------------------------------------- |
|
20839 // |
|
20840 CChrMultiTapTimer* CChrMultiTapTimer::NewL(TCallBack aCallback) |
|
20841 { |
|
20842 CChrMultiTapTimer* self = new(ELeave)CChrMultiTapTimer(aCallback); |
|
20843 CleanupStack::PushL(self); |
|
20844 self->ConstructL(); |
|
20845 CleanupStack::Pop(); // self |
|
20846 return self; |
|
20847 } |
|
20848 |
|
20849 |
|
20850 // --------------------------------------------------------------------------- |
|
20851 // CChrMultiTapTimer::CChrMultiTapTimer |
|
20852 // |
|
20853 // --------------------------------------------------------------------------- |
|
20854 // |
|
20855 CChrMultiTapTimer::CChrMultiTapTimer(TCallBack aCallback) |
|
20856 :CTimer(EPriorityStandard), iCallback(aCallback) |
|
20857 { |
|
20858 } |
|
20859 |
|
20860 // --------------------------------------------------------------------------- |
|
20861 // CChrMultiTapTimer::ConstructL |
|
20862 // |
|
20863 // --------------------------------------------------------------------------- |
|
20864 // |
|
20865 void CChrMultiTapTimer::ConstructL() |
|
20866 { |
|
20867 CTimer::ConstructL(); |
|
20868 CActiveScheduler::Add(this); |
|
20869 } |
|
20870 |
|
20871 // --------------------------------------------------------------------------- |
|
20872 // CChrMultiTapTimer::After |
|
20873 // |
|
20874 // --------------------------------------------------------------------------- |
|
20875 // |
|
20876 void CChrMultiTapTimer::After(TTimeIntervalMicroSeconds32 aInterval) |
|
20877 { |
|
20878 if (IsActive()) |
|
20879 { |
|
20880 Cancel(); |
|
20881 } |
|
20882 CTimer::After(aInterval); |
|
20883 } |
|
20884 |
|
20885 // --------------------------------------------------------------------------- |
|
20886 // CChrMultiTapTimer::RunL |
|
20887 // |
|
20888 // --------------------------------------------------------------------------- |
|
20889 // |
|
20890 void CChrMultiTapTimer::RunL() |
|
20891 { |
|
20892 iCallback.CallBack(); |
|
20893 } |
|
20894 |
|
20895 TBool CAknFepManager::IsLanguageSupportPrediction() |
|
20896 { |
|
20897 TBool isLanguagugeSupportsPrediction = EFalse; |
|
20898 switch(iKeyboardType) |
|
20899 { |
|
20900 case EPtiKeyboardHalfQwerty: |
|
20901 #ifdef __HALF_QWERTY_KEYPAD |
|
20902 isLanguagugeSupportsPrediction = (iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternHalfQwertyPredictive); |
|
20903 #endif |
|
20904 break; |
|
20905 case EPtiKeyboardQwerty4x12: |
|
20906 case EPtiKeyboardQwerty4x10: |
|
20907 case EPtiKeyboardQwerty3x11: |
|
20908 case EPtiKeyboardCustomQwerty: |
|
20909 isLanguagugeSupportsPrediction = (iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternQwertyPredictive); |
|
20910 break; |
|
20911 case EPtiKeyboardNone: |
|
20912 case EPtiKeyboard12Key: |
|
20913 isLanguagugeSupportsPrediction = (!iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternPredictive); |
|
20914 break; |
|
20915 default: |
|
20916 isLanguagugeSupportsPrediction = (!iQwertyInputMode) & (iLanguageCapabilities.iSupportsWesternPredictive); |
|
20917 break; |
|
20918 } |
|
20919 return isLanguagugeSupportsPrediction; |
|
20920 } |
|
20921 #endif //RD_INTELLIGENT_TEXT_INPUT |
|
20922 |
|
20923 TBool CAknFepManager::IsAllowedKeymappingForNumberMode(TChar aChar) const |
|
20924 { |
|
20925 TBool response = EFalse; |
|
20926 |
|
20927 |
|
20928 switch ( iAknEditorNumericKeymap ) |
|
20929 { |
|
20930 case EAknEditorStandardNumberModeKeymap: |
|
20931 case EAknEditorFixedDiallingNumberModeKeymap: |
|
20932 case EAknEditorSATNumberModeKeymap: |
|
20933 case EAknEditorSATHiddenNumberModeKeymap: |
|
20934 { |
|
20935 response = (aChar == '#'); |
|
20936 } |
|
20937 break; |
|
20938 case EAknEditorCalculatorNumberModeKeymap: |
|
20939 case EAknEditorConverterNumberModeKeymap: |
|
20940 { |
|
20941 TLocale tLoc; |
|
20942 response = (aChar == tLoc.DecimalSeparator()); |
|
20943 } |
|
20944 break; |
|
20945 case EAknEditorToFieldNumberModeKeymap: |
|
20946 { |
|
20947 response = (aChar == ';'); |
|
20948 } |
|
20949 break; |
|
20950 case EAknEditorPlainNumberModeKeymap: |
|
20951 case EAknEditorReservedInternalUseKeymap: |
|
20952 default: |
|
20953 break; |
|
20954 } |
|
20955 |
|
20956 return response; |
|
20957 } |
|
20958 /** |
|
20959 * Return wether ipnut mode is change by press shift+space. |
|
20960 * This is for half-qwerty. |
|
20961 */ |
|
20962 TBool CAknFepManager::IsChangeModeByShiftAndSpace() |
|
20963 { |
|
20964 return iShiftAndSpace; |
|
20965 } |
|
20966 |
|
20967 /** |
|
20968 * Set wether ipnut mode is change by press shift+space. |
|
20969 * This is for half-qwerty. |
|
20970 */ |
|
20971 void CAknFepManager::SetChangeModeByShiftAndSpace( TBool aFlag ) |
|
20972 { |
|
20973 iShiftAndSpace = aFlag; |
|
20974 } |
|
20975 |
|
20976 void CAknFepManager::HideExactWordPopUp() |
|
20977 { |
|
20978 iExactWordPopupContent->HidePopUp(); |
|
20979 TRAP_IGNORE( SendEventsToPluginManL( EPluginHideTooltip )); |
|
20980 } |
|
20981 |
|
20982 TBool CAknFepManager::IsExactWordPopUpShown() |
|
20983 { |
|
20984 #ifdef RD_SCALABLE_UI_V2 |
|
20985 return iExactWordPopupContent->IsPopUpVisible() |
|
20986 || ( iFepPluginManager && iFepPluginManager->IsTooltipOpenOnFSQ() ); |
|
20987 #else |
|
20988 return iExactWordPopupContent->IsPopUpVisible(); |
|
20989 #endif // RD_SCALABLE_UI_V2 |
|
20990 } |
|
20991 void CAknFepManager::StopDisplayingMenuBar() |
|
20992 { |
|
20993 if (iEditMenuBar) |
|
20994 { |
|
20995 iEditMenuBar->StopDisplayingMenuBar(); |
|
20996 iEditMenuBar = NULL; |
|
20997 } |
|
20998 #ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__ |
|
20999 // temporary solution for Entering key on virtual QWERTY not working |
|
21000 // like enter on virtual ITU-T or on external keyboard |
|
21001 if ( iOptionsMenuBar && !( iFepPluginManager && |
|
21002 ( iFepPluginManager->CurrentPluginInputMode() == EPluginInputModeFSQ || |
|
21003 iFepPluginManager->CurrentPluginInputMode() == EPluginInputModePortraitFSQ ) ) ) |
|
21004 { |
|
21005 iOptionsMenuBar->StopDisplayingMenuBar(); |
|
21006 iOptionsMenuBar = NULL; |
|
21007 } |
|
21008 #endif //__ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__ |
|
21009 } |
|
21010 |
|
21011 void CAknFepManager::SetQwertyModeToInputcapbility() |
|
21012 { |
|
21013 if ( iSharedDataInterface->QwertyInputMode() ) |
|
21014 { |
|
21015 SetExtendedInputCapabilities( ExtendedInputCapabilities() | |
|
21016 CAknExtendedInputCapabilities::EInputEditorQwertyInputActive ); |
|
21017 } |
|
21018 else |
|
21019 { |
|
21020 SetExtendedInputCapabilities( ExtendedInputCapabilities() & |
|
21021 ~CAknExtendedInputCapabilities::EInputEditorQwertyInputActive ); |
|
21022 } |
|
21023 } |
|
21024 void CAknFepManager::SetExtendedInputCapabilities( TUint aCapabilities) |
|
21025 { |
|
21026 MObjectProvider* mop = iInputCapabilities.ObjectProvider(); |
|
21027 |
|
21028 if ( mop && iInputCapabilities.FepAwareTextEditor() )//IsFepAwareTextEditor() |
|
21029 { |
|
21030 CAknExtendedInputCapabilities* extendedInputCapabilities = |
|
21031 mop->MopGetObject( extendedInputCapabilities ); |
|
21032 |
|
21033 if ( extendedInputCapabilities ) |
|
21034 { |
|
21035 extendedInputCapabilities->SetCapabilities( aCapabilities ); |
|
21036 } |
|
21037 } |
|
21038 |
|
21039 return; |
|
21040 } |
|
21041 |
|
21042 void CAknFepManager::PrepareFepAfterDialogExitL(TUid aFepUid) |
|
21043 { |
|
21044 // This ensures that on 3rd party fep change we do not have access to other fep variables |
|
21045 if (aFepUid != CCoeEnv::Static()->FepUid()) |
|
21046 { |
|
21047 // In case the fep has changed, then leave |
|
21048 User::Leave(KErrNone); |
|
21049 } |
|
21050 // Once the editor which launches a dialog is destroyed, this flag is set |
|
21051 // In case we have any dialog launched we leave as the underneath editor is |
|
21052 // destroyed |
|
21053 if (IsExtendedFlagSet(EExtendedFlagEdwinEditorDestroyed)) |
|
21054 { |
|
21055 if(!iFepAwareDialogParentEditor) |
|
21056 { |
|
21057 // For Eg: Messaging editor launches spell query which inturn launches |
|
21058 // SCT. Then don't clear the flag once we dismiss SCT because we even |
|
21059 // need to dismiss spell query dialog. |
|
21060 ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
21061 } |
|
21062 User::Leave(KErrNone); |
|
21063 } |
|
21064 if(!iFepAwareDialogParentEditor) |
|
21065 { |
|
21066 ClearExtendedFlag(EExtendedFlagEdwinEditorDestroyed); |
|
21067 } |
|
21068 } |
|
21069 |
|
21070 void CAknFepManager::PrepareFepForFepAwareDialogLaunch() |
|
21071 { |
|
21072 iFepAwareDialogParentEditor = EditorState(); |
|
21073 SetExtendedFlag(EExtendedFlagFepAwareDialogLaunched); |
|
21074 } |
|
21075 |
|
21076 void CAknFepManager::PrepareFepAfterFepAwareDialogExitL(TUid aFepUid) |
|
21077 { |
|
21078 // This ensures that on 3rd party fep change we do not have access to other fep variables |
|
21079 if (aFepUid != CCoeEnv::Static()->FepUid()) |
|
21080 { |
|
21081 // In case the fep has changed, then leave |
|
21082 User::Leave(KErrNone); |
|
21083 } |
|
21084 iFepAwareDialogParentEditor = NULL; |
|
21085 ClearExtendedFlag(EExtendedFlagFepAwareDialogLaunched); |
|
21086 } |
|
21087 |
|
21088 void CAknFepManager::ConvertCharToKey(TChar aChar, TUint16& aKey) const |
|
21089 { |
|
21090 aKey = 0; |
|
21091 |
|
21092 if (!iPtiEngine) |
|
21093 return; |
|
21094 |
|
21095 CPtiCoreLanguage* lang = static_cast<CPtiCoreLanguage*>( iPtiEngine->CurrentLanguage() ); |
|
21096 if (!lang) |
|
21097 return; |
|
21098 |
|
21099 const TBool vietnamese = (iLanguageCapabilities.iInputLanguageCode == ELangVietnamese); |
|
21100 |
|
21101 MPtiKeyMappings* map; |
|
21102 TPtiKeyboardType keyboardLayout = KeyboardLayout(); |
|
21103 if ( keyboardLayout == EPtiKeyboardQwerty4x12 |
|
21104 || keyboardLayout == EPtiKeyboardQwerty4x10 |
|
21105 || keyboardLayout == EPtiKeyboardQwerty3x11 |
|
21106 || keyboardLayout == EPtiKeyboardCustomQwerty ) |
|
21107 { |
|
21108 map = lang->GetQwertyKeymappings(); |
|
21109 } |
|
21110 else if( keyboardLayout == EPtiKeyboardHalfQwerty ) |
|
21111 { |
|
21112 map = lang->GetHalfQwertyKeymappings(); |
|
21113 } |
|
21114 else |
|
21115 { |
|
21116 map = lang->GetKeymappings(); |
|
21117 } |
|
21118 |
|
21119 if (!map) |
|
21120 { |
|
21121 return; |
|
21122 } |
|
21123 |
|
21124 TUint16 ch; |
|
21125 ch = (TUint16)map->KeyForCharacter(aChar); |
|
21126 if ( !ch && vietnamese |
|
21127 && !( iFepPluginManager && iFepPluginManager->IsSupportITIOnFSQ() ) ) |
|
21128 { |
|
21129 // This may be Vietnamese tone mark or an accented character which isn't listed |
|
21130 // in keymappings. |
|
21131 ch = RemapVietnameseAccentedCharacter(aChar); |
|
21132 } |
|
21133 |
|
21134 aKey = ch; |
|
21135 } |
|
21136 |
|
21137 TBool CAknFepManager::GetSctLengthL(TInt resourceId)const |
|
21138 { |
|
21139 CCoeEnv* coeEnv = CCoeEnv::Static(); |
|
21140 TResourceReader reader; |
|
21141 CEikonEnv::Static()->CreateResourceReaderLC(reader,resourceId); |
|
21142 TInt component_count=reader.ReadInt16(); |
|
21143 TInt length = 0; |
|
21144 TBool isEmpty = ETrue; |
|
21145 HBufC* sctChar = NULL; |
|
21146 |
|
21147 for (TInt ii=0;ii<component_count;ii++) |
|
21148 { |
|
21149 TInt component_id=reader.ReadInt16(); |
|
21150 switch(component_id) |
|
21151 { |
|
21152 case EAknSCTLowerCase: |
|
21153 { |
|
21154 sctChar = reader.ReadHBufCL(); |
|
21155 length += (sctChar != NULL)? sctChar->Length(): 0; |
|
21156 break; |
|
21157 } |
|
21158 case EAknSCTUpperCase: |
|
21159 { |
|
21160 sctChar = reader.ReadHBufCL(); |
|
21161 length += (sctChar != NULL)? sctChar->Length(): 0; |
|
21162 break; |
|
21163 } |
|
21164 case EAknSCTNumeric: |
|
21165 { |
|
21166 sctChar = reader.ReadHBufCL(); |
|
21167 length += (sctChar != NULL)? sctChar->Length(): 0; |
|
21168 break; |
|
21169 } |
|
21170 case EAknSCTFullCase: |
|
21171 { |
|
21172 sctChar = reader.ReadHBufCL(); |
|
21173 length += (sctChar != NULL)? sctChar->Length(): 0; |
|
21174 break; |
|
21175 } |
|
21176 case EAknSCTHalfCase: |
|
21177 { |
|
21178 sctChar = reader.ReadHBufCL(); |
|
21179 length += (sctChar != NULL)? sctChar->Length(): 0; |
|
21180 break; |
|
21181 } |
|
21182 case EAknSCTQwerty: |
|
21183 { |
|
21184 sctChar = reader.ReadHBufCL(); |
|
21185 length += (sctChar != NULL)? sctChar->Length(): 0; |
|
21186 break; |
|
21187 } |
|
21188 default: |
|
21189 break; |
|
21190 } |
|
21191 delete sctChar; |
|
21192 sctChar = NULL; |
|
21193 if(length > 0) |
|
21194 { |
|
21195 isEmpty = EFalse; |
|
21196 break; |
|
21197 } |
|
21198 } |
|
21199 CleanupStack::PopAndDestroy(); //reader |
|
21200 return isEmpty; |
|
21201 } |
|
21202 |
|
21203 // ======================================== |
|
21204 // Update Editor State Flag |
|
21205 // Add editor state flags or |
|
21206 // Remove editor state flags |
|
21207 // ======================================== |
|
21208 void CAknFepManager::UpdateEditorStateFlags( TInt aFlag, TBool aAdd ) const |
|
21209 { |
|
21210 CAknEdwinState* state( EditorState() ); |
|
21211 if ( state ) |
|
21212 { |
|
21213 TInt flags( state->Flags() ); |
|
21214 if ( aAdd ) |
|
21215 { |
|
21216 flags |= aFlag; // Add flag |
|
21217 } |
|
21218 else |
|
21219 { |
|
21220 flags &= ~aFlag; // Remove flag |
|
21221 } |
|
21222 state->SetFlags( flags ); |
|
21223 } |
|
21224 } |
|
21225 |
|
21226 |
|
21227 // --------------------------------------------------------------------------- |
|
21228 // CAknFepManager::HandleFnKeyPressMonitorCallback |
|
21229 // Handle fnkey press monitor callback |
|
21230 // static function |
|
21231 // --------------------------------------------------------------------------- |
|
21232 // |
|
21233 TInt CAknFepManager::HandleFnKeyPressMonitorCallback(TAny* aObj) |
|
21234 { |
|
21235 TRAPD(err, static_cast<CAknFepManager*>(aObj)->HandleFnKeyPressMonitor()); |
|
21236 if (err) |
|
21237 { |
|
21238 static_cast<CAknFepManager*>(aObj)->CleanUpFep(); |
|
21239 return KErrDied; |
|
21240 } |
|
21241 return KErrNone; |
|
21242 } |
|
21243 |
|
21244 // --------------------------------------------------------------------------- |
|
21245 // CAknFepManager::HandleFnKeyPressMonitor |
|
21246 // Handle fnkey press monitor callback |
|
21247 // --------------------------------------------------------------------------- |
|
21248 // |
|
21249 void CAknFepManager::HandleFnKeyPressMonitor() |
|
21250 { |
|
21251 DeactivateFnkeyPressMonitor(); |
|
21252 |
|
21253 //if previous state of fn key is EFnKeyNone or EFnKeyNext, EFnKeyLock will be set; |
|
21254 //otherwise, if previous state is EFnKeyLock, EFnKeyNone will be set. |
|
21255 switch(iFnKeyManager->FnKeyState()) |
|
21256 { |
|
21257 case CAknFepFnKeyManager::EFnKeyPressed: |
|
21258 case CAknFepFnKeyManager::EFnKeyPressedAgain: |
|
21259 iFnKeyManager->SetFnKeyState(CAknFepFnKeyManager::EFnKeyLock); |
|
21260 break; |
|
21261 case CAknFepFnKeyManager::EFnKeyDown: |
|
21262 iFnKeyManager->SetFnKeyState(CAknFepFnKeyManager::EFnKeyNone); |
|
21263 break; |
|
21264 default: |
|
21265 break; |
|
21266 } |
|
21267 } |
|
21268 |
|
21269 // --------------------------------------------------------------------------- |
|
21270 // CAknFepManager::ActivateFnkeyPressMonitor |
|
21271 // Activate Fnkey press Monitor |
|
21272 // --------------------------------------------------------------------------- |
|
21273 // |
|
21274 void CAknFepManager::ActivateFnkeyPressMonitor() |
|
21275 { |
|
21276 if( iFnKeypressMonitor ) |
|
21277 { |
|
21278 iFnKeypressMonitor->Start(KFnKeyLongPressTimeout, KFnKeyLongPressTimeout, |
|
21279 TCallBack(HandleFnKeyPressMonitorCallback, this)); |
|
21280 } |
|
21281 } |
|
21282 |
|
21283 // --------------------------------------------------------------------------- |
|
21284 // CAknFepManager::DeactivateFnkeyPressMonitor |
|
21285 // Deactivate Fnkey press Monitor |
|
21286 // --------------------------------------------------------------------------- |
|
21287 // |
|
21288 void CAknFepManager::DeactivateFnkeyPressMonitor() |
|
21289 { |
|
21290 if( iFnKeypressMonitor && iFnKeypressMonitor->IsActive()) |
|
21291 { |
|
21292 iFnKeypressMonitor->Cancel(); |
|
21293 } |
|
21294 } |
|
21295 |
|
21296 // --------------------------------------------------------------------------- |
|
21297 // LOCAL METHODS |
|
21298 // |
|
21299 // --------------------------------------------------------------------------- |
|
21300 // |
|
21301 const TInt KVietKeyMarker = 0xffff; |
|
21302 const TUint16 vietnameseAccents[] = |
|
21303 { |
|
21304 KVietKeyMarker, EPtiKey2, // For key 2, a-based |
|
21305 0x00c1, 0x00c0, 0x1ea2, 0x00c3, 0x1ea0, |
|
21306 0x00e1, 0x00e0, 0x1ea3, 0x00e3, 0x1ea1, |
|
21307 0x0102, 0x1eae, 0x1eb0, 0x1eb2, 0x1eb4, 0x1eb6, |
|
21308 0x0103, 0x1eaf, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eb7, |
|
21309 0x00c2, 0x1ea4, 0x1ea6, 0x1ea8, 0x1eaa, 0x1eac, |
|
21310 0x00e2, 0x1ea5, 0x1ea7, 0x1ea9, 0x1eab, 0x1ead, |
|
21311 |
|
21312 KVietKeyMarker, EPtiKey3, // For key 3, e-based |
|
21313 0x00c9, 0x00c8, 0x1eba, 0x1ebc, 0x1eb8, |
|
21314 0x00e9, 0x00e8, 0x1ebb, 0x1ebd, 0x1eb9, |
|
21315 0x00ca, 0x1ebe, 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6, |
|
21316 0x00ea, 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7, |
|
21317 |
|
21318 KVietKeyMarker, EPtiKey4, // For key 4, i-based |
|
21319 0x00cd, 0x00cc, 0x1ec8, 0x0128, 0x1eca, |
|
21320 0x00ed, 0x00ec, 0x1ec9, 0x0129, 0x1ecb, |
|
21321 |
|
21322 KVietKeyMarker, EPtiKey6, // For key 6, o-based |
|
21323 0x00d3, 0x00d2, 0x1ece, 0x00d5, 0x1ecc, |
|
21324 0x00f3, 0x00f2, 0x1ecf, 0x00f5, 0x1ecd, |
|
21325 0x00d4, 0x1ed0, 0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8, |
|
21326 0x00f4, 0x1ed1, 0x1ed3, 0x1ed5, 0x1ed7, 0x1ed9, |
|
21327 0x01a0, 0x1eda, 0x1edc, 0x1ede, 0x1ee0, 0x1ee2, |
|
21328 0x01a1, 0x1edb, 0x1edd, 0x1edf, 0x1ee1, 0x1ee3, |
|
21329 0 |
|
21330 }; |
|
21331 |
|
21332 |
|
21333 // --------------------------------------------------------------------------- |
|
21334 // RemapVietnameseAccentedCharacter |
|
21335 // |
|
21336 // --------------------------------------------------------------------------- |
|
21337 // |
|
21338 LOCAL_C TInt RemapVietnameseAccentedCharacter(TUint16 aChr) |
|
21339 { |
|
21340 // Check tone marks first. |
|
21341 switch (aChr) |
|
21342 { |
|
21343 case 0x0301: |
|
21344 return EPtiKey2; |
|
21345 case 0x0300: |
|
21346 return EPtiKey3; |
|
21347 case 0x0309: |
|
21348 return EPtiKey4; |
|
21349 case 0x0303: |
|
21350 return EPtiKey5; |
|
21351 case 0x0323: |
|
21352 return EPtiKey6; |
|
21353 default: |
|
21354 break; |
|
21355 } |
|
21356 |
|
21357 TInt ret = 0; |
|
21358 |
|
21359 for (const TUint16* ptr = vietnameseAccents; *ptr != 0; ptr++) |
|
21360 { |
|
21361 if (*ptr == KVietKeyMarker) |
|
21362 { |
|
21363 ret = ptr[1]; |
|
21364 ptr++; |
|
21365 } |
|
21366 else |
|
21367 { |
|
21368 if (*ptr == aChr) |
|
21369 { |
|
21370 break; |
|
21371 } |
|
21372 } |
|
21373 } |
|
21374 |
|
21375 return ret; |
|
21376 } |
|
21377 |
|
21378 // End of file |