javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttextextension.cpp
branchRCL_3
changeset 19 04becd199f91
child 34 71c436fe3ce0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttextextension.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,783 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - S60 implementation
+ *******************************************************************************/
+
+
+#include <eikedwin.h>
+#include <CPbkContactEngine.h>
+#include <CPbkSingleEntryFetchDlg.h>
+#include <CPbkContactItem.h>
+#include <RPbkViewResourceFile.h>
+#include <avkon.rsg>
+#include <barsread.h>
+#include <favouritesdb.h>
+#include <favouritesitemlist.h>
+#include <favouritessession.h>
+#include <aknselectionlist.h>
+#include <eikspane.h>
+#include <akntitle.h>
+#include <akncontext.h>
+#include <AknsUtils.h>
+#include <aknappui.h>
+#include <eswtcore.rsg>
+#include <featdiscovery.h>
+#include <e32const.h>
+#include <swtlaffacade.h>
+#include "swtcontrolmenu.h"
+#include "swtmenuitem.h"
+#include "eswtmobile.hrh"
+#include "swtuiutils.h"
+#include "swttextextension.h"
+
+
+//Pin Board UID for Favourites Icon
+#define PINB_UID 0x1000590B
+
+_LIT(KTAB,"\t");
+
+const TInt KSWTTEXTEXTENSION_EMAIL_LENGTH = 150;
+const TInt KSWTTEXTEXTENSION_URL_LENGTH = 1000;
+
+// Character subsets for SetInitialInputModeL
+_LIT(KUcbBasicLatin,        "UCB_BASIC_LATIN");
+_LIT(KIsLatin,              "IS_LATIN");
+_LIT(KIsLatinDigits,        "IS_LATIN_DIGITS");
+_LIT(KUcbArabic,            "UCB_ARABIC");
+_LIT(KUcbHebrew,            "UCB_HEBREW");
+_LIT(KUcbGreek,             "UCB_GREEK");
+_LIT(KUcbThai,              "UCB_THAI");
+_LIT(KIsSimplifiedHanzi,    "IS_SIMPLIFIED_HANZI");
+_LIT(KUcbHiragana,          "UCB_HIRAGANA");
+_LIT(KUcbKatakana,          "UCB_KATAKANA");
+_LIT(KIsHalfwidthKatakana,  "IS_HALFWIDTH_KATAKANA");
+_LIT(KIsKanji,              "IS_KANJI");
+_LIT(KIsFullwidthDigits,    "IS_FULLWIDTH_DIGITS");
+_LIT(KIsFullwidthLatin,     "IS_FULLWIDTH_LATIN");
+_LIT(KUcbCyrillic,          "UCB_CYRILLIC");
+_LIT(KUcbArmenian,          "UCB_ARMENIAN");
+_LIT(KUcbDevanagari,        "UCB_DEVANAGARI");
+_LIT(KUcbBengali,           "UCB_BENGALI");
+_LIT(KUcbHangulSyllables,   "UCB_HANGUL_SYLLABLES");
+_LIT(KIsHanja,              "IS_HANJA");
+_LIT(KIsTraditionalHanzi,   "IS_TRADITIONAL_HANZI");
+
+
+// Character subsets that contain more than one S60 language
+enum
+{
+    ECharSubsetNone= 0,
+    EIsLatin,               // "IS_LATIN"
+    EUcbCyrillic,           // "UCB_CYRILLIC"
+    EUcbArabic,             // "UCB_ARABIC"
+    EIsTraditionalHanzi     // "IS_TRADITIONAL_HANZI"
+};
+
+
+// ======== LOCAL FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// Local function for sorting the Favourite items by Name
+// ---------------------------------------------------------------------------
+//
+LOCAL_C TInt CompareItemsByNameL(const CFavouritesItem& aLeft, const CFavouritesItem& aRight)
+{
+    return aLeft.Name().CompareF(aRight.Name());
+}
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// Destructor for TextExtension
+// ---------------------------------------------------------------------------
+//
+CSwtTextExtension::~CSwtTextExtension()
+{
+    delete iNaviDecorator;
+
+    if (iMenuItem)
+        iMenuItem->Dispose();
+
+    if (iMenu)
+        iMenu->Dispose();
+}
+
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CSwtTextExtension::ConstructL()
+{
+    CSwtText::ConstructL();
+}
+
+
+// ---------------------------------------------------------------------------
+// Constructs and returns an object.
+// ---------------------------------------------------------------------------
+//
+CSwtTextExtension* CSwtTextExtension::NewL(
+    MSwtDisplay& aDisplay,
+    TSwtPeer aPeer,
+    MSwtComposite& aParent,
+    TInt aStyle)
+{
+    CSwtTextExtension* self = new(ELeave) CSwtTextExtension(aDisplay,
+            aPeer, aParent, aStyle);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    self->InitControlBaseL();
+    CleanupStack::Pop(self);
+    return self;
+}
+
+
+
+// ---------------------------------------------------------------------------
+// Sets content styles(Email address, URL), input modifier styles and
+//  casing modifiers. Note that Non Midlet commands are added here
+// ---------------------------------------------------------------------------
+//
+void CSwtTextExtension::SetTypeStyleL(TInt aTypeStyle)
+{
+    iTypeStyle=aTypeStyle;
+
+    TInt sct = R_AVKON_URL_SPECIAL_CHARACTER_TABLE_DIALOG;
+    TUint flags = 0;
+    if (iTypeStyle & EEmailAddress)
+    {
+        iMenu = CSwtControlMenu::NewL(iDisplay, NULL, 0);
+        iMenu->SetObserver(this);
+        iMenuItem = CSwtMenuItem::NewL(iDisplay, NULL, *iMenu, 0, 0, ESwtFetchEmail);
+        // Email style implementation
+        Editor().SetMaxLength(KSWTTEXTEXTENSION_EMAIL_LENGTH);
+        Editor().SetAknEditorAllowedInputModes(EAknEditorAllInputModes);
+        Editor().SetAknEditorCurrentInputMode(EAknEditorAlphaInputMode);
+        Editor().SetAknEditorPermittedCaseModes(EAknEditorAllCaseModes);
+        Editor().SetAknEditorCase(EAknEditorLowerCase);
+        Editor().SetAknEditorCurrentCase(EAknEditorLowerCase);
+        sct =  R_AVKON_EMAIL_ADDR_SPECIAL_CHARACTER_TABLE_DIALOG;
+        flags |= EEikEdwinNoLineOrParaBreaks|EAknEditorFlagNoT9;
+        //Adding Non Midlet Commands
+        HBufC* buffer = iCoeEnv->AllocReadResourceLC(R_EMAIL_COMMAND_TEXT);
+        TPtrC ptr = buffer->Des();
+        iMenuItem->SetTextL(ptr);
+        CleanupStack::PopAndDestroy(buffer);
+    }
+    else if (iTypeStyle & EUrl)
+    {
+        iMenu = CSwtControlMenu::NewL(iDisplay, NULL, 0);
+        iMenu->SetObserver(this);
+        iMenuItem = CSwtMenuItem::NewL(iDisplay, NULL, *iMenu, 0, 0, ESwtFetchUrl);
+        // Url type implementation
+        Editor().SetMaxLength(KSWTTEXTEXTENSION_URL_LENGTH);
+        Editor().SetAknEditorAllowedInputModes(EAknEditorAllInputModes);
+        Editor().SetAknEditorCurrentInputMode(EAknEditorAlphaInputMode);
+        Editor().SetAknEditorPermittedCaseModes(EAknEditorAllCaseModes);
+        Editor().SetAknEditorCase(EAknEditorLowerCase);
+        Editor().SetAknEditorCurrentCase(EAknEditorLowerCase);
+        sct = R_AVKON_URL_SPECIAL_CHARACTER_TABLE_DIALOG;
+        flags |= EEikEdwinNoLineOrParaBreaks|EAknEditorFlagNoT9;
+        //Adding Non Midlet Commands
+        HBufC* buffer = iCoeEnv->AllocReadResourceLC(R_URL_COMMAND_TEXT);
+        TPtrC ptr = buffer->Des();
+        iMenuItem->SetTextL(ptr);
+        CleanupStack::PopAndDestroy(buffer);
+    }
+
+    if (iTypeStyle & ELatinInputOnly)
+    {
+        //LatinInputOnly type implementation
+        flags |=  EAknEditorFlagLatinInputModesOnly;
+    }
+
+    if (iTypeStyle & ENonPredictive)
+    {
+        //NonPredictive type implementation
+        flags |= EAknEditorFlagNoT9;
+    }
+#ifdef RD_SCALABLE_UI_V2
+    flags |= EAknEditorFlagDeliverVirtualKeyEventsToApplication;
+#endif // RD_SCALABLE_UI_V2 
+    Editor().SetAknEditorFlags(flags);
+    Editor().SetAknEditorSpecialCharacterTable(sct);
+    // make changes take effect
+    TRAP_IGNORE(Editor().NotifyEditorStateObserverOfStateChangeL());
+}
+
+
+// ---------------------------------------------------------------------------
+// Handling non midlet menu commands
+// ---------------------------------------------------------------------------
+//
+void CSwtTextExtension::ProcessCommandL(TInt aCmdId)
+{
+
+    switch (aCmdId)
+    {
+
+    case ESwtFetchEmail:
+        FetchEmailL();// Fetching the Email address from the phone book
+        break;
+
+    case ESwtFetchUrl:
+        FetchUrlL();// Fetching URL from favourites
+        break;
+
+    default:
+        ASSERT(EFalse);
+        break;
+    }
+}
+
+
+// ---------------------------------------------------------------------------
+// Return the control menu to the menu arranger
+// ---------------------------------------------------------------------------
+//
+const MSwtMenu* CSwtTextExtension::GetControlMenu() const
+{
+    if (iMenu)
+    {
+        return iMenu;
+    }
+    return ASwtControlBase::GetControlMenu();
+}
+
+
+#ifdef RD_SCALABLE_UI_V2
+// ---------------------------------------------------------------------------
+// Return the control menu for the stylus popup menu
+// ---------------------------------------------------------------------------
+//
+const MSwtMenu* CSwtTextExtension::GetStylusPopupControlMenu() const
+{
+    return GetControlMenu();
+}
+#endif //RD_SCALABLE_UI_V2
+
+// ---------------------------------------------------------------------------
+// Provides GUI that allows the user to select Email address from Phone Book
+// and returns selected email id to the editor
+// ---------------------------------------------------------------------------
+//
+void CSwtTextExtension::FetchEmailL()
+{
+    // The dialog used to select the address doesn't work properly if there is no
+    // status pane. Therefore, the status pane is temporarily made visible for
+    // the duration of showing the dialog.
+    MSwtShell* shell = iDisplay.UiUtils().TopMostTopShell();
+    TBool fullScreenMode(EFalse);
+    MSwtShell::TSwtStatusPaneStyle statusPaneStyle;
+    MakeStatusPaneLargeL(shell, fullScreenMode, statusPaneStyle);
+
+    CPbkContactEngine* pbkContactEngine = CPbkContactEngine::NewL();
+    CleanupStack::PushL(pbkContactEngine);
+    RPbkViewResourceFile pbkResource(*iCoeEnv);
+    // Opening the default phone book
+    TBool isOpen = EFalse;
+    if (!pbkResource.IsOpen())
+    {
+        pbkResource.OpenL();
+        isOpen = ETrue;
+    }
+    // Filtering phone book items which have email address
+    CContactDatabase::TContactViewFilter filter(CContactDatabase::EMailable);
+    CPbkSingleEntryFetchDlg::TParams params;
+    params.iContactView = &pbkContactEngine->FilteredContactsViewL(filter);
+    //Construct the dialog with filtered parameters
+    CPbkSingleEntryFetchDlg* fetchDialog = CPbkSingleEntryFetchDlg::NewL(params);
+    CleanupStack::PushL(fetchDialog);
+    fetchDialog->SetMopParent(this);
+    // Executes the dialog and waits for user selection
+    TInt selection =  fetchDialog->ExecuteLD();
+    CleanupStack::Pop(fetchDialog);
+    if (selection)
+    {
+        //Retrieving the user selected email address
+        const TContactItemId contactItemId = params.iSelectedEntry;
+        CPbkContactItem* pbkItem = pbkContactEngine->ReadContactLC(contactItemId);
+        TPbkContactItemField* emailField = pbkItem->FindField(EPbkFieldIdEmailAddress);
+        TPtrC ptr = emailField->Text();
+        Editor().SetTextL(&ptr);  // assigning email address to editor
+        Editor().HandleTextChangedL();
+        CleanupStack::PopAndDestroy(pbkItem);
+    }
+    if (isOpen)
+    {
+        pbkResource.Close();
+    }
+    CleanupStack::PopAndDestroy(pbkContactEngine);
+
+    // Restore the original status pane style and fullscreenmode state
+    RestoreStatusPaneL(shell, fullScreenMode, statusPaneStyle);
+}
+
+
+// ---------------------------------------------------------------------------
+// Provides GUI that allows the user to select URL from Favourites Database
+// and returns selected Bookmarked URL to the editor
+// ---------------------------------------------------------------------------
+//
+void CSwtTextExtension::FetchUrlL()
+{
+    // The dialog used to select the url doesn't work properly if there is no
+    // status pane. Therefore, the status pane is temporarily made visible for
+    // the duration of showing the dialog.
+    MSwtShell* shell = iDisplay.UiUtils().TopMostTopShell();
+    TBool fullScreenMode(EFalse);
+    MSwtShell::TSwtStatusPaneStyle statusPaneStyle;
+    MakeStatusPaneLargeL(shell, fullScreenMode, statusPaneStyle);
+
+    RFavouritesSession favouritesSession;
+    User::LeaveIfError(favouritesSession.Connect());
+    CleanupClosePushL<RFavouritesSession>(favouritesSession);
+
+    // Opening the Favourites Database
+    RFavouritesDb favouritesDb;
+    TInt error(favouritesDb.Open(favouritesSession, KBrowserBookmarks));
+    if (!error)
+    {
+        CleanupClosePushL<RFavouritesDb>(favouritesDb);
+        CFavouritesItemList* favouriteItemsList = new(ELeave) CFavouritesItemList();
+        CleanupStack::PushL(favouriteItemsList);
+
+        // Retrieving the items which have URL address into the items list
+        User::LeaveIfError(favouritesDb.GetAll(*favouriteItemsList,
+                                               KFavouritesNullUid,
+                                               CFavouritesItem::EItem,
+                                               NULL,
+                                               KFavouritesNullContextId));
+        TInt itemsCount = favouriteItemsList->Count();
+        favouriteItemsList->SortL(&CompareItemsByNameL);  // Sorting the items by name
+
+        // Defining the array with the size equals to the number of items retrieved
+        CDesCArrayFlat* arrayList = new(ELeave) CDesCArrayFlat(
+            itemsCount ? itemsCount : 1);
+
+        CleanupStack::PushL(arrayList);
+        for (TInt i = 0; i < itemsCount; i++)
+        {
+            // Adding items to the array
+            const TInt size(((favouriteItemsList->At(i))->Name()).Length());
+            HBufC* name = HBufC::NewLC(size + 1);
+            name->Des().Append(KTAB);
+            name->Des().Append((favouriteItemsList->At(i))->Name());
+            arrayList->AppendL(*name);
+            CleanupStack::PopAndDestroy(name);
+        }
+        TInt selectedItem(0);   // Default selected item
+        CAknSelectionListDialog* selectionListDialog =
+            CAknSelectionListDialog::NewL(selectedItem, arrayList, 0);
+
+        // Constructing the dialog from the resource
+        selectionListDialog->PrepareLC(R_SELECTION_LIST_DIALOG);
+        selectionListDialog->SetMopParent(this);
+
+        // Getting pointer to the AppUi's status pane
+        CEikStatusPane* statusPane = iAvkonAppUi->StatusPane();
+
+        // Setting the dialog title to the title pane
+        CAknNavigationControlContainer* naviContainer =
+            static_cast<CAknNavigationControlContainer*>(statusPane->ControlL(
+                        TUid::Uid(EEikStatusPaneUidNavi)));
+        HBufC* buffer = iCoeEnv->AllocReadResourceLC(R_TITLEPANE_TITLE);
+        TPtrC ptr = buffer->Des();
+        if (iNaviDecorator)
+        {
+            delete iNaviDecorator;
+            iNaviDecorator = NULL;
+        }
+        iNaviDecorator = naviContainer->CreateMessageLabelL(ptr);
+        CleanupStack::PopAndDestroy(buffer);
+
+        // Newly created navigation decorator onto the navigation panes object stack
+        naviContainer->PushL(*iNaviDecorator);
+
+        TInt selection(selectionListDialog->RunLD());   // pops the dialog from cleanupstack
+        if (selection)
+        {
+            // Setting selected url to editor
+            if (selectedItem >= 0)
+            {
+                TPtrC itemPtr((favouriteItemsList->At(selectedItem))->Url());
+                Editor().SetTextL(&itemPtr);
+                Editor().HandleTextChangedL();
+            }
+        }
+
+        CleanupStack::PopAndDestroy(arrayList);
+        CleanupStack::PopAndDestroy(favouriteItemsList);
+        CleanupStack::PopAndDestroy(&favouritesDb);
+    }
+    CleanupStack::PopAndDestroy(&favouritesSession);
+
+    // Restore the original status pane style and fullscreenmode state
+    RestoreStatusPaneL(shell, fullScreenMode, statusPaneStyle);
+}
+
+
+// ---------------------------------------------------------------------------
+// Sets input language and character subset
+// ---------------------------------------------------------------------------
+//
+void CSwtTextExtension::SetInitialInputModeL(TCasingModifier aCasingModifier, const TDesC* aMode)
+{
+    iInitialCurrentCase = 0;
+    switch (aCasingModifier)
+    {
+    case ELowerCase:
+        iInitialCurrentCase =  EAknEditorLowerCase;
+        break;
+    case EUpperCase:
+        iInitialCurrentCase = EAknEditorUpperCase ;
+        break;
+    case ETitleCase://Fall-through
+    case ETextCase:
+        iInitialCurrentCase = EAknEditorTextCase ;
+        break;
+    default:
+        iInitialCurrentCase = EAknEditorAllCaseModes;
+        break;
+    }
+
+    iInitialCurrentInputMode = 0;
+    iInitialCurrentLanguage = ELangTest;  // 0
+    if (aMode)
+    {
+        HBufC* mode = aMode->AllocLC();
+        if (mode->Compare(KUcbBasicLatin) == 0 || mode->Compare(KIsLatin) == 0)
+        {
+            // UCB_BASIC_LATIN, IS_LATIN
+            iInitialCurrentLanguage = SelectLanguage(EIsLatin,ELangEnglish);
+            iInitialCurrentInputMode = EAknEditorTextInputMode;
+
+        }
+        else if (mode->Compare(KIsLatinDigits) == 0)
+        {
+            // IS_LATIN_DIGITS
+            iInitialCurrentInputMode = EAknEditorNumericInputMode;
+        }
+        else if (mode->Compare(KUcbArabic) == 0)
+        {
+            // UCB_ARABIC
+            iInitialCurrentLanguage = ELangArabic;
+        }
+        else if (mode->Compare(KUcbHebrew) == 0)
+        {
+            // UCB_HEBREW
+            iInitialCurrentLanguage = ELangHebrew;
+        }
+        else if (mode->Compare(KUcbGreek) == 0)
+        {
+            // UCB_GREEK
+            iInitialCurrentLanguage = ELangGreek;
+            iInitialCurrentCase = EAknEditorTextCase;
+        }
+        else if (mode->Compare(KUcbThai) == 0)
+        {
+            // UCB_THAI
+#ifdef KFeatureIdThai
+            if (CFeatureDiscovery::IsFeatureSupportedL(KFeatureIdThai))
+            {
+                iInitialCurrentLanguage = ELangThai;
+            }
+#endif // KFeatureIdThai
+        }
+        else if (mode->Compare(KIsSimplifiedHanzi) == 0)
+        {
+            // IS_SIMPLIIFED_HANZI
+#ifdef KFeatureIdChinese
+            if (CFeatureDiscovery::IsFeatureSupportedL(KFeatureIdChinese))
+            {
+                iInitialCurrentLanguage = ELangPrcChinese;
+            }
+#endif // KFeatureIdChinese
+        }
+        else if (mode->Compare(KUcbKatakana) == 0)
+        {
+            // UCB_KATAKANA
+#ifdef KFeatureIdJapanese
+            if (CFeatureDiscovery::IsFeatureSupportedL(KFeatureIdJapanese))
+            {
+                iInitialCurrentLanguage = ELangJapanese;
+                iInitialCurrentInputMode = EAknEditorFullWidthKatakanaInputMode;
+            }
+#endif // KFeatureIdJapanese
+        }
+        else if (mode->Compare(KUcbHiragana) == 0 || mode->Compare(KIsKanji) == 0)
+        {
+            // UCB_HIRAGANA, IS_KANJI
+#ifdef KFeatureIdJapanese
+            if (CFeatureDiscovery::IsFeatureSupportedL(KFeatureIdJapanese))
+            {
+                iInitialCurrentLanguage = ELangJapanese;
+                iInitialCurrentInputMode = EAknEditorHiraganaKanjiInputMode;
+            }
+#endif // KFeatureIdJapanese
+        }
+        else if (mode->Compare(KUcbHangulSyllables) == 0 || mode->Compare(KIsHanja) == 0)
+        {
+            // UCB_HANGUL_SYLLABLES, IS_HANJA
+            iInitialCurrentLanguage = ELangKorean;
+
+        }
+        else if (mode->Compare(KIsTraditionalHanzi) == 0)
+        {
+            //IS_TRADITIONAL_HANZI
+#ifdef KFeatureIdChinese
+            if (CFeatureDiscovery::IsFeatureSupportedL(KFeatureIdChinese))
+            {
+                iInitialCurrentLanguage = SelectLanguage(
+                                              EIsTraditionalHanzi, ELangTest);
+            }
+#endif // KFeatureIdChinese
+        }
+        else if (mode->Compare(KUcbDevanagari) == 0)
+        {
+            //UCB_DEVANAGARI
+            iInitialCurrentLanguage = ELangHindi;
+        }
+        else if (mode->Compare(KUcbBengali) == 0)
+        {
+            //UCB_BENGALI
+            iInitialCurrentLanguage = ELangBengali;
+        }
+        else if (mode->Compare(KUcbArmenian) == 0)
+        {
+            //UCB_ARMENIAN
+            iInitialCurrentLanguage = ELangArmenian;
+        }
+        else if (mode->Compare(KUcbCyrillic) == 0)
+        {
+            //UCB_CYRILLIC
+            iInitialCurrentLanguage = SelectLanguage(EUcbCyrillic, ELangRussian);
+            iInitialCurrentCase = EAknEditorTextCase;
+        }
+
+        else if (mode->Compare(KIsHalfwidthKatakana) == 0)
+        {
+            // IS_HALFWIDTH_KATAKANA
+#ifdef KFeatureIdJapanese
+            if (CFeatureDiscovery::IsFeatureSupportedL(KFeatureIdJapanese))
+            {
+                iInitialCurrentLanguage = ELangJapanese;
+                iInitialCurrentInputMode = EAknEditorKatakanaInputMode;
+            }
+#endif // KFeatureIdJapanese
+        }
+        else if (mode->Compare(KIsFullwidthDigits) == 0)
+        {
+            // IS_FULLWIDTH_DIGITS
+#ifdef KFeatureIdJapanese
+            if (CFeatureDiscovery::IsFeatureSupportedL(KFeatureIdJapanese))
+            {
+                iInitialCurrentLanguage = ELangJapanese;
+                iInitialCurrentInputMode = EAknEditorFullWidthNumericInputMode;
+            }
+#endif // KFeatureIdJapanese
+        }
+        else if (mode->Compare(KIsFullwidthLatin) == 0)
+        {
+            // IS_FULLWIDTH_DIGITS
+#ifdef KFeatureIdJapanese
+            if (CFeatureDiscovery::IsFeatureSupportedL(KFeatureIdJapanese))
+            {
+                iInitialCurrentLanguage = ELangJapanese;
+                iInitialCurrentInputMode = EAknEditorFullWidthTextInputMode;
+            }
+#endif // KFeatureIdJapanese
+        }
+        CleanupStack::PopAndDestroy(mode);   //mode
+    }
+    else
+    {
+        iInitialCurrentLanguage = CSwtLafFacade::GetLanguage();
+    }
+}
+
+
+// ---------------------------------------------------------------------------
+// Returns an intial input language for a given character subset.
+// If the global input language or the display language belong to the desired
+// character set, that language is returned as the initial input language.
+// Otherwise the given default language is returned.  Note that this method
+// is only used for character sets that contain more than one language.
+// ---------------------------------------------------------------------------
+//
+TLanguage CSwtTextExtension::SelectLanguage(
+    TInt aCharSubset,
+    TLanguage aDefaultLanguage)
+{
+    TLanguage language = CSwtLafFacade::GetLanguage();
+    if (IsLanguageInCharSubset(language, aCharSubset))
+    {
+        return language;        // global input language
+    }
+    language = User::Language();
+    if (IsLanguageInCharSubset(language, aCharSubset))
+    {
+        return language;        // display language
+    }
+    return aDefaultLanguage;    // given default
+}
+
+
+// ---------------------------------------------------------------------------
+// Returns ETrue if the given language belongs to the given character subset
+// ---------------------------------------------------------------------------
+//
+TBool CSwtTextExtension::IsLanguageInCharSubset(TLanguage aLanguage, TInt aCharSubset)
+{
+    switch (aLanguage)
+    {
+        // Cyrillic languages:
+    case ELangBulgarian:
+    case ELangRussian:
+    case ELangSerbian:
+    case ELangUkrainian:
+        return (aCharSubset == EUcbCyrillic);
+        // Arabic languages:
+    case ELangArabic:
+    case ELangFarsi:
+    case ELangUrdu:
+        return(aCharSubset == EUcbArabic);
+        // Traditi onal Chinese languages, support latin, too:
+    case ELangTaiwanChinese:
+    case ELangHongKongChinese:
+        return (aCharSubset == EIsTraditionalHanzi ||
+                aCharSubset == EIsLatin);
+        // Single languages that belong to other character subsets than latin
+    case ELangHebrew:
+    case ELangGreek:
+    case ELangHindi:
+    case ELangVietnamese:
+    case ELangThai:
+    case ELangBengali:
+        return (aCharSubset == ECharSubsetNone);
+        // All the rest are latin languages; Japanese and Simplified Chinese
+        // included here,  because they support latin, too
+    default:
+        return (aCharSubset == EIsLatin);
+    }
+}
+
+
+// =========================== VIRTUAL FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// Virtual methods from ASwtControlBase
+// Sets the Focus
+// This is where the inputMode will be set (if needed).
+// ---------------------------------------------------------------------------
+//
+void CSwtTextExtension::FocusChanged(TDrawNow aDrawNow)
+{
+    if (iInitialCurrentLanguage)
+    {
+        Editor().SetAknEditorLocalLanguage(iInitialCurrentLanguage);
+        if (iInitialCurrentInputMode == 0)
+        {
+            // clears any number mode used previously
+            Editor().SetAknEditorCurrentInputMode(EAknEditorNullInputMode);
+        }
+    }
+
+    if (iInitialCurrentInputMode)
+    {
+        Editor().SetAknEditorCurrentInputMode(iInitialCurrentInputMode);
+    }
+
+    if (iInitialCurrentCase)
+    {
+        TInt initialCurrentCase = iInitialCurrentCase;
+        if ((iStyle & KSwtStylePassword ||
+                iTypeStyle & EEmailAddress ||
+                iTypeStyle & EUrl) &&
+                iInitialCurrentCase == EAknEditorTextCase)
+        {
+            // Text case is not used in passwords, emailaddrs and urls
+            initialCurrentCase = EAknEditorLowerCase;
+        }
+        Editor().SetAknEditorCurrentCase(initialCurrentCase);
+        Editor().SetAknEditorCase(initialCurrentCase);
+    }
+    CSwtTextBase::FocusChanged(aDrawNow);
+}
+
+
+// ---------------------------------------------------------------------------
+// Virtual methods from MSwtTextExtension
+// ---------------------------------------------------------------------------
+//
+MSwtText* CSwtTextExtension::Text()
+{
+    return this;
+}
+
+
+// ---------------------------------------------------------------------------
+// CSwtTextExtension::MakeStatusPaneLargeL
+// This is only needed because the dialogs don't work unless status pane
+// is certain size.
+// ---------------------------------------------------------------------------
+//
+void CSwtTextExtension::MakeStatusPaneLargeL(MSwtShell* aShell,
+        TBool& aFullScreenMode,
+        MSwtShell::TSwtStatusPaneStyle& aStyle)
+{
+    if (aShell)
+    {
+        aStyle = aShell->StatusPaneStyle();
+        if (aStyle != MSwtShell::EStyleLargeStatusPane)
+        {
+            MSwtMobileShell* mobileShell = aShell->MobileShellInterface();
+            ASSERT(mobileShell);
+            // Also FullScreenMode has to be temporarily disabled because setting status
+            // pane style doesn't have any effect otherwise.
+            aFullScreenMode = aShell->FullScreenMode();
+            if (aFullScreenMode)
+            {
+                aShell->SetFullScreen(EFalse);
+            }
+            mobileShell->ChangeTrimL(aShell->Control()->Style(),
+                                     MSwtShell::EStyleLargeStatusPane);
+        }
+    }
+}
+
+
+// ---------------------------------------------------------------------------
+// CSwtTextExtension::RestoreStatusPaneL
+// ---------------------------------------------------------------------------
+//
+void CSwtTextExtension::RestoreStatusPaneL(MSwtShell* aShell,
+        const TBool& aFullScreenMode,
+        const MSwtShell::TSwtStatusPaneStyle& aStyle)
+{
+    if (aShell)
+    {
+        if (aFullScreenMode)
+        {
+            aShell->SetFullScreen(ETrue);
+        }
+        if (aStyle != MSwtShell::EStyleLargeStatusPane)
+        {
+            MSwtMobileShell* mobileShell = aShell->MobileShellInterface();
+            if (mobileShell)
+            {
+                mobileShell->ChangeTrimL(aShell->Control()->Style(), aStyle);
+            }
+        }
+    }
+}