diff -r ebd48d2de13c -r ecbabf52600f textinput/GSLangPlugin/src/GSLangPlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/GSLangPlugin/src/GSLangPlugin.cpp Wed Sep 01 12:23:33 2010 +0100 @@ -0,0 +1,1878 @@ +/* +* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0"" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: GSLangPlugin implementation. +* +*/ + + +// Includes +#include "GSLangPlugin.h" +#include "GSLangContainer.h" +#include "GSLangModel.h" +#include +#include +#include +#include + +#include +#include // EPinyin +#include +#include +#include +#include +#include +#include +#include +#include +#include // HlpLauncher +#include +#include +#include +#include // Display UI language +#include +#include +#include +#ifdef RD_INTELLIGENT_TEXT_INPUT +#include "PredictiveSettingDialog.h" +#include +#include +#ifdef FF_DUAL_LANGUAGE_SUPPORT +#include "DualLanguageDialog.h" +#endif +#include //CAknNoteDialog +#include +#endif +#include + +#ifndef RD_STARTUP_CHANGE + #include // Startup reasons +#else + #include // Startup reasons +#endif // RD_STARTUP_CHANGE + +// Constants + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CGSLangPlugin::CGSLangPlugin() +// Constructor +// +// --------------------------------------------------------------------------- +// +CGSLangPlugin::CGSLangPlugin(): + iCascadeOptionsOpen(EFalse), + iDialog(NULL) + { + } + + +// --------------------------------------------------------------------------- +// CGSLangPlugin::~CGSLangPlugin() +// Destructor +// +// --------------------------------------------------------------------------- +// +CGSLangPlugin::~CGSLangPlugin() + { + FeatureManager::UnInitializeLib(); + if( iContainer ) + { + AppUi()->RemoveFromViewStack( *this, iContainer ); + delete iContainer; + } + if(iDialog) + { + delete iDialog; + } + +#ifdef RD_INTELLIGENT_TEXT_INPUT +#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__ + if (iKeyboardLayoutStatusSubscriber) + { + iKeyboardLayoutStatusSubscriber->StopSubscribe(); + } + iKeyboardLayoutStatusProperty.Close(); + delete iKeyboardLayoutStatusSubscriber; +#endif +#endif + } + + +// --------------------------------------------------------------------------- +// CGSLangPlugin::ConstructL(const TRect& aRect) +// Symbian OS two-phased constructor +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CGSLangPlugin::ConstructL() + { + FeatureManager::InitializeLibL(); + OpenLocalizedResourceFileL( KGSLangPluginResourceFileName, + iResourceLoader ); + BaseConstructL( R_GS_LANG_VIEW ); + +#ifdef RD_INTELLIGENT_TEXT_INPUT +#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__ + //Attach the P&S property to the keyboardlayout and subscribe to the P&S framework + // for any keyboard layout change. + User::LeaveIfError(iKeyboardLayoutStatusProperty.Attach(KCRUidAvkon, KAknKeyBoardLayout)); + iKeyboardLayoutStatusSubscriber = new (ELeave) CSubscriber( + TCallBack(HandleKeyboardLayoutChangeNotification, this), + iKeyboardLayoutStatusProperty); + iKeyboardLayoutStatusSubscriber->SubscribeL(); +#endif +#endif + } + + +// --------------------------------------------------------------------------- +// CGSLangPlugin::NewL() +// Static constructor +// +// --------------------------------------------------------------------------- +// +CGSLangPlugin* CGSLangPlugin::NewL( TAny* /*aInitParams*/ ) + { + CGSLangPlugin* self = new(ELeave) CGSLangPlugin(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::Id +// +// +// ----------------------------------------------------------------------------- +// +TUid CGSLangPlugin::Id() const + { + return KGSLangPluginUID; + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::HandleClientRectChange +// +// +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::HandleClientRectChange() + { + if ( iContainer ) + { + iContainer->SetRect( ClientRect() ); + } + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::DoActivateL +// +// +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::DoActivateL( const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage ) + { + CGSBaseView::DoActivateL( aPrevViewId, aCustomMessageId, aCustomMessage ); + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::DoDeactivate +// +// +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::DoDeactivate() + { + CGSBaseView::DoDeactivate(); + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::HandleCommandL +// +// +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::HandleCommandL( TInt aCommand ) + { + switch ( aCommand ) + { + case EGSMSKCmdAppChange: + HandleListBoxSelectionL(); + break; + case EGSCmdAppChange: + if ( Container()->CurrentFeatureId() == EGSLangIdT9L ) + { +#ifdef RD_INTELLIGENT_TEXT_INPUT + // Launch Predictive mode setting page if >1 keyboards available on device + // Otherwise just change the setting value for the only keyboard + ShowITIMultiSettingPageL(ETrue); +#else + // If EGSLangIdT9L is selected, change T9 + // setting using setting page. + Container()->Model()->ChangePredictiveOnOffSettingL( + ETrue, + CGSLangModel::EGSLangOther ); +#endif + } + else if( Container()->CurrentFeatureId() == EGSLangIdEPT ) + { + // If EGSLangIdEPT is selected, change T9 + // setting using setting page. + Container()->Model()->ChangePredictiveOnOffSettingL( + ETrue, + CGSLangModel::EGSLangOther ); + } + else if( Container()->CurrentFeatureId() == EGSLangIdJPT ) + { + Container()->Model()->ChangePredictiveOnOffSettingL( + ETrue, + CGSLangModel::EGSLangJapanese ); + } + else if( Container()->CurrentFeatureId() == EGSLangIdJQC ) + { + ChangeJapQwertySettingL( EGSJapQwertyFlagComma, + EGSLangIdJQC, ETrue ); + } + else if( Container()->CurrentFeatureId() == EGSLangIdJQP ) + { + ChangeJapQwertySettingL( EGSJapQwertyFlagPeriod, + EGSLangIdJQP, ETrue ); + } + else if( Container()->CurrentFeatureId() == EGSLangIdJQWSP ) + { + ChangeJapQwertySettingL( EGSJapQwertyFlagSpaceFullWidth, + EGSLangIdJQWSP, ETrue ); + } + else if ( Container()->CurrentFeatureId() == EGSLangIdPredictiveMode ) + { +#ifndef RD_INTELLIGENT_TEXT_INPUT + if( Container()->Model()->CheckAutoWordCompletionSupportL() ) + { + ShowPredictiveModeSettingPageL( ETrue ); + } +#endif + } +#ifdef RD_INTELLIGENT_TEXT_INPUT + else if ( Container()->CurrentFeatureId() == EGSLangIdPredictiveOptions ) + { + // Show full ITI predictive settings list + ShowPredictiveSettingListL(); + } +#endif // RD_INTELLIGENT_TEXT_INPUT + else + { + HandleListBoxSelectionL(); + } + break; + case EAknSoftkeyBack: + //In 5.0 "Language" settings were moved from Psln to Device view + #ifdef RD_CONTROL_PANEL //For S60 5.0 + AppUi()->ActivateLocalViewL( KGSGenPluginUid ); + #else //RD_CONTROL_PANEL + AppUi()->ActivateLocalViewL( KGSPrslnPluginUid ); + #endif //RD_CONTROL_PANEL + break; + case EAknCmdHelp: + { + if( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + HlpLauncher::LaunchHelpApplicationL( + iEikonEnv->WsSession(), AppUi()->AppHelpContextL() ); + } + break; + } + default: + AppUi()->HandleCommandL( aCommand ); + break; + } + } + +// ========================= From CGSPluginInterface ================== + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::GetCaptionL +// +// +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::GetCaptionL( TDes& aCaption ) const + { + HBufC* result = StringLoader::LoadL( R_GS_LANG_PLUGIN_CAPTION ); + aCaption.Copy( *result ); + delete result; + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::PluginProviderCategory +// +// +// ----------------------------------------------------------------------------- +// +TInt CGSLangPlugin::PluginProviderCategory() const + { + //This plugin is created by 3rd party. + return KGSPluginProviderInternal; + } + +// ========================= From CGSBaseView ================== + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::NewContainerL +// +// +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::NewContainerL() + { + iContainer = new(ELeave) CGSLangContainer; + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::HandleListBoxSelectionL +// +// +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::HandleListBoxSelectionL() + { + const TInt currentFeatureId = Container()->CurrentFeatureId(); + + switch ( currentFeatureId ) + { + case EGSLangIdDTL: + ShowLanguageSelectionSettingPageL(); + break; + case EGSLangIdITL: + +#ifdef RD_INTELLIGENT_TEXT_INPUT +#ifdef FF_DUAL_LANGUAGE_SUPPORT + TInt keyboardLayout = 0; + RProperty::Get(KCRUidAvkon, KAknKeyBoardLayout, keyboardLayout); + TPtiKeyboardType layout = (TPtiKeyboardType)keyboardLayout; + // Currently dual language feature would work correctly for ITUT and Half Qwerty products + // Hence the dual language settings should also be displayed only for ITUT and Halfqwerty products + if(layout == EPtiKeyboard12Key || layout == EPtiKeyboardHalfQwerty ) + { + // Show Dual language selection setting list + /* In Chinese/Japanese language variant,if there are more than one languages supporting dual language feature, + display writing language setting view in which Primary and Secondary Languages can be selected from the list. + + In Chinese language variant,if there is only one language supporting dual language feature, + no need to display the Writing language view which contains Primary and Secondary Language. + Instead we can display the Writing language list directly to the user;from which the user can select the writing language*/ + if ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) || FeatureManager::FeatureSupported( KFeatureIdChinese ) ) + { + CPtiEngine* ptiEngine = CPtiEngine::NewL(); + CleanupStack::PushL( ptiEngine ); + CArrayFixFlat* languages = new( ELeave )CArrayFixFlat( 10 ); + CleanupStack::PushL( languages ); + ptiEngine->GetAvailableLanguagesL( languages ); + + TInt count = languages->Count(); + TInt noLangSupportWesternPred = count; + + for (TInt index = 0; index < count; index++) + { + const TInt langCode = languages->At(index); + if (langCode == ELangTaiwanChinese || + langCode == ELangHongKongChinese || + langCode == ELangPrcChinese || + langCode == ELangJapanese || + langCode == ELangKorean ) + { + noLangSupportWesternPred--; + } + } + + CleanupStack::PopAndDestroy(languages); + CleanupStack::PopAndDestroy(ptiEngine); + + if( noLangSupportWesternPred > 1 ) + { + ShowDualInputLanguageSettingListL(); + } + else + ShowInputSelectionSettingPageL(); + } + else + ShowDualInputLanguageSettingListL(); + } + else + ShowInputSelectionSettingPageL(); +#else //FF_DUAL_LANGUAGE_SUPPORT + ShowInputSelectionSettingPageL(); +#endif //FF_DUAL_LANGUAGE_SUPPORT +#else //RD_INTELLIGENT_TEXT_INPUT + ShowInputSelectionSettingPageL(); +#endif //RD_INTELLIGENT_TEXT_INPUT + break; + case EGSLangAHNumberMode: + if( iElaf ) + { + ShowAHNumberModeSettingPageL(); + } + break; + case EGSLangHindiNumberMode: + ShowHindiNumberModeSettingPageL(); + break; + case EGSLangIdT9L: + if ( !FeatureManager::FeatureSupported( KFeatureIdJapanese ) ) + { +#ifdef RD_INTELLIGENT_TEXT_INPUT + // Launch Predictive mode setting page if >1 keyboards available on device + // Otherwise just change the setting value for the only keyboard + TInt keyboardLayout = 0; + RProperty::Get(KCRUidAvkon, KAknKeyBoardLayout, keyboardLayout); + TPtiKeyboardType layout = (TPtiKeyboardType)keyboardLayout; + TBool isPredictionSupport = EFalse; + switch(layout) + { + case EPtiKeyboardHalfQwerty: + isPredictionSupport = Container()->Model()->CheckT9FromPtiLForPredictionL((TPtiEngineInputMode)EPtiEngineHalfQwertyPredictive); + break; + case EPtiKeyboardQwerty4x12: + case EPtiKeyboardQwerty4x10: + case EPtiKeyboardQwerty3x11: + case EPtiKeyboardCustomQwerty: + isPredictionSupport = Container()->Model()->CheckT9FromPtiLForPredictionL((TPtiEngineInputMode)EPtiEngineQwertyPredictive); + break; + case EPtiKeyboardNone: + case EPtiKeyboard12Key: + isPredictionSupport = Container()->Model()->CheckT9FromPtiLForPredictionL((TPtiEngineInputMode)EPtiEnginePredictive); + break; + default: + isPredictionSupport = Container()->Model()->CheckT9FromPtiLForPredictionL((TPtiEngineInputMode)EPtiEnginePredictive); + break; + } + if (isPredictionSupport) + ShowITIMultiSettingPageL(EFalse); +#else + //change setting without opening the setting page + Container()->Model()->ChangePredictiveOnOffSettingL( + EFalse, + CGSLangModel::EGSLangOther ); +#endif + } + break; + case EGSLangIdEPT: + if ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) ) + { + Container()->Model()->ChangePredictiveOnOffSettingL( + EFalse, + CGSLangModel::EGSLangOther ); + } + break; + case EGSLangIdResetAtokDict: + if ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) ) + { + ResetATOKDictionaryL(); + } + break; + case EGSLangIdJPT: + if ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) ) + { + Container()->Model()->ChangePredictiveOnOffSettingL( + EFalse, + CGSLangModel::EGSLangJapanese ); + } + break; + case EGSLangIdKT: + if ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) ) + { + ShowKeypressTimeoutSettingPageL(); + } + break; + case EGSLangIdJQC: + if ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) && + FeatureManager::FeatureSupported( KFeatureIdQwertyInput ) ) + { + ChangeJapQwertySettingL( EGSJapQwertyFlagComma, + currentFeatureId, EFalse ); + } + break; + case EGSLangIdJQP: + if ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) && + FeatureManager::FeatureSupported( KFeatureIdQwertyInput ) ) + { + ChangeJapQwertySettingL( EGSJapQwertyFlagPeriod, + currentFeatureId, EFalse ); + } + break; + case EGSLangIdJQWSP: + if ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) && + FeatureManager::FeatureSupported( KFeatureIdQwertyInput ) ) + { + ChangeJapQwertySettingL( EGSJapQwertyFlagSpaceFullWidth, + currentFeatureId, EFalse ); + } + break; + case EGSLangIdDIM: + if ( FeatureManager::FeatureSupported( KFeatureIdChinese ) ) + { + ShowDefaultInputMethodSettingPageL(); + } + break; + case EGSLangIdCangJie: + if ( FeatureManager::FeatureSupported( KFeatureIdChinese ) && + Container()->Model()->DefaultInputMethodL() == ECangJie ) + { + ShowChiCangJieInputModeSettingPageL(); + } + break; + case EGSLangIdPredictiveMode: +#ifndef RD_INTELLIGENT_TEXT_INPUT + if( Container()->Model()->CheckAutoWordCompletionSupportL() ) + { + ShowPredictiveModeSettingPageL( EFalse ); + } +#endif + break; +#ifdef RD_INTELLIGENT_TEXT_INPUT + case EGSLangIdPredictiveOptions: + // Show full ITI predictive settings list + ShowPredictiveSettingListL(); + break; +#endif + default: + break; + } + } + +// ========================= New ====================================== + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::CGSLangPlugin +// +// +// ----------------------------------------------------------------------------- +// +CGSLangContainer* CGSLangPlugin::Container() + { + CGSLangContainer* container = static_cast( iContainer ); + return container; + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::ShowLanguageSelectionSettingPageL +// +// +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::ShowLanguageSelectionSettingPageL() + { + // If the setting page has a list create array which contains all + // the items of the list in the setting page: + + // Set up UI language arrays + CArrayFixFlat* systemEpocLanguageCodes = 0; + // This creates the list itself + User::LeaveIfError( SysLangUtil::GetInstalledLanguages( + systemEpocLanguageCodes ) ); + CleanupStack::PushL( systemEpocLanguageCodes ); + + CArrayFixFlat* dtlanguages = new(ELeave)CArrayFixFlat(4); + CleanupStack::PushL( dtlanguages ); + // Append "automatic" language into dtitems array + dtlanguages->AppendL( 0 ); + // and get text for automatic from resource... + CDesCArrayFlat* dtitems = iCoeEnv->ReadDesC16ArrayResourceL( + R_DISPLAY_TEXT_LANGUAGE_SETTING_PAGE_LBX ); + CleanupStack::PushL( dtitems ); + + Container()->Model()->GetLanguagesFromPtiL( + systemEpocLanguageCodes, + dtlanguages, dtitems ); + + TInt count = dtlanguages->Count(); + TInt currentItem = 0; // default value is Automatic + + //fetch the current value from model: + TInt uiLanguage = Container()->Model()->LanguageL( CGSLangModel::EGSUiLanguage ); + + // find the match epoc language code and set to UI array + TInt i=0; + for ( ; i < count; i++ ) + { + if ( ( *dtlanguages )[i] == uiLanguage ) + { + currentItem = i; + break; + } + } + // create setting page: + TInt oldItem = currentItem; + CAknSettingPage* dlg = + new( ELeave ) CAknRadioButtonSettingPage( + R_DISPLAY_TEXT_LANGUAGE_SETTING_PAGE, + currentItem, dtitems ); + + // Execute the setting page and check if the setting value was changed: + if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) ) + { + if ( oldItem != currentItem ) + { + // Check if there is enough space in disk + if ( Container()->Model()->CheckDiskSpaceL() ) + { + // Show information note + HBufC* prompt = iCoeEnv->AllocReadResourceLC( R_GS_NOT_ENOUGH_MEMORY ); + + CAknInformationNote* note = + new( ELeave ) CAknInformationNote( ETrue ); + note->ExecuteLD( *prompt ); + + CleanupStack::PopAndDestroy( prompt ); + } + else + { + ConfirmRebootDTLL( ( *dtlanguages )[ currentItem ], + ( *dtitems )[ currentItem ] ); + } + } + } + // Delete items: + //dtitems, dtlanguages & systemEpocLanguageCodes + CleanupStack::PopAndDestroy(3); + + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::ShowInputSelectionSettingPageL +// +// +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::ShowInputSelectionSettingPageL() + { + // If the setting page has a list create array which contains all + // the items of the list in the setting page: + + //some dummy size of 10 + CArrayFixFlat* languages = + new( ELeave )CArrayFixFlat(10); + CleanupStack::PushL( languages ); + + //some dummy size of 10 + CDesCArrayFlat* items = new( ELeave )CDesCArrayFlat(10); + CleanupStack::PushL( items ); + + Container()->Model()->GetLanguagesFromPtiL( NULL, + languages, items ); + TInt i; + TInt currentItem = 0; + + //fetch the current value from model: + // current item is the decimal value of T9 language code from shared data + TInt currentInputLanguage = + Container()->Model()->LanguageL( CGSLangModel::EGSInputLanguage ); + + // total sum of available T9 dictionaries + TInt count = languages->Count(); + + // compare sharedata languageCode with PtiLanguageCode array + // Ptilanguage <-> listindex converter + + for ( i=0;iModel()->LanguageL( CGSLangModel::EGSInputLanguage ); + // Execute the setting page and check if the setting value was changed: + if ( dlg->ExecuteLD(CAknSettingPage::EUpdateWhenChanged ) ) + { + //if the value was changed set the value to model + Container()->Model()->SetLanguageL( CGSLangModel::EGSInputLanguage, + ( *languages )[ currentItem ] ); + //inform all other apps about language change. + TWsEvent event; + event.SetType( KEikInputLanguageChange ); + iEikonEnv->WsSession().SendEventToAllWindowGroups( event ); + + //if updated + if ( previous != + Container()->Model()->LanguageL( CGSLangModel::EGSInputLanguage ) ) + { + //Update setting list: + Container()->UpdateListBoxL( EGSLangIdITL ); + Container()->UpdateListBoxL( EGSLangIdT9L ); + Container()->UpdateListBoxL( EGSLangIdPredictiveMode ); + } + TInt current = Container()->Model()->LanguageL( CGSLangModel::EGSInputLanguage ); + + if ( ( (current == ELangPrcChinese || current == ELangHongKongChinese + || current == ELangTaiwanChinese) && previous != current) + || ( (current != ELangPrcChinese || current != ELangHongKongChinese ) + && previous != current) ) + { + if (current == ELangPrcChinese ) + { + Container()->Model()->SetDefaultInputMethodL( EPinyin ); + } + else if ( current == ELangHongKongChinese ) + { + Container()->Model()->SetDefaultInputMethodL( EStroke ); + } + else if ( current == ELangTaiwanChinese ) + { + Container()->Model()->SetDefaultInputMethodL( EZhuyin ); + } + Container()->UpdateListBoxL( EGSLangIdDIM ); + } + } + // Delete items: + CleanupStack::PopAndDestroy(2); // items and languages + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::ShowDefaultInputMethodSettingPageL +// +// +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::ShowDefaultInputMethodSettingPageL() + { + // If the setting page has a list create array which contains all + // the items of the list in the setting page: + + // Find correct Language resource among PRC, HK and TW. + TInt resId = 0; + TInt lang = Container()->Model()->LanguageL( CGSLangModel::EGSInputLanguage ); + + if ( FeatureManager::FeatureSupported( KFeatureIdQwertyInput ) + || (FeatureManager::FeatureSupported(KFeatureIdVirtualKeyboardInput) && + FeatureManager::FeatureSupported(KFeatureIdChinese))) + { + resId = R_DIM_QWERTY_SETTING_PAGE_LBX; + } + else + { + resId = R_DIM_SETTING_PAGE_LBX; + } + + TInt keyboardLayout = 0; + RProperty::Get(KCRUidAvkon, KAknKeyBoardLayout, keyboardLayout); + TPtiKeyboardType layout = (TPtiKeyboardType)keyboardLayout; + + // Get the static items here + CGSRadioButtonSettingPageItemTextArray* items = + CGSRadioButtonSettingPageItemTextArray::NewL( resId, *iCoeEnv, NULL ); + + + CleanupStack::PushL(items); + + TBool isCangjieSupported = EFalse; + + + switch( lang ) + { + case ELangPrcChinese: + if ( FeatureManager::FeatureSupported( KFeatureIdQwertyInput ) + || FeatureManager::FeatureSupported(KFeatureIdVirtualKeyboardInput)) + { + items->SetItemVisibilityL( EGSLangSPIdQwPinyin, + CGSListBoxItemTextArray::EVisible ); + } + else + { + items->SetItemVisibilityL( EGSLangSPIdPinyin, + CGSListBoxItemTextArray::EVisible ); + } + break; + case ELangHongKongChinese: + if ( FeatureManager::FeatureSupported( KFeatureIdQwertyInput ) + || FeatureManager::FeatureSupported(KFeatureIdVirtualKeyboardInput)) + { + if(!(layout == EPtiKeyboard12Key || layout == EPtiKeyboardHalfQwerty)) + { + isCangjieSupported = ETrue; + } + if ( Container()->Model()->CheckCangjieSupportL( ELangHongKongChinese ) && isCangjieSupported ) + { + + //Cangjie input mode is only valid for QWERTY input and Virtual keyboard Input + //Putting condition for 12 key and half QWERTY keyboard layout. + + items->SetItemVisibilityL( EGSLangSPIdQwCangJie, + CGSListBoxItemTextArray::EVisible ); + + + } + } + break; + case ELangTaiwanChinese: + if ( FeatureManager::FeatureSupported( KFeatureIdQwertyInput ) + || FeatureManager::FeatureSupported(KFeatureIdVirtualKeyboardInput)) + { + items->SetItemVisibilityL( EGSLangSPIdQwZhuyin, + CGSListBoxItemTextArray::EVisible ); + } + else + { + items->SetItemVisibilityL( EGSLangSPIdZhuyin, + CGSListBoxItemTextArray::EVisible ); + } + break; + default: + break; + } + + //fetch the current value from model: + // current item is the Hexadecimal value of Input method code from CenRep + TInt oldInputMethodCode = + Container()->Model()->DefaultInputMethodL(); + TInt currentItem = 0; + + // Construct a map for PRC,HK and TW for Input Method codes + struct TMapArray { TInt iInputMethodCode; TInt index0, index1, index2; }; + //Note: The values 0, 1, 2, 3 have been used to align with the setting page indices + + TMapArray qwertyMethodMap_Cangjie[] = { + // PRC, HK, TW + { EPinyin , 0, -1, -1 }, + { EZhuyin ,-1, -1, 0 }, + { EStroke , 1, 0, 1 }, + { ECangJie ,-1, 1, -1 }, + { ELatin , 2, 2, 2 } + }; + + TMapArray qwertyMethodMap_NoCangjie[] = { + // PRC, HK, TW + { EPinyin , 0, -1, -1 }, + { EZhuyin ,-1, -1, 0 }, + { EStroke , 1, 0, 1 }, + { ECangJie ,-1, -1, -1 }, + { ELatin , 2, 1, 2 } + }; + + TMapArray itutMethodMap[] = { + // PRC, HK, TW + { EPinyin , 0, -1, -1 }, + { EZhuyin ,-1, -1, 0 }, + { EStroke , 1, 0, 1 }, + { ELatinText , 2, 1, 2 }, + { ELatinUpper , 3, 2, 3 }, + { ELatinLower , 4, 3, 4 } + }; + + TMapArray halfQwertyMethodMap[] = { + // PRC, HK, TW + { EPinyin , 0, -1, -1 }, + { EZhuyin ,-1, -1, 0 }, + { EStroke , 1, 0, 1 }, + { ECangJie ,-1, -1, -1 }, + { ELatin , 2, 1, 2 } + }; + + TInt itemsNum = KGSMapSize; + TMapArray* methodMap = NULL; + if ( layout == EPtiKeyboardHalfQwerty ) + { + methodMap = halfQwertyMethodMap; + itemsNum = sizeof( halfQwertyMethodMap ) / sizeof( TMapArray ); + } + else if ( FeatureManager::FeatureSupported( KFeatureIdQwertyInput ) + || (FeatureManager::FeatureSupported(KFeatureIdVirtualKeyboardInput) && + FeatureManager::FeatureSupported(KFeatureIdChinese))) + { + if (isCangjieSupported) + { + methodMap = qwertyMethodMap_Cangjie; + itemsNum = sizeof( qwertyMethodMap_Cangjie ) / sizeof( TMapArray ); + } + else + { + methodMap = qwertyMethodMap_NoCangjie; + itemsNum = sizeof( qwertyMethodMap_NoCangjie ) / sizeof( TMapArray ); + } + } + else + { + methodMap = itutMethodMap; + itemsNum = sizeof( itutMethodMap ) / sizeof( TMapArray ); + } + for(TInt i = 0; i < itemsNum && i < KGSMapSize; i++) + { + if (oldInputMethodCode == methodMap[i].iInputMethodCode) + { + TInt val = 0; + if ( lang == ELangPrcChinese ) { val = methodMap[i].index0; } + if ( lang == ELangHongKongChinese ) { val = methodMap[i].index1; } + if ( lang == ELangTaiwanChinese ) { val = methodMap[i].index2; } + currentItem = val; + break; + } + } + if ( currentItem == -1 ) + { + currentItem = 0; + } + + // create setting page: + CAknSettingPage* dlg =new( ELeave ) CAknRadioButtonSettingPage( + R_CH_DEFAULT_INPUT_METHOD_SETTING_PAGE, + currentItem, + items ); + + // Execute the setting page and check if the setting value was changed: + if (dlg->ExecuteLD(CAknSettingPage::EUpdateWhenChanged)) + { + TInt newInputMethodCode=EPinyin; + + for (TInt j = 0; j < itemsNum && j < KGSMapSize; j++) + { + TInt val = 0; + if ( lang == ELangPrcChinese ) { val = methodMap[j].index0; } + if ( lang == ELangHongKongChinese ) { val = methodMap[j].index1; } + if ( lang == ELangTaiwanChinese ) { val = methodMap[j].index2; } + + if ( currentItem == val ) + { + newInputMethodCode = methodMap[j].iInputMethodCode; + break; + } + } + //if the value was changed set the value to model + Container()->Model()->SetDefaultInputMethodL( newInputMethodCode ); + + //Update setting list: + Container()->UpdateListBoxL( EGSLangIdDIM ); + // If CangJie input is selected, then make the CangJie input list + // item visible in the UI. + if ( newInputMethodCode == ECangJie ) + { + Container()->UpdateListBoxL( EGSLangIdCangJie ); + } + Container()->MakeListItemVisibleL( EGSLangIdCangJie, EGSLangIdDIM ); + } + // Delete items: + CleanupStack::PopAndDestroy( items ); + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::ShowAHNumberModeSettingPageL +// +// Show A&H number mode setting page +// ----------------------------------------------------------------------------- +// +TBool CGSLangPlugin::ShowAHNumberModeSettingPageL() + { + // This updates also the iAHNumberModeItems which should be checked before + // using them. + Container()->UpdateListBoxL( EGSLangAHNumberMode ); + + TInt currentItem = + Container()->Model()->DefaultNumberMode( EGSNbrModeTypeArabic ); + + CAknRadioButtonSettingPage* dlg = new (ELeave) CAknRadioButtonSettingPage( + R_AH_NUMBER_MODE_SETTINGS_PAGE, + currentItem, + Container()->NumberModeItems( EGSNbrModeTypeArabic ) ); + + TBool ret = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ); + + // Code to obtain the visual appearance of the date. + TAknVisualDateFormat visualDateFormat; + { + TLocale locale; + visualDateFormat = + AknDateFormatUtils::MapSymbianDateFormatToVisualDateFormat( + locale.DateFormat(), NULL ); + } + + const TInt uiLang = + Container()->Model()->LanguageL( CGSLangModel::EGSUiLanguage ); + if ( ( uiLang == ELangUrdu || User::Language() == ELangUrdu ) || + ( uiLang == ELangFarsi || User::Language() == ELangFarsi) ) + { + Container()->Model()->SetDefaultNumberMode( currentItem, + EGSNbrModeTypeEasternArabic ); + } + else + { + Container()->Model()->SetDefaultNumberMode( currentItem, + EGSNbrModeTypeArabic ); + } + + // Code to set ensure the visual appearance stays stable. + TLocale locale; + TDateFormat newFormat = + AknDateFormatUtils::MapVisualDateFormatToSymbianDateFormat( + visualDateFormat, NULL ); + if ( newFormat != locale.DateFormat()) + { + locale.SetDateFormat( newFormat ); + locale.Set(); + } + + TWsEvent event; + event.SetType( KEikInputLanguageChange ); + iEikonEnv->WsSession().SendEventToAllWindowGroups( event ); + + // value should really be being updated, so update listbox + Container()->UpdateListBoxL( EGSLangAHNumberMode ); + + return ret; + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::ShowHindiNumberModeSettingPageL +// +// Show Hindi number mode setting page +// ----------------------------------------------------------------------------- +// +TBool CGSLangPlugin::ShowHindiNumberModeSettingPageL() + { + // This updates also the iHindiNumberModeItems which should be checked before + // using them. + Container()->UpdateListBoxL( EGSLangHindiNumberMode ); + + TInt currentItem = + Container()->Model()->DefaultNumberMode( EGSNbrModeTypeIndic ); + + CAknRadioButtonSettingPage* dlg = new (ELeave) CAknRadioButtonSettingPage( + R_HI_NUMBER_MODE_SETTINGS_PAGE, + currentItem, + Container()->NumberModeItems( EGSNbrModeTypeIndic ) ); + + TBool ret = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ); + + // Code to obtain the visual appearance of the date. + TAknVisualDateFormat visualDateFormat; + { + TLocale locale; + visualDateFormat = + AknDateFormatUtils::MapSymbianDateFormatToVisualDateFormat( + locale.DateFormat(), NULL ); + } + + Container()->Model()->SetDefaultNumberMode( currentItem, + EGSNbrModeTypeIndic ); + + // Code to set ensure the visual appearance stays stable. + TLocale locale; + TDateFormat newFormat = + AknDateFormatUtils::MapVisualDateFormatToSymbianDateFormat( + visualDateFormat, NULL ); + if ( newFormat != locale.DateFormat()) + { + locale.SetDateFormat( newFormat ); + locale.Set(); + } + + TWsEvent event; + event.SetType( KEikInputLanguageChange ); + iEikonEnv->WsSession().SendEventToAllWindowGroups( event ); + + // value should really be being updated, so update listbox + Container()->UpdateListBoxL( EGSLangHindiNumberMode ); + + return ret; + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::ConfirmRebootDTLL +// +// +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::ConfirmRebootDTLL( TInt aCurrentLanguage, + const TDesC& aLanguageName ) + { + //Get information of if there are open connections + TInt callState = CheckCallState(); + + // get information of whether there are open connections or not + if ( callState != EPSCTsyCallStateUninitialized && + callState != EPSCTsyCallStateNone ) + { + HBufC* prompt = iCoeEnv->AllocReadResourceLC( R_ACTIVE_CALLS ); + + CAknInformationNote* note = + new( ELeave ) CAknInformationNote( ETrue ); + + note->ExecuteLD( *prompt ); + + CleanupStack::PopAndDestroy( prompt ); + + return; + } + + // The activity starts here. + // First, show the confirmation query. + HBufC* buf = + StringLoader::LoadL(R_CONFIRM_DTL_STRING, aLanguageName, iEikonEnv ); + CleanupStack::PushL(buf); + + CAknQueryDialog* query = + new( ELeave ) CAknQueryDialog( CAknQueryDialog::ENoTone ); + query->PrepareLC( R_CONFIRM_DTL ); // pushes query to cleanupstack + query->SetPromptL( *buf ); + + TInt ret = query->RunLD(); // deletes query + + CleanupStack::PopAndDestroy( buf ); + + if ( ret ) + { + // Code to obtain the visual appearance of the date. + TAknVisualDateFormat visualDateFormat; + { + //This locale is scoped so that it does we get a totally new + //instance later on + TLocale locale; + visualDateFormat = + AknDateFormatUtils::MapSymbianDateFormatToVisualDateFormat( + locale.DateFormat(), NULL ); + } + // if the value was changed set the value to model + Container()->Model()->SetLanguageL( CGSLangModel::EGSUiLanguage, + aCurrentLanguage ); + + // Code to set ensure the visual appearance stays stable. + // Note that we force the language here because User::Language will + // not return the new language + TLocale locale; + TDateFormat newFormat = + AknDateFormatUtils::MapVisualDateFormatToSymbianDateFormat( + visualDateFormat, (TLanguage*)&aCurrentLanguage ); + if ( newFormat != locale.DateFormat() ) + { + locale.SetDateFormat( newFormat ); + locale.Set(); + } + // Update setting list: + Container()->UpdateListBoxL( EGSLangIdDTL ); + Container()->UpdateListBoxL( EGSLangIdITL ); + + //Updating default input method based on input text language + //Chinese specific feature + if ( aCurrentLanguage == ELangPrcChinese ) + { + Container()->Model()->SetDefaultInputMethodL( EPinyin ); + } + else if ( aCurrentLanguage == ELangHongKongChinese ) + { + Container()->Model()->SetDefaultInputMethodL( EStroke ); + } + else if ( aCurrentLanguage == ELangTaiwanChinese ) + { + Container()->Model()->SetDefaultInputMethodL( EZhuyin ); + } + + TInt satLanguageSelectionTime( 0 ); + RProperty::Get( KPSUidSatServer, + KSatLanguageSelectionTimeBeforeReboot, + satLanguageSelectionTime ); + + if ( 0 != satLanguageSelectionTime ) + { + User::After( satLanguageSelectionTime * 1000 ); + } + + // Reboot with Language Switch reason +#ifndef RD_STARTUP_CHANGE + SysStartup::ShutdownAndRestart( AppUi()->Application()->AppDllUid(), + ESWLangSwitch ); +#else + RStarterSession startSession; + if ( startSession.Connect() == KErrNone ) + { + startSession.Reset( RStarterSession::ELanguageSwitchReset ); + startSession.Close(); + } +#endif // RD_STARTUP_CHANGE + } + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::CheckCallState +// +// +// ----------------------------------------------------------------------------- +// +TInt CGSLangPlugin::CheckCallState() + { + TInt callState = KErrNone; + + //here are open connections or not + RProperty::Get( KPSUidCtsyCallInformation, + KCTsyCallState, + callState ); + return callState; + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::ResetATOKDictionaryL +// +// +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::ResetATOKDictionaryL() + { + HBufC* buf = StringLoader::LoadL( R_CONFIRM_RESET_ATOK_STRING, iEikonEnv ); + CleanupStack::PushL( buf ); + + CAknQueryDialog* query = + new( ELeave ) CAknQueryDialog( CAknQueryDialog::ENoTone ); + query->PrepareLC( R_CONFIRM_RESET_ATOK ); + query->SetPromptL( *buf ); + + TInt ret = query->RunLD(); // deletes query + CleanupStack::PopAndDestroy( buf ); + + if ( ret ) + { + CPtiEngine* ptiEngine = CPtiEngine::NewL(); + CleanupStack::PushL( ptiEngine ); + + ptiEngine->ActivateLanguageL( ELangJapanese, EPtiEngineHiraganaKanji ); + ptiEngine->HandleCommandL( EPtiCommandResetLearningInfo ); + + CleanupStack::PopAndDestroy( ptiEngine ); + } + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::ShowKeypressTimeoutSettingPageL() +// +// Create a Keypress timeout setting page +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::ShowKeypressTimeoutSettingPageL() + { + // Get current data + const TInt currentTime = Container()->Model()->KeypressTimeout(); + TInt currentIndex; + if ( currentTime == 0 ) + { + currentIndex = EGSKeypressTimeoutItemNone; + } + else if ( currentTime > KGSMultiTapTimerDefault ) + { + currentIndex = EGSKeypressTimeoutItemLong; + } + else if ( currentTime < KGSMultiTapTimerDefault ) + { + currentIndex = EGSKeypressTimeoutItemShort; + } + else + { + currentIndex = EGSKeypressTimeoutItemMedium; + } + + // and get text for automatic from resource... + CDesCArrayFlat* items = iCoeEnv->ReadDesC16ArrayResourceL( + R_KEYPRESS_TIMEOUT_SETTING_PAGE_LBX ); + CleanupStack::PushL( items ); + + // create setting page: + TInt oldIndex = currentIndex; + CAknSettingPage* dlg = new( ELeave ) CAknRadioButtonSettingPage + ( R_KEYPRESS_TIMEOUT_SETTING_PAGE, + currentIndex, items ); + + // Execute the setting page and check if the setting value was changed: + if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) ) + { + if ( oldIndex != currentIndex ) + { + TInt newTime = KGSMultiTapTimerDefault; + const TInt rate = 40; // rate is 40%. + switch ( currentIndex ) + { + case EGSKeypressTimeoutItemNone: + newTime = 0; + break; + case EGSKeypressTimeoutItemShort: + newTime = + KGSMultiTapTimerDefault - KGSMultiTapTimerDefault * rate / 100; + break; + case EGSKeypressTimeoutItemLong: + newTime = + KGSMultiTapTimerDefault + KGSMultiTapTimerDefault * rate / 100; + break; + case EGSKeypressTimeoutItemMedium: + default: + newTime = KGSMultiTapTimerDefault; + break; + } + Container()->Model()->SetKeypressTimeout( newTime ); + // value should really be being updated, so update listbox + Container()->UpdateListBoxL( EGSLangIdKT ); + } + } + // Delete items: + CleanupStack::PopAndDestroy( items ); + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::ChangeJapQwertySettingL +// Change Japanese Qwerty settings +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::ChangeJapQwertySettingL( const TGSJapQwertyFlags aFlag, + const TInt aItemId, + const TBool aShowSettingPage ) + { + TBool currentValue = Container()->Model()->JapanQwertyFlags( aFlag ); + TBool updateValue = ETrue; + + TInt settingPageResourceId = 0; + TInt itemArraryResourceId = 0; + switch ( aItemId ) + { + case EGSLangIdJQC: + settingPageResourceId = R_JAP_QWERTY_COMMA_SETTING_PAGE; + itemArraryResourceId = R_JAP_QWERTY_COMMA_SETTING_PAGE_LBX; + break; + case EGSLangIdJQP: + settingPageResourceId = R_JAP_QWERTY_PERIOD_SETTING_PAGE; + itemArraryResourceId = R_JAP_QWERTY_PERIOD_SETTING_PAGE_LBX; + break; + case EGSLangIdJQWSP: + settingPageResourceId = R_JAP_QWERTY_WIDTH_SPACE_SETTING_PAGE; + itemArraryResourceId = R_JAP_QWERTY_WIDTH_FULL_HALF_SETTING_PAGE_LBX; + break; + default: + break; + } + + // Following code potentially changes the value of currrent value + if ( aShowSettingPage ) + { + updateValue = ShowJapQwertySettingPageL( settingPageResourceId, + itemArraryResourceId, + currentValue ); + } + else + { + updateValue = !( currentValue ); + } + + if ( currentValue != updateValue ) + { + Container()->Model()->SetJapanQwertyFlags( aFlag, updateValue ); + // value should really be being updated, so update listbox + Container()->UpdateListBoxL( aItemId ); + } + } + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::ShowJapQwertySettingPageL +// Display Japanese Qwerty ON/OFF setting page. +// ----------------------------------------------------------------------------- +// +TBool CGSLangPlugin::ShowJapQwertySettingPageL( + const TInt aSettingPageResourceId, + const TInt aItemArraryResourceId, + const TBool aCurrentValue ) + { + // Default is to act as if the user cancelled the setting page + TBool ret = EFalse; + + CDesCArrayFlat* items = iCoeEnv->ReadDesC16ArrayResourceL( + aItemArraryResourceId ); + CleanupStack::PushL( items ); + // If current value is ETrue, display index is 0. + TInt dispIndex = ( aCurrentValue )? 0 : 1; + + CAknRadioButtonSettingPage* dlg = new ( ELeave ) CAknRadioButtonSettingPage + ( aSettingPageResourceId, + dispIndex, items ); + ret = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ); + if ( ret ) + { + ret = ( dispIndex )? EFalse : ETrue; + } + else + { + ret = aCurrentValue; + } + CleanupStack::PopAndDestroy( items ); + return ret; + } + + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::ShowChiCangJieInputModeSettingPageL +// +// Display Chinese CangJie Input mode setting page. +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::ShowChiCangJieInputModeSettingPageL() + { + // Default is to act as if the user cancelled the setting page + TBool ret = EFalse; + + TInt selection = Container()->Model()->ChiCangJieInputL(); + CDesCArrayFlat* items = iCoeEnv->ReadDesC16ArrayResourceL( + R_CHI_CANGJIE_SETTING_PAGE_LBX ); + CleanupStack::PushL( items ); + + CAknRadioButtonSettingPage* dlg = new ( ELeave ) CAknRadioButtonSettingPage + ( R_CHI_CANGJIE_INPUT_MODE_SETTING_PAGE, selection, items ); + ret = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ); + CleanupStack::PopAndDestroy( items ); + + if ( ret ) + { + //User has changed the value. Update the CenRep key and the UI + Container()->Model()->SetChiCangJieInputL( selection ); + Container()->UpdateListBoxL( EGSLangIdCangJie ); + } + } + +// ----------------------------------------------------------------------------- +// CGSLangPlugin::ShowPredictiveModeSettingPageL +// Word Autocompletion Requirement +// Display Predictive mode setting page. +// ----------------------------------------------------------------------------- +// +void CGSLangPlugin::ShowPredictiveModeSettingPageL( const TBool aShowSettingPage ) + { + TBool updateValue = ETrue; + TInt selection = Container()->Model()->PredictiveModeL(); + if ( aShowSettingPage ) + { + // Default is to act as if the user cancelled the setting page + CDesCArrayFlat* items = iCoeEnv->ReadDesC16ArrayResourceL( + R_PREDICTIVE_MODE_SETTING_PAGE_LBX ); + CleanupStack::PushL( items ); + CAknRadioButtonSettingPage* dlg = new ( ELeave ) CAknRadioButtonSettingPage + ( R_PREDICTIVE_MODE_SETTING_PAGE, selection, items ); + updateValue = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ); + CleanupStack::PopAndDestroy( items ); + } + else // just switch the value + { + // 0 --> Normal + // 1 --> Autocompletion + if ( selection == EGSPredictiveModeNormal ) + { + selection = EGSPredictiveModeAutocompletion; + } + else if ( selection == EGSPredictiveModeAutocompletion ) + { + selection = EGSPredictiveModeNormal; + } + } + + if ( updateValue ) + { + //User has changed the value. Update the CenRep key and the UI + // Treat on and off separately for clarity + if ( selection ) + { + // See if it can do predictive text entry + TInt langCode = Container()->Model()->LanguageL + ( CGSLangModel::EGSInputLanguage ); + if( Container()->Model()->CheckDictionaryFromPtiL( langCode ) ) + { + Container()->Model()->SetPredictiveModeL( selection ); + } + else + { + CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog( ); + dlg->ExecuteDlgLD( + CAknNoteDialog::EShortTimeout, + CAknNoteDialog::ENoTone, + R_AVKON_T9_NOTE_NO_AVAILABLE ); + } + } + else + { + // We are always able to turn T9 off: + Container()->Model()->SetPredictiveModeL( selection ); + } + Container()->UpdateListBoxL( EGSLangIdPredictiveMode ); + } + } + +#ifdef RD_INTELLIGENT_TEXT_INPUT +#ifdef FF_DUAL_LANGUAGE_SUPPORT +// ---------------------------------------------------------------------------- +// CGSLangPlugin::ShowDualInputLanguageSettingListL() +// +// Display the dynamic menu +// ---------------------------------------------------------------------------- +void CGSLangPlugin::ShowDualInputLanguageSettingListL() + { + CAknAppUi* appUi = static_cast(iCoeEnv->AppUi()); + + CAknTitlePane* titlePane = static_cast( appUi->StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + + const TDesC* appTitle = titlePane->Text(); + HBufC* oldTitle = appTitle->AllocL(); + CleanupStack::PushL(oldTitle); + HBufC* title = StringLoader::LoadLC( R_INPUT_LANGUAGE_SETTINGS_TITLE, iCoeEnv); + titlePane->SetTextL( *title ); + CleanupStack::PopAndDestroy(title); + + CGSDualLanguageDialog* dlg = CGSDualLanguageDialog::NewL(R_GS_MENUBAR_CHANGE_EXIT, Container()->Model()); + dlg->ExecuteLD(R_INPUTLANGUAGE_DIALOG); + + titlePane->SetTextL( *oldTitle ); + CleanupStack::PopAndDestroy(oldTitle); + } + +#endif //FF_DUAL_LANGUAGE_SUPPORT + +void DestroySelectionItemList(TAny* aPtr) + { + CSelectionItemList* list = static_cast(aPtr); + list->ResetAndDestroy(); + delete list; + } + +// ---------------------------------------------------------------------------- +// CGSLangPlugin::ShowITIMultiSettingPageL(TBool aShowOnOffSettingPage) +// +// Display the dynamic menu +// ---------------------------------------------------------------------------- +void CGSLangPlugin::ShowITIMultiSettingPageL(TBool aShowOnOffSettingPage) + { + if( Container()->Model()->DeviceHasMultipleKeyboardsL() ) + { + CSelectionItemList* selection = new (ELeave) CSelectionItemList(2); + CleanupStack::PushL(TCleanupItem(DestroySelectionItemList, selection)); + TInt physicalKeyboards = Container()->Model()->PhysicalKeyboardsL(); + TInt predictionBitmask = Container()->Model()->PredictionBitMaskL(); + TBool settingActive = EFalse; + HBufC* selectionText = 0; + TInt count = 0; + TInt itutIndex = 0; + TInt halfQwertyIndex = 0; + TInt qwertyIndex = 0; + for(TUint i = 0x01; i <= 0xF0; i = i << 1) + { + if(physicalKeyboards & i) + { + switch(i) + { + case 0x01: // itut + settingActive = ( predictionBitmask & EKeyboardStyle12Key ? 1 : 0 ); + selectionText = iCoeEnv->AllocReadResourceLC(R_AKNFEP_PRED_SETTING_ITUT); + itutIndex = count; + break; + case 0x10: // half + settingActive = ( predictionBitmask & EKeyboardStyleHalfQwerty ? 1 : 0 ); + selectionText = iCoeEnv->AllocReadResourceLC(R_AKNFEP_PRED_SETTING_HALF_QWERTY); + halfQwertyIndex = count; + break; + case 0x02: // 4x12 + case 0x04: // 4x10 + case 0x08: // 3x11 + case 0x20: // custom + settingActive = ( predictionBitmask & EKeyboardStyleQwerty ? 1: 0); + selectionText = iCoeEnv->AllocReadResourceLC(R_AKNFEP_PRED_SETTING_QWERTY); + qwertyIndex = count; + i = 0x20; // Skip rest of qwerty checks + break; + default: + break; + } + count++; + CSelectableItem* item = new (ELeave) CSelectableItem( *selectionText, settingActive ); + item->ConstructL(); + selection->AppendL(item); + CleanupStack::PopAndDestroy(); //selectionText + } + } + + CAknCheckBoxSettingPage* settingPage = + new( ELeave) CAknCheckBoxSettingPage( R_PREDICTIVE_TEXT_MULTI_SETTING_PAGE, selection); + + if( settingPage->ExecuteLD(CAknSettingPage::EUpdateWhenAccepted)) + { + for(TUint i = 0x01; i <= 0xF0; i = i << 1) + { + if(physicalKeyboards & i) + { + switch(i) + { + case 0x01: // itut + if( (selection->At(itutIndex))->SelectionStatus() ) + { + predictionBitmask = predictionBitmask | EKeyboardStyle12Key ; + } + else + { + predictionBitmask = predictionBitmask & ~EKeyboardStyle12Key ; + } + break; + case 0x10: // half + if( (selection->At(halfQwertyIndex))->SelectionStatus() ) + { + predictionBitmask = predictionBitmask | EKeyboardStyleHalfQwerty ; + } + else + { + predictionBitmask = predictionBitmask & ~EKeyboardStyleHalfQwerty ; + } + break; + case 0x02: // 4x12 + case 0x04: // 4x10 + case 0x08: // 3x11 + case 0x20: // custom + if( (selection->At(qwertyIndex))->SelectionStatus() ) + { + predictionBitmask = predictionBitmask | EKeyboardStyleQwerty ; + } + else + { + predictionBitmask = predictionBitmask & ~EKeyboardStyleQwerty ; + } + i = 0x20; // Skip rest of qwerty checks + break; + default: + break; + } + } + } + Container()->Model()->SetPredictionBitMaskL(predictionBitmask); + } + CleanupStack::PopAndDestroy(); // selection + } + else + { + Container()->Model()->ChangePredictiveOnOffSettingL( + aShowOnOffSettingPage, + CGSLangModel::EGSLangOther ); + } + } + +// ---------------------------------------------------------------------------- +// CGSLangPlugin::ShowPredictiveSettingListL() +// +// Display the dynamic menu +// ---------------------------------------------------------------------------- +void CGSLangPlugin::ShowPredictiveSettingListL() + { + if (iCascadeOptionsOpen) + { + // Return if already open + return; + } + + CAknAppUi* appUi = static_cast(iCoeEnv->AppUi()); + + CAknTitlePane* titlePane = static_cast( appUi->StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + + const TDesC* appTitle = titlePane->Text(); + HBufC* oldTitle = appTitle->AllocL(); + CleanupStack::PushL(oldTitle); + HBufC* title = StringLoader::LoadLC( R_AKNFEP_PRED_INPUT_SETTINGS_TITLE, iCoeEnv); + titlePane->SetTextL( *title ); + CleanupStack::PopAndDestroy(title); + + CGSPredictiveSettingDialog* dlg = CGSPredictiveSettingDialog::NewL(R_PREDICTIVESETTINGDIALOG_MENUBAR, R_PREDICTIVETEXTOFF_CONFIRMATION_QUERY); + iDialog = dlg; + iCascadeOptionsOpen = ETrue; + dlg->ExecuteLD(R_PREDICTIVESETTING_DIALOG); + iCascadeOptionsOpen = EFalse; + iDialog = NULL; + titlePane->SetTextL( *oldTitle ); + CleanupStack::PopAndDestroy(oldTitle); + } +#endif + +// ---------------------------------------------------------------------------- +// CGSLangPlugin::DynInitMenuPaneL() +// +// Display the dynamic menu +// ---------------------------------------------------------------------------- +void CGSLangPlugin::DynInitMenuPaneL( TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + // show or hide the 'help' menu item when supported + if( aResourceId == R_GS_MENU_ITEM_HELP ) + { + User::LeaveIfNull( aMenuPane ); + + if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + aMenuPane->SetItemDimmed( EAknCmdHelp, EFalse ); + } + else + { + aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue ); + } + } +#ifdef RD_INTELLIGENT_TEXT_INPUT + // show or hide the change menu option when supported + if(aResourceId == R_GS_MENU_ITEM_CHANGE) + { + User::LeaveIfNull( aMenuPane ); + TInt keyboardLayout = 0; + RProperty::Get(KCRUidAvkon, KAknKeyBoardLayout, keyboardLayout); + TPtiKeyboardType layout = (TPtiKeyboardType)keyboardLayout; + TBool isPredictionSupport = EFalse; + switch(layout) + { + case EPtiKeyboardHalfQwerty: + isPredictionSupport = Container()->Model()->CheckT9FromPtiLForPredictionL((TPtiEngineInputMode)EPtiEngineHalfQwertyPredictive); + break; + case EPtiKeyboardQwerty4x12: + case EPtiKeyboardQwerty4x10: + case EPtiKeyboardQwerty3x11: + case EPtiKeyboardCustomQwerty: + isPredictionSupport = Container()->Model()->CheckT9FromPtiLForPredictionL((TPtiEngineInputMode)EPtiEngineQwertyPredictive); + break; + case EPtiKeyboardNone: + case EPtiKeyboard12Key: + isPredictionSupport = Container()->Model()->CheckT9FromPtiLForPredictionL((TPtiEngineInputMode)EPtiEnginePredictive); + break; + default: + isPredictionSupport = Container()->Model()->CheckT9FromPtiLForPredictionL((TPtiEngineInputMode)EPtiEnginePredictive); + break; + } + if (isPredictionSupport == EFalse) + { + aMenuPane->SetItemDimmed(EGSCmdAppChange, ETrue ); + } + } +#endif + + } +// ----------------------------------------------------------------------------- +// CGSLangPlugin::CreateIconL() +// +// +// ----------------------------------------------------------------------------- +// +CGulIcon* CGSLangPlugin::CreateIconL( const TUid aIconType ) + { + //EMbm + CGulIcon* icon; + + if( aIconType == KGSIconTypeLbxItem ) + { + icon = AknsUtils::CreateGulIconL( + AknsUtils::SkinInstance(), + KAknsIIDQgnPropCpPersoLang, + KGSDefaultLangIconFileName, + EMbmGslangpluginQgn_prop_cp_perso_lang, + EMbmGslangpluginQgn_prop_cp_perso_lang_mask ); + } + else + { + icon = CGSPluginInterface::CreateIconL( aIconType ); + } + + return icon; + } + +#ifdef RD_INTELLIGENT_TEXT_INPUT +#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__ +TInt CGSLangPlugin::HandleKeyboardLayoutChangeNotification(TAny* aObj) + { + if (aObj) + { + static_cast(aObj)->HandleKeyboardLayoutChange(); + return KErrNone; + } + else + { + return KErrArgument; + } + } + +void CGSLangPlugin::HandleKeyboardLayoutChange() + { + if(iDialog) + { + iDialog->HandleResourceChange(KEikDynamicLayoutVariantSwitch); + } + if(iContainer) + { + Container()->HandleResourceChange(KEikDynamicLayoutVariantSwitch); + } + } + +CGSLangPlugin::CSubscriber::CSubscriber(TCallBack aCallBack, RProperty& aProperty) + : + CActive(EPriorityNormal), iCallBack(aCallBack), iProperty(aProperty) + { + CActiveScheduler::Add(this); + } + +CGSLangPlugin::CSubscriber::~CSubscriber() + { + Cancel(); + } + +void CGSLangPlugin::CSubscriber::SubscribeL() + { + if (!IsActive()) + { + iProperty.Subscribe(iStatus); + SetActive(); + } + } + +void CGSLangPlugin::CSubscriber::StopSubscribe() + { + Cancel(); + } + +void CGSLangPlugin::CSubscriber::RunL() + { + if (iStatus.Int() == KErrNone) + { + iCallBack.CallBack(); + SubscribeL(); + } + } + +void CGSLangPlugin::CSubscriber::DoCancel() + { + iProperty.Cancel(); + } + +#endif //__ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__ +#endif +// End of File