textinput/peninputvkbjp/src/peninputvkbdatamgr.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputvkbjp/src/peninputvkbdatamgr.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,426 @@
+/*
+* Copyright (c) 2002-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:  Implementation of the vkb data manager
+*
+*/
+
+
+// system includes
+#include <peninputlayoutcontext.h>
+#include <aknfeppeninputenums.h>    // ERangeHiraganaKanji, ...
+
+#include <PtiEngine.h>
+#include <PtiCompositionDataIF.h>
+#include <peninputcommonlayoutglobalenum.h>
+
+// user includes
+#include "peninputvkbdatamgr.h"
+
+// constant definition
+const TInt LengthSymbolFuncyional = 3;
+
+const TUint KSymbolsFuncyional[] = {0x309b,  // dakuten(Full-width)
+                                    0x309c,  // handakuten(Full-width)
+                                    0x5c0f}; // little
+const TUint16 KEWComma = 0x002C;
+const TUint16 KEWFullStop = 0x002E;
+const TUint16 KEWFullWidthComma = 0xFF0C;
+const TUint16 KEWFullWidthFullStop = 0xFF0E;
+const TUint16 KEWHalfWidthIdeographicComma = 0xFF64;  // touten
+const TUint16 KEWHalfWidthIdeographicFullStop = 0xFF61;  // kuten
+const TUint16 KEWIdeographicComma = 0x3001;  // touten
+const TUint16 KEWIdeographicFullStop = 0x3002;  // kuten
+const TUint KHalfDakuten = 0xff9e;
+const TUint KHalfHanDakuten = 0xff9f;
+const TUint KLittle = 0x5c0f;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::NewL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CPeninputVkbDataMgr* CPeninputVkbDataMgr::NewL(MPeninputLayoutContext* aContext)
+    {
+    CPeninputVkbDataMgr* self = NewLC(aContext);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::NewLC
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CPeninputVkbDataMgr* CPeninputVkbDataMgr::NewLC(MPeninputLayoutContext* aContext)
+    {
+    CPeninputVkbDataMgr* self = new(ELeave) CPeninputVkbDataMgr(aContext);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::~CPeninputVkbDataMgr
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CPeninputVkbDataMgr::~CPeninputVkbDataMgr()
+    {
+    delete iPtiEngine;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputGenericVkbDataMgr::InitMoreJpL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+// this method maybe Leave. this method is called by ConstructL()
+///void CPeninputVkbDataMgr::InitMore()
+void CPeninputVkbDataMgr::InitMoreJpL()
+    {
+    // Create engine
+    iPtiEngine = CPtiEngine::NewL(ETrue);
+    iPtiEngine->ActivateLanguageL(ELangJapanese, EPtiEngineHiraganaKanjiPredictiveVkb);
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::PtiEngine
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CPtiEngine* CPeninputVkbDataMgr::PtiEngine()
+    {
+    return iPtiEngine;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::Predictive
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CPeninputVkbDataMgr::Predictive() const
+    {
+    return iPredictive;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::FullHalf
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputVkbDataMgr::FullHalf() const
+    {
+    return iFullHalf;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::JapaneseFlags
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputVkbDataMgr::JapaneseFlags() const
+    {
+    return iJapaneseFlags;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::SetPermittedRange
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputVkbDataMgr::SetPermittedRange(TInt aRange)
+    {
+    iPermittedRange = aRange;
+    TPtr ptr((TUint16* ) &iPermittedRange,sizeof(iPermittedRange)/sizeof(TUint16));
+    iContext->SendEventToWindow(EPeninputLayoutEventSetPermittedRange,NULL,ptr);
+    }
+
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::SetEngineInputMode
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputVkbDataMgr::SetEngineInputMode(TInt aRange)
+    {
+    if (iPermittedRange & aRange)
+        {
+        TInt clearDirection = iClear;   // 1:delete 0:backspace
+        TPtiEngineInputMode mode = EPtiEngineInputModeNone;
+        switch (aRange)
+            {
+            case ERangeHiraganaKanji:
+                mode = (Predictive())? EPtiEngineHiraganaKanjiPredictiveVkb
+                                     : EPtiEngineHiraganaKanjiVkb;
+                break;
+            case ERangeKatakana:
+                mode = EPtiEngineKatakanaVkb;
+                break;
+            case ERangeFullWidthKatakana:
+                mode = EPtiEngineFullWidthKatakanaVkb;
+                break;
+            case ERangeHiraganaOnly:
+                mode = EPtiEngineHiraganaVkb;
+                break;
+            default:
+                break;
+            }
+        iPtiEngine->SetInputMode(mode);
+        TRAP_IGNORE(iPtiEngine->HandleCommandL(EPtiCommandSetClearFunction, &clearDirection));
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::SetPredictive
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputVkbDataMgr::SetPredictive(TBool aPredictive)
+    {
+    iPredictive = aPredictive;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::SetFullHalf
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputVkbDataMgr::SetFullHalf(TInt aFullHalf)
+    {
+    iFullHalf = aFullHalf;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::SetClear
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputVkbDataMgr::SetClear(TInt aClear)
+    {
+    iClear = aClear;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::SetJapaneseFlags
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputVkbDataMgr::SetJapaneseFlags(TInt aJapaneseFlags)
+    {
+    iJapaneseFlags = aJapaneseFlags;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputVkbDataMgr::HandleFunctionalVkbEventL
+// (other items were commented in a header).
+// return aStatus == False --->UiStateMgr()->CurrentUiState()->HandleControlEvent() by UiLayout
+// -----------------------------------------------------------------------------
+//
+void CPeninputVkbDataMgr::HandleFunctionalVkbEventL(const TDesC& aEventData, TUint aPreChar
+                                                    , TBool& aStatus, TInt& aSendText)
+    {
+    aStatus = EFalse;
+    TUint unicode =  *((TUint16*) aEventData.Ptr());  // always aEventData length == 1
+    for (TInt ii=0; ii < LengthSymbolFuncyional; ii++)
+        {
+        if ( unicode == KSymbolsFuncyional[ii] )
+            {
+            iPtiEngine->ClearCurrentWord();
+            iPtiEngine->HandleCommandL(EPtiCommandAppendCharacter, &aPreChar);
+            iPtiEngine->HandleCommandL(EPtiCommandAppendCharacter, &unicode);
+            const MPtiEngineCompositionDataInterface* data = iPtiEngine->CompositionData();
+            TPtrC convertingString = data->ConvertingString();
+            if (convertingString.Length() == 1 && aPreChar != convertingString[0])
+                {
+                //replace
+                //
+                TInt replacedLen = 1;
+                HBufC* p = HBufC::NewL(convertingString.Length() + 2);
+                p->Des().Append((TUint16*)&replacedLen, 2);
+                p->Des().Append(convertingString);
+                iContext->Sendkey( ESignalReplaceTextJp, *p );
+                delete p;
+                aSendText = 1;
+                aStatus = ETrue;
+                }
+            else if (2 == ii)   // ignore little
+                {
+                aStatus = ETrue;
+                }
+            iPtiEngine->ClearCurrentWord();
+            break;
+            }
+        }
+    }
+// -----------------------------------------------------------------------------
+// CPeninputVkbDataMgr::HandleFunctionalVkbEventL
+// (other items were commented in a header).
+// return aStatus == False --->UiStateMgr()->CurrentUiState()->HandleControlEvent() by UiLayout
+// -----------------------------------------------------------------------------
+//
+void CPeninputVkbDataMgr::HandleFunctionalVkbEventWithPrePreCharL(const TDesC& aEventData, TUint aPreChar
+                                                                  , TUint aPrePreChar, TBool& aStatus, TInt& aSendText)
+    {
+    aStatus = EFalse;
+    TUint unicode =  *((TUint16*) aEventData.Ptr());  // always aEventData length == 1
+    if (KHalfDakuten == unicode || KHalfHanDakuten == unicode || KLittle == unicode)
+        {
+        TInt len = 2;
+        iPtiEngine->ClearCurrentWord();
+        if (aPrePreChar != KNoChar)
+            {
+            iPtiEngine->HandleCommandL(EPtiCommandAppendCharacter, &aPrePreChar);
+            ++ len;
+            }
+        iPtiEngine->HandleCommandL(EPtiCommandAppendCharacter, &aPreChar);
+        iPtiEngine->HandleCommandL(EPtiCommandAppendCharacter, &unicode);
+        const MPtiEngineCompositionDataInterface* data = iPtiEngine->CompositionData();
+        TPtrC convertingString = data->ConvertingString();
+        TInt backSpace = EKeyDelete;
+        TPtrC ptr(reinterpret_cast<TText*>(&backSpace), 1);
+        if (convertingString.Length() != len )
+            {
+            if (convertingString.Length() == len-1 && len > 1 && aPreChar != convertingString[len-2])
+                { // pa + "-->ba
+                TInt replacedLen = 1;
+                HBufC* p = HBufC::NewL(convertingString.Right(1).Length() + 2);
+                p->Des().Append((TUint16*)&replacedLen, 2);
+                p->Des().Append(convertingString.Right(1));
+                iContext->Sendkey( ESignalReplaceTextJp, *p );
+                delete p;
+                aSendText = 1;
+                }
+            else if (convertingString.Length() == len-2 && len > 2)
+                {
+                if (aPrePreChar != convertingString[0])   // zu + little ---> little tsu
+                    {
+                    TInt replacedLen = 1;
+                    HBufC* p = HBufC::NewL(convertingString.Length() + 2);
+                    p->Des().Append((TUint16*)&replacedLen, 2);
+                    p->Des().Append(convertingString);
+                    iContext->Sendkey(ESignalKeyEvent, ptr);  // delete "
+                    iContext->Sendkey( ESignalReplaceTextJp, *p );  // tsu --->little tsu
+                    delete p;
+                    }
+                else  // ga + " ---> ka
+                    {
+                    iContext->Sendkey(ESignalKeyEvent, ptr);
+                    }
+                aSendText = 1;
+                }
+            }
+        else if (aPreChar != convertingString[len-2])   // little tsu + " ---> zu
+            {
+            TInt replacedLen = 1;
+            HBufC* p = HBufC::NewL(convertingString.Mid(len-2,1).Length() + 2);
+            p->Des().Append((TUint16*)&replacedLen, 2);
+            p->Des().Append(convertingString.Mid(len-2,1));
+            iContext->Sendkey( ESignalReplaceTextJp, *p );
+            delete p;
+            iContext->Sendkey(ESignalKeyEvent, convertingString.Right(1));
+            aSendText = 1;
+            }
+        else if (KLittle != unicode)   // ignore little
+            {
+            iContext->Sendkey(ESignalKeyEvent, convertingString.Right(1));
+            aSendText = 1;
+            }
+        aStatus = ETrue;
+        iPtiEngine->ClearCurrentWord();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputVkbDataMgr::ConvertCommaFullStop
+// (other items were commented in a header).
+// return aStatus == False : not changed
+// -----------------------------------------------------------------------------
+//
+TBool CPeninputVkbDataMgr::ConvertCommaFullStop(TUint& aNewChar) const
+    {
+    TUint unicode =  aNewChar;
+    switch(unicode)
+        {
+        case KEWIdeographicComma:   // touten
+            if (iJapaneseFlags & EPenInputJapaneseSettingQwertyComma)  // Japanese
+                {
+                aNewChar = (iFullHalf)? KEWIdeographicComma : KEWHalfWidthIdeographicComma;
+                }
+            else
+                {   // English
+                aNewChar = (iFullHalf)? KEWFullWidthComma : KEWComma;
+                }
+            break;
+        case KEWIdeographicFullStop:  // kuten
+            if (iJapaneseFlags & EPenInputJapaneseSettingQwertyPeriod)  // Japanese
+                {
+                aNewChar = (iFullHalf)? KEWIdeographicFullStop : KEWHalfWidthIdeographicFullStop;
+                }
+            else
+                {   // English
+                aNewChar = (iFullHalf)? KEWFullWidthFullStop : KEWFullStop;
+                }
+            break;
+        case KEWHalfWidthIdeographicComma:   // touten(halfwidth)
+            if (!(iJapaneseFlags & EPenInputJapaneseSettingQwertyComma))  // English
+                {
+                aNewChar = KEWComma;
+                }
+            break;
+        case KEWHalfWidthIdeographicFullStop:   // kuten(halfwidth)
+            if (!(iJapaneseFlags & EPenInputJapaneseSettingQwertyPeriod))  // English
+                {
+                aNewChar = KEWFullStop;
+                }
+            break;
+        default:
+            break;
+        }
+    return (aNewChar == unicode)? EFalse : ETrue;
+    }
+
+// ---------------------------------------------------------
+// Return the clear direction
+// ---------------------------------------------------------
+//
+TInt CPeninputVkbDataMgr::ClearDirection() const
+    {
+    return iClear;   // 1:delete 0:backspace
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputVkbDataMgr::CPeninputVkbDataMgr
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CPeninputVkbDataMgr::CPeninputVkbDataMgr(MPeninputLayoutContext* aContext)
+    : CPeninputDataMgr::CPeninputDataMgr(aContext),
+     iPredictive(ETrue)
+    {
+    iInputLanguage = ELangJapanese;
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputVkbDataMgr::ConstructL
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputVkbDataMgr::ConstructL()
+    {
+    CPeninputDataMgr::ConstructL();
+    InitMoreJpL();
+    }
+
+// End Of File