textinput/peninputgenerichwr/src/peninputhwrarabiclayout.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputgenerichwr/src/peninputhwrarabiclayout.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,398 @@
+/*
+* Copyright (c) 2002-2005 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:  generic HWR layout
+*
+*/
+
+
+// System includes
+#include <aknfeppeninputenums.h>    // Command from fep or IME to plugin
+#include <AknFepGlobalEnums.h>      // Define EPluginInputModeHwr
+#include <peninputcmd.h>            // Use global signal
+#include <peninputpluginutils.h>    // Use resource utils and laf env
+#include <peninputlayoutchoicelist.h>
+#include <peninputlayoutbutton.h>
+#include <peninputdragbutton.h>
+#include <peninputcommonlayoutglobalenum.h>
+#include <peninputdataconverter.h>
+
+// User includes
+#include "peninputhwrarabic.hrh"
+//#include "peninputhwrevent.h"
+#include "peninputuistatemgrinterface.h"
+#include "peninputhwrarabiclayout.h"
+#include "peninputhwrarabicwindow.h"
+#include "peninputhwrarabicdatamgr.h"
+#include "peninputhwrarabicstate.h"
+#include "peninputhwrarabicstatestandby.h"
+#include "peninputhwrarabicstatebeginwriting.h"
+#include "peninputhwrarabicstateendwriting.h"
+#include "peninputhwrboxarabicstatecandidateselecting.h"
+#include "peninputuistatemgr.h"
+#include "peninputlayouthwrwnd.h"
+
+// constant definition
+//const TInt KMaxPredictiveLen = 128;
+const TInt KMaxCandidateLen = 128;
+//const TUint16 KBackRep = 0x2408;
+// convert displayable backspace
+const TUint16 KBackRep = 0x2190;
+const TUint16 KEnterRep = 0xF801;
+const TUint16 KSpaceRep = 0xF800;
+//const TUint16 KEnterCode = 0x2029;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayoutImp::NewL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//    
+CPeninputHwrBxAbLayoutImp* CPeninputHwrBxAbLayoutImp::NewL( 
+    TAny* /*aInitParams*/ )
+    {
+    CPeninputHwrBxAbLayoutImp* self = 
+        new ( ELeave ) CPeninputHwrBxAbLayoutImp();
+    CleanupStack::PushL( self );
+    self->Construct(); 
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayoutImp::~CPeninputHwrBxAbLayoutImp
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//   
+CPeninputHwrBxAbLayoutImp::~CPeninputHwrBxAbLayoutImp()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayoutImp::CPeninputHwrBxAbLayoutImp
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//   
+CPeninputHwrBxAbLayoutImp::CPeninputHwrBxAbLayoutImp()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayoutImp::ConstructL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//   
+void CPeninputHwrBxAbLayoutImp::Construct()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayoutImp::CreateFepUiLayoutL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//   
+CFepUiLayout* CPeninputHwrBxAbLayoutImp::CreateFepUiLayoutL(
+    MLayoutOwner* aLayoutOwner, const TAny* aData )
+    {
+    CPeninputHwrBxAbLayout* uiLayout = 
+        CPeninputHwrBxAbLayout::NewL( aLayoutOwner, aData );
+
+    return uiLayout;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::NewL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//   
+CPeninputHwrBxAbLayout* CPeninputHwrBxAbLayout::NewL( 
+    MLayoutOwner* aLayoutOwner, 
+    const TAny* aInitData )
+    {
+    CPeninputHwrBxAbLayout* self = 
+        new ( ELeave ) CPeninputHwrBxAbLayout( aLayoutOwner );
+    CleanupStack::PushL( self );
+    self->ConstructL( aInitData );
+    CleanupStack::Pop( self );
+
+    return self;  
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::CPeninputHwrBxAbLayout
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//   
+CPeninputHwrBxAbLayout::CPeninputHwrBxAbLayout(
+    MLayoutOwner* aLayoutOwner )
+    : CPeninputCommonLayout( aLayoutOwner )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::~CPeninputHwrBxAbLayout
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//   
+CPeninputHwrBxAbLayout::~CPeninputHwrBxAbLayout()
+    {    
+    }        
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::ConstructL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//   
+void CPeninputHwrBxAbLayout::ConstructL( const TAny *aInitData )
+    {
+    CPeninputCommonLayout::ConstructL( aInitData ); 
+
+    
+    CPeninputHwrBxAbStateBase* initState = CPeninputHwrBxAbStateBase::NewL( UiStateMgr(), this );
+    CPeninputHwrBxAbStateStandby* standbyState = CPeninputHwrBxAbStateStandby::NewL( UiStateMgr(), this );
+    CPeninputHwrBxAbStateBeginWriting* beginWritingState = CPeninputHwrBxAbStateBeginWriting::NewL( UiStateMgr(), this );
+    CPeninputHwrBxAbStateEndWriting* endWritingState = CPeninputHwrBxAbStateEndWriting::NewL( UiStateMgr(), this );
+    CPeninputHwrBxAbStateCandidateSelecting* candSelectingState = CPeninputHwrBxAbStateCandidateSelecting::NewL( UiStateMgr(), this );
+
+    UiStateMgr()->AddUiState( initState, EPeninputHwrBxAbStateInit );
+    UiStateMgr()->AddUiState( standbyState, EPeninputHwrBxAbStateStandby );
+    UiStateMgr()->AddUiState( beginWritingState, EPeninputHwrBxAbStateBeginWriting );
+    UiStateMgr()->AddUiState( endWritingState, EPeninputHwrBxAbStateEndWriting );
+    UiStateMgr()->AddUiState( candSelectingState, EPeninputHwrBxAbStateCandidateSelecting );
+    UiStateMgr()->SetCurrentUiState( initState );
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::HandleCommand
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//   
+TInt CPeninputHwrBxAbLayout::HandleCommand( TInt aCmd, TUint8* aData )
+    {
+    CPeninputCommonLayout::HandleCommand( aCmd, aData );
+    
+    if ( aCmd == ECmdPenInputWindowOpen )
+        {
+        TInt curRange = CPeninputDataConverter::AnyToInt( RequestData( EPeninputDataTypeCurrentRange ) );
+        UiStateMgr()->SetCurrentUiState( EPeninputHwrBxAbStateStandby );
+        if (curRange == ERangeNative)
+            {
+            static_cast<CPeninputHwrBxAbWnd *>(LayoutWindow())->ResetAndShowDropdownList();
+            }
+        else
+            {
+            static_cast<CPeninputHwrBxAbWnd *>(LayoutWindow())->ClearAndCloseDropdownList();
+            }
+        }
+    else if ( aCmd == ECmdPenInputWindowClose )
+        {
+        UiStateMgr()->SetCurrentUiState( EPeninputHwrBxAbStateInit );
+        }
+    else if( aCmd == ECmdPenInputLanguage )
+        {
+        ((CPeninputHwrBxAbWnd*)iLayoutWindow)->OnLanguageChange();
+        }
+    else if(aCmd == ECmdPenInputRange)
+        {
+        UiStateMgr()->SetCurrentUiState( EPeninputHwrBxAbStateStandby );        
+        iLayoutWindow->SizeChanged(ETrue);
+        }
+    return KErrNone;    
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::HandleControlEvent
+// Handle event from control
+// ---------------------------------------------------------
+//
+void CPeninputHwrBxAbLayout::HandleControlEvent(TInt aEventType, CFepUiBaseCtrl* aCtrl, 
+                                            const TDesC& aEventData)
+    {
+    MPeninputUiStateMgr * UIStateMgr = UiStateMgr();
+    if (UIStateMgr)
+        {    
+        CPeninputHwrBxAbStateBase* current =
+                        static_cast<CPeninputHwrBxAbStateBase*>(UIStateMgr->CurrentUiState());
+        if (current)
+            {
+            TBuf<KMaxCandidateLen> charCode;
+            TBool handled = EFalse;
+            TRAPD(err, current->HandleControlEventPenL(aEventType, aEventData, *this, 
+                                                        charCode, handled));
+            if (KErrNone != err)
+                { // close peninput
+                CPeninputCommonLayout::HandleControlEvent(
+                        EPeninputLayoutEventClose, NULL, KNullDesC);
+                handled = ETrue;
+                }
+            if (handled)
+                {
+                return;
+                }
+            }
+        }
+    CPeninputCommonLayout::HandleControlEvent(aEventType, aCtrl, aEventData);	
+
+    return;
+    }
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::CreateLayoutWindowL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//   
+void CPeninputHwrBxAbLayout::CreateLayoutWindowL()
+    {
+    iLayoutWindow = CPeninputHwrBxAbWnd::NewL( this, this );
+    }
+ 
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::CreateDataMgrL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//      
+void CPeninputHwrBxAbLayout::CreateDataMgrL( const TAny* aInitData )
+    {
+    TPeninputLayoutData* layoutData = (TPeninputLayoutData*)aInitData;
+
+    iDataMgr = CPeninputHwrBxAbDataMgr::NewL( this, (*layoutData).iPtiEngine );
+    }    
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::LayoutType
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//   
+TInt CPeninputHwrBxAbLayout::LayoutType()
+    {
+    return EPluginInputModeHwr;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::SemiTransparencyRequired
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//   
+TBool CPeninputHwrBxAbLayout::SemiTransparencyRequired()
+    {
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::LayoutWindow
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+CPeninputLayoutWindow* CPeninputHwrBxAbLayout::LayoutWindow() const
+    {
+    return iLayoutWindow;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::TranslateCharCode
+// Translate the char code.
+// ---------------------------------------------------------
+//
+void CPeninputHwrBxAbLayout::TranslateCharCode( TDes& aCharCode )
+    {
+    TPtrC16 ptr;
+    ptr.Set(&KBackRep, sizeof(KBackRep)/2);
+    
+    if (aCharCode.CompareC(ptr) == 0)
+        {
+        aCharCode.Zero();
+        aCharCode.Append((TChar)EKeyBackspace);
+        }
+    else 
+        {
+        ptr.Set(&KSpaceRep, sizeof(KSpaceRep)/2);
+        if (aCharCode.CompareC(ptr) == 0)
+            {
+            aCharCode.Zero();
+            aCharCode.Append((TChar)EKeySpace);
+            }
+        else
+            {
+            ptr.Set(&KEnterRep, sizeof(KEnterRep)/2);
+            if (aCharCode.CompareC(ptr) == 0)
+                {
+                aCharCode.Zero();
+                aCharCode.Append((TChar)EKeyEnter);
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::ReplaceL
+// Delete the previous charcode and submit the new one
+// ---------------------------------------------------------
+//
+void CPeninputHwrBxAbLayout::ReplaceL(const TDesC& aOldCharCode, const TDesC& aNewCharCode)
+    {
+    // user tries to correct the previous selection
+    // Delete the previous character and append the new one
+    _LIT(KSpaceChar, " ");
+    TBuf<1> buf;
+    buf.Zero();
+    buf.Append(KSpaceChar);
+    HBufC* p = NULL;
+    HBufC* oldCharCode = aOldCharCode.AllocLC();
+    HBufC* newCharCode = aNewCharCode.AllocLC();
+            
+    if (static_cast<CPeninputHwrBxAbWnd *>(LayoutWindow())->IsAddingSpace(newCharCode))
+        {
+        p = HBufC::New(aNewCharCode.Length() + 2 + buf.Length());
+        }
+    else
+        {
+        p = HBufC::New(aNewCharCode.Length() + 2);
+        }
+    if( p )
+        {
+        TInt len = aOldCharCode.Length();
+        if (static_cast<CPeninputHwrBxAbWnd *>(LayoutWindow())->IsAddingSpace(oldCharCode))
+            {
+            len += buf.Length();
+            }
+        p->Des().Append((TUint16*)&len, 2);
+        p->Des().Append(aNewCharCode);
+        if (static_cast<CPeninputHwrBxAbWnd *>(LayoutWindow())->IsAddingSpace(newCharCode))
+            {
+            p->Des().Append(buf);
+            }
+        SignalOwner( ESignalReplaceText, *p );
+        delete p;
+        }
+    CleanupStack::PopAndDestroy(newCharCode);
+    CleanupStack::PopAndDestroy(oldCharCode);        
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBxAbLayout::SubmitL
+// Submit the char code.
+// ---------------------------------------------------------
+//
+void CPeninputHwrBxAbLayout::SubmitL(const TDesC& aCharCode)
+    {
+    HBufC* buf = HBufC::NewLC(aCharCode.Length());
+    TPtr charcode(buf->Des());
+    charcode = aCharCode;
+    TranslateCharCode( charcode );
+    SignalOwner(ESignalKeyEvent, charcode);
+    
+    CleanupStack::PopAndDestroy(buf);
+    }
+
+//End Of File