fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlDualLanguageSettingModel.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlDualLanguageSettingModel.cpp Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,326 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+#include <PtiEngine.h>
+#include <AknAppUi.h> //For CAknAppUi
+#include <akntitle.h> //CAknTitlePane
+#include <aknfep.rsg> //For R_SECONDARY_WRITING_LANG_NONE
+#include <StringLoader.h>
+#include <AknFepInternalCRKeys.h>
+#include <aknnotedialog.h>
+#include <avkon.rsg>
+#include <featmgr.h>
+#include <e32property.h>
+#include <AvkonInternalCRKeys.h>
+#include <aknenv.h>
+#include <AknSettingCache.h>
+#include "AknFepUIAvkonCtrlDualLanguageSettingModel.h"
+
+const TInt KAkFepDualLanguageMask = 0x03FF;
+const TInt KAkFepDualLanguageBufSize128 = 128;
+
+CAknFepDualLanguageSettingModel* CAknFepDualLanguageSettingModel::NewL()
+ {
+ CAknFepDualLanguageSettingModel* self = new( ELeave ) CAknFepDualLanguageSettingModel();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+void CAknFepDualLanguageSettingModel::ConstructL()
+ {
+ iAknFepRepository = CRepository::NewL( KCRUidAknFep );
+ }
+
+CAknFepDualLanguageSettingModel::~CAknFepDualLanguageSettingModel()
+ {
+ if(iAknFepRepository)
+ delete iAknFepRepository;
+ }
+void CAknFepDualLanguageSettingModel::GetSecondaryInputLanguagesL(
+ CArrayFix<TInt>* aSeedLanguages,
+ CDesCArray* aLanguageNames,
+ CCoeEnv* aCoeEnv)
+ {
+ CPtiEngine* ptiEngine = CPtiEngine::NewL();
+ CleanupStack::PushL( ptiEngine );
+
+ CArrayFix<TInt>* languageCodeArray = aSeedLanguages;
+ ptiEngine->GetAvailableLanguagesL( languageCodeArray );
+ languageCodeArray->InsertL(0,0); // No secondary input language as the first item
+
+ TInt count = languageCodeArray->Count();
+ for ( TInt index = 0; index < count; ++index )
+ {
+ const TInt langCode = languageCodeArray->At(index);
+ if(langCode == ELangTaiwanChinese ||
+ langCode == ELangHongKongChinese ||
+ langCode == ELangPrcChinese ||
+ langCode == ELangJapanese ||
+ langCode == ELangKorean )
+ {
+ languageCodeArray->Delete(index);
+ count--;
+ index--;
+ }
+ }
+
+ HBufC* noneString = StringLoader::LoadLC( R_SECONDARY_WRITING_LANG_NONE, aCoeEnv);
+ TPtr nonePtr( noneString->Des() );
+ aLanguageNames->AppendL(nonePtr);
+ CleanupStack::PopAndDestroy( noneString );
+
+ HBufC* buffer = HBufC::NewLC( KAkFepDualLanguageBufSize128 );
+ for ( TInt index = 1; index < count; ++index )
+ {
+ const TInt langId = languageCodeArray->At( index );
+
+ TPtr ptrToBuffer( buffer->Des() );
+ ptiEngine->GetLocalizedLanguageName( langId & KAkFepDualLanguageMask,
+ ptrToBuffer );
+
+ aLanguageNames->AppendL( ptrToBuffer );
+
+ ptrToBuffer.Zero();
+ }
+
+ CleanupStack::PopAndDestroy( buffer );
+ CleanupStack::PopAndDestroy( ptiEngine );
+ }
+void CAknFepDualLanguageSettingModel::ShowDualInputLanguageSettingListL(CCoeEnv* aCoeEnv)
+ {
+ CAknAppUi* appUi = static_cast<CAknAppUi*>(aCoeEnv->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, aCoeEnv);
+ titlePane->SetTextL( *title );
+ CleanupStack::PopAndDestroy(title);
+
+ //Launch dialog
+
+ titlePane->SetTextL( *oldTitle );
+ CleanupStack::PopAndDestroy(oldTitle);
+ }
+
+
+// ================= DATA ACCESS FUNCTIONS ==================
+
+// ----------------------------------------------------------------------------
+// CAknFepDualLanguageSettingModel::GetLanguagesFromPtiL
+//
+// Utility routine to get available languages with Symbian OS codes
+// ----------------------------------------------------------------------------
+//
+void CAknFepDualLanguageSettingModel::GetLanguagesFromPtiL(
+ CArrayFix<TInt>* aInstalledLangCodes,
+ CArrayFix<TInt>* aSeedLanguages,
+ CDesCArray* aLanguageNames )
+ {
+ CPtiEngine* ptiEngine = CPtiEngine::NewL();
+ CleanupStack::PushL( ptiEngine );
+
+ CArrayFix<TInt>* languageCodeArray = aSeedLanguages;
+ if ( aInstalledLangCodes )
+ {
+ languageCodeArray = aInstalledLangCodes;
+ }
+ else
+ {
+ ptiEngine->GetAvailableLanguagesL( languageCodeArray );
+ }
+
+ HBufC* buffer = HBufC::NewLC( KAkFepDualLanguageBufSize128 );
+ const TInt count = languageCodeArray->Count();
+ for ( TInt index = 0; index < count; ++index )
+ {
+ const TInt langId = languageCodeArray->At( index );
+
+ TPtr ptrToBuffer( buffer->Des() );
+ ptiEngine->GetLocalizedLanguageName( langId & KAkFepDualLanguageMask,
+ ptrToBuffer );
+
+ if ( aInstalledLangCodes )
+ {
+ aSeedLanguages->AppendL( langId );
+ }
+ aLanguageNames->AppendL( ptrToBuffer );
+
+ ptrToBuffer.Zero();
+ }
+
+ CleanupStack::PopAndDestroy( buffer );
+ CleanupStack::PopAndDestroy( ptiEngine );
+ }
+
+TInt CAknFepDualLanguageSettingModel::LanguageL( TLanguageType aType )
+ {
+ TInt Language = KErrNone;
+ switch ( aType )
+ {
+ case EAknFepDualLanguageSettingInputLanguage:
+ {
+ User::LeaveIfError(
+ iAknFepRepository->Get( KAknFepInputTxtLang, Language ) );
+ }
+ break;
+ case EAknFepDualLanguageSettingInputLanguageSecondary:
+ {
+ User::LeaveIfError(
+ iAknFepRepository->Get( KAknFepInputTxtLangSecondary, Language ) );
+ }
+ break;
+ default:
+ break;
+ }
+ return Language;
+
+ }
+
+
+TBool CAknFepDualLanguageSettingModel::SetLanguageL( TLanguageType aType, TInt aLanguage )
+ {
+ TBool ret = ETrue;
+
+ switch( aType )
+ {
+ case EAknFepDualLanguageSettingInputLanguage:
+ {
+ if( iAknFepRepository->Set( KAknFepInputTxtLang,
+ aLanguage ) != KErrNone )
+ {
+ ret = EFalse;
+ }
+
+ if(ret)
+ {
+ // now inform all open apps of the switch
+ TWsEvent event;
+ event.SetType(KEikInputLanguageChange);
+ CEikonEnv::Static()->WsSession().SendEventToAllWindowGroups(event);
+ CAknEnv::Static()->SettingCache().Update(KEikInputLanguageChange);
+ }
+
+ // See if it cannot do predictive text entry
+ if( !CheckDictionaryFromPtiL( aLanguage ) )
+ {
+ CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog( );
+ dlg->ExecuteDlgLD(
+ CAknNoteDialog::EShortTimeout,
+ CAknNoteDialog::ENoTone,
+ R_AVKON_T9_NOTE_NO_AVAILABLE );
+
+ }
+ }
+ break;
+ case EAknFepDualLanguageSettingInputLanguageSecondary:
+ {
+ if( iAknFepRepository->Set( KAknFepInputTxtLangSecondary,
+ aLanguage ) != KErrNone )
+ {
+ ret = EFalse;
+ }
+ if(ret)
+ {
+ // now inform all open apps of the switch
+ // same event as primary input language change
+ TWsEvent event;
+ event.SetType(KEikInputLanguageChange);
+ CEikonEnv::Static()->WsSession().SendEventToAllWindowGroups(event);
+ CAknEnv::Static()->SettingCache().Update(KEikInputLanguageChange);
+ }
+ // Secondary input language does not need prediction
+ // so we don't check for it
+ }
+ break;
+ default:
+ break;
+
+ }
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CGSLangModel::CheckDictionaryFromPtiL
+//
+// Checks if the selected language supports predictive text input.
+// In case this returns EFalse, the UI display's "Not available"
+// for Predictive text input.
+// ----------------------------------------------------------------------------
+//
+TBool CAknFepDualLanguageSettingModel::CheckDictionaryFromPtiL( TInt aLangCode )
+ {
+ TBool langSupport = EFalse;
+
+ if ( FeatureManager::FeatureSupported( KFeatureIdChinese ) ||
+ FeatureManager::FeatureSupported( KFeatureIdJapanese ) )
+ {
+ langSupport = ETrue;
+ }
+ else
+ {
+ CPtiEngine* ptiEngine = CPtiEngine::NewL();
+ CleanupStack::PushL( ptiEngine );
+
+ MPtiLanguage* ptiLang = ptiEngine->GetLanguage( aLangCode );
+ if ( ptiLang )
+ {
+ // the check here should be based on the keyboard
+ TInt keyboardLayout = 0;
+ RProperty::Get(KCRUidAvkon, KAknKeyBoardLayout, keyboardLayout);
+ TPtiKeyboardType layout = (TPtiKeyboardType)keyboardLayout;
+ switch(layout)
+ {
+ case EPtiKeyboardHalfQwerty:
+ langSupport = ptiLang->HasInputMode( (TPtiEngineInputMode)EPtiEngineHalfQwertyPredictive);
+ break;
+ case EPtiKeyboardQwerty4x12:
+ case EPtiKeyboardQwerty4x10:
+ case EPtiKeyboardQwerty3x11:
+ case EPtiKeyboardCustomQwerty:
+ langSupport = ptiLang->HasInputMode( (TPtiEngineInputMode)EPtiEngineQwertyPredictive);
+ break;
+ case EPtiKeyboardNone:
+ case EPtiKeyboard12Key:
+ langSupport = ptiLang->HasInputMode( (TPtiEngineInputMode)EPtiEnginePredictive);
+ break;
+ default:
+ langSupport = ptiLang->HasInputMode( (TPtiEngineInputMode)EPtiEnginePredictive);
+ break;
+ }
+
+ }
+ CleanupStack::PopAndDestroy( ptiEngine );
+ ptiLang = NULL;
+ }
+
+ return langSupport;
+ }