--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputhwrboxjp/src/peninputhwrboxlayout.cpp Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,1445 @@
+/*
+* Copyright (c) 2009 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 hwr layout
+*
+*/
+
+
+// system includes
+#include <peninputhiraganakanji.h> // hiraganakanji
+#include <peninputuistatemgr.h> // use ui state mgr
+#include <peninputdataconverter.h>
+#include <aknfeppeninputenums.h> //command from fep or IME to plugin. for vkb/hwr, range defination
+#include <peninputcommonlayoutglobalenum.h> // EPeninputLayoutEventEnter
+#include <peninputeventjp.h>
+#include <AknFepGlobalEnums.h> //define TWidthChar
+#include <PtiEngine.h>
+#include <peninputjapanesecandidatewnd.h>
+#include <peninputjapanesepredictivewnd.h>
+
+// user includes
+#include "peninputhwrboxlayout.h"
+#include "peninputhwrboxuistatetype.h" // UI state
+#include "peninputhwrboxwindow.h" // use hwr window, which derived from base window
+#include "peninputhwrboxdatamgr.h" // use data mgr
+#include "peninputhwrboxuistatestandby.h"
+#include "peninputhwrboxuistatestandbyjp.h"
+#include "peninputhwrboxuistatewithtransitorychars.h"
+#include "peninputhwrboxuistatepenstandby.h"
+#include "peninputhwrboxuistatepenbeginwriting.h"
+#include "peninputhwrboxuistatepenendwriting.h"
+#include "peninputhwrboxuistatepencandidateselecting.h"
+#include "peninputhwrevent.h"
+#include "peninputhwrboxgroup.h"
+
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+#include <PeninputHwrStrokeLogConst.h>
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+
+// constant definition
+const TInt KMaxCandidateLen = 128;
+const TUint16 KBackRep = 0x2408;
+const TUint16 KEnterRep = 0xF801;
+const TUint16 KSpaceRep = 0xF800;
+const TInt KDelay = 100000; //1/10 second
+const TInt KPeninputBufLen = 16;
+const TInt KPeninputBufLen8 = 8;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::NewL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CPeninputHwrBoxLayout* CPeninputHwrBoxLayout::NewL(MLayoutOwner* aLayoutOwner,
+ const TAny* aInitData)
+ {
+ CPeninputHwrBoxLayout* self = new (ELeave) CPeninputHwrBoxLayout(aLayoutOwner);
+
+ CleanupStack::PushL(self);
+ self->ConstructL(aInitData);
+ CleanupStack::Pop(self);
+
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::~CPeninputHwrBoxLayout
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CPeninputHwrBoxLayout::~CPeninputHwrBoxLayout()
+ {
+ delete iHiraganaKanji;
+ delete iKeyEventAsync;
+ delete iKeyEventClearAsync;
+ delete iPointerEventAsync;
+ delete iUiStatePenMgr;
+ delete iSubmitText;
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+ if (iLogger.LogValid())
+ {
+ iLogger.CloseLog();
+ }
+ iLogger.Close();
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::HandleEventL
+// handle event from window server
+// ---------------------------------------------------------------------------
+//
+TBool CPeninputHwrBoxLayout::HandleEventL(TEventType aType, const TAny* aData)
+ {
+ TRawEvent event=*((TRawEvent*)aData);
+ CFepUiBaseCtrl* ctrl = NULL;
+ if(ERawEvent == aType)
+ {
+ if (TRawEvent::EButton1Down == event.Type() && iHiraganaKanji)
+ {
+ iHiraganaKanji->CancelRepeat();
+ }
+ // DropDownList expanded and PointerDown on drawing area ---> cancel input and to StandBy
+ if (iExpanded
+ && TRawEvent::EButton1Down == event.Type()
+ && iUiStatePenMgr->CurrentUiState() == iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenCandidateSelecting)
+ && iDropdownList
+ && iHwrWindow->BoxGroup())
+ {
+ TPoint point = event.Pos() - Position ();
+ if (!iDropdownList->Rect().Contains(point)
+ && iHwrWindow->BoxGroup()->Rect().Contains(point))
+ {
+ ClearInputToPenStandByL();
+ return ETrue;
+ }
+ }
+ if(TRawEvent::EButton1Up == event.Type())
+ {
+ ctrl = RootControl()->CtrlCapPointer();
+ }
+ }
+ TBool handled = CPeninputCommonLayout::HandleEventL(aType,aData);
+ // if dropdownlist expanded, capture off
+ // as the dropdownlist is the 1st control in the clientpane controlgroup, capture is not need.
+ if (TRawEvent::EButton1Up == event.Type() && !ctrl)
+ {
+ CFepUiBaseCtrl* capture = RootControl()->CtrlCapPointer();
+ if (capture && capture->ControlId() == EPeninutWindowCtrlIdDropDownList)
+ { // dropdownlist expanded
+ iDropdownList = capture;
+ capture->CapturePointer(EFalse);
+ SetCapturePointerEventAgain(); // capture for transitory input on
+ HandleControlEvent(EPeninputLayoutHwrEventDropDownListExpanded, capture, KNullDesC);
+ }
+ }
+ // if a control do capture off, capture for transitory input on.
+ if (ctrl && !RootControl()->CtrlCapPointer())
+ {
+ SetCapturePointerEventAgain();
+ }
+ return handled;
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::HandleCommand
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputHwrBoxLayout::HandleCommand(TInt aCmd, TUint8* aData)
+ {
+ // Handle command from fep or IME to this layout
+ TUint* data = (TUint*) aData;
+
+ switch ( aCmd )
+ {
+ case ECmdPenInputPermittedRange: // different from common layout
+ // this command comes after ECmdPenInputJapaneseSetting
+ if (iDataMgr)
+ {
+ // in SetData, SetPermittedRanges() and SetCharacterRangePopupLare() called.
+ SetData(EPeninputDataTypePermittedRange, aData);
+ }
+ break;
+ case ECmdPenInputLanguage:
+ {
+ CPeninputCommonLayout::HandleCommand(aCmd, aData);
+ }
+ break;
+ case ECmdPenInputWindowOpen:
+ if (iHwrWindow)
+ {
+ iHwrWindow->Opened();
+ iLayoutWindow->Hide(EFalse); // before Hide Check or Change, parent controlgroup should be Hide Off.
+ TInt curRange = CPeninputDataConverter::AnyToInt(RequestData(EPeninputDataTypeCurrentRange));
+ TBool currHide = iHwrWindow->PredictiveWindow()->Hiden();
+ TBool newHide = ETrue;
+ if (static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->Predictive()
+ && static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->Conversion()
+ && ERangeHiraganaKanji == curRange)
+ {
+ newHide = EFalse;
+ }
+ if (newHide && !currHide || !newHide && currHide)
+ {
+ iHwrWindow->PredictiveWindow()->Hide(newHide);
+ iHwrWindow->SizeChanged(ETrue);
+ }
+ CPeninputCommonLayout::HandleCommand( aCmd, aData );
+ if (*data != EPenInputOpenManually && Position() == TPoint(0,0))
+ { // position is not yet set.(English --> Japanese)
+ SendEventToWindow(EPeninputLayoutEventMovePosition, NULL, KNullDesC);
+ }
+ iHwrWindow->ICFEnableRegionUpdating(); // ICF::OnActivate()
+ }
+ ToPenStandBy();
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+ if (iLogger.Handle())
+ {
+ if (iLogger.LogValid())
+ {
+ iLogger.CloseLog();
+ }
+ // Generate file name based on date.
+ TTime time;
+ time.HomeTime();
+ TDateTime datetime = time.DateTime();
+ TBuf<KHwrStrokeLogFileNameMaxLen> name;
+ name.Format(KHwrStrokeLogFileExt(),
+ datetime.Year(), TInt(datetime.Month()+1), datetime.Day()+1,
+ datetime.Hour(), datetime.Minute(), datetime.Second());
+ // Open(or create) log file
+ iLogger.CreateLog( KHwrStrokeLogDir(), name, EFileLoggingModeAppend);
+ // Disable date and time
+ iLogger.SetDateAndTime(EFalse, EFalse);
+ // Write log
+ iLogger.Write(KHwrStrokeLogOpen());
+ WriteHwrStrokeLogRange();
+ }
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+ break;
+ case ECmdPenInputWindowClose:
+ SendEventToWindow(EPeninputLayoutEventCloseCharacterRange, NULL, KNullDesC);
+ HiraganaKanjiCompleteAll();
+ CPeninputCommonLayout::HandleCommand( aCmd, aData );
+ UiStateMgr()->SetCurrentUiState( EPeninputHwrUiStateNone );
+ Initialize();
+ SetCapturePointerEvent(EFalse);
+ iHwrWindow->Closed();
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+ if (iLogger.LogValid())
+ {
+ iLogger.Write(KHwrStrokeLogClose());
+ iLogger.CloseLog();
+ }
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+ break;
+ case ECmdPenInputRange: // different from common layout:control. ptiEngine.
+ {
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+ iLogOff = 1;
+#endif
+ // this command comes after ECmdPenInputJapaneseSetting, ECmdPenInputPermittedRange
+ if (iLayoutWindow)
+ {
+ iHwrWindow->ICFDisableRegionUpdating(); // ICF::OnDeActivate()
+ iLayoutWindow->Hide(EFalse); // before Hide Check or Change, parent controlgroup should be Hide Off.
+ }
+ if (iDataMgr)
+ {
+ TUint range = TranslateRangeHullHalf(*data);
+ TUint8* rangedata = reinterpret_cast<TUint8*>(&range);
+ // SetData(SetPremaryRange) and SizeChangedForBaseWindow and ChangeClientLayout
+ CPeninputCommonLayout::HandleCommand( aCmd, rangedata );
+ iRangeOrg = range;
+ TInt permittedRange = CPeninputDataConverter::AnyToInt(RequestData(EPeninputDataTypePermittedRange));
+ if (permittedRange & (ERangeHiraganaKanji | ERangeKatakana | ERangeFullWidthKatakana))
+ {
+ TInt index = 0;
+ if (range == ERangeEnglish || range == ERangeFullWidthEnglish)
+ {
+ index = 2; // see CPeninputHwrBoxDataMgr::SetCharacterRangePopupL()
+ }
+ if (range == ERangeNumber || range == ERangeFullWidthNumeric)
+ {
+ index = (permittedRange & (ERangeEnglish | ERangeFullWidthEnglish))? 3:2;
+ // see CPeninputHwrBoxDataMgr::SetCharacterRangePopupL()
+ }
+ if (index)
+ {
+ TPtrC dataPtr;
+ dataPtr.Set(reinterpret_cast<TUint16*>(&index),sizeof(TInt)/sizeof(TUint16));
+ HandleControlEvent(EPeninputLayoutEventRange,NULL,dataPtr); // call DoSetCurrentRange()
+ }
+ else
+ {
+ DoSetCurrentRange();
+ }
+ }
+ else
+ {
+ DoSetCurrentRange();
+ }
+ }
+ }
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+ iLogOff = 0;
+#endif
+ break;
+ case ECmdPenInputJapaneseSetting: // Japanese setting information
+ // this command comes before ECmdPenInputPermittedRange, ECmdPenInputRange
+ if (iDataMgr)
+ {
+ iDataMgr->Reset();
+ TUint val = *data;
+ TInt sctDimmFlag = (val & EPenInputJapaneseSettingLunchSCT)? 0: 1;
+ TPtr ptr((TUint16*)&sctDimmFlag, sizeof(TInt)/sizeof(TUint16));
+ SendEventToWindow(EEventSetDimmedSctBtn, NULL, ptr);
+ static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetFullHalf(
+ (val & EPenInputJapaneseSettingCharacterWidth)? 1: 0);
+ static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetPredictive(
+ (val & EPenInputJapaneseSettingPredictive)? ETrue: EFalse);
+ static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetConversion(
+ (val & EPenInputJapaneseSettingConversion)? ETrue: EFalse);
+ static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetClear(
+ (val & EPenInputJapaneseSettingDeletingDirection)? 1: 0);
+ }
+ break;
+ case ECmdPenInputEnableSettingBtn:
+ iHwrWindow->SetEnableSettingBtnJp(*data);
+ break;
+ case ECmdPenInputSendEditorTextAndCurPos:
+ CFepUiLayout::HandleCommand( aCmd, aData );
+ break;
+ default:
+ CPeninputCommonLayout::HandleCommand( aCmd, aData );
+ break;
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::HandleControlEvent
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputHwrBoxLayout::HandleControlEvent(TInt aEventType, CFepUiBaseCtrl* aCtrl, const TDesC& aEventData)
+ {
+ // Handle event from control
+ TInt* data = (TInt*)aEventData.Ptr();
+ TBool handled = EFalse;
+
+ if (EEventDraggingEnd == aEventType)
+ {
+ CPeninputCommonLayout::HandleControlEvent(aEventType, aCtrl, aEventData);
+ }
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+ if (EPeninputLayoutEventBack == aEventType)
+ {
+ WriteHwrStrokeLogClear();
+ }
+ if (EPeninputLayoutHwrEventCandidateSelected == aEventType && iLogger.LogValid())
+ {
+ if (aEventData.Length() > 1)
+ {
+ //get the candidate index
+ const TInt cellNo = aEventData[aEventData.Length()-1] + 1;
+ iLogger.WriteFormat(KHwrStrokeLogSelected(), cellNo);
+ }
+ }
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+
+ if (iUiStatePenMgr != NULL)
+ {
+ handled = HandleControlEventPen(aEventType, aCtrl, aEventData);
+ }
+ if (handled)
+ {
+ return;
+ }
+
+ //deal with the event from all controls in layout
+ switch (aEventType)
+ {
+ case EPeninputLayoutEventClose:
+ case EPeninputLayoutEventOption:
+ case EPeninputLayoutEventToVkb:
+ HiraganaKanjiCompleteAll(); // call ToPenStandBy()
+ SetCapturePointerEvent(EFalse);
+ if (EPeninputLayoutEventClose == aEventType)
+ {
+ Initialize(); //jump to init state
+ }
+ if (EPeninputLayoutEventToVkb == aEventType)
+ {
+ TBuf<KPeninputBufLen8> buf;
+ TBool switchByMode = ETrue;
+ TInt mode = EPluginInputModeVkb;
+ CPeninputDataConverter::CombinationToDesc( switchByMode,
+ mode, buf );
+ SignalOwner( ESignalLayoutUIChanged, buf );
+ }
+ else
+ {
+ CPeninputCommonLayout::HandleControlEvent(aEventType, aCtrl, aEventData);
+ }
+ break;
+ case EPeninputLayoutEventSct:
+ HiraganaKanjiCompleteAll();
+ SetCapturePointerEvent(EFalse);
+ SignalOwner(ESignalHwNotifySctPopup);
+ break;
+ case EPeninputLayoutEventSwitchLanguage: // nop
+ break;
+
+ case EPeninputLayoutEventRange: // from character range popup or when accept ECmdPenInputRange command
+ {
+ TInt permittedRange = CPeninputDataConverter::AnyToInt(RequestData(EPeninputDataTypePermittedRange));
+ TInt currentRange = CPeninputDataConverter::AnyToInt( RequestData( EPeninputDataTypeCurrentRange ) );
+ TInt range = currentRange;
+ TInt deActive = 0; // 0:none 1:ICF 2:display off
+ static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetCurrentCharacterRangeIndex(*data);
+ switch(static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->CharacterRangeId())
+ {
+ case EPeninutCharacterRangeIdAll:
+ if (permittedRange & (ERangeHiraganaKanji | ERangeKatakana | ERangeFullWidthKatakana))
+ {
+ if (!(range & (ERangeHiraganaKanji | ERangeKatakana | ERangeFullWidthKatakana)))
+ {
+ range = (permittedRange & ERangeHiraganaKanji)? ERangeHiraganaKanji : ERangeKatakana;
+ }
+ }
+ break;
+ case EPeninutCharacterRangeIdKanaKanji:
+ permittedRange &= (ERangeHiraganaKanji | ERangeKatakana | ERangeFullWidthKatakana);
+ if (!(permittedRange & range))
+ {
+ range = (permittedRange & ERangeHiraganaKanji)? ERangeHiraganaKanji : ERangeKatakana;
+ }
+ break;
+ case EPeninutCharacterRangeIdLatin:
+ permittedRange &= (ERangeEnglish | ERangeFullWidthEnglish);
+ range = ERangeEnglish;
+ break;
+ case EPeninutCharacterRangeIdNumber:
+ permittedRange &= (ERangeNumber | ERangeFullWidthNumeric);
+ range = ERangeNumber;
+ break;
+ default:
+ break;
+ }
+ static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetPermittedRanges(permittedRange);
+ range = TranslateRangeHullHalf(range);
+ if (!(range & permittedRange))
+ {
+ range = iRangeOrg;
+ }
+ if (aCtrl) // from character range popup
+ {
+ TBool currHide = iHwrWindow->PredictiveWindow()->Hiden();
+ TBool newHide = ETrue;
+ if (static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->Predictive()
+ && static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->Conversion()
+ && ERangeHiraganaKanji == range)
+ {
+ newHide = EFalse;
+ }
+ if (newHide && !currHide || !newHide && currHide)
+ {
+ LayoutOwner()->Hide(ETrue); // display off
+ deActive = 2;
+ iHwrWindow->PredictiveWindow()->Hide(newHide);
+ iHwrWindow->SizeChanged(ETrue);
+ }
+ else
+ {
+ iHwrWindow->ICFDisableRegionUpdating(); // ICF::OnDeActivate()
+ deActive = 1;
+ }
+ iHwrWindow->CharacterRangeWindow()->HidePopup();
+ }
+ if (aCtrl && range != currentRange) // from character range popup
+ {
+ // SetData(SetPremaryRange) and Sendkey( ESignalRange,...)
+ TPtrC rangeptr((TUint16*)(&range), sizeof(TInt)/sizeof(TUint16));
+ CPeninputCommonLayout::HandleControlEvent(aEventType, aCtrl, rangeptr);
+ if (ERangeEnglish != range && ERangeNumber != range)
+ {
+ TInt native = ERangeNative;
+ TBuf<KPeninputBufLen> buf;
+ CPeninputDataConverter::CombinationToDesc( native, range, buf );
+ Sendkey( ESignalRange, buf );
+ }
+ }
+ else
+ {
+ SetData(EPeninputDataTypeCurrentRange, &range);
+ }
+ DoSetCurrentRange();
+ if (deActive == 2)
+ {
+ LayoutOwner()->Hide(EFalse); // display on
+ }
+ else if (deActive == 1)
+ {
+ iHwrWindow->ICFEnableRegionUpdating(); // ICF Cursor On
+ }
+ }
+ break;
+
+ // from HiraganaKanji
+ case EEventHiraganaKanjiWithTransitoryChars2Standbyjp:
+ if (UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
+ {
+ UiStateMgr()->SetCurrentUiState(EPeninputHwrUiStateStandbyjp);
+ SetCapturePointerEvent(EFalse);
+ ToPenStandBy();
+ }
+ break;
+ // from HiraganaKanji
+ case EEventHiraganaKanjiWithoutTransitoryChars:
+ if (UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
+ {
+ SetCapturePointerEvent(EFalse);
+ }
+ break;
+
+ case EEventVirtualKeyUp:
+ if ( UiStateMgr()->CurrentUiState()
+ && !static_cast<CPeninputHwrBoxUiState*>(UiStateMgr()->CurrentUiState())->HandleControlEvent(aEventType,aEventData) )
+ {
+ SetCapturePointerEvent(ETrue);
+ HiraganaHandleControlEventJp(aEventType, aEventData);
+ }
+ break;
+ case EPeninputLayoutEventBack:
+ {
+ TInt clear = EKeyBackspace;
+ TPtrC clearptr((TUint16*)(&clear), 1);
+ if ( UiStateMgr()->CurrentUiState()
+ && !static_cast<CPeninputHwrBoxUiState*>(UiStateMgr()->CurrentUiState())->HandleControlEvent(aEventType,clearptr) )
+ {
+ HiraganaHandleControlEventJp(aEventType, clearptr);
+ }
+ }
+ break;
+ case EPeninputLayoutEventEnter:
+ case EPeninputLayoutEventSelectItem: // select from prediction/convert candidates by pointer
+ case EPeninputLayoutEventTab:
+ if (EPeninputLayoutEventEnter == aEventType && IsPredictiveWithNoChar())
+ { // without transitory chars and next word prediction candidates are offered
+ // Enter button should clear Prediction and enter a newline
+ TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(EPeninputLayoutEventBack,KNullDesC));
+ }
+ if ( UiStateMgr()->CurrentUiState()
+ && !static_cast<CPeninputHwrBoxUiState*>(UiStateMgr()->CurrentUiState())->HandleControlEvent(aEventType,aEventData) )
+ {
+ TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(aEventType,aEventData));
+ }
+ break;
+ case EPeninputLayoutEventSpace: // convert
+ if ( UiStateMgr()->CurrentUiState()
+ && !static_cast<CPeninputHwrBoxUiState*>(UiStateMgr()->CurrentUiState())->HandleControlEvent(aEventType, aEventData) )
+ {
+ HiraganaHandleControlEventJp(aEventType, aEventData);
+ }
+ break;
+ case EEventIcfPointerUp: // from ContextField
+ case EEventIcfCompleteAll: // from ContextField
+ TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(aEventType,aEventData));
+ break;
+ case EEventShowCandidateWnd: // CandidateWnd On
+ {
+ iHwrWindow->SetDimmed(ETrue);
+ }
+ break;
+ case EEventHideCandidateWnd: // CandidateWnd Off
+ {
+ iHwrWindow->SetDimmed(EFalse);
+ }
+ break;
+ case EEventWaitforEditorTextComing: // may use, someday.
+ {
+ iWaitforEditorTextComing = 1;
+ }
+ break;
+ case EEventDraggingEnd:
+ break;
+ case EPeninputLayoutEventSwitchCharacterRange:
+ if (static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->CharacterRangeArray()->Count() > 1)
+ {
+ HiraganaKanjiCompleteAll();
+ SendEventToWindow(aEventType, aCtrl, aEventData);
+ }
+ break;
+ case EEventICFSelectionChanged: // from ContextField (when whithout transitory input)
+ if (iHiraganaKanji)
+ { // update saved data
+ TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(aEventType,aEventData));
+ }
+ break;
+ case EEventSetAppCursorSelection: // from ContextField
+ if (UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
+ {
+ TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(aEventType,aEventData));
+ }
+ break;
+ case EPeninputLayoutHwrEventDropDownListExpanded:
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+ if (iLogger.LogValid())
+ {
+ iLogger.Write(KHwrStrokeLogExpand());
+ }
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+ CPeninputCommonLayout::HandleControlEvent(aEventType, aCtrl, aEventData);
+ iExpanded = ETrue;
+ break;
+ default:
+ CPeninputCommonLayout::HandleControlEvent(aEventType, aCtrl, aEventData);
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::HandleControlEventPen
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CPeninputHwrBoxLayout::HandleControlEventPen(TInt aEventType, CFepUiBaseCtrl* /*aCtrl*/, const TDesC& aEventData)
+ {
+ TBool handled = EFalse;
+ CPeninputHwrBoxUiState* current = static_cast<CPeninputHwrBoxUiState*>(iUiStatePenMgr->CurrentUiState());
+ TBuf<KMaxCandidateLen> charCode;
+ //filter un-related events
+ if (aEventType != EEventSetAppCursorSelection
+ && aEventType != EPeninputLayoutEventClose
+ && aEventType != EPeninputLayoutEventBack
+ && aEventType != EPeninputLayoutEventEnter
+ && (aEventType != EPeninputLayoutEventSpace || !iCapturePointerEvent)
+ && aEventType != EPeninputLayoutEventRange
+ && aEventType != EPeninputLayoutEventOption
+ && aEventType != EPeninputLayoutEventSct
+ && aEventType != EPeninputLayoutEventSwitchCharacterRange
+ && aEventType != EEventDraggingEnd
+ && (aEventType >= EPeninputLayoutHwrEventLast || aEventType < EPeninputLayoutHwrEventBeginWriting))
+ {
+ return handled;
+ }
+ TRAPD(err, current->HandleControlEventPenL(aEventType, aEventData, *this, charCode, handled));
+ if (KErrNone != err)
+ { // close peninput
+ HiraganaKanjiCompleteAll(); // call ToPenStandBy()
+ SetCapturePointerEvent(EFalse);
+ Initialize(); //jump to init state
+ CPeninputCommonLayout::HandleControlEvent(EPeninputLayoutEventClose, NULL, KNullDesC);
+ handled = ETrue;
+ }
+ return handled;
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::OnAppEditorTextComing
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputHwrBoxLayout::OnAppEditorTextComing(const TFepInputContextFieldData& aData)
+ {
+ iWaitforEditorTextComing = 0;
+ // Handle edit text coming
+ if (iHiraganaKanji)
+ {
+ TRAPD(err, iHiraganaKanji->SetEditorTextL(aData));
+ if (KErrNone != err)
+ {
+ HandleControlEvent(EPeninputLayoutEventClose, NULL, KNullDesC);
+ }
+ return err;
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Submit the char code.
+// ---------------------------------------------------------
+//
+void CPeninputHwrBoxLayout::SubmitL(const TDesC& aCharCode)
+ {
+ TInt len = 0;
+ if (iSubmitText && !(*iSubmitText).CompareC(aCharCode)
+ || !UiStateMgr()
+ || !UiStateMgr()->CurrentUiState())
+ {
+ return;
+ }
+ if (iSubmitText)
+ {
+ len = iSubmitText->Length();
+ if (len > 1
+ && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
+ {
+ len = 1;
+ }
+ }
+ delete iSubmitText;
+ iSubmitText = NULL;
+ iSubmitText = aCharCode.AllocL();
+
+ TInt eventType = EEventVirtualKeyUp;
+ TPtr charcode(iSubmitText->Des());
+
+ //if charcode is enter or back or space, translate them back
+ TPtrC16 ptr;
+ ptr.Set(&KBackRep, sizeof(KBackRep)/sizeof(TUint16));
+
+ if (charcode.CompareC(ptr) == 0)
+ {
+ charcode.Zero();
+ charcode.Append((TChar)EKeyBackspace);
+ eventType = EPeninputLayoutEventBack;
+ }
+ else
+ {
+ ptr.Set(&KSpaceRep, sizeof(KSpaceRep)/sizeof(TUint16));
+ if (charcode.CompareC(ptr) == 0)
+ {
+ charcode.Zero();
+ charcode.Append((TChar)EKeySpace);
+ eventType = EPeninputLayoutEventSpace;
+ }
+ else
+ {
+ ptr.Set(&KEnterRep, sizeof(KEnterRep)/sizeof(TUint16));
+ if (charcode.CompareC(ptr) == 0)
+ {
+ charcode.Zero();
+ charcode.Append((TChar)EKeyEnter);
+ eventType = EPeninputLayoutEventEnter;
+ }
+ }
+ }
+ if (len > 0 &&
+ (EEventVirtualKeyUp != eventType
+ || UiStateMgr()->CurrentUiState() != UiStateMgr()->GetUiState(EPeninputHwrUiStateStandby)))
+ {
+ for (TInt i = 0; i < len; i++)
+ {
+ DeleteL(EKeyDelete);
+ }
+ }
+
+ if (len > 0 &&
+ (EEventVirtualKeyUp == eventType
+ && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateStandby)))
+ {
+ // len == 1 or 2, charcode.Length() == 1 or 2.
+ TInt diff = charcode.Length() - len;
+ if (diff > 0)
+ {
+ HBufC* p = HBufC::NewL(charcode.Length() + 2);
+ p->Des().Append((TUint16*)&len, 2);
+ p->Des().Append(charcode.Left(len));
+ Sendkey( ESignalReplaceTextJp, *p );
+ delete p;
+ Sendkey( ESignalKeyEvent, charcode.Right(diff));
+ }
+ else
+ {
+ while (len > charcode.Length())
+ {
+ DeleteL(EKeyDelete);
+ --len;
+ }
+ HBufC* p = HBufC::NewL(charcode.Length() + 2);
+ p->Des().Append((TUint16*)&len, 2);
+ p->Des().Append(charcode);
+ Sendkey( ESignalReplaceTextJp, *p );
+ delete p;
+ }
+ }
+ else if ( !static_cast<CPeninputHwrBoxUiState*>(UiStateMgr()->CurrentUiState())->HandleControlEvent(eventType,charcode) )
+ {
+ SetCapturePointerEvent(ETrue);
+ iHiraganaKanji->HandleControlEventJpL(eventType, charcode);
+ }
+ if (EEventVirtualKeyUp != eventType)
+ {
+ delete iSubmitText;
+ iSubmitText = NULL;
+ }
+ }
+
+// ---------------------------------------------------------
+// Delete the previous charcode
+// ---------------------------------------------------------
+//
+void CPeninputHwrBoxLayout::DeleteL(TInt aChar/* = EKeyBackspace*/)
+ {
+ //delete the last char
+ const TInt len = sizeof(aChar);
+ TBuf<len> aBufBck;
+ aBufBck.Append((TChar)aChar);
+
+ if (UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
+ {
+ static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->PtiEngine()->HandleCommandL(EPtiCommandBackSpaceByForce);
+ }
+ else
+ {
+ SignalOwner(ESignalKeyEvent, aBufBck);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::HandleRawKeyEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CPeninputHwrBoxLayout::HandleRawKeyEventL(const TRawEvent& aKeyEvent)
+ {
+ TBool rs = EFalse;
+ if (iHiraganaKanji)
+ {
+ iHiraganaKanji->CancelRepeat();
+ }
+ if (iUiStatePenMgr)
+ {
+ CPeninputUiStateBase* current = iUiStatePenMgr->CurrentUiState();
+ if (iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenBeginWriting) == current)
+ { // temporary
+ return ETrue;
+ }
+ if (iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenEndWriting) == current
+ || iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenCandidateSelecting) == current)
+ {
+ TInt key = (aKeyEvent.ScanCode() & 0x000000FF);
+ switch(key)
+ { // Handle clear key
+ case EKeyBackspace:
+ case EStdKeyBackspace: /* 0x01 */
+ case EStdKeyEscape: /* 0x04 */
+ {
+ // if TRawEvent::EKeyDown, return at once.
+ if (TRawEvent::EKeyDown == aKeyEvent.Type())
+ {
+ iKeyEventClearAsync->CallBack();
+ }
+ return ETrue;
+ }
+ default:
+ ToPenStandBy();
+ break;
+ }
+ }
+ }
+ if (UiStateMgr() && UiStateMgr()->CurrentUiState())
+ {
+ rs = UiStateMgr()->CurrentUiState()->HandleKeyEventL(aKeyEvent);
+ if (rs && iHiraganaKanji)
+ {
+ if (EStdKeyEnter == (aKeyEvent.ScanCode() & 0x000000FF) && IsPredictiveWithNoChar())
+ { // without transitory chars and next word prediction candidates are offered
+ // Enter button should clear Prediction and enter a newline
+ TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(EPeninputLayoutEventBack,KNullDesC));
+ return UiStateMgr()->GetUiState(EPeninputHwrUiStateStandby)->HandleKeyEventL(aKeyEvent);
+ }
+ rs = iHiraganaKanji->HandleKeyEvent(aKeyEvent);
+ }
+ }
+ if (!iWaitforEditorTextComing && TRawEvent::EKeyDown == aKeyEvent.Type() && TRawEvent::ENone == iKeyEvent.Type())
+ {
+ if (!rs)
+ {
+ SendEventToWindow(EPeninputLayoutEventCloseCharacterRange, NULL, KNullDesC);
+ HiraganaKanjiCompleteAll();
+ if (iWaitforEditorTextComing) // complete done.
+ {
+ rs = ETrue;
+ iKeyEvent = aKeyEvent;
+ iKeyEventAsync->CallBack(); // for key that hiraganakanji do not handle
+ }
+ }
+ else if (iHiraganaKanji)
+ {
+ iKeyEventAsync->CallBack(); // for pending event
+ }
+ }
+ return rs;
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::OnPointerEventOutsideLayout
+// Call back when the pointer down/up event happends outside of the layout
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CPeninputHwrBoxLayout::OnPointerEventOutsideLayout(const TRawEvent& aEvent)
+ {
+ if (TRawEvent::EButton1Down == aEvent.Type()) // this if is not necessary. only EButton1Down.
+ {
+ HandleControlEventPen(EPeninputLayoutHwrEventPointerOutsideWnd, NULL, KNullDesC);
+ SendEventToWindow(EPeninputLayoutEventCloseCharacterRange, NULL, KNullDesC);
+ HiraganaKanjiCompleteAll();
+ if (iCapturePointerEvent)
+ {
+ iPointerEventDown = aEvent;
+ SetCapturePointerEvent(EFalse);
+ iPointerEventAsync->CallBack();
+ }
+ }
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::DataMgr
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+CPeninputHwrBoxDataMgr* CPeninputHwrBoxLayout::DataMgr(TInt /*aDummy*/)
+ {
+ return static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr);
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::HwrBoxWindow
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+CPeninputHwrBoxWindow* CPeninputHwrBoxLayout::HwrBoxWindow()
+ {
+ return iHwrWindow;
+ }
+
+void CPeninputHwrBoxLayout::ToPenStandBy(TBool aNotStandBy/* = EFalse*/)
+ {
+ if (iUiStatePenMgr)
+ {
+ CPeninputUiStateBase* current = iUiStatePenMgr->CurrentUiState();
+ if (iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenEndWriting) == current
+ || iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenCandidateSelecting) == current)
+ {
+ static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->ClearCandidates();
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+ if (iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenEndWriting) == current && !aNotStandBy)
+ {
+ WriteHwrStrokeLogNew();
+ }
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+ }
+ if (!aNotStandBy)
+ {
+ iUiStatePenMgr->SetCurrentUiState(EPeninputHwrUiStatePenStandBy);
+ iHwrWindow->CancelWriting(); // Standby::OnEntry()
+ iHwrWindow->DimInputContextField(EFalse);
+ }
+ delete iSubmitText;
+ iSubmitText = NULL;
+ iExpanded = EFalse;
+ }
+ }
+
+void CPeninputHwrBoxLayout::Initialize()
+ {
+ if (iUiStatePenMgr)
+ {
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+ CPeninputUiStateBase* current = iUiStatePenMgr->CurrentUiState();
+ if (iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenEndWriting) == current
+ || iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenBeginWriting) == current)
+ {
+ WriteHwrStrokeLogNew();
+ }
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+ iUiStatePenMgr->SetCurrentUiState(EPeninputHwrUiStateNone);
+ }
+ if (iHwrWindow)
+ {
+ iHwrWindow->CancelWriting();
+ iHwrWindow->Hide(ETrue);
+ iExpanded = EFalse;
+ }
+ }
+
+void CPeninputHwrBoxLayout::CompleteIfConvertingL()
+ {
+ if (iCapturePointerEvent // Transitory Input Exists
+ && UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
+ {
+ iWaitforEditorTextComing = 0;
+ if (iHiraganaKanji)
+ {
+ iHiraganaKanji->HandleControlEventJpL(EEventCompleteIfConvertingHiraganaKanji, KNullDesC);
+ }
+ if (iWaitforEditorTextComing) // the status of hiraganakanji was converting ---> complete,but should not capture off
+ {
+ UiStateMgr()->SetCurrentUiState(EPeninputHwrUiStateStandbyjp);
+ iCapturePointerEvent = EFalse;
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::ClearInputToPenStandByL()
+// clear last input char and goto PenStandBy
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+void CPeninputHwrBoxLayout::ClearInputToPenStandByL()
+ {
+ if (iSubmitText)
+ {
+ TInt len = iSubmitText->Length();
+ if (len > 1 &&
+ UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
+ {
+ len = 1;
+ }
+ for (TInt i = 0; i < len; i++)
+ {
+ DeleteL(EKeyDelete);
+ }
+ }
+ ToPenStandBy();
+ if (UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
+ {
+ iHiraganaKanji->HandleControlEventJpL(EEventVirtualKeyUp,KNullDesC);
+ }
+ }
+
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::WriteHwrStrokeLogNew
+// write log "New"
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+void CPeninputHwrBoxLayout::WriteHwrStrokeLogNew()
+ {
+ if (iLogger.LogValid())
+ {
+ iLogger.Write(KHwrStrokeLogNew());
+ }
+ }
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::CPeninputHwrBoxLayout
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CPeninputHwrBoxLayout::CPeninputHwrBoxLayout(MLayoutOwner* aLayoutOwner)
+ : CPeninputCommonLayout( aLayoutOwner ),
+ iCapturePointerEvent(EFalse),
+ iExpanded(EFalse)
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::ConstructL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputHwrBoxLayout::ConstructL(const TAny* aInitData)
+ {
+ CPeninputCommonLayout::ConstructL( aInitData );
+
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+ User::LeaveIfError( iLogger.Connect() );
+ // Make directory
+ RFs fs;
+ if (fs.Connect() == KErrNone)
+ {
+ TInt ret = fs.MkDirAll(KHwrStrokeLogBaseDir());
+ fs.Close();
+ }
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+
+ iUiStatePenMgr = CPeninputUiStateMgr::NewL( this );
+
+ CPeninputUiStateBase* initialState =
+ CPeninputUiStateBase::NewL( UiStateMgr(), this );
+ UiStateMgr()->AddUiState( initialState, EPeninputHwrUiStateNone );
+
+ CPeninputHwrBoxUiStateStandby* standbyState =
+ CPeninputHwrBoxUiStateStandby::NewL( UiStateMgr(), this );
+ UiStateMgr()->AddUiState( standbyState, EPeninputHwrUiStateStandby );
+
+ CPeninputHwrBoxUiStateStandbyjp* standbyjpState =
+ CPeninputHwrBoxUiStateStandbyjp::NewL( UiStateMgr(), this );
+ UiStateMgr()->AddUiState( standbyjpState, EPeninputHwrUiStateStandbyjp );
+
+ CPeninputHwrBoxUiStateWithTransitoryChars* transitoryState =
+ CPeninputHwrBoxUiStateWithTransitoryChars::NewL( UiStateMgr(), this );
+ UiStateMgr()->AddUiState( transitoryState, EPeninputHwrUiStateWithTransitoryChars );
+
+ UiStateMgr()->SetCurrentUiState( initialState );
+
+ CPeninputUiStateBase* penInitialState =
+ CPeninputHwrBoxUiState::NewL( iUiStatePenMgr, this );
+
+ iUiStatePenMgr->AddUiState( penInitialState, EPeninputHwrUiStateNone );
+ CPeninputHwrBoxUiStatePenStandby* penStandbyState =
+ CPeninputHwrBoxUiStatePenStandby::NewL( iUiStatePenMgr, this );
+ iUiStatePenMgr->AddUiState( penStandbyState, EPeninputHwrUiStatePenStandBy );
+
+ CPeninputHwrBoxUiStatePenBeginWriting* penBeginState =
+ CPeninputHwrBoxUiStatePenBeginWriting::NewL( iUiStatePenMgr, this );
+ iUiStatePenMgr->AddUiState( penBeginState, EPeninputHwrUiStatePenBeginWriting );
+
+ CPeninputHwrBoxUiStatePenEndWriting* penEndState =
+ CPeninputHwrBoxUiStatePenEndWriting::NewL( iUiStatePenMgr, this );
+ iUiStatePenMgr->AddUiState( penEndState, EPeninputHwrUiStatePenEndWriting );
+
+ CPeninputHwrBoxUiStatePenCandidateSelecting* penCandidateSelectingState =
+ CPeninputHwrBoxUiStatePenCandidateSelecting::NewL( iUiStatePenMgr, this );
+ iUiStatePenMgr->AddUiState( penCandidateSelectingState, EPeninputHwrUiStatePenCandidateSelecting );
+
+ iUiStatePenMgr->SetCurrentUiState( penInitialState );
+
+ iHwrWindow = static_cast<CPeninputHwrBoxWindow*>(iLayoutWindow);
+ Initialize();
+ {
+ TInt penSpeed = static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->WritingSpeed();
+ TPtr ptr((TUint16*)&penSpeed,sizeof(TInt)/sizeof(TUint16));
+ SendEventToWindow(EPeninputLayoutHwrEventWritingSpeedChange, NULL, ptr);
+ }
+ {
+ TSize penSize = static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->PenSize();
+ TPtr ptr((TUint16*)&penSize,sizeof(TSize)/sizeof(TUint16));
+ SendEventToWindow(EPeninputLayoutHwrEventPenSizeChange, NULL, ptr);
+ }
+ {
+ TRgb penColor = static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->PenColor();
+ TPtr ptr((TUint16*)&penColor,sizeof(TRgb)/sizeof(TUint16));
+ SendEventToWindow(EPeninputLayoutHwrEventPenColorChange, NULL, ptr);
+ }
+ //create hiraganakanji
+ iHiraganaKanji = CPeninputHiraganaKanji::NewL(static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->PtiEngine()
+ , this
+ , iHwrWindow->InputContextField()
+ , iHwrWindow->CandidateWindow()
+ , iHwrWindow->PredictiveWindow());
+ TCallBack cb(KeyEventCallback, this);
+ TCallBack cbpointer(PointerEventCallback, this);
+ iKeyEventAsync = new(ELeave) CAsyncCallBack(cb, CActive::EPriorityHigh);
+ iPointerEventAsync = new(ELeave) CAsyncCallBack(cbpointer, CActive::EPriorityStandard);
+ TCallBack cbClear(KeyEventClearCallback, this);
+ iKeyEventClearAsync = new(ELeave) CAsyncCallBack(cbClear, CActive::EPriorityHigh);
+
+ iKeyEvent.Set(TRawEvent::ENone,0);
+ iPointerEventDown.Set(TRawEvent::ENone,0);
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::DoSetCurrentRange
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputHwrBoxLayout::DoSetCurrentRange()
+ {
+ TInt currentRange = CPeninputDataConverter::AnyToInt( RequestData( EPeninputDataTypeCurrentRange ) );
+ static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetEngineInputMode(currentRange); // PtiEngine:SetInputMode()
+
+ if ( currentRange == ERangeHiraganaKanji && static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->Conversion())
+ {
+ UiStateMgr()->SetCurrentUiState(EPeninputHwrUiStateStandbyjp);
+ }
+ else
+ {
+ UiStateMgr()->SetCurrentUiState(EPeninputHwrUiStateStandby);
+ }
+ SetCapturePointerEvent(EFalse);
+ ToPenStandBy();
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+ WriteHwrStrokeLogRange();
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::CompleteAllHiraganaKanji
+// ---------------------------------------------------------------------------
+//
+void CPeninputHwrBoxLayout::HiraganaKanjiCompleteAll()
+ {
+ ToPenStandBy();
+ if( UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
+ {
+ if (iHiraganaKanji)
+ { // CompleteALL
+ TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(EEventCompleteAllHiraganaKanji, KNullDesC));
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::CreateLayoutWindowL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+void CPeninputHwrBoxLayout::CreateLayoutWindowL()
+ {
+ iLayoutWindow = CPeninputHwrBoxWindow::NewL( this, this );
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::CreateDataMgrL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+void CPeninputHwrBoxLayout::CreateDataMgrL( const TAny* /*aInitData*/ )
+ {
+ iDataMgr = CPeninputHwrBoxDataMgr::NewL( this );
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::LayoutType
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputHwrBoxLayout::LayoutType()
+ {
+ return EPluginInputModeHwr;
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::SemiTransparencyRequired
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+TBool CPeninputHwrBoxLayout::SemiTransparencyRequired()
+ {
+ return ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::TranslateRangeHullHalf
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputHwrBoxLayout::TranslateRangeHullHalf(TInt aRange) const
+ {
+ TInt newRange = aRange;
+ if (static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->FullHalf()) // Full
+ {
+ switch (aRange)
+ {
+ case ERangeEnglish:
+ newRange = ERangeFullWidthEnglish;
+ break;
+ case ERangeNumber:
+ newRange = ERangeFullWidthNumeric;
+ break;
+ case ERangeKatakana:
+ newRange = ERangeFullWidthKatakana;
+ break;
+ default:
+ break;
+ }
+ }
+ else // half
+ {
+ switch (aRange)
+ {
+ case ERangeFullWidthEnglish:
+ newRange = ERangeEnglish;
+ break;
+ case ERangeFullWidthNumeric:
+ newRange = ERangeNumber;
+ break;
+ case ERangeFullWidthKatakana:
+ newRange = ERangeKatakana;
+ break;
+ default:
+ break;
+ }
+ }
+ return newRange;
+ }
+
+TInt CPeninputHwrBoxLayout::KeyEventCallback(TAny* aThis)
+ {
+ if (aThis)
+ {
+ TRAPD(err,static_cast<CPeninputHwrBoxLayout*>(aThis)->DoKeyEventL());
+ if (KErrNone != err)
+ {
+ static_cast<CPeninputHwrBoxLayout*>(aThis)->HandleControlEvent(EPeninputLayoutEventClose, NULL, KNullDesC);
+ }
+ return err;
+ }
+ return 0;
+ }
+
+TInt CPeninputHwrBoxLayout::PointerEventCallback(TAny* aThis)
+ {
+ if (aThis)
+ {
+ static_cast<CPeninputHwrBoxLayout*>(aThis)->DoPointerEvent();
+ }
+ return 0;
+ }
+
+void CPeninputHwrBoxLayout::DoKeyEventL()
+ {
+ TBool ret = iHiraganaKanji->HandlePendingEventL();
+ if (!ret && TRawEvent::ENone != iKeyEvent.Type())
+ {
+ iKeyEvent.Set(TRawEvent::EKeyUp,iKeyEvent.ScanCode());
+ CCoeEnv::Static()->WsSession().SimulateRawEvent(iKeyEvent);
+ iKeyEvent.Set(TRawEvent::EKeyDown,iKeyEvent.ScanCode());
+ CCoeEnv::Static()->WsSession().SimulateRawEvent(iKeyEvent);
+ iKeyEvent.Set(TRawEvent::EKeyUp,iKeyEvent.ScanCode());
+ CCoeEnv::Static()->WsSession().SimulateRawEvent(iKeyEvent);
+ iKeyEvent.Set(TRawEvent::ENone,0);
+ }
+ }
+
+void CPeninputHwrBoxLayout::DoPointerEvent()
+ {
+ if (TRawEvent::ENone != iPointerEventDown.Type())
+ {
+ User::After(KDelay);
+ CCoeEnv::Static()->WsSession().SimulateRawEvent(iPointerEventDown);
+ iPointerEventDown.Set(TRawEvent::EButton1Up,iPointerEventDown.Pos().iX,iPointerEventDown.Pos().iY);
+ CCoeEnv::Static()->WsSession().SimulateRawEvent(iPointerEventDown);
+ iPointerEventDown.Set(TRawEvent::ENone,0);
+ }
+ }
+
+TInt CPeninputHwrBoxLayout::KeyEventClearCallback(TAny* aThis)
+ {
+ if (aThis)
+ {
+ TRAPD(err,static_cast<CPeninputHwrBoxLayout*>(aThis)->DoKeyClearEventL());
+ if (KErrNone != err)
+ {
+ static_cast<CPeninputHwrBoxLayout*>(aThis)->HandleControlEvent(EPeninputLayoutEventClose, NULL, KNullDesC);
+ }
+ return err;
+ }
+ return 0;
+ }
+
+void CPeninputHwrBoxLayout::DoKeyClearEventL()
+ {
+ ClearInputToPenStandByL();
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+ WriteHwrStrokeLogClear();
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+ if (iHiraganaKanji)
+ {
+ iHiraganaKanji->RepeatClearKeyStart();
+ }
+ }
+
+void CPeninputHwrBoxLayout::SetCapturePointerEvent(TBool aFlag)
+ {
+ if (iCapturePointerEvent && !aFlag || !iCapturePointerEvent && aFlag)
+ {
+ TBool dimmFlag = (aFlag)? EFalse : ETrue;
+ TPtr ptr((TUint16*)&dimmFlag,sizeof(TBool)/sizeof(TUint16));
+ SendEventToWindow(EPeninputLayoutEventSetConversion, NULL, ptr);
+ //signal the owner that pointer needs not be captured
+ TBool capture = aFlag;
+ TPtrC captureData;
+ captureData.Set((const TUint16*)&capture,sizeof(TBool)/sizeof(TUint16));
+ SignalOwner(ESignalCapturePointer,captureData);
+ iCapturePointerEvent = aFlag;
+ }
+ }
+
+void CPeninputHwrBoxLayout::SetCapturePointerEventAgain()
+ {
+ if (iCapturePointerEvent)
+ {
+ //signal the owner that pointer needs not be captured
+ TBool capture = ETrue;
+ TPtrC captureData;
+ captureData.Set((const TUint16*)&capture,sizeof(TBool)/sizeof(TUint16));
+ SignalOwner(ESignalCapturePointer,captureData);
+ }
+ }
+
+void CPeninputHwrBoxLayout::HiraganaHandleControlEventJp(TInt aEventType, const TDesC& aEventData)
+ {
+ if (iHiraganaKanji)
+ {
+ TRAPD(err, iHiraganaKanji->HandleControlEventJpL(aEventType,aEventData));
+ if (KErrNone != err)
+ { // close peninput
+ HiraganaKanjiCompleteAll(); // call ToPenStandBy()
+ SetCapturePointerEvent(EFalse);
+ Initialize(); //jump to init state
+ CPeninputCommonLayout::HandleControlEvent(EPeninputLayoutEventClose, NULL, KNullDesC);
+ }
+ }
+ }
+
+TBool CPeninputHwrBoxLayout::IsPredictiveWithNoChar() const
+ {
+ if (!iCapturePointerEvent // without transitory chars
+ && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
+ {
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+#ifdef __PENINPUT_HWR_STROKE_LOG_ON
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::WriteHwrStrokeLogClear
+// write log "Clear"
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+void CPeninputHwrBoxLayout::WriteHwrStrokeLogClear()
+ {
+ if (iLogger.LogValid())
+ {
+ iLogger.Write(KHwrStrokeLogClear());
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CPeninputHwrBoxLayout::WriteHwrStrokeLogRange
+// write log characterrange
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+void CPeninputHwrBoxLayout::WriteHwrStrokeLogRange()
+ {
+ if (iLogger.LogValid() && !iLogOff)
+ {
+ TBuf<KHwrStrokeLogCharacterRangeLen> characterRange;
+ switch(static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->CharacterRangeId())
+ {
+ case EPeninutCharacterRangeIdKanaKanji:
+ characterRange.Append(KHwrStrokeLogRangeKanaKanji());
+ break;
+ case EPeninutCharacterRangeIdLatin:
+ characterRange.Append(KHwrStrokeLogRangeLatin());
+ break;
+ case EPeninutCharacterRangeIdNumber:
+ characterRange.Append(KHwrStrokeLogRangeNumber());
+ break;
+ default:
+ characterRange.Append(KHwrStrokeLogRangeAllTypes());
+ break;
+ }
+ iLogger.WriteFormat(KHwrStrokeLogCharacterRange(), &characterRange);
+ }
+ }
+#endif // __PENINPUT_HWR_STROKE_LOG_ON
+// End Of File