fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlDualLanguageSettingModel.cpp
changeset 0 eb1f2e154e89
--- /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;
+    }