fep/aknfep/src/AknFepLanguageManager.cpp
changeset 0 eb1f2e154e89
child 5 a47de9135b21
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/src/AknFepLanguageManager.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,471 @@
+/*
+* Copyright (c) 2002-2008 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:            Implementation of CAknFepLanguageManager class.
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+// INCLUDE FILES
+#include "AknFepGlobalEnums.h"
+#include "AknFepPanic.h"
+#include "AknFepManager.h"                  // CAknFepManager
+#include "AknFepManagerInterface.h"
+#include "AknFepUIManagerStateInterface.h"  // MAknFepUIManagerStateInterface
+#include "AknFepUiInputStateBase.h"         // TAknFepInputStateBase
+#include "AknFepUiManagerBase.h"            // CAknFepUIManagerBase
+#include "AknFepUIManagerJapanese.h"        // CAknFepUIManagerJapanese
+#include "AknFepUiManagerWestern.h"         // CAknFepUIManagerWestern
+#include "AknFepUiManagerChinese.h"         // CAknFepUIManagerChinese
+#include "AknFepLanguageManager.h"          // this class
+
+#include "AknFepUiManagerKorean.h"        	// CAknFepUIManagerKorean
+#include <uikon.hrh>                        // TAknEditorNumericKeymap
+#include <AknUtils.h>
+
+#include <aknfeppeninputimeplugin.h>
+#include  "AknFepPluginManager.h"
+#include <peninputcmd.h>
+#include <peninputclient.h>
+
+void Cleanup( TAny* aAny )
+	{
+	RImplInfoPtrArray* implArray = 
+		reinterpret_cast< RImplInfoPtrArray*> ( aAny );
+	implArray->ResetAndDestroy();
+	implArray->Close();
+	}
+
+/**
+ * CAknFepLanguageManager
+ *
+ */
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAknFepLanguageManager()
+// first phase construction.
+// -----------------------------------------------------------------------------
+//
+CAknFepLanguageManager* CAknFepLanguageManager::NewL(MAknFepManagerUIInterface* aFepMan, 
+                                                     CAknFepCaseManager* aCaseMan)
+    {
+    CAknFepLanguageManager* self = new(ELeave) CAknFepLanguageManager(aFepMan, aCaseMan);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(); // self
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// ~CAknFepLanguageManager()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CAknFepLanguageManager::~CAknFepLanguageManager()
+    {
+    if (iUiManArray)
+        {
+        iUiManArray->ResetAndDestroy();
+        }
+    delete iUiManArray;
+    delete iCurImePlugin;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepLanguageManager::GetFepUI()
+// get ui manager object
+// -----------------------------------------------------------------------------
+//
+MAknFepManagerInterface* CAknFepLanguageManager::GetFepUI(TInt aMode, TWidthChar /*aCharacterWidth*/, TBool aPredictive)
+    {
+    MAknFepManagerInterface* uiMan = NULL;
+    switch (aMode)
+        {
+        case EPinyin:
+        case EZhuyin:
+        case EStroke:
+        case ECangJie:
+        case EZhuyinFind:
+        case EStrokeFind:
+            uiMan = iUiManArray->At(EUiManChinese);
+            break;
+        case ELatin:
+        case EHindi:
+            if (iInputLanguage == ELangJapanese)
+                {
+                uiMan = iUiManArray->At((aPredictive)? EUiManWestern : EUiManJapanese);
+                }
+        	else if(iInputLanguage == ELangKorean)
+        		{
+        		uiMan = iUiManArray->At(EUiManKorean);
+        		}
+            else
+                {
+                uiMan = iUiManArray->At(EUiManWestern);
+                }
+            break;
+        case ENumber:
+        case ENativeNumber:
+            if (iInputLanguage == ELangJapanese)
+                {
+                uiMan = iUiManArray->At(EUiManJapanese);
+                }
+            else if(iInputLanguage == ELangKorean)
+                {
+                uiMan = iUiManArray->At(EUiManKorean);
+                }
+            else
+                {
+                uiMan = iUiManArray->At(EUiManWestern);
+                }
+            break;
+        case EHiragana:
+        case EHiraganaKanji:
+        case EKatakana:
+            uiMan = iUiManArray->At(EUiManJapanese);
+            break;
+        case EHangul:
+        	uiMan = iUiManArray->At(EUiManKorean);
+ 			break;
+        default:
+            AknFepPanic(EAknFepPanicNoUiManager);
+            break;
+        }
+    return uiMan;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknFepLanguageManager::SetInputLanguageL()
+// Set new input language.
+// -----------------------------------------------------------------------------
+//
+void CAknFepLanguageManager::SetInputLanguageL(TInt aInputLanguage)
+    {
+    iInputLanguage = aInputLanguage;
+    MAknFepManagerInterface* uiManager = NULL;
+    TInt uiManagerId = UiManagerId();
+    uiManager = iUiManArray->At(uiManagerId);
+    
+    if ( !uiManager )
+        {
+        // Ui manager does not exist for this language yet. We create it.
+        ConstructUiManagerL();
+        uiManager = iUiManArray->At(uiManagerId);
+        }
+    
+    uiManager->SetInputLanguageL((TLanguage)iInputLanguage);
+    
+    if (uiManagerId != EUiManWestern)
+        {
+        // Western UI manager needs to know current input language also when 
+        // Chinese or Japanese Ui manager is used.
+        // Western UI manager needs to use English language if the 
+        // input language is Chinese or Japanese.
+        uiManager = iUiManArray->At(EUiManWestern);
+        if (uiManager)
+            {
+            uiManager->SetInputLanguageL((TLanguage)iInputLanguage);
+            }
+        }
+        
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknFepLanguageManager()
+// Constructor.
+// -----------------------------------------------------------------------------
+//
+CAknFepLanguageManager::CAknFepLanguageManager(MAknFepManagerUIInterface* aFepManager, 
+                                               CAknFepCaseManager* aCaseManager) 
+
+:iInputLanguage(ELangEnglish), 
+ iFepManager(aFepManager), 
+ iCaseManager(aCaseManager),
+ iPluginManager(NULL)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepLanguageManager::ConstructL()
+// Second phase construction
+// -----------------------------------------------------------------------------
+//
+void CAknFepLanguageManager::ConstructL()
+    {
+    iUiManArray = new(ELeave)CArrayPtrFlat<MAknFepManagerInterface>(EUiManMax);
+
+    for ( TInt ii = 0; ii < EUiManMax; ii++)
+        {
+        iUiManArray->AppendL(NULL);
+        }
+
+    // Create UI manager for English language. English exists in all variants and
+    // it is default language in CAknFepLanguageManager.
+    ConstructUiManagerL();
+    }
+
+void CAknFepLanguageManager::ConstructUiManagerL()
+    {
+    MAknFepManagerInterface* uiMan = NULL;
+    TInt uiManagerId = UiManagerId();
+    iUiManArray->Delete(uiManagerId);
+    switch (uiManagerId)
+        {
+        case EUiManWestern:
+            uiMan = CAknFepUIManagerWestern::NewL(iFepManager, iCaseManager, 
+                                                 (TLanguage)iInputLanguage);
+            break;
+        case EUiManChinese:
+            uiMan = CAknFepUIManagerChinese::NewL(iFepManager, iCaseManager, 
+                                                 (TLanguage)iInputLanguage);
+            break;
+        case EUiManJapanese:
+            uiMan = CAknFepUIManagerJapanese::NewL(iFepManager, iCaseManager, 
+                                                  (TLanguage)iInputLanguage);
+            break;
+        case EUiManKorean:
+        	uiMan = CAknFepUIManagerKorean::NewL(iFepManager, iCaseManager, (TLanguage)iInputLanguage);
+        	break;
+        default:
+            AknFepPanic(EAknFepPanicNoUiManager);
+            break;
+        }
+    CleanupStack::PushL(uiMan);
+    iUiManArray->InsertL(uiManagerId, uiMan);
+    CleanupStack::Pop(); // uiMan
+    }
+
+TInt CAknFepLanguageManager::UiManagerId()
+    {
+    TInt uiManagerId = EUiManWestern;
+    switch (iInputLanguage)
+        {
+        case ELangPrcChinese:
+        case ELangHongKongChinese:
+        case ELangTaiwanChinese:
+            uiManagerId = EUiManChinese;
+            break;
+        case ELangJapanese:
+            uiManagerId = EUiManJapanese;
+            break;
+        case ELangKorean:
+        	uiManagerId = EUiManKorean;
+        	break;
+        default:
+            // Western UI manager is default.
+            // Thai, Arabic and Hebrew uses western UI manager.
+            break;
+        }
+    return uiManagerId;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepLanguageManager::GetPluginInputFepUiL
+// Get plugin UI manager object.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+MAknFepManagerInterface* CAknFepLanguageManager::GetPluginInputFepUiL(
+                                                      TPluginInputMode aPreferedMode,
+                                                      TInt aPenInputLang,
+                                                      TInt aDisplayLang,
+                                                      RPeninputServer* aPenServer)
+    {
+
+    RArray<TInt> implList;
+    CleanupClosePushL(implList);
+    
+    TPluginInputMode secondMode = EPluginInputModeItut;
+    TPluginInputMode curMode = aPreferedMode;
+    TInt language = aPenInputLang;
+
+    //pen input language and prefered mode
+    aPenServer->GetImePluginIdListL(aPenInputLang, curMode, implList);
+    
+    if( implList.Count() == 0 )
+        {
+        //pen input language and other modes
+        curMode = secondMode;
+        aPenServer->GetImePluginIdListL(aPenInputLang, curMode, implList);
+        }
+        
+    if( implList.Count() == 0 && aPenInputLang != aDisplayLang)
+        {
+        //display language and prefered modes
+        language = aDisplayLang;
+        curMode = aPreferedMode;
+        aPenServer->GetImePluginIdListL(aDisplayLang, curMode, implList);
+
+        if( implList.Count() == 0 )
+            {
+            //display language and other modes
+            curMode = secondMode;
+            aPenServer->GetImePluginIdListL(aDisplayLang, curMode, implList);
+            }
+        }
+        
+    CAknFepPenInputImePlugin* pIme = NULL;
+    MAknFepManagerInterface* pUi = NULL;
+    TInt i;
+    for(i = 0; i < implList.Count(); ++i)
+        {
+        pIme = ActivateImePlugin(implList[i], aPenServer);
+        if( pIme )
+            {
+            pUi = ActivateLayoutUiPluginL(pIme, language, curMode);
+            if( pUi )
+                {
+                iCurUiPlugIn = pUi;
+                if( iCurImePlugin != pIme )
+                    {
+                    //a new IME plugin created
+                    delete iCurImePlugin;
+                    iCurImePlugin = pIme;
+                    }
+                break;
+                }
+            else
+                {
+                //Fail create UI, delete IME plugin just created
+                 if( iCurImePlugin != pIme )
+                     {
+                     delete pIme;
+                     }
+                }
+            }        
+        }
+    
+    if( i == implList.Count() )
+        {
+        delete iCurImePlugin;
+        iCurImePlugin = NULL;
+        iCurUiPlugIn = NULL;
+        }
+    CleanupStack::PopAndDestroy(&implList);    
+    
+    if ( iCurUiPlugIn )
+    	{
+    	aPenServer->SetInputLanguage( language );
+    	}
+    return iCurUiPlugIn;
+    }
+
+TBool  CAknFepLanguageManager::IsPluginInputAvaiable(TPluginInputMode aMode, 
+                                                     TInt aPenInputLang,
+                                                     RPeninputServer* aPenServer)
+    {
+    TBool bAvail = EFalse;
+    TRAP_IGNORE(bAvail = IsPluginInputAvaiableL(aMode, aPenInputLang, aPenServer));
+    return bAvail;
+    }
+
+TBool  CAknFepLanguageManager::IsPluginInputAvaiableL(TPluginInputMode aMode, 
+                                                     TInt aPenInputLang,
+                                                     RPeninputServer* aPenServer)
+    {
+    RArray<TInt> implList;
+    CleanupClosePushL(implList);
+    
+    aPenServer->GetImePluginIdListL(aPenInputLang, aMode, implList);    
+    TBool bAvail = implList.Count() != 0;
+    CleanupStack::PopAndDestroy(&implList);    
+    return bAvail;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepLanguageManager::ActivateImePlugin
+// Activate IME plugin by implemenation.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CAknFepPenInputImePlugin* CAknFepLanguageManager::ActivateImePlugin(
+                                                 TInt aImeImplId, 
+                                                 RPeninputServer* aPenServer)
+    {
+    if(iCurImePlugin && iCurImePlugin->ImeImplId() == aImeImplId)
+        {
+        return iCurImePlugin;
+        }
+    else
+        {
+        TUid dtor_ID_Key;
+        CAknFepPenInputImePlugin* pIme = NULL;
+
+        TRAP_IGNORE(pIme = REINTERPRET_CAST(CAknFepPenInputImePlugin*, 
+              REComSession::CreateImplementationL(TUid::Uid(aImeImplId), dtor_ID_Key, aPenServer)));
+
+        if( pIme )
+            {
+            pIme->iDtor_ID_Key = dtor_ID_Key;           
+            }
+
+        return pIme;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepLanguageManager::ActivateLayoutUiPluginL
+// Activate IME plugin's UI by mode.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+MAknFepManagerInterface* CAknFepLanguageManager::ActivateLayoutUiPluginL(
+                                                   CAknFepPenInputImePlugin* aImePlugin, 
+                                                   TInt aPenInputLang,
+                                                   TPluginInputMode aMode)
+    {
+    MAknFepManagerInterface* pUi = NULL;
+
+    if( aImePlugin )
+        {
+        pUi = aImePlugin -> GetInputMethodUiL(iFepManager,
+                                            (TLanguage)aPenInputLang, 
+                                            aMode,
+                                            KNullDesC8(),
+                                            iIsSplitView);
+        //set inputlanguage                                                             
+        if(pUi)
+            {
+            pUi->SetInputLanguageL((TLanguage)aPenInputLang);
+            //pUi->ActivateUI();
+            }
+        }
+    
+    return pUi;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepLanguageManager::SetSplitView
+// Activate IME plugin's UI by mode.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAknFepLanguageManager::SetSplitView(TBool aIsSplitView)
+    {
+    iIsSplitView = aIsSplitView;
+    }
+
+// End of File