--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/GSLangPlugin/src/GSLangPlugin.cpp Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,1877 @@
+/*
+* 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 <gsfwviewuids.h>
+#include <GSLangPluginRsc.rsg>
+#include <gslistbox.h>
+#include <gsprivatepluginproviderids.h>
+
+#include <AknDateFormatUtils.h>
+#include <AknFepGlobalEnums.h> // EPinyin
+#include <aknnotewrappers.h>
+#include <aknradiobuttonsettingpage.h>
+#include <aknsettingpage.h>
+#include <akntextsettingpage.h>
+#include <aknViewAppUi.h>
+#include <AknWaitDialog.h>
+#include <eikapp.h>
+#include <featmgr.h>
+#include <hlplch.h> // HlpLauncher
+#include <PSVariables.h>
+#include <PtiEngine.h>
+#include <StringLoader.h>
+#include <syslangutil.h> // Display UI language
+#include <ctsydomainpskeys.h>
+#include <SATDomainPSKeys.h>
+#include <e32property.h>
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+#include "PredictiveSettingDialog.h"
+#include <AknFep.rsg>
+#include <akntitle.h>
+#ifdef FF_DUAL_LANGUAGE_SUPPORT
+#include "DualLanguageDialog.h"
+#endif
+#include <aknnotedialog.h> //CAknNoteDialog
+#include <AvkonInternalCRKeys.h>
+#endif
+#include <gslangplugin.mbg>
+
+#ifndef RD_STARTUP_CHANGE
+ #include <sysstartup.h> // Startup reasons
+#else
+ #include <starterclient.h> // 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<TInt>* languages = new( ELeave )CArrayFixFlat<TInt>( 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<CGSLangContainer*>( 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<TInt>* systemEpocLanguageCodes = 0;
+ // This creates the list itself
+ User::LeaveIfError( SysLangUtil::GetInstalledLanguages(
+ systemEpocLanguageCodes ) );
+ CleanupStack::PushL( systemEpocLanguageCodes );
+
+ CArrayFixFlat<TInt>* dtlanguages = new(ELeave)CArrayFixFlat<TInt>(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<TInt>* languages =
+ new( ELeave )CArrayFixFlat<TInt>(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;i<count;i++ )
+ {
+ if ((*languages)[i] == currentInputLanguage)
+ {
+ currentItem = i;
+ break;
+ }
+ }
+ // create setting page:
+ CAknSettingPage* dlg =
+ new( ELeave ) CAknRadioButtonSettingPage(
+ R_INPUT_TEXT_LANGUAGE_SETTING_PAGE,
+ currentItem, items );
+ TInt previous = Container()->Model()->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
+ || current != ELangTaiwanChinese) && 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 < 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<CAknAppUi*>(iCoeEnv->AppUi());
+
+ CAknTitlePane* titlePane = static_cast<CAknTitlePane*>( 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<CSelectionItemList*>(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<CAknAppUi*>(iCoeEnv->AppUi());
+
+ CAknTitlePane* titlePane = static_cast<CAknTitlePane*>( 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<Mbm_file_name><Bitmap_name>
+ 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<CGSLangPlugin*>(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