fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonImpl.cpp
changeset 0 eb1f2e154e89
child 3 f5a1e66df979
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonImpl.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,896 @@
+/*
+* Copyright (c) 2007 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:           
+*       Provides the FEP's Avkon UI access methods.
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+#include "AknFepUiAvkonImpl.h"
+#include "AknFepUiAvkonStylusPopUpMenu.h"
+#include <aknnotedialog.h>          //CAknNoteDialog
+#include <aknmessagequerydialog.h>  //CAknMessageQueryDialog
+#include <aknradiobuttonsettingpage.h>
+#include <aknsettingpage.h>
+#include <aknlistquerydialog.h>
+#include <aknedsts.h>               //CAknEdwinState
+#include <barsread.h>
+#include <AknFep.rsg>
+#include "AknFepGlobalEnums.h"
+#include <aknstyluspopupmenu.h>
+#include <aknSctDialog.h>           //CAknCharMapDialog
+#include <akntouchpane.h>
+#include "AknFepQuery.h"
+#include <aknedformaccessor.h>
+#include "AknFepIndicatorAvkon.h"
+#include <AknFepManagerInterface.h> // MAknFepManagerInterface
+#include <AknIndicatorContainer.h>  //CAknIndicatorContainer
+#include "AknFepUIAvkonCtrlContainerChinese.h"
+#include "AknFepUIAvkonCtrlContainerJapanese.h"
+#include <AknFepUiInterfacePanic.h>
+#include "AknFepUIAvkonCtrlJapaneseKutenQueryDialog.h"
+#include <featmgr.h>
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+// Predictive QWERTY (XT9) changes ---->
+#include <aknappui.h>
+#include <akntitle.h> //CAknTitlePane
+#include <StringLoader.h>
+#include "AknFepAvkonCandidatePopup.h"
+#include "AknFepUiAvkonCtrlExactWordPopupContent.h"
+#include "AknFepPredictiveSettingDialog.h"
+#include "AknFepUserDictionaryEditDialog.h"
+
+#ifdef FF_DUAL_LANGUAGE_SUPPORT
+#include "AknFepUIAvkonCtrlDualLanguageSettingDialog.h"
+#endif //FF_DUAL_LANGUAGE_SUPPORT
+// Predictive QWERTY (XT9) changes <----
+#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__    
+#include <AvkonInternalCRKeys.h> 
+#endif //__ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__
+#endif //RD_INTELLIGENT_TEXT_INPUT
+
+GLDEF_C void AknFepUiInterfacePanic(TAknFepUiInterfacePanic aPanic)
+    {
+    User::Panic(_L("AKNFEPUI"),aPanic);
+    }
+
+
+// This command is is used for setting empty CBA.
+const TInt ENullCommandId = 0;
+
+
+CAknFepUIAvkonImpl* CAknFepUIAvkonImpl::NewL()
+	{
+	CAknFepUIAvkonImpl* self = new(ELeave) CAknFepUIAvkonImpl();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;	
+	}
+
+void CAknFepUIAvkonImpl::ConstructL()
+    {
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__   
+    //Attach the P&S property to the keyboardlayout and subscribe to the P&S framework
+    // for any keyboard layout change.
+    User::LeaveIfError(iKeyboardLayoutStatusProperty.Attach(KCRUidAvkon, KAknKeyBoardLayout));    
+    iKeyboardLayoutStatusSubscriber = new (ELeave) CSubscriber(
+                                         TCallBack(HandleKeyboardLayoutChangeNotification, this), 
+                                         iKeyboardLayoutStatusProperty);    
+    iKeyboardLayoutStatusSubscriber->SubscribeL();
+#endif
+#endif     
+    }
+
+CAknFepUIAvkonImpl::CAknFepUIAvkonImpl()
+	{
+    iDialog = NULL;
+    iPredictiveSettingDialog = NULL;
+    iListQueryDialog = NULL;
+    iTextQueryDialog = NULL;
+	}
+CAknFepUIAvkonImpl::~CAknFepUIAvkonImpl()
+	{
+    delete iCba;
+    iCba = NULL;
+    DeleteDialogs();
+
+#ifdef RD_INTELLIGENT_TEXT_INPUT    
+#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__       
+    if (iKeyboardLayoutStatusSubscriber)
+        {
+        iKeyboardLayoutStatusSubscriber->StopSubscribe();
+        }
+    iKeyboardLayoutStatusProperty.Close();
+    delete iKeyboardLayoutStatusSubscriber;     
+#endif    
+#endif   
+	}
+
+void CAknFepUIAvkonImpl::DeleteDialogs()
+    {
+    if(iDialog)
+        {
+        delete iDialog;
+        iDialog = NULL;
+        }
+    if(iCharMapDialog)
+        {
+        delete iCharMapDialog;
+        iCharMapDialog = NULL;
+        }
+    if(iListQueryDialog)
+        {
+        delete iListQueryDialog;
+        iListQueryDialog = NULL;
+        }
+    if(iTextQueryDialog)
+        {
+        delete iTextQueryDialog;
+        iTextQueryDialog = NULL;
+        }
+    if(iPredictiveSettingDialog)
+        {
+        TRAP_IGNORE( iPredictiveSettingDialog->ProcessCommandL(EAknCmdExit));
+        }
+    }
+
+void CAknFepUIAvkonImpl::LaunchConfirmationNoteL(TInt aResourceId)
+	{
+    CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog();
+    dlg->SetTimeout(CAknNoteDialog::EShortTimeout);
+    dlg->SetTone(CAknNoteDialog::ENoTone);
+    dlg->ExecuteLD(aResourceId);
+	}
+
+void CAknFepUIAvkonImpl::LaunchHelpTextQueryL(TInt aResourceId)
+	{
+    CAknMessageQueryDialog* dlg = new (ELeave) CAknMessageQueryDialog();
+    iDialog = dlg;
+    dlg->ExecuteLD(aResourceId);
+    iDialog = NULL;
+	}
+
+TInt CAknFepUIAvkonImpl::LaunchCangJieOptionDlgL(TInt aResourceId, TInt& aLevel, MDesC16Array* aItems)
+	{
+    CAknRadioButtonSettingPage* dlg = new (ELeave) CAknRadioButtonSettingPage (
+        aResourceId,
+        aLevel,
+        aItems
+        );
+    TBool ret = dlg->ExecuteLD(CAknSettingPage::EUpdateWhenChanged);
+	return ret;
+	}
+
+/* TCleanupSlotBase can be placed on the cleanup stack to cleanup
+ * a CBase derived object, but with the benefit that the CBase
+ * object can be reassigned.
+ * Essesntially it is a reusable cleanup stack slot.
+ * This is useful for situations where you would like to be able
+ * to remove or change an item on the cleanup stack, but do not
+ * know enough about the contents of the cleanup stack above it
+ * to unstack then restack the items that should remain.
+ */
+class TCleanupSlotCBase
+	{
+public:
+	TCleanupSlotCBase() 
+		: iObj(NULL) 
+		{}
+	TCleanupSlotCBase(CBase* aObj) 
+		: iObj(aObj) 
+		{}
+	void PushL()
+		{ CleanupStack::PushL(TCleanupItem(Cleanup, this)); }
+	void Pop()
+		{ CleanupStack::Pop(); }
+	void PopAndDestroy()
+		{ CleanupStack::PopAndDestroy(); }
+	void SetObj(CBase* aObj)
+		{ iObj = aObj; }
+private:
+	static void Cleanup(TAny* aThis)
+		{ delete static_cast<CBase*>(static_cast<TCleanupSlotCBase*>(aThis)->iObj); }
+private:
+	CBase* iObj;
+	};
+	
+TInt CAknFepUIAvkonImpl::LaunchListPopupL(TInt aResourceId, TInt& aIndex, TInt aInitialIndex, MDesC16Array* aItems, CArrayPtr<CGulIcon>* aIcons)
+	{
+	TCleanupSlotCBase iconsCleanup(aIcons);
+	iconsCleanup.PushL();
+	
+    iListQueryDialog = new (ELeave) CAknListQueryDialog(&aIndex);
+    iListQueryDialog->PrepareLC( aResourceId );
+    
+    CAknListQueryControl* listQueryControl = 
+        STATIC_CAST( CAknListQueryControl*, iListQueryDialog->Control(EListQueryControl));
+    if (aIcons)
+    	{
+	    listQueryControl->Listbox()->ItemDrawer()->FormattedCellData()
+	        ->SetIconArrayL( aIcons );
+	   	iconsCleanup.SetObj(NULL);	// ownership transferred to dialog
+	    listQueryControl->Listbox()->ItemDrawer()->FormattedCellData()
+	        ->SetNotAlwaysDrawnSubCellL( 0, ETrue );// Needed because not using icon in cell.
+    	}
+
+    // Activate selected language:
+    CTextListBoxModel* model = listQueryControl->Listbox()->Model();
+    model->SetItemTextArray( aItems );
+    model->SetOwnershipType( ELbmDoesNotOwnItemArray );
+    iListQueryDialog->ListBox()->SetCurrentItemIndex( aInitialIndex );
+
+    // Fire up the dialog
+    TInt ret = iListQueryDialog->RunLD();
+    iconsCleanup.Pop();
+    iListQueryDialog = NULL;
+    return ret;
+	}
+
+void CAknFepUIAvkonImpl::UpdateSoftkeysL(TInt aResourceId, CAknEdwinState* aEditorState, MEikCommandObserver* aObserver, TInt aInputMode)
+	{
+    CEikButtonGroupContainer* currentEditorCba=aEditorState->CbaState().iCurrentCba;
+    if (currentEditorCba /*&& currentEditorCba->IsVisible()*/)
+        {
+//        currentEditorCba->MakeVisible(ETrue);
+        TBool cbaModified = EFalse;
+
+        // remove the old command button(s)
+        if (aEditorState->CbaState().iLeftSoftkeyCommandId)
+            {
+            currentEditorCba->RemoveCommandFromStack(ELeftSoftkeyIndex, currentEditorCba->ButtonGroup()->CommandId(ELeftSoftkeyIndex));
+            currentEditorCba->RemoveCommandObserver(ELeftSoftkeyIndex);
+            aEditorState->CbaState().iLeftSoftkeyCommandId=0;
+            cbaModified = ETrue;
+            }
+        if (aEditorState->CbaState().iRightSoftkeyCommandId)
+            {
+            currentEditorCba->RemoveCommandFromStack(ERightSoftkeyIndex, currentEditorCba->ButtonGroup()->CommandId(ERightSoftkeyIndex));
+            currentEditorCba->RemoveCommandObserver(ERightSoftkeyIndex);
+            aEditorState->CbaState().iRightSoftkeyCommandId=0;
+            cbaModified = ETrue;
+            }
+        if (aEditorState->MiddleSoftkeyCommandId())
+            {
+            currentEditorCba->RemoveCommandFromStack(EMiddleSoftkeyIndex, currentEditorCba->ButtonGroup()->CommandId(EMiddleSoftkeyIndex));
+            currentEditorCba->RemoveCommandObserver(EMiddleSoftkeyIndex);
+            aEditorState->SetMiddleSoftkeyCommandId(0);
+            cbaModified = ETrue;
+            }
+
+        if( aResourceId  == R_AKNFEP_SOFTKEYS_FINGER ||
+            aResourceId  == R_AKNFEP_SOFTKEYS_FINGER_OPTION_PREVIOUS  ||
+            aResourceId  == R_AKNFEP_SOFTKEYS_FINGER_SPELL_PREVIOUS )
+            {
+            ShowOwnsSoftkeysL(aResourceId, aObserver);
+            return;     // return this function
+            }
+        // for Japanese
+        switch (aResourceId)
+            {
+            case R_AKNFEP_SOFTKEYS_PREDICT_OTHER_COMMIT:
+            case R_AKNFEP_SOFTKEYS_EMPTY_EMPTY_COMMIT:
+            case R_AKNFEP_SOFTKEYS_EMPTY_OTHER_COMMIT:
+            case R_AKNFEP_SOFTKEYS_PHRASE_CREATION_SELECT_CANCEL_SELECT:
+            case R_AKNFEP_SOFTKEYS_DONE_CANCEL_DONE:
+                ShowOwnsSoftkeysL(aResourceId, aObserver);
+                return;     // return this function
+            case R_AKNFEP_SOFTKEYS_CONVERT_OTHER_SELECT:
+            case R_AKNFEP_SOFTKEYS_EMPTY_CANCEL_SELECT:
+            case R_AVKON_SOFTKEYS_EMPTY:
+                ShowEmptySoftkeysL(ETrue, aObserver, aInputMode);
+                return;     // return this function
+            default:
+                // delete iCba object in this function
+                ShowEmptySoftkeysL(EFalse, aObserver, aInputMode);
+                break;
+            }
+
+        // add the new button/command ids
+        if (aResourceId)
+            {
+            TResourceReader reader;
+            CCoeEnv::Static()->CreateResourceReaderLC(reader, aResourceId);
+            reader.ReadInt32();     // flags
+            reader.ReadInt16();     // width
+            reader.ReadInt32();     // related buttons
+            reader.ReadInt16();     // size of buttons array
+
+            TInt leftSoftkeyShortCommandId=(currentEditorCba->ButtonGroup()->CommandId(ELeftSoftkeyIndex)) & 0x0000ffff;
+
+            for (TInt index=0; index < currentEditorCba->ButtonCount(); index++)
+                {
+                TInt cbaIndex = index;
+                if ( index >=1 )
+                    {
+                    cbaIndex++;    // skip the scrollbar
+                    }
+
+                TUint8 version = (TUint8)reader.ReadUint8();
+                TInt commandId;
+                if (version == KAknCbaVersion)
+                    {
+                    TUint32 shortCommandId = reader.ReadUint16();
+                    TUint32 longCommandId = reader.ReadUint16();
+                    commandId = (longCommandId << 16) | shortCommandId;
+                    }
+                else
+                    {
+                    commandId = TInt(TUint(reader.ReadUint16()));
+                    }
+                TPtrC text=reader.ReadTPtrC();
+                reader.ReadTPtrC(); // bmp filename
+                reader.ReadInt16(); // bmp id
+                reader.ReadInt16(); // bmp mask id
+
+                // check we have a command and also check that if we're changing the
+                // left softkey that it is 'Options'
+                if ( commandId )
+                    {
+                    if(!currentEditorCba->UpdatedCommandObserverExists(CEikButtonGroupContainer::TCommandPosition(cbaIndex)))
+                        {
+                        currentEditorCba->UpdateCommandObserverL(cbaIndex, *aObserver);
+                        currentEditorCba->AddCommandToStackL(cbaIndex, commandId, text);
+                        
+                    if (cbaIndex==ELeftSoftkeyIndex)
+                        {
+                        aEditorState->CbaState().iLeftSoftkeyCommandId=commandId;
+                        }
+                    else if (cbaIndex==ERightSoftkeyIndex)
+                        {
+                        aEditorState->CbaState().iRightSoftkeyCommandId=commandId;
+                        }
+                    else if (cbaIndex==EMiddleSoftkeyIndex)
+                        {
+                        aEditorState->SetMiddleSoftkeyCommandId(commandId);
+                        }
+                        }
+
+                    cbaModified = ETrue;
+                    }
+                }
+            CleanupStack::PopAndDestroy(); // reader
+            }
+
+        if (cbaModified)
+            {
+            currentEditorCba->DrawNow(); // to update the cba
+            }
+        }
+	}
+
+/**
+ *  Show cba of aResourceId using owns cba object(iCba)
+ *
+ *  @since 3.2
+ *  @param aResourceId Cba resource id.
+ *  @return None
+ */
+void CAknFepUIAvkonImpl::ShowOwnsSoftkeysL(const TInt aResourceId, MEikCommandObserver* aObserver)
+    {
+    if (iCba)
+        {
+        delete iCba;
+        iCba = NULL;
+        }
+    iCba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba,
+                                          CEikButtonGroupContainer::EHorizontal,
+                                          aObserver,
+                                          aResourceId);
+    iCba->SetBoundingRect(CEikonEnv::Static()->EikAppUi()->ApplicationRect());
+    iCba->DrawNow();
+    }
+
+/**
+ * This method is that empty CBA is shown in case aShown is ETrue.
+ * If aShown is EFalse, empty CBA is erased.
+ */
+void CAknFepUIAvkonImpl::ShowEmptySoftkeysL(TBool aShown, MEikCommandObserver* aObserver, TInt aInputMode)
+    {
+    if (aShown)
+        {
+        if (!iCba)
+            {
+            iCba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba, CEikButtonGroupContainer::EHorizontal, aObserver, R_AVKON_SOFTKEYS_EMPTY);
+            iCba->SetBoundingRect(CEikonEnv::Static()->EikAppUi()->ApplicationRect());
+            }
+        // set each CBA
+        TBool update = UpdateSoftkeyLabelL(ELeftSoftkeyIndex, ENullCommandId, R_TEXT_SOFTKEY_EMPTY);
+        if (aInputMode == EPinyin || aInputMode == EZhuyin ||
+            aInputMode == EStroke || aInputMode == ECangJie)
+            {
+            update |= UpdateSoftkeyLabelL(ERightSoftkeyIndex, EAknFepSoftkeyCloseWindow, R_AKNFEP_SOFTKEY_CCPU_CANCEL);
+            update |= UpdateSoftkeyLabelL( EMiddleSoftkeyIndex, ENullCommandId, R_AVKON_SOFTKEY_SELECT_TEXT ); 
+            }
+        else
+            {
+            update |= UpdateSoftkeyLabelL(ERightSoftkeyIndex, ENullCommandId, R_TEXT_SOFTKEY_EMPTY);
+            update |= UpdateSoftkeyLabelL(EMiddleSoftkeyIndex, ENullCommandId, R_TEXT_SOFTKEY_EMPTY);
+            }
+
+        if (update)
+            {
+            iCba->DrawNow();
+            }
+        }
+    else
+        {
+        delete iCba;
+        iCba = NULL;
+        }
+    }
+
+TBool CAknFepUIAvkonImpl::SoftkeysExist()
+	{
+	return iCba != NULL;
+	}
+
+TInt CAknFepUIAvkonImpl::SoftkeyCommandId(TInt aPosition)
+	{
+	return iCba->ButtonGroup()->CommandId(aPosition);
+	}
+
+void CAknFepUIAvkonImpl::DeleteSoftkeys()
+	{
+	delete iCba;
+	iCba = NULL;
+	}
+
+void CAknFepUIAvkonImpl::DrawSoftkeysNow()
+	{
+	iCba->DrawNow();
+	}
+
+void CAknFepUIAvkonImpl::CreateSoftkeys(TInt aResourceId, MEikCommandObserver* aObserver)
+	{
+	DeleteSoftkeys();
+    TRAP_IGNORE(iCba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba, CEikButtonGroupContainer::EHorizontal, aObserver, aResourceId));
+    iCba->SetBoundingRect(CEikonEnv::Static()->EikAppUi()->ApplicationRect());
+    iCba->MakeVisible(ETrue);
+    iCba->ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront + 10);
+	}
+
+TBool CAknFepUIAvkonImpl::UpdateSoftkeyLabelL(TInt aPosition, TInt aCommandId, TInt aTextResId)
+	{
+    if (iCba->ButtonGroup()->CommandId(aPosition) != aCommandId)
+        {
+        HBufC* buf = CEikonEnv::Static()->AllocReadResourceLC(aTextResId);
+        if( buf->Des().Length() > 1 && EMiddleSoftkeyIndex != aPosition )
+            {
+            iCba->SetCommandL(aPosition, aCommandId, buf->Des().Mid(1));                    
+            }
+        else
+            {           
+            iCba->SetCommandL(aPosition, aCommandId, *buf);
+            }
+        CleanupStack::PopAndDestroy(buf);
+        return ETrue;
+        }
+    return EFalse;
+	}
+
+void CAknFepUIAvkonImpl::SetFepMenuObserver(MAknFepUiInterfaceMenuObserver* aObserver)
+	{
+	iFepMenuObserver = aObserver;
+	if (aObserver)
+		{	
+		CAknEnv::Static()->SetFepMenuObserver(this);
+		}
+	else
+		{	
+		CAknEnv::Static()->SetFepMenuObserver(NULL);
+		}
+	}
+
+CAknFepUiInterfaceMenuBar* CAknFepUIAvkonImpl::EditorStateMenuBar(CAknEdwinState* aEditorState)
+	{
+	iEditorMenuBar.iMenuBar = aEditorState->MenuBar();
+	return &iEditorMenuBar;
+	}
+
+void CAknFepUIAvkonImpl::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane)
+	{
+	iTempMenuPane.iMenuPane = aMenuPane;
+	if (iFepMenuObserver)
+		iFepMenuObserver->DynInitMenuPaneL(aResourceId, &iTempMenuPane);
+	}
+
+void CAknFepUIAvkonImpl::DynInitMenuBarL(TInt aResourceId,CEikMenuBar* aMenuBar)
+	{
+	CAknFepUIAvkonMenuBarImpl* impl = &iTempMenuBar;
+	if (iEditorMenuBar.iMenuBar == aMenuBar)
+		impl = &iEditorMenuBar;
+	impl->iMenuBar = aMenuBar;
+	if (iFepMenuObserver)
+		iFepMenuObserver->DynInitMenuBarL(aResourceId, impl);
+	}
+
+void CAknFepUIAvkonImpl::SetEmphasis(CCoeControl* aMenuControl,TBool aEmphasis)
+	{
+	CBase* impl = NULL;
+	if (aMenuControl == iEditorMenuBar.iMenuBar)
+		impl = &iEditorMenuBar;
+	else if (aMenuControl == iTempMenuBar.iMenuBar)
+		impl = &iTempMenuBar;
+	else if (aMenuControl == iTempMenuPane.iMenuPane)
+		impl = &iTempMenuPane;
+	if (iFepMenuObserver)
+		iFepMenuObserver->SetEmphasis(impl, aEmphasis);
+	}
+
+void CAknFepUIAvkonImpl::ProcessCommandL(TInt aCommandId)
+	{
+	if (iFepMenuObserver)
+		iFepMenuObserver->ProcessCommandL(aCommandId);
+	}
+
+CAknFepUiInterfaceMenuBar* CAknFepUIAvkonImpl::NewMenuBarL(MAknFepUiInterfaceMenuObserver* aObserver, TInt aHotKeyResourceId, TInt aMenuTitleResourceId)
+	{
+	CAknFepUIAvkonMenuBarOwningImpl* menuBar = new(ELeave) CAknFepUIAvkonMenuBarOwningImpl;
+	CleanupStack::PushL(menuBar);
+	menuBar->ConstructL(aObserver, aHotKeyResourceId, aMenuTitleResourceId);
+	CleanupStack::Pop(menuBar);
+	return menuBar;
+	}
+
+CAknFepUiInterfaceStylusPopUpMenu* CAknFepUIAvkonImpl::NewStylusPopUpMenuL(MAknFepUiInterfaceMenuObserver* aObserver, const TPoint& aPoint)
+	{
+	CAknFepUIAvkonStylusPopUpMenu* popupMenu = new(ELeave) CAknFepUIAvkonStylusPopUpMenu;
+	CleanupStack::PushL(popupMenu);
+	popupMenu->ConstructL(aObserver, aPoint);
+	CleanupStack::Pop(popupMenu);
+	return popupMenu;
+	}
+
+TInt CAknFepUIAvkonImpl::CharMapDialogL(TInt aCharCase, TDes& aSpecialChars, TInt aCharSetResourceId, TBool aLockNumericKeys, TBool aShowPictographsFirst, TBool aShowNoPictographs, TBool aShowAnotherTable, TInt aAfterSctChars, TInt aResId, TBool aDisableRecentItemRow )
+	{
+	TInt result;
+	
+	iCharMapDialog = new(ELeave) CAknCharMapDialog(aCharCase, aSpecialChars, aCharSetResourceId);
+
+    if (aLockNumericKeys)
+        {
+        iCharMapDialog->LockNumericKeys(ETrue);
+        }
+
+    if ( aShowPictographsFirst )
+        {
+        // It is supposed that the pictograph table launch is allowed in this case.
+        iCharMapDialog->ShowPictographsFirst();
+        }
+    else if (aShowNoPictographs)
+        {
+        // Pictograph table is not shown.
+        iCharMapDialog->ShowNoPictographs();
+        }
+
+    if (aShowAnotherTable)
+        {
+        iCharMapDialog->ShowAnotherTable(aAfterSctChars);
+        }
+    if(aDisableRecentItemRow)
+        {
+        iCharMapDialog->DisableRecentCharsRow();
+        }
+    
+
+    result = iCharMapDialog->ExecuteLD(aResId);
+    iCharMapDialog = NULL;
+    return result;
+	}
+
+void CAknFepUIAvkonImpl::TouchPaneSetFepPenSupportInterface(MAknFepPenSupportInterface* aFepPenSupportInterface)
+	{
+	if(iAvkonAppUi->TouchPane())
+		iAvkonAppUi->TouchPane()->SetFepPenSupportInterface(aFepPenSupportInterface);
+	}
+
+void CAknFepUIAvkonImpl::TouchPaneAllowInputMethodActivation(TBool aValue)
+	{
+	if(iAvkonAppUi->TouchPane())
+		iAvkonAppUi->TouchPane()->AllowInputMethodActivation(aValue);
+	}
+
+void CAknFepUIAvkonImpl::TouchPaneRefreshL()
+	{
+	if(iAvkonAppUi->TouchPane())
+		iAvkonAppUi->TouchPane()->RefreshL();
+	}
+
+void CAknFepUIAvkonImpl::TouchPaneSetInputMethodIconActivated(TBool aActivated)
+	{
+	if(iAvkonAppUi->TouchPane())
+		iAvkonAppUi->TouchPane()->SetInputMethodIconActivated(aActivated);
+	}
+
+TInt CAknFepUIAvkonImpl::TextQueryDialogL(TDes& aDataText, CAknEdwinState& aEditorState, TInt aEditorFlag, TInt aResId)
+	{
+	TInt result;
+    iTextQueryDialog = new (ELeave) CAknFepTextQueryDialog(aDataText, aEditorState, CAknFepTextQueryDialog::ENoTone, aEditorFlag);
+    iTextQueryDialog->PrepareLC(aResId);
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+    //last char space has to be reserved for null terminator
+    iTextQueryDialog->SetMaxLength( KMaxUDBLength - 1 );
+#endif //RD_INTELLIGENT_TEXT_INPUT
+    result = iTextQueryDialog->RunLD();
+    iTextQueryDialog = NULL;
+    return result;
+	}
+
+CPlainText* CAknFepUIAvkonImpl::PlainText(CAknEdwinState* aEditorState)
+	{
+    CEikEdwin* editor = NULL;
+    if (aEditorState)
+        {
+        CAknEdwinFormAccessor* formAccessor = aEditorState->FormAccessor();
+        if (formAccessor)
+            {
+            editor = (CEikEdwin*)formAccessor->FormClientControl();
+            if (editor)
+                {
+                return editor->Text();                
+                }
+            }
+        }
+    return NULL;
+	}
+
+void CAknFepUIAvkonImpl::UpdateEditorContext(MAknEditingStateIndicator& aIndicator, MAknFepManagerInterface& aManager)
+	{
+    CAknIndicatorContainer* indicatorContainer = aIndicator.IndicatorContainer();
+
+    if(indicatorContainer)
+        {
+        TInt indicatorContext = indicatorContainer->IndicatorContext();
+        aManager.SetEditorContext(indicatorContext);
+        }
+	}
+
+CAknFepIndicator* CAknFepUIAvkonImpl::NewIndicatorL()
+	{
+    return CAknFepIndicatorAvkon::NewL();
+	}
+
+TBool CAknFepUIAvkonImpl::IsDisplayDataQuery(TBool aIsFepAwareTextEditor)
+	{
+    CEikAppUi* eikAppUi = (CEikAppUi *)CCoeEnv::Static()->AppUi();
+    
+    if( eikAppUi->IsDisplayingDialog() && eikAppUi->TopFocusedControl() )
+        {
+        CEikDialog* dlg = eikAppUi->TopFocusedControl()->MopGetObject( dlg );
+        
+        if ( dlg )
+            {
+            TInt flag = dlg->DialogFlags();
+
+            if(!(flag & EEikDialogFlagFillScreen) &&
+               !(flag & EEikDialogFlagFillAppClientRect) )
+                {
+                MObjectProvider* objectProvider = NULL;
+				MCoeFepAwareTextEditor* editor;
+			    MCoeFepAwareTextEditor_Extension1* ext1;
+    			CAknEdwinState* state;
+                CCoeEnv* coeEnv = CCoeEnv::Static();
+                TCoeInputCapabilities inputCapabilities = 
+                    static_cast<const CCoeAppUi*>(coeEnv->AppUi())->InputCapabilities();
+
+    			if ( aIsFepAwareTextEditor &&
+         			( editor = inputCapabilities.FepAwareTextEditor() ) != NULL &&       
+         		    ( ext1 = editor->Extension1() ) != NULL &&
+				    ( state = (CAknEdwinState*)ext1->State( KNullUid ) ) != NULL )
+        			{
+        			objectProvider = state->ObjectProvider();
+        			}
+
+    			// If not found, try to get object provider from input capabilities.
+    			// It is set there with CEikMfne-derived editors.
+
+    			if ( !objectProvider )
+        			{
+        			objectProvider = inputCapabilities.ObjectProvider();
+        			}
+
+			    if ( objectProvider )
+        			{
+        			CAknQueryControl* ctrl = objectProvider->MopGetObject( ctrl );
+        		
+        			if ( ctrl )
+        				{
+        				return ETrue;
+        				}
+        			}
+        		}
+            }
+        }
+         
+    return EFalse;
+	}
+
+CAknFepUiInterfaceMenuBar* CAknFepUIAvkonImpl::ObjectProviderMenuBar(MObjectProvider* aObjectProvider)
+	{
+	if (!aObjectProvider)
+		return NULL;
+	CEikMenuBar* menu;
+	aObjectProvider->MopGetObject(menu);
+	if (menu)
+		{
+		iObjectProviderMenuBar.iMenuBar = menu;
+		return &iObjectProviderMenuBar;
+		}
+	else
+		return NULL;
+	}
+
+MAknFepUICtrlContainerChinese* CAknFepUIAvkonImpl::NewAknFepUICtrlContainerChineseL()
+	{
+    if (FeatureManager::FeatureSupported(KFeatureIdChinese))
+        {
+        return CAknFepUICtrlContainerChinese::NewL();
+        }
+
+    User::Leave(KErrNotSupported);
+	return NULL;
+	}
+
+MAknFepUICtrlContainerJapanese* CAknFepUIAvkonImpl::NewAknFepUICtrlContainerJapaneseL(CAknFepUIManagerJapanese* aUiMng)
+	{
+    if (FeatureManager::FeatureSupported(KFeatureIdJapanese))
+        {
+        return CAknFepUICtrlContainerJapanese::NewL(aUiMng);
+        }
+    return NULL;
+	}
+
+void CAknFepUIAvkonImpl::JapaneseKutenQueryDialogL(TInt aResId, TInt& aCharCode, TInt aTone)
+	{
+    if (FeatureManager::FeatureSupported(KFeatureIdJapanese))
+        {
+        CAknFepUICtrlJapaneseKutenQueryDialog* query = CAknFepUICtrlJapaneseKutenQueryDialog::NewL(aCharCode, (CAknQueryDialog::TTone)aTone);
+        iDialog = query;
+        query->ExecuteLD(aResId);
+        iDialog = NULL;
+        }
+	}
+
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+// Predictive QWERTY (XT9) changes ---->
+MAknFepCandidatePopup* CAknFepUIAvkonImpl::NewCandidatePopupL(MAknFepCandidatePopupCallback& aOwner)
+	{
+	MAknFepCandidatePopup* candidatePopup = CAknFepAvkonCandidatePopup::NewL(aOwner);
+	return candidatePopup;
+	}
+
+MAknFepUiWordPopupContent* CAknFepUIAvkonImpl::CreateWordPopupContentL()
+	{
+	return CAknFepExactWordPopupContent::NewL();	
+	}
+	
+void CAknFepUIAvkonImpl::LaunchPredictiveSettingDialogL(TInt aDialogResId, 
+														TInt aMenuResId, 
+														TInt aConfirmationQueryResId,
+														TInt aTitlePaneResId)
+	{
+	iPredictiveSettingDialog = CAknFepPredictiveSettingDialog::NewL(aMenuResId, aConfirmationQueryResId, aTitlePaneResId);
+	iPredictiveSettingDialog->ExecuteLD(aDialogResId);
+	iPredictiveSettingDialog = NULL;
+	}
+
+#ifdef __USER_DICTIONARY_EDITING__
+void CAknFepUIAvkonImpl::LaunchUserDictEditDialogL()
+    {
+    CAknFepUserDictionaryEditDialog::RunDlgLD();
+    }
+#endif //__USER_DICTIONARY_EDITING__
+
+#ifdef FF_DUAL_LANGUAGE_SUPPORT
+void CAknFepUIAvkonImpl::LaunchWritingLanguageSettingDialogL(TInt aDialogResId, TInt aMenuResId, TInt aTitlePaneResId)
+    {    
+    CCoeEnv* coeEnv = CCoeEnv::Static();
+	CAknAppUi* appUi = static_cast<CAknAppUi*>(coeEnv->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( aTitlePaneResId,coeEnv);
+    titlePane->SetTextL( *title );
+    CleanupStack::PopAndDestroy(title);
+    
+    CAknFepDualLanguageSettingDialog* dlg = CAknFepDualLanguageSettingDialog::NewL(aMenuResId);            
+    iDialog = dlg;
+    dlg->ExecuteLD(aDialogResId);
+    iDialog = NULL;
+    
+    titlePane->SetTextL( *oldTitle );
+    CleanupStack::PopAndDestroy(oldTitle);
+    }
+#endif //FF_DUAL_LANGUAGE_SUPPORT
+// Predictive QWERTY (XT9) changes <----	
+
+#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__
+TInt CAknFepUIAvkonImpl::HandleKeyboardLayoutChangeNotification(TAny* aObj)
+    {
+    if (aObj)
+        {
+        static_cast<CAknFepUIAvkonImpl*>(aObj)->HandleKeyboardLayoutChange();
+        return KErrNone;
+        }
+    else
+        {
+        return KErrArgument;
+        }
+    }
+
+void CAknFepUIAvkonImpl::HandleKeyboardLayoutChange()
+    {
+    if(iPredictiveSettingDialog)
+        {
+        iPredictiveSettingDialog->HandleResourceChange(KEikDynamicLayoutVariantSwitch);
+        }
+    }
+
+CAknFepUIAvkonImpl::CSubscriber::CSubscriber(TCallBack aCallBack, RProperty& aProperty)
+    :
+    CActive(EPriorityNormal), iCallBack(aCallBack), iProperty(aProperty)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+CAknFepUIAvkonImpl::CSubscriber::~CSubscriber()
+    {
+    Cancel();
+    }
+
+void CAknFepUIAvkonImpl::CSubscriber::SubscribeL()
+    {
+    if (!IsActive())
+        {
+        iProperty.Subscribe(iStatus);
+        SetActive();
+        }
+    }
+
+void CAknFepUIAvkonImpl::CSubscriber::StopSubscribe()
+    {
+    Cancel();
+    }
+
+void CAknFepUIAvkonImpl::CSubscriber::RunL()
+    {
+    if (iStatus.Int() == KErrNone)
+        {
+        iCallBack.CallBack();
+        SubscribeL();
+        }
+    }
+
+void CAknFepUIAvkonImpl::CSubscriber::DoCancel()
+    {
+    iProperty.Cancel();
+    }
+    
+#endif //__ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__
+#endif //RD_INTELLIGENT_TEXT_INPUT
+