--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/src/AknFepLanguageManager.cpp Wed Sep 01 12:23:33 2010 +0100
@@ -0,0 +1,491 @@
+/*
+* 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 "AknFepSharedDataInterface.h" // CAknFepSharedDataInterface
+
+#include "AknFepUiManagerKorean.h" // CAknFepUIManagerKorean
+#include <uikon.hrh> // TAknEditorNumericKeymap
+#include <AknUtils.h>
+
+#include <aknfeppeninputimeplugin.h>
+#include "AknFepPluginManager.h"
+#include <peninputcmd.h>
+#include <peninputclient.h>
+#include <featmgr.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,
+ CAknFepSharedDataInterface* aSharedData )
+ {
+ CAknFepLanguageManager* self = new(ELeave) CAknFepLanguageManager(aFepMan, aCaseMan, aSharedData);
+ 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,
+ CAknFepSharedDataInterface* aSharedData )
+
+:iInputLanguage(ELangEnglish),
+ iFepManager(aFepManager),
+ iCaseManager(aCaseManager),
+ iPluginManager(NULL),
+ iSharedData(aSharedData)
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// 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);
+ // Now, there is no Landscape mode ITUT anymore, so change SecondMode to FSQ or ITUT
+ // based on current screen mode.
+
+ TPluginInputMode secondMode;
+ TPixelsTwipsAndRotation size;
+ CCoeEnv::Static()->ScreenDevice()->GetDefaultScreenSizeAndRotation(size);
+ TBool landscape = size.iPixelSize.iWidth > size.iPixelSize.iHeight;
+ if (landscape) // LandScape
+ {
+ secondMode = EPluginInputModeFSQ;
+ }
+ else // Portrait
+ {
+ secondMode = ( iSharedData )
+ ? iSharedData->PluginPortraitInputMode() : 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(
+ TAny* obj = REComSession::CreateImplementationL(TUid::Uid(aImeImplId), dtor_ID_Key, aPenServer);
+ pIme = REINTERPRET_CAST(CAknFepPenInputImePlugin*, obj );
+ );
+ 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