diff -r 000000000000 -r eb1f2e154e89 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 +#include //For CAknAppUi +#include //CAknTitlePane +#include //For R_SECONDARY_WRITING_LANG_NONE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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* aSeedLanguages, + CDesCArray* aLanguageNames, + CCoeEnv* aCoeEnv) + { + CPtiEngine* ptiEngine = CPtiEngine::NewL(); + CleanupStack::PushL( ptiEngine ); + + CArrayFix* 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(aCoeEnv->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, 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* aInstalledLangCodes, + CArrayFix* aSeedLanguages, + CDesCArray* aLanguageNames ) + { + CPtiEngine* ptiEngine = CPtiEngine::NewL(); + CleanupStack::PushL( ptiEngine ); + + CArrayFix* 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; + }