textinput/peninputhwrboxjp/src/peninputhwrboxlayout.cpp
changeset 0 eb1f2e154e89
child 10 6defe5d1bd39
equal deleted inserted replaced
-1:000000000000 0:eb1f2e154e89
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0""
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Implementation of the hwr layout
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // system includes
       
    20 #include <peninputhiraganakanji.h>       // hiraganakanji
       
    21 #include <peninputuistatemgr.h>    // use ui state mgr
       
    22 #include <peninputdataconverter.h>
       
    23 #include <aknfeppeninputenums.h>    //command from fep or IME to plugin. for vkb/hwr, range defination
       
    24 #include <peninputcommonlayoutglobalenum.h>  // EPeninputLayoutEventEnter
       
    25 #include <peninputeventjp.h>
       
    26 #include <AknFepGlobalEnums.h> //define TWidthChar
       
    27 #include <PtiEngine.h>
       
    28 #include <peninputjapanesecandidatewnd.h>
       
    29 #include <peninputjapanesepredictivewnd.h>
       
    30 
       
    31 // user includes
       
    32 #include "peninputhwrboxlayout.h"
       
    33 #include "peninputhwrboxuistatetype.h"         // UI state
       
    34 #include "peninputhwrboxwindow.h"        // use hwr window, which derived from base window
       
    35 #include "peninputhwrboxdatamgr.h"       // use data mgr
       
    36 #include "peninputhwrboxuistatestandby.h"
       
    37 #include "peninputhwrboxuistatestandbyjp.h"
       
    38 #include "peninputhwrboxuistatewithtransitorychars.h"
       
    39 #include "peninputhwrboxuistatepenstandby.h"
       
    40 #include "peninputhwrboxuistatepenbeginwriting.h"
       
    41 #include "peninputhwrboxuistatepenendwriting.h"
       
    42 #include "peninputhwrboxuistatepencandidateselecting.h"
       
    43 #include "peninputhwrevent.h"
       
    44 #include "peninputhwrboxgroup.h"
       
    45 
       
    46 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
    47 #include <PeninputHwrStrokeLogConst.h>
       
    48 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
    49 
       
    50 // constant definition
       
    51 const TInt KMaxCandidateLen = 128;
       
    52 const TUint16 KBackRep = 0x2408;
       
    53 const TUint16 KEnterRep = 0xF801;
       
    54 const TUint16 KSpaceRep = 0xF800;
       
    55 const TInt KDelay = 100000; //1/10 second
       
    56 const TInt KPeninputBufLen = 16;
       
    57 const TInt KPeninputBufLen8 = 8;
       
    58 
       
    59 // ======== MEMBER FUNCTIONS ========
       
    60 
       
    61 // ---------------------------------------------------------------------------
       
    62 // CPeninputHwrBoxLayout::NewL
       
    63 // (other items were commented in a header).
       
    64 // ---------------------------------------------------------------------------
       
    65 //
       
    66 CPeninputHwrBoxLayout* CPeninputHwrBoxLayout::NewL(MLayoutOwner* aLayoutOwner,
       
    67                                          const TAny* aInitData)
       
    68     {
       
    69     CPeninputHwrBoxLayout* self = new (ELeave) CPeninputHwrBoxLayout(aLayoutOwner);
       
    70 
       
    71     CleanupStack::PushL(self);
       
    72     self->ConstructL(aInitData);
       
    73     CleanupStack::Pop(self);
       
    74 
       
    75     return self;
       
    76     }
       
    77 
       
    78 // ---------------------------------------------------------------------------
       
    79 // CPeninputHwrBoxLayout::~CPeninputHwrBoxLayout
       
    80 // (other items were commented in a header).
       
    81 // ---------------------------------------------------------------------------
       
    82 //
       
    83 CPeninputHwrBoxLayout::~CPeninputHwrBoxLayout()
       
    84     {
       
    85     delete iHiraganaKanji;
       
    86     delete iKeyEventAsync;
       
    87     delete iKeyEventClearAsync;
       
    88     delete iPointerEventAsync;
       
    89     delete iUiStatePenMgr;
       
    90     delete iSubmitText;
       
    91 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
    92     if (iLogger.LogValid())
       
    93         {
       
    94         iLogger.CloseLog();
       
    95         }
       
    96     iLogger.Close();
       
    97 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
    98     }
       
    99 
       
   100 // ---------------------------------------------------------------------------
       
   101 // CPeninputHwrBoxLayout::HandleEventL
       
   102 // handle event from window server
       
   103 // ---------------------------------------------------------------------------
       
   104 //
       
   105 TBool CPeninputHwrBoxLayout::HandleEventL(TEventType aType, const TAny* aData)
       
   106     {
       
   107     TRawEvent event=*((TRawEvent*)aData);
       
   108     CFepUiBaseCtrl* ctrl = NULL;
       
   109     if(ERawEvent == aType)
       
   110         {
       
   111         if (TRawEvent::EButton1Down == event.Type() && iHiraganaKanji)
       
   112             {
       
   113             iHiraganaKanji->CancelRepeat();
       
   114             }
       
   115         // DropDownList expanded and PointerDown on drawing area ---> cancel input and to StandBy
       
   116         if (iExpanded
       
   117             && TRawEvent::EButton1Down == event.Type()
       
   118             && iUiStatePenMgr->CurrentUiState() == iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenCandidateSelecting)
       
   119             && iDropdownList
       
   120             && iHwrWindow->BoxGroup())
       
   121             {
       
   122             TPoint point = event.Pos() - Position ();
       
   123             if (!iDropdownList->Rect().Contains(point)
       
   124                 && iHwrWindow->BoxGroup()->Rect().Contains(point))
       
   125                 {
       
   126                 ClearInputToPenStandByL();
       
   127                 return ETrue;
       
   128                 }
       
   129             }
       
   130         if(TRawEvent::EButton1Up == event.Type())
       
   131             {
       
   132             ctrl = RootControl()->CtrlCapPointer();
       
   133             }
       
   134         }
       
   135     TBool handled = CPeninputCommonLayout::HandleEventL(aType,aData);
       
   136     // if dropdownlist expanded, capture off
       
   137     // as the dropdownlist is the 1st control in the clientpane controlgroup, capture is not need.
       
   138     if (TRawEvent::EButton1Up == event.Type() && !ctrl)
       
   139         {
       
   140         CFepUiBaseCtrl* capture = RootControl()->CtrlCapPointer();
       
   141         if (capture && capture->ControlId() == EPeninutWindowCtrlIdDropDownList)
       
   142            {  // dropdownlist expanded
       
   143            iDropdownList = capture;
       
   144            capture->CapturePointer(EFalse);
       
   145            SetCapturePointerEventAgain(); // capture for transitory input on
       
   146            HandleControlEvent(EPeninputLayoutHwrEventDropDownListExpanded, capture, KNullDesC);
       
   147            }
       
   148         }
       
   149     // if a control do capture off, capture for transitory input on.
       
   150     if (ctrl && !RootControl()->CtrlCapPointer())
       
   151         {
       
   152         SetCapturePointerEventAgain();
       
   153         }
       
   154     return handled;
       
   155     }
       
   156 
       
   157 // ---------------------------------------------------------------------------
       
   158 // CPeninputHwrBoxLayout::HandleCommand
       
   159 // (other items were commented in a header).
       
   160 // ---------------------------------------------------------------------------
       
   161 //
       
   162 TInt CPeninputHwrBoxLayout::HandleCommand(TInt aCmd, TUint8* aData)
       
   163     {
       
   164     // Handle command from fep or IME to this layout
       
   165     TUint* data = (TUint*) aData;
       
   166 
       
   167     switch ( aCmd )
       
   168         {
       
   169         case ECmdPenInputPermittedRange:  // different from common layout
       
   170             // this command comes after ECmdPenInputJapaneseSetting
       
   171             if (iDataMgr)
       
   172                 {
       
   173                 // in SetData, SetPermittedRanges() and SetCharacterRangePopupLare() called.
       
   174                 SetData(EPeninputDataTypePermittedRange, aData);
       
   175                 }
       
   176             break;
       
   177         case ECmdPenInputLanguage:
       
   178             {
       
   179             CPeninputCommonLayout::HandleCommand(aCmd, aData);
       
   180             }
       
   181             break;
       
   182         case ECmdPenInputWindowOpen:
       
   183             if (iHwrWindow)
       
   184                 {
       
   185                 iHwrWindow->Opened();
       
   186                 iLayoutWindow->Hide(EFalse);  // before Hide Check or Change, parent controlgroup should be Hide Off.
       
   187                 TInt curRange = CPeninputDataConverter::AnyToInt(RequestData(EPeninputDataTypeCurrentRange));
       
   188                 TBool currHide = iHwrWindow->PredictiveWindow()->Hiden();
       
   189                 TBool newHide = ETrue;
       
   190                 if (static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->Predictive()
       
   191                               && static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->Conversion()
       
   192                               &&  ERangeHiraganaKanji == curRange)
       
   193                     {
       
   194                     newHide = EFalse;
       
   195                     }
       
   196                 if (newHide && !currHide || !newHide && currHide)
       
   197                     {
       
   198                     iHwrWindow->PredictiveWindow()->Hide(newHide);
       
   199                     iHwrWindow->SizeChanged(ETrue);
       
   200                     }
       
   201                 CPeninputCommonLayout::HandleCommand( aCmd, aData );
       
   202                 if (*data != EPenInputOpenManually && Position() == TPoint(0,0))
       
   203                     {  // position is not yet set.(English --> Japanese)
       
   204                     SendEventToWindow(EPeninputLayoutEventMovePosition, NULL, KNullDesC);
       
   205                     }
       
   206                 iHwrWindow->ICFEnableRegionUpdating();  // ICF::OnActivate()
       
   207                 }
       
   208             ToPenStandBy();
       
   209 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
   210     if (iLogger.Handle())
       
   211         {
       
   212         if (iLogger.LogValid())
       
   213             {
       
   214             iLogger.CloseLog();
       
   215             }
       
   216         // Generate file name based on date.
       
   217         TTime time;
       
   218         time.HomeTime();
       
   219         TDateTime datetime = time.DateTime();
       
   220         TBuf<KHwrStrokeLogFileNameMaxLen> name;
       
   221         name.Format(KHwrStrokeLogFileExt(),
       
   222             datetime.Year(), TInt(datetime.Month()+1), datetime.Day()+1,
       
   223             datetime.Hour(), datetime.Minute(), datetime.Second());
       
   224         // Open(or create) log file
       
   225         iLogger.CreateLog( KHwrStrokeLogDir(), name, EFileLoggingModeAppend);
       
   226         // Disable date and time
       
   227         iLogger.SetDateAndTime(EFalse, EFalse);
       
   228         // Write log
       
   229         iLogger.Write(KHwrStrokeLogOpen());
       
   230         WriteHwrStrokeLogRange();
       
   231         }
       
   232 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
   233             break;
       
   234         case ECmdPenInputWindowClose:
       
   235             SendEventToWindow(EPeninputLayoutEventCloseCharacterRange, NULL, KNullDesC);
       
   236             HiraganaKanjiCompleteAll();
       
   237             CPeninputCommonLayout::HandleCommand( aCmd, aData );
       
   238             UiStateMgr()->SetCurrentUiState( EPeninputHwrUiStateNone );
       
   239             Initialize();
       
   240             SetCapturePointerEvent(EFalse);
       
   241             iHwrWindow->Closed();
       
   242 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
   243     if (iLogger.LogValid())
       
   244         {
       
   245         iLogger.Write(KHwrStrokeLogClose());
       
   246         iLogger.CloseLog();
       
   247         }
       
   248 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
   249             break;
       
   250         case ECmdPenInputRange:  // different from common layout:control. ptiEngine.
       
   251             {
       
   252 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
   253     iLogOff = 1;
       
   254 #endif
       
   255             // this command comes after ECmdPenInputJapaneseSetting, ECmdPenInputPermittedRange
       
   256             if (iLayoutWindow)
       
   257                 {
       
   258                 iHwrWindow->ICFDisableRegionUpdating();  // ICF::OnDeActivate()
       
   259                 iLayoutWindow->Hide(EFalse);  // before Hide Check or Change, parent controlgroup should be Hide Off.
       
   260                 }
       
   261             if (iDataMgr)
       
   262                 {
       
   263                 TUint range = TranslateRangeHullHalf(*data);
       
   264                 TUint8* rangedata = reinterpret_cast<TUint8*>(&range);
       
   265                 // SetData(SetPremaryRange) and SizeChangedForBaseWindow and ChangeClientLayout
       
   266                 CPeninputCommonLayout::HandleCommand( aCmd, rangedata );
       
   267                 iRangeOrg = range;
       
   268                 TInt permittedRange = CPeninputDataConverter::AnyToInt(RequestData(EPeninputDataTypePermittedRange));
       
   269                 if (permittedRange & (ERangeHiraganaKanji | ERangeKatakana | ERangeFullWidthKatakana))
       
   270                     {
       
   271                     TInt index = 0;
       
   272                     if (range == ERangeEnglish || range == ERangeFullWidthEnglish)
       
   273                         {
       
   274                         index = 2;  // see CPeninputHwrBoxDataMgr::SetCharacterRangePopupL()
       
   275                         }
       
   276                     if (range == ERangeNumber || range == ERangeFullWidthNumeric)
       
   277                         {
       
   278                         index = (permittedRange & (ERangeEnglish | ERangeFullWidthEnglish))? 3:2;
       
   279                                                  // see CPeninputHwrBoxDataMgr::SetCharacterRangePopupL()
       
   280                         }
       
   281                     if (index)
       
   282                         {
       
   283                         TPtrC dataPtr;
       
   284                         dataPtr.Set(reinterpret_cast<TUint16*>(&index),sizeof(TInt)/sizeof(TUint16));
       
   285                         HandleControlEvent(EPeninputLayoutEventRange,NULL,dataPtr);  // call DoSetCurrentRange()
       
   286                         }
       
   287                     else
       
   288                         {
       
   289                         DoSetCurrentRange();
       
   290                         }
       
   291                     }
       
   292                 else
       
   293                     {
       
   294                     DoSetCurrentRange();
       
   295                     }
       
   296                 }
       
   297             }
       
   298 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
   299     iLogOff = 0;
       
   300 #endif
       
   301             break;
       
   302         case ECmdPenInputJapaneseSetting:  // Japanese setting information
       
   303             // this command comes before ECmdPenInputPermittedRange, ECmdPenInputRange
       
   304             if (iDataMgr)
       
   305                 {
       
   306                 iDataMgr->Reset();
       
   307                 TUint val = *data;
       
   308                 TInt sctDimmFlag = (val & EPenInputJapaneseSettingLunchSCT)? 0: 1;
       
   309                 TPtr ptr((TUint16*)&sctDimmFlag, sizeof(TInt)/sizeof(TUint16));
       
   310                 SendEventToWindow(EEventSetDimmedSctBtn, NULL, ptr);
       
   311                 static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetFullHalf(
       
   312                                 (val & EPenInputJapaneseSettingCharacterWidth)? 1: 0);
       
   313                 static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetPredictive(
       
   314                                 (val & EPenInputJapaneseSettingPredictive)? ETrue: EFalse);
       
   315                 static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetConversion(
       
   316                                 (val & EPenInputJapaneseSettingConversion)? ETrue: EFalse);
       
   317                 static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetClear(
       
   318                                 (val & EPenInputJapaneseSettingDeletingDirection)? 1: 0);
       
   319                 }
       
   320             break;
       
   321         case ECmdPenInputEnableSettingBtn:
       
   322             iHwrWindow->SetEnableSettingBtnJp(*data);
       
   323             break;
       
   324         case ECmdPenInputSendEditorTextAndCurPos:
       
   325             CFepUiLayout::HandleCommand( aCmd, aData );
       
   326             break;
       
   327         default:
       
   328             CPeninputCommonLayout::HandleCommand( aCmd, aData );
       
   329             break;
       
   330         }
       
   331     return KErrNone;
       
   332     }
       
   333 
       
   334 // ---------------------------------------------------------------------------
       
   335 // CPeninputHwrBoxLayout::HandleControlEvent
       
   336 // (other items were commented in a header).
       
   337 // ---------------------------------------------------------------------------
       
   338 //
       
   339 void CPeninputHwrBoxLayout::HandleControlEvent(TInt aEventType, CFepUiBaseCtrl* aCtrl, const TDesC& aEventData)
       
   340     {
       
   341     // Handle event from control
       
   342     TInt* data = (TInt*)aEventData.Ptr();
       
   343     TBool handled = EFalse;
       
   344 
       
   345     if (EEventDraggingEnd == aEventType)
       
   346         {
       
   347         CPeninputCommonLayout::HandleControlEvent(aEventType, aCtrl, aEventData);
       
   348         }
       
   349 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
   350     if (EPeninputLayoutEventBack == aEventType)
       
   351         {
       
   352         WriteHwrStrokeLogClear();
       
   353         }
       
   354     if (EPeninputLayoutHwrEventCandidateSelected == aEventType && iLogger.LogValid())
       
   355         {
       
   356         if (aEventData.Length() > 1)
       
   357             {
       
   358                     //get the candidate index
       
   359             const TInt cellNo = aEventData[aEventData.Length()-1] + 1;
       
   360             iLogger.WriteFormat(KHwrStrokeLogSelected(), cellNo);
       
   361             }
       
   362         }
       
   363 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
   364 
       
   365     if (iUiStatePenMgr != NULL)
       
   366         {
       
   367         handled = HandleControlEventPen(aEventType, aCtrl, aEventData);
       
   368         }
       
   369     if (handled)
       
   370         {
       
   371         return;
       
   372         }
       
   373 
       
   374     //deal with the event from all controls in layout
       
   375     switch (aEventType)
       
   376         {
       
   377         case EPeninputLayoutEventClose:
       
   378         case EPeninputLayoutEventOption:
       
   379         case EPeninputLayoutEventToVkb:
       
   380             HiraganaKanjiCompleteAll();  // call ToPenStandBy()
       
   381             SetCapturePointerEvent(EFalse);
       
   382             if (EPeninputLayoutEventClose == aEventType)
       
   383                 {
       
   384                 Initialize();  //jump to init state
       
   385                 }
       
   386             if (EPeninputLayoutEventToVkb == aEventType)
       
   387                 {
       
   388                 TBuf<KPeninputBufLen8> buf;
       
   389                 TBool switchByMode = ETrue;
       
   390                 TInt mode = EPluginInputModeVkb;
       
   391                 CPeninputDataConverter::CombinationToDesc( switchByMode, 
       
   392                                                                  mode, buf );
       
   393                 SignalOwner( ESignalLayoutUIChanged, buf );
       
   394                 }
       
   395             else
       
   396                 {
       
   397                 CPeninputCommonLayout::HandleControlEvent(aEventType, aCtrl, aEventData);
       
   398                 }
       
   399             break;
       
   400         case EPeninputLayoutEventSct:
       
   401             HiraganaKanjiCompleteAll();
       
   402             SetCapturePointerEvent(EFalse);
       
   403             SignalOwner(ESignalHwNotifySctPopup);
       
   404             break;
       
   405         case EPeninputLayoutEventSwitchLanguage: // nop
       
   406             break;
       
   407 
       
   408         case EPeninputLayoutEventRange:  // from character range popup or when accept ECmdPenInputRange command
       
   409             {
       
   410             TInt permittedRange = CPeninputDataConverter::AnyToInt(RequestData(EPeninputDataTypePermittedRange));
       
   411             TInt currentRange = CPeninputDataConverter::AnyToInt( RequestData( EPeninputDataTypeCurrentRange ) );
       
   412             TInt range = currentRange;
       
   413             TInt deActive = 0;   // 0:none 1:ICF 2:display off
       
   414             static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetCurrentCharacterRangeIndex(*data);
       
   415             switch(static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->CharacterRangeId())
       
   416                 {
       
   417                 case EPeninutCharacterRangeIdAll:
       
   418                     if (permittedRange & (ERangeHiraganaKanji | ERangeKatakana | ERangeFullWidthKatakana))
       
   419                         {
       
   420                         if (!(range & (ERangeHiraganaKanji | ERangeKatakana | ERangeFullWidthKatakana)))
       
   421                             {
       
   422                             range = (permittedRange & ERangeHiraganaKanji)? ERangeHiraganaKanji : ERangeKatakana;
       
   423                             }
       
   424                         }
       
   425                     break;
       
   426                 case EPeninutCharacterRangeIdKanaKanji:
       
   427                     permittedRange &= (ERangeHiraganaKanji | ERangeKatakana | ERangeFullWidthKatakana);
       
   428                     if (!(permittedRange & range))
       
   429                         {
       
   430                         range = (permittedRange & ERangeHiraganaKanji)? ERangeHiraganaKanji : ERangeKatakana;
       
   431                         }
       
   432                     break;
       
   433                 case EPeninutCharacterRangeIdLatin:
       
   434                     permittedRange &= (ERangeEnglish | ERangeFullWidthEnglish);
       
   435                     range = ERangeEnglish;
       
   436                     break;
       
   437                 case EPeninutCharacterRangeIdNumber:
       
   438                     permittedRange &= (ERangeNumber | ERangeFullWidthNumeric);
       
   439                     range = ERangeNumber;
       
   440                     break;
       
   441                 default:
       
   442                     break;
       
   443                 }
       
   444             static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetPermittedRanges(permittedRange);
       
   445             range = TranslateRangeHullHalf(range);
       
   446             if (!(range & permittedRange))
       
   447                 {
       
   448                 range = iRangeOrg;
       
   449                 }
       
   450             if (aCtrl)  // from character range popup
       
   451                 {
       
   452                 TBool currHide = iHwrWindow->PredictiveWindow()->Hiden();
       
   453                 TBool newHide = ETrue;
       
   454                 if (static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->Predictive()
       
   455                                   && static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->Conversion()
       
   456                                   &&  ERangeHiraganaKanji == range)
       
   457                     {
       
   458                     newHide = EFalse;
       
   459                     }
       
   460                 if (newHide && !currHide || !newHide && currHide)
       
   461                     {
       
   462                     LayoutOwner()->Hide(ETrue);   // display off
       
   463                     deActive = 2;
       
   464                     iHwrWindow->PredictiveWindow()->Hide(newHide);
       
   465                     iHwrWindow->SizeChanged(ETrue);
       
   466                     }
       
   467                 else
       
   468                     {
       
   469                     iHwrWindow->ICFDisableRegionUpdating();  // ICF::OnDeActivate()
       
   470                     deActive = 1;
       
   471                     }
       
   472                 iHwrWindow->CharacterRangeWindow()->HidePopup();
       
   473                 }
       
   474             if (aCtrl && range != currentRange)  // from character range popup
       
   475                 {
       
   476                 // SetData(SetPremaryRange) and Sendkey( ESignalRange,...)
       
   477                 TPtrC rangeptr((TUint16*)(&range), sizeof(TInt)/sizeof(TUint16));
       
   478                 CPeninputCommonLayout::HandleControlEvent(aEventType, aCtrl, rangeptr);
       
   479                 if (ERangeEnglish != range && ERangeNumber != range)
       
   480                     {
       
   481                     TInt native = ERangeNative;
       
   482                     TBuf<KPeninputBufLen> buf;
       
   483                     CPeninputDataConverter::CombinationToDesc( native, range, buf );
       
   484                     Sendkey( ESignalRange, buf );
       
   485                     }
       
   486                 }
       
   487             else
       
   488                 {
       
   489                 SetData(EPeninputDataTypeCurrentRange, &range);
       
   490                 }
       
   491             DoSetCurrentRange();
       
   492             if (deActive == 2)
       
   493                 {
       
   494                 LayoutOwner()->Hide(EFalse);   // display on
       
   495                 }
       
   496             else if (deActive == 1)
       
   497                 {
       
   498                 iHwrWindow->ICFEnableRegionUpdating();  // ICF Cursor On
       
   499                 }
       
   500             }
       
   501             break;
       
   502 
       
   503         // from HiraganaKanji
       
   504         case EEventHiraganaKanjiWithTransitoryChars2Standbyjp:
       
   505             if (UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
       
   506                 {
       
   507                 UiStateMgr()->SetCurrentUiState(EPeninputHwrUiStateStandbyjp);
       
   508                 SetCapturePointerEvent(EFalse);
       
   509                 ToPenStandBy();
       
   510                 }
       
   511             break;
       
   512         // from HiraganaKanji
       
   513         case EEventHiraganaKanjiWithoutTransitoryChars:
       
   514             if (UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
       
   515                 {
       
   516                 SetCapturePointerEvent(EFalse);
       
   517                 }
       
   518             break;
       
   519 
       
   520         case EEventVirtualKeyUp:
       
   521             if ( UiStateMgr()->CurrentUiState()
       
   522             && !static_cast<CPeninputHwrBoxUiState*>(UiStateMgr()->CurrentUiState())->HandleControlEvent(aEventType,aEventData) )
       
   523                 {
       
   524                 SetCapturePointerEvent(ETrue);
       
   525                 HiraganaHandleControlEventJp(aEventType, aEventData);
       
   526                 }
       
   527             break;
       
   528         case EPeninputLayoutEventBack:
       
   529             {
       
   530             TInt clear = EKeyBackspace;
       
   531             TPtrC clearptr((TUint16*)(&clear), 1);
       
   532             if ( UiStateMgr()->CurrentUiState()
       
   533             && !static_cast<CPeninputHwrBoxUiState*>(UiStateMgr()->CurrentUiState())->HandleControlEvent(aEventType,clearptr) )
       
   534                 {
       
   535                 HiraganaHandleControlEventJp(aEventType, clearptr);
       
   536                 }
       
   537             }
       
   538             break;
       
   539         case EPeninputLayoutEventEnter:
       
   540         case EPeninputLayoutEventSelectItem:  // select from prediction/convert candidates by pointer
       
   541         case EPeninputLayoutEventTab:
       
   542             if (EPeninputLayoutEventEnter == aEventType && IsPredictiveWithNoChar())
       
   543                 {    // without transitory chars and next word prediction candidates are offered
       
   544                      // Enter button should clear Prediction and enter a newline
       
   545                 TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(EPeninputLayoutEventBack,KNullDesC));
       
   546                 }
       
   547             if ( UiStateMgr()->CurrentUiState()
       
   548             && !static_cast<CPeninputHwrBoxUiState*>(UiStateMgr()->CurrentUiState())->HandleControlEvent(aEventType,aEventData) )
       
   549                 {
       
   550                 TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(aEventType,aEventData));
       
   551                 }
       
   552             break;
       
   553         case EPeninputLayoutEventSpace:   // convert
       
   554             if ( UiStateMgr()->CurrentUiState()
       
   555             && !static_cast<CPeninputHwrBoxUiState*>(UiStateMgr()->CurrentUiState())->HandleControlEvent(aEventType, aEventData) )
       
   556                 {
       
   557                 HiraganaHandleControlEventJp(aEventType, aEventData);
       
   558                 }
       
   559             break;
       
   560         case EEventIcfPointerUp:  // from ContextField
       
   561         case EEventIcfCompleteAll:  // from ContextField
       
   562             TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(aEventType,aEventData));
       
   563             break;
       
   564         case EEventShowCandidateWnd:   // CandidateWnd On
       
   565             {
       
   566             iHwrWindow->SetDimmed(ETrue);
       
   567             }
       
   568             break;
       
   569         case EEventHideCandidateWnd:   // CandidateWnd Off
       
   570             {
       
   571             iHwrWindow->SetDimmed(EFalse);
       
   572             }
       
   573             break;
       
   574         case EEventWaitforEditorTextComing:   // may use, someday.
       
   575             {
       
   576             iWaitforEditorTextComing = 1;
       
   577             }
       
   578             break;
       
   579         case EEventDraggingEnd:
       
   580             break;
       
   581         case EPeninputLayoutEventSwitchCharacterRange:
       
   582             if (static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->CharacterRangeArray()->Count() > 1)
       
   583                 {
       
   584                 HiraganaKanjiCompleteAll();
       
   585                 SendEventToWindow(aEventType, aCtrl, aEventData);
       
   586                 }
       
   587             break;
       
   588         case EEventICFSelectionChanged:  // from ContextField (when whithout transitory input)
       
   589             if (iHiraganaKanji)
       
   590                 {  // update saved data
       
   591                 TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(aEventType,aEventData));
       
   592                 }
       
   593             break;
       
   594         case EEventSetAppCursorSelection:  // from ContextField
       
   595             if (UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
       
   596                 {
       
   597                 TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(aEventType,aEventData));
       
   598                 }
       
   599             break;
       
   600         case EPeninputLayoutHwrEventDropDownListExpanded:
       
   601 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
   602     if (iLogger.LogValid())
       
   603         {
       
   604         iLogger.Write(KHwrStrokeLogExpand());
       
   605         }
       
   606 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
   607             CPeninputCommonLayout::HandleControlEvent(aEventType, aCtrl, aEventData);
       
   608             iExpanded = ETrue;
       
   609             break;
       
   610         default:
       
   611             CPeninputCommonLayout::HandleControlEvent(aEventType, aCtrl, aEventData);
       
   612             break;
       
   613         }
       
   614     }
       
   615 
       
   616 // ---------------------------------------------------------------------------
       
   617 // CPeninputHwrBoxLayout::HandleControlEventPen
       
   618 // (other items were commented in a header).
       
   619 // ---------------------------------------------------------------------------
       
   620 //
       
   621 TBool CPeninputHwrBoxLayout::HandleControlEventPen(TInt aEventType, CFepUiBaseCtrl* /*aCtrl*/, const TDesC& aEventData)
       
   622     {
       
   623     TBool handled = EFalse;
       
   624     CPeninputHwrBoxUiState* current = static_cast<CPeninputHwrBoxUiState*>(iUiStatePenMgr->CurrentUiState());
       
   625     TBuf<KMaxCandidateLen> charCode;
       
   626     //filter un-related events
       
   627     if (aEventType != EEventSetAppCursorSelection
       
   628         && aEventType != EPeninputLayoutEventClose
       
   629         && aEventType != EPeninputLayoutEventBack
       
   630         && aEventType != EPeninputLayoutEventEnter
       
   631         && (aEventType != EPeninputLayoutEventSpace || !iCapturePointerEvent)
       
   632         && aEventType != EPeninputLayoutEventRange
       
   633         && aEventType != EPeninputLayoutEventOption
       
   634         && aEventType != EPeninputLayoutEventSct
       
   635         && aEventType != EPeninputLayoutEventSwitchCharacterRange
       
   636         && aEventType != EEventDraggingEnd
       
   637         && (aEventType >= EPeninputLayoutHwrEventLast || aEventType < EPeninputLayoutHwrEventBeginWriting))
       
   638         {
       
   639         return handled;
       
   640         }
       
   641     TRAPD(err, current->HandleControlEventPenL(aEventType, aEventData, *this, charCode, handled));
       
   642     if (KErrNone != err)
       
   643         {   // close peninput
       
   644         HiraganaKanjiCompleteAll();  // call ToPenStandBy()
       
   645         SetCapturePointerEvent(EFalse);
       
   646         Initialize();  //jump to init state
       
   647         CPeninputCommonLayout::HandleControlEvent(EPeninputLayoutEventClose, NULL, KNullDesC);
       
   648         handled = ETrue;
       
   649         }
       
   650     return handled;
       
   651     }
       
   652 
       
   653 // ---------------------------------------------------------------------------
       
   654 // CPeninputHwrBoxLayout::OnAppEditorTextComing
       
   655 // (other items were commented in a header).
       
   656 // ---------------------------------------------------------------------------
       
   657 //
       
   658 TInt CPeninputHwrBoxLayout::OnAppEditorTextComing(const TFepInputContextFieldData& aData)
       
   659     {
       
   660     iWaitforEditorTextComing = 0;
       
   661     // Handle edit text coming
       
   662     if (iHiraganaKanji)
       
   663         {
       
   664         TRAPD(err, iHiraganaKanji->SetEditorTextL(aData));
       
   665         if (KErrNone != err)
       
   666             {
       
   667             HandleControlEvent(EPeninputLayoutEventClose, NULL, KNullDesC);
       
   668             }
       
   669         return err;
       
   670         }
       
   671     return KErrNone;
       
   672     }
       
   673 
       
   674 // ---------------------------------------------------------
       
   675 // Submit the char code.
       
   676 // ---------------------------------------------------------
       
   677 //
       
   678 void CPeninputHwrBoxLayout::SubmitL(const TDesC& aCharCode)
       
   679     {
       
   680     TInt len = 0;
       
   681     if (iSubmitText && !(*iSubmitText).CompareC(aCharCode)
       
   682         || !UiStateMgr()
       
   683         || !UiStateMgr()->CurrentUiState())
       
   684         {
       
   685         return;
       
   686         }
       
   687     if (iSubmitText)
       
   688         {
       
   689         len = iSubmitText->Length();
       
   690         if (len > 1 
       
   691             && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
       
   692             {
       
   693             len = 1;
       
   694             }
       
   695         }
       
   696     delete iSubmitText;
       
   697     iSubmitText = NULL;
       
   698     iSubmitText = aCharCode.AllocL();
       
   699 
       
   700     TInt eventType = EEventVirtualKeyUp;
       
   701     TPtr charcode(iSubmitText->Des());
       
   702 
       
   703     //if charcode is enter or back or space, translate them back
       
   704     TPtrC16 ptr;
       
   705     ptr.Set(&KBackRep, sizeof(KBackRep)/sizeof(TUint16));
       
   706 
       
   707     if (charcode.CompareC(ptr) == 0)
       
   708         {
       
   709         charcode.Zero();
       
   710         charcode.Append((TChar)EKeyBackspace);
       
   711         eventType = EPeninputLayoutEventBack;
       
   712         }
       
   713     else
       
   714         {
       
   715         ptr.Set(&KSpaceRep, sizeof(KSpaceRep)/sizeof(TUint16));
       
   716         if (charcode.CompareC(ptr) == 0)
       
   717             {
       
   718             charcode.Zero();
       
   719             charcode.Append((TChar)EKeySpace);
       
   720             eventType = EPeninputLayoutEventSpace;
       
   721             }
       
   722         else
       
   723             {
       
   724             ptr.Set(&KEnterRep, sizeof(KEnterRep)/sizeof(TUint16));
       
   725             if (charcode.CompareC(ptr) == 0)
       
   726                 {
       
   727                 charcode.Zero();
       
   728                 charcode.Append((TChar)EKeyEnter);
       
   729                 eventType = EPeninputLayoutEventEnter;
       
   730                 }
       
   731             }
       
   732         }
       
   733     if (len > 0 && 
       
   734         (EEventVirtualKeyUp != eventType
       
   735                   || UiStateMgr()->CurrentUiState() != UiStateMgr()->GetUiState(EPeninputHwrUiStateStandby)))
       
   736         {
       
   737         for (TInt i = 0; i < len; i++)
       
   738             {
       
   739             DeleteL(EKeyDelete);
       
   740             }
       
   741         }
       
   742 
       
   743     if (len > 0 && 
       
   744         (EEventVirtualKeyUp == eventType
       
   745                   && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateStandby)))
       
   746         {
       
   747         // len == 1 or 2, charcode.Length() == 1 or 2.
       
   748         TInt diff = charcode.Length() - len;
       
   749         if (diff > 0)
       
   750             {
       
   751             HBufC* p = HBufC::NewL(charcode.Length() + 2);
       
   752             p->Des().Append((TUint16*)&len, 2);
       
   753             p->Des().Append(charcode.Left(len));
       
   754             Sendkey( ESignalReplaceTextJp, *p );
       
   755             delete p;
       
   756             Sendkey( ESignalKeyEvent, charcode.Right(diff));
       
   757             }
       
   758         else
       
   759             {
       
   760             while (len > charcode.Length())
       
   761                 {
       
   762                 DeleteL(EKeyDelete);
       
   763                 --len;
       
   764                 }
       
   765             HBufC* p = HBufC::NewL(charcode.Length() + 2);
       
   766             p->Des().Append((TUint16*)&len, 2);
       
   767             p->Des().Append(charcode);
       
   768             Sendkey( ESignalReplaceTextJp, *p );
       
   769             delete p;
       
   770             }
       
   771         }
       
   772     else if ( !static_cast<CPeninputHwrBoxUiState*>(UiStateMgr()->CurrentUiState())->HandleControlEvent(eventType,charcode) )
       
   773         {
       
   774         SetCapturePointerEvent(ETrue);
       
   775         iHiraganaKanji->HandleControlEventJpL(eventType, charcode);
       
   776         }
       
   777     if (EEventVirtualKeyUp != eventType)
       
   778         {
       
   779         delete iSubmitText;
       
   780         iSubmitText = NULL;
       
   781         }
       
   782     }
       
   783 
       
   784 // ---------------------------------------------------------
       
   785 // Delete the previous charcode
       
   786 // ---------------------------------------------------------
       
   787 //
       
   788 void CPeninputHwrBoxLayout::DeleteL(TInt aChar/*  = EKeyBackspace*/)
       
   789     {
       
   790         //delete the last char
       
   791     const TInt len = sizeof(aChar);
       
   792     TBuf<len> aBufBck;
       
   793     aBufBck.Append((TChar)aChar);
       
   794 
       
   795     if (UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
       
   796         {
       
   797         static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->PtiEngine()->HandleCommandL(EPtiCommandBackSpaceByForce);
       
   798         }
       
   799     else
       
   800         {
       
   801         SignalOwner(ESignalKeyEvent, aBufBck);
       
   802         }
       
   803     }
       
   804 
       
   805 // ---------------------------------------------------------------------------
       
   806 // CPeninputHwrBoxLayout::HandleRawKeyEventL
       
   807 // (other items were commented in a header).
       
   808 // ---------------------------------------------------------------------------
       
   809 //
       
   810 TBool CPeninputHwrBoxLayout::HandleRawKeyEventL(const TRawEvent& aKeyEvent)
       
   811     {
       
   812     TBool rs = EFalse;
       
   813     if (iHiraganaKanji)
       
   814         {
       
   815         iHiraganaKanji->CancelRepeat();
       
   816         }
       
   817     if (iUiStatePenMgr)
       
   818         {
       
   819         CPeninputUiStateBase* current = iUiStatePenMgr->CurrentUiState();
       
   820         if (iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenBeginWriting) == current)
       
   821             {  // temporary
       
   822             return ETrue;
       
   823             }
       
   824         if (iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenEndWriting) == current
       
   825             || iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenCandidateSelecting) == current)
       
   826             {
       
   827             TInt key = (aKeyEvent.ScanCode() & 0x000000FF);
       
   828             switch(key)
       
   829                 {  // Handle clear key
       
   830                 case EKeyBackspace:
       
   831                 case EStdKeyBackspace:      /* 0x01 */
       
   832                 case EStdKeyEscape:         /* 0x04 */
       
   833                     {
       
   834                     // if TRawEvent::EKeyDown, return at once.
       
   835                     if (TRawEvent::EKeyDown == aKeyEvent.Type())
       
   836                         {
       
   837                         iKeyEventClearAsync->CallBack();
       
   838                         }
       
   839                     return ETrue;
       
   840                     }
       
   841                 default:
       
   842                     ToPenStandBy();
       
   843                     break;
       
   844                 }
       
   845             }
       
   846         }
       
   847     if (UiStateMgr() && UiStateMgr()->CurrentUiState())
       
   848         {
       
   849         rs = UiStateMgr()->CurrentUiState()->HandleKeyEventL(aKeyEvent);
       
   850         if (rs && iHiraganaKanji)
       
   851             {
       
   852             if (EStdKeyEnter == (aKeyEvent.ScanCode() & 0x000000FF) && IsPredictiveWithNoChar())
       
   853                 {    // without transitory chars and next word prediction candidates are offered
       
   854                      // Enter button should clear Prediction and enter a newline
       
   855                 TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(EPeninputLayoutEventBack,KNullDesC));
       
   856                 return UiStateMgr()->GetUiState(EPeninputHwrUiStateStandby)->HandleKeyEventL(aKeyEvent);
       
   857                 }
       
   858             rs = iHiraganaKanji->HandleKeyEvent(aKeyEvent);
       
   859             }
       
   860         }
       
   861     if (!iWaitforEditorTextComing && TRawEvent::EKeyDown == aKeyEvent.Type() && TRawEvent::ENone == iKeyEvent.Type())
       
   862         {
       
   863         if (!rs)
       
   864             {
       
   865             SendEventToWindow(EPeninputLayoutEventCloseCharacterRange, NULL, KNullDesC);
       
   866             HiraganaKanjiCompleteAll();
       
   867             if (iWaitforEditorTextComing)  // complete done.
       
   868                 {
       
   869                 rs = ETrue;
       
   870                 iKeyEvent = aKeyEvent;
       
   871                 iKeyEventAsync->CallBack();       // for key that hiraganakanji do not handle
       
   872                 }
       
   873             }
       
   874         else if (iHiraganaKanji)
       
   875             {
       
   876             iKeyEventAsync->CallBack();   // for pending event
       
   877             }
       
   878         }
       
   879     return rs;
       
   880     }
       
   881 
       
   882 // ---------------------------------------------------------------------------
       
   883 // CPeninputHwrBoxLayout::OnPointerEventOutsideLayout
       
   884 // Call back when the pointer down/up event happends outside of the layout
       
   885 // (other items were commented in a header).
       
   886 // ---------------------------------------------------------------------------
       
   887 //
       
   888 TBool CPeninputHwrBoxLayout::OnPointerEventOutsideLayout(const TRawEvent& aEvent)
       
   889     {
       
   890     if (TRawEvent::EButton1Down == aEvent.Type()) // this if is not necessary. only EButton1Down.
       
   891         {
       
   892         HandleControlEventPen(EPeninputLayoutHwrEventPointerOutsideWnd, NULL, KNullDesC);
       
   893         SendEventToWindow(EPeninputLayoutEventCloseCharacterRange, NULL, KNullDesC);
       
   894         HiraganaKanjiCompleteAll();
       
   895         if (iCapturePointerEvent)
       
   896             {
       
   897             iPointerEventDown = aEvent;
       
   898             SetCapturePointerEvent(EFalse);
       
   899             iPointerEventAsync->CallBack();
       
   900             }
       
   901         }
       
   902     return EFalse;
       
   903     }
       
   904 
       
   905 // ---------------------------------------------------------------------------
       
   906 // CPeninputHwrBoxLayout::DataMgr
       
   907 // (other items were commented in a header)
       
   908 // ---------------------------------------------------------------------------
       
   909 //
       
   910 CPeninputHwrBoxDataMgr* CPeninputHwrBoxLayout::DataMgr(TInt /*aDummy*/)
       
   911     {
       
   912     return static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr);
       
   913     }
       
   914 
       
   915 // ---------------------------------------------------------------------------
       
   916 // CPeninputHwrBoxLayout::HwrBoxWindow
       
   917 // (other items were commented in a header)
       
   918 // ---------------------------------------------------------------------------
       
   919 //
       
   920 CPeninputHwrBoxWindow* CPeninputHwrBoxLayout::HwrBoxWindow()
       
   921     {
       
   922     return iHwrWindow;
       
   923     }
       
   924 
       
   925 void CPeninputHwrBoxLayout::ToPenStandBy(TBool aNotStandBy/* = EFalse*/)
       
   926     {
       
   927     if (iUiStatePenMgr)
       
   928         {
       
   929         CPeninputUiStateBase* current = iUiStatePenMgr->CurrentUiState();
       
   930         if (iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenEndWriting) == current
       
   931             || iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenCandidateSelecting) == current)
       
   932             {
       
   933             static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->ClearCandidates();
       
   934 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
   935             if (iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenEndWriting) == current && !aNotStandBy)
       
   936                 {
       
   937                 WriteHwrStrokeLogNew();
       
   938                 }
       
   939 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
   940             }
       
   941         if (!aNotStandBy)
       
   942             {
       
   943             iUiStatePenMgr->SetCurrentUiState(EPeninputHwrUiStatePenStandBy);
       
   944             iHwrWindow->CancelWriting();   // Standby::OnEntry()
       
   945             iHwrWindow->DimInputContextField(EFalse);
       
   946             }
       
   947         delete iSubmitText;
       
   948         iSubmitText = NULL;
       
   949         iExpanded = EFalse;
       
   950         }
       
   951     }
       
   952 
       
   953 void CPeninputHwrBoxLayout::Initialize()
       
   954     {
       
   955     if (iUiStatePenMgr)
       
   956         {
       
   957 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
   958         CPeninputUiStateBase* current = iUiStatePenMgr->CurrentUiState();
       
   959         if (iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenEndWriting) == current
       
   960             || iUiStatePenMgr->GetUiState(EPeninputHwrUiStatePenBeginWriting) == current)
       
   961             {
       
   962             WriteHwrStrokeLogNew();
       
   963             }
       
   964 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
   965         iUiStatePenMgr->SetCurrentUiState(EPeninputHwrUiStateNone);
       
   966         }
       
   967     if (iHwrWindow)
       
   968         {
       
   969         iHwrWindow->CancelWriting();
       
   970         iHwrWindow->Hide(ETrue);
       
   971         iExpanded = EFalse;
       
   972         }
       
   973     }
       
   974 
       
   975 void CPeninputHwrBoxLayout::CompleteIfConvertingL()
       
   976     {
       
   977     if (iCapturePointerEvent    // Transitory Input Exists
       
   978         && UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
       
   979         {
       
   980         iWaitforEditorTextComing = 0;
       
   981         if (iHiraganaKanji)
       
   982             {
       
   983             iHiraganaKanji->HandleControlEventJpL(EEventCompleteIfConvertingHiraganaKanji, KNullDesC);
       
   984             }
       
   985         if (iWaitforEditorTextComing)   // the status of hiraganakanji was converting  ---> complete,but should not capture off
       
   986             {
       
   987             UiStateMgr()->SetCurrentUiState(EPeninputHwrUiStateStandbyjp);
       
   988             iCapturePointerEvent = EFalse;
       
   989             }
       
   990         }
       
   991     }
       
   992 
       
   993 // ---------------------------------------------------------------------------
       
   994 // CPeninputHwrBoxLayout::ClearInputToPenStandByL()
       
   995 // clear last input char and goto PenStandBy
       
   996 // (other items were commented in a header)
       
   997 // ---------------------------------------------------------------------------
       
   998 //
       
   999 void CPeninputHwrBoxLayout::ClearInputToPenStandByL()
       
  1000     {
       
  1001     if (iSubmitText)
       
  1002         {
       
  1003         TInt len = iSubmitText->Length();
       
  1004         if (len > 1 &&
       
  1005             UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
       
  1006             {
       
  1007             len = 1;
       
  1008             }
       
  1009         for (TInt i = 0; i < len; i++)
       
  1010             {
       
  1011             DeleteL(EKeyDelete);
       
  1012             }
       
  1013         }
       
  1014     ToPenStandBy();
       
  1015     if (UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
       
  1016         {
       
  1017         iHiraganaKanji->HandleControlEventJpL(EEventVirtualKeyUp,KNullDesC);
       
  1018         }
       
  1019     }
       
  1020 
       
  1021 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
  1022 // ---------------------------------------------------------------------------
       
  1023 // CPeninputHwrBoxLayout::WriteHwrStrokeLogNew
       
  1024 // write log "New"
       
  1025 // (other items were commented in a header)
       
  1026 // ---------------------------------------------------------------------------
       
  1027 //
       
  1028 void CPeninputHwrBoxLayout::WriteHwrStrokeLogNew()
       
  1029     {
       
  1030     if (iLogger.LogValid())
       
  1031         {
       
  1032         iLogger.Write(KHwrStrokeLogNew());
       
  1033         }
       
  1034     }
       
  1035 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
  1036 
       
  1037 // ---------------------------------------------------------------------------
       
  1038 // CPeninputHwrBoxLayout::CPeninputHwrBoxLayout
       
  1039 // (other items were commented in a header).
       
  1040 // ---------------------------------------------------------------------------
       
  1041 //
       
  1042 CPeninputHwrBoxLayout::CPeninputHwrBoxLayout(MLayoutOwner* aLayoutOwner)
       
  1043     : CPeninputCommonLayout( aLayoutOwner ),
       
  1044     iCapturePointerEvent(EFalse),
       
  1045     iExpanded(EFalse)
       
  1046     {
       
  1047     }
       
  1048 
       
  1049 // ---------------------------------------------------------------------------
       
  1050 // CPeninputHwrBoxLayout::ConstructL
       
  1051 // (other items were commented in a header).
       
  1052 // ---------------------------------------------------------------------------
       
  1053 //
       
  1054 void CPeninputHwrBoxLayout::ConstructL(const TAny* aInitData)
       
  1055     {
       
  1056     CPeninputCommonLayout::ConstructL( aInitData );
       
  1057 
       
  1058 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
  1059     User::LeaveIfError( iLogger.Connect() );
       
  1060     // Make directory
       
  1061     RFs fs;
       
  1062     if (fs.Connect() == KErrNone)
       
  1063         {
       
  1064         TInt ret = fs.MkDirAll(KHwrStrokeLogBaseDir());
       
  1065         fs.Close();
       
  1066         }
       
  1067 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
  1068 
       
  1069     iUiStatePenMgr = CPeninputUiStateMgr::NewL( this );
       
  1070 
       
  1071     CPeninputUiStateBase* initialState =
       
  1072         CPeninputUiStateBase::NewL( UiStateMgr(), this );
       
  1073     UiStateMgr()->AddUiState( initialState, EPeninputHwrUiStateNone );
       
  1074 
       
  1075     CPeninputHwrBoxUiStateStandby* standbyState =
       
  1076         CPeninputHwrBoxUiStateStandby::NewL( UiStateMgr(), this );
       
  1077     UiStateMgr()->AddUiState( standbyState, EPeninputHwrUiStateStandby );
       
  1078 
       
  1079     CPeninputHwrBoxUiStateStandbyjp* standbyjpState =
       
  1080         CPeninputHwrBoxUiStateStandbyjp::NewL( UiStateMgr(), this );
       
  1081     UiStateMgr()->AddUiState( standbyjpState, EPeninputHwrUiStateStandbyjp );
       
  1082 
       
  1083     CPeninputHwrBoxUiStateWithTransitoryChars* transitoryState =
       
  1084         CPeninputHwrBoxUiStateWithTransitoryChars::NewL( UiStateMgr(), this );
       
  1085     UiStateMgr()->AddUiState( transitoryState, EPeninputHwrUiStateWithTransitoryChars );
       
  1086 
       
  1087     UiStateMgr()->SetCurrentUiState( initialState );
       
  1088 
       
  1089     CPeninputUiStateBase* penInitialState =
       
  1090         CPeninputHwrBoxUiState::NewL( iUiStatePenMgr, this );
       
  1091 
       
  1092     iUiStatePenMgr->AddUiState( penInitialState, EPeninputHwrUiStateNone );
       
  1093     CPeninputHwrBoxUiStatePenStandby* penStandbyState =
       
  1094         CPeninputHwrBoxUiStatePenStandby::NewL( iUiStatePenMgr, this );
       
  1095     iUiStatePenMgr->AddUiState( penStandbyState, EPeninputHwrUiStatePenStandBy );
       
  1096 
       
  1097     CPeninputHwrBoxUiStatePenBeginWriting* penBeginState =
       
  1098         CPeninputHwrBoxUiStatePenBeginWriting::NewL( iUiStatePenMgr, this );
       
  1099     iUiStatePenMgr->AddUiState( penBeginState, EPeninputHwrUiStatePenBeginWriting );
       
  1100 
       
  1101     CPeninputHwrBoxUiStatePenEndWriting* penEndState =
       
  1102         CPeninputHwrBoxUiStatePenEndWriting::NewL( iUiStatePenMgr, this );
       
  1103     iUiStatePenMgr->AddUiState( penEndState, EPeninputHwrUiStatePenEndWriting );
       
  1104 
       
  1105     CPeninputHwrBoxUiStatePenCandidateSelecting* penCandidateSelectingState =
       
  1106         CPeninputHwrBoxUiStatePenCandidateSelecting::NewL( iUiStatePenMgr, this );
       
  1107     iUiStatePenMgr->AddUiState( penCandidateSelectingState, EPeninputHwrUiStatePenCandidateSelecting );
       
  1108 
       
  1109     iUiStatePenMgr->SetCurrentUiState( penInitialState );
       
  1110 
       
  1111     iHwrWindow = static_cast<CPeninputHwrBoxWindow*>(iLayoutWindow);
       
  1112     Initialize();
       
  1113     {
       
  1114     TInt penSpeed = static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->WritingSpeed();
       
  1115     TPtr ptr((TUint16*)&penSpeed,sizeof(TInt)/sizeof(TUint16));
       
  1116     SendEventToWindow(EPeninputLayoutHwrEventWritingSpeedChange, NULL, ptr);
       
  1117     }
       
  1118     {
       
  1119     TSize penSize = static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->PenSize();
       
  1120     TPtr ptr((TUint16*)&penSize,sizeof(TSize)/sizeof(TUint16));
       
  1121     SendEventToWindow(EPeninputLayoutHwrEventPenSizeChange, NULL, ptr);
       
  1122     }
       
  1123     {
       
  1124     TRgb penColor = static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->PenColor();
       
  1125     TPtr ptr((TUint16*)&penColor,sizeof(TRgb)/sizeof(TUint16));
       
  1126     SendEventToWindow(EPeninputLayoutHwrEventPenColorChange, NULL, ptr);
       
  1127     }
       
  1128     //create hiraganakanji
       
  1129     iHiraganaKanji = CPeninputHiraganaKanji::NewL(static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->PtiEngine()
       
  1130                                                        , this
       
  1131                                                        , iHwrWindow->InputContextField()
       
  1132                                                        , iHwrWindow->CandidateWindow()
       
  1133                                                        , iHwrWindow->PredictiveWindow());
       
  1134     TCallBack cb(KeyEventCallback, this);
       
  1135     TCallBack cbpointer(PointerEventCallback, this);
       
  1136     iKeyEventAsync = new(ELeave) CAsyncCallBack(cb, CActive::EPriorityHigh);
       
  1137     iPointerEventAsync = new(ELeave) CAsyncCallBack(cbpointer, CActive::EPriorityStandard);
       
  1138     TCallBack cbClear(KeyEventClearCallback, this);
       
  1139     iKeyEventClearAsync = new(ELeave) CAsyncCallBack(cbClear, CActive::EPriorityHigh);
       
  1140 
       
  1141     iKeyEvent.Set(TRawEvent::ENone,0);
       
  1142     iPointerEventDown.Set(TRawEvent::ENone,0);
       
  1143     }
       
  1144 
       
  1145 // ---------------------------------------------------------------------------
       
  1146 // CPeninputHwrBoxLayout::DoSetCurrentRange
       
  1147 // (other items were commented in a header).
       
  1148 // ---------------------------------------------------------------------------
       
  1149 //
       
  1150 void CPeninputHwrBoxLayout::DoSetCurrentRange()
       
  1151     {
       
  1152     TInt currentRange = CPeninputDataConverter::AnyToInt( RequestData( EPeninputDataTypeCurrentRange ) );
       
  1153     static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->SetEngineInputMode(currentRange); // PtiEngine:SetInputMode()
       
  1154 
       
  1155     if ( currentRange == ERangeHiraganaKanji && static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->Conversion())
       
  1156         {
       
  1157         UiStateMgr()->SetCurrentUiState(EPeninputHwrUiStateStandbyjp);
       
  1158         }
       
  1159     else
       
  1160         {
       
  1161         UiStateMgr()->SetCurrentUiState(EPeninputHwrUiStateStandby);
       
  1162         }
       
  1163    SetCapturePointerEvent(EFalse);
       
  1164    ToPenStandBy();
       
  1165 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
  1166    WriteHwrStrokeLogRange();
       
  1167 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
  1168    }
       
  1169 
       
  1170 // ---------------------------------------------------------------------------
       
  1171 // CPeninputHwrBoxLayout::CompleteAllHiraganaKanji
       
  1172 // ---------------------------------------------------------------------------
       
  1173 //
       
  1174 void CPeninputHwrBoxLayout::HiraganaKanjiCompleteAll()
       
  1175     {
       
  1176     ToPenStandBy();
       
  1177     if( UiStateMgr() && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
       
  1178         {
       
  1179         if (iHiraganaKanji)
       
  1180             {  // CompleteALL
       
  1181             TRAP_IGNORE(iHiraganaKanji->HandleControlEventJpL(EEventCompleteAllHiraganaKanji, KNullDesC));
       
  1182             }
       
  1183         }
       
  1184     }
       
  1185 
       
  1186 // ---------------------------------------------------------------------------
       
  1187 // CPeninputHwrBoxLayout::CreateLayoutWindowL
       
  1188 // (other items were commented in a header)
       
  1189 // ---------------------------------------------------------------------------
       
  1190 //
       
  1191 void CPeninputHwrBoxLayout::CreateLayoutWindowL()
       
  1192     {
       
  1193     iLayoutWindow = CPeninputHwrBoxWindow::NewL( this, this );
       
  1194     }
       
  1195 
       
  1196 // ---------------------------------------------------------------------------
       
  1197 // CPeninputHwrBoxLayout::CreateDataMgrL
       
  1198 // (other items were commented in a header)
       
  1199 // ---------------------------------------------------------------------------
       
  1200 //
       
  1201 void CPeninputHwrBoxLayout::CreateDataMgrL( const TAny* /*aInitData*/ )
       
  1202     {
       
  1203     iDataMgr = CPeninputHwrBoxDataMgr::NewL( this );
       
  1204     }
       
  1205 
       
  1206 // ---------------------------------------------------------------------------
       
  1207 // CPeninputHwrBoxLayout::LayoutType
       
  1208 // (other items were commented in a header)
       
  1209 // ---------------------------------------------------------------------------
       
  1210 //
       
  1211 TInt CPeninputHwrBoxLayout::LayoutType()
       
  1212     {
       
  1213     return EPluginInputModeHwr;
       
  1214     }
       
  1215 
       
  1216 // ---------------------------------------------------------------------------
       
  1217 // CPeninputHwrBoxLayout::SemiTransparencyRequired
       
  1218 // (other items were commented in a header)
       
  1219 // ---------------------------------------------------------------------------
       
  1220 //
       
  1221 TBool CPeninputHwrBoxLayout::SemiTransparencyRequired()
       
  1222     {
       
  1223     return ETrue;
       
  1224     }
       
  1225 
       
  1226 // ---------------------------------------------------------------------------
       
  1227 // CPeninputHwrBoxLayout::TranslateRangeHullHalf
       
  1228 // (other items were commented in a header)
       
  1229 // ---------------------------------------------------------------------------
       
  1230 //
       
  1231 TInt CPeninputHwrBoxLayout::TranslateRangeHullHalf(TInt aRange) const
       
  1232     {
       
  1233     TInt newRange = aRange;
       
  1234     if (static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->FullHalf()) // Full
       
  1235         {
       
  1236         switch (aRange)
       
  1237             {
       
  1238             case ERangeEnglish:
       
  1239                 newRange = ERangeFullWidthEnglish;
       
  1240                 break;
       
  1241             case ERangeNumber:
       
  1242                  newRange = ERangeFullWidthNumeric;
       
  1243                  break;
       
  1244             case ERangeKatakana:
       
  1245                 newRange = ERangeFullWidthKatakana;
       
  1246                 break;
       
  1247             default:
       
  1248                 break;
       
  1249             }
       
  1250         }
       
  1251     else   // half
       
  1252         {
       
  1253         switch (aRange)
       
  1254             {
       
  1255             case ERangeFullWidthEnglish:
       
  1256                 newRange = ERangeEnglish;
       
  1257                 break;
       
  1258             case ERangeFullWidthNumeric:
       
  1259                 newRange = ERangeNumber;
       
  1260                 break;
       
  1261             case ERangeFullWidthKatakana:
       
  1262                 newRange = ERangeKatakana;
       
  1263                 break;
       
  1264             default:
       
  1265                 break;
       
  1266             }
       
  1267         }
       
  1268     return newRange;
       
  1269     }
       
  1270 
       
  1271 TInt CPeninputHwrBoxLayout::KeyEventCallback(TAny* aThis)
       
  1272     {
       
  1273     if (aThis)
       
  1274         {
       
  1275         TRAPD(err,static_cast<CPeninputHwrBoxLayout*>(aThis)->DoKeyEventL());
       
  1276         if (KErrNone != err)
       
  1277             {
       
  1278             static_cast<CPeninputHwrBoxLayout*>(aThis)->HandleControlEvent(EPeninputLayoutEventClose, NULL, KNullDesC);
       
  1279             }
       
  1280         return err;
       
  1281         }
       
  1282     return 0;
       
  1283     }
       
  1284 
       
  1285 TInt CPeninputHwrBoxLayout::PointerEventCallback(TAny* aThis)
       
  1286     {
       
  1287     if (aThis)
       
  1288         {
       
  1289         static_cast<CPeninputHwrBoxLayout*>(aThis)->DoPointerEvent();
       
  1290         }
       
  1291     return 0;
       
  1292     }
       
  1293 
       
  1294 void CPeninputHwrBoxLayout::DoKeyEventL()
       
  1295     {
       
  1296     TBool ret = iHiraganaKanji->HandlePendingEventL();
       
  1297     if (!ret && TRawEvent::ENone != iKeyEvent.Type())
       
  1298         {
       
  1299         iKeyEvent.Set(TRawEvent::EKeyUp,iKeyEvent.ScanCode());
       
  1300         CCoeEnv::Static()->WsSession().SimulateRawEvent(iKeyEvent);
       
  1301         iKeyEvent.Set(TRawEvent::EKeyDown,iKeyEvent.ScanCode());
       
  1302         CCoeEnv::Static()->WsSession().SimulateRawEvent(iKeyEvent);
       
  1303         iKeyEvent.Set(TRawEvent::EKeyUp,iKeyEvent.ScanCode());
       
  1304         CCoeEnv::Static()->WsSession().SimulateRawEvent(iKeyEvent);
       
  1305         iKeyEvent.Set(TRawEvent::ENone,0);
       
  1306         }
       
  1307     }
       
  1308 
       
  1309 void CPeninputHwrBoxLayout::DoPointerEvent()
       
  1310     {
       
  1311     if (TRawEvent::ENone != iPointerEventDown.Type())
       
  1312         {
       
  1313         User::After(KDelay);
       
  1314         CCoeEnv::Static()->WsSession().SimulateRawEvent(iPointerEventDown);
       
  1315         iPointerEventDown.Set(TRawEvent::EButton1Up,iPointerEventDown.Pos().iX,iPointerEventDown.Pos().iY);
       
  1316         CCoeEnv::Static()->WsSession().SimulateRawEvent(iPointerEventDown);
       
  1317         iPointerEventDown.Set(TRawEvent::ENone,0);
       
  1318         }
       
  1319     }
       
  1320 
       
  1321 TInt CPeninputHwrBoxLayout::KeyEventClearCallback(TAny* aThis)
       
  1322     {
       
  1323     if (aThis)
       
  1324         {
       
  1325         TRAPD(err,static_cast<CPeninputHwrBoxLayout*>(aThis)->DoKeyClearEventL());
       
  1326         if (KErrNone != err)
       
  1327             {
       
  1328             static_cast<CPeninputHwrBoxLayout*>(aThis)->HandleControlEvent(EPeninputLayoutEventClose, NULL, KNullDesC);
       
  1329             }
       
  1330         return err;
       
  1331         }
       
  1332     return 0;
       
  1333     }
       
  1334 
       
  1335 void CPeninputHwrBoxLayout::DoKeyClearEventL()
       
  1336     {
       
  1337     ClearInputToPenStandByL();
       
  1338 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
  1339     WriteHwrStrokeLogClear();
       
  1340 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
  1341     if (iHiraganaKanji)
       
  1342         {
       
  1343         iHiraganaKanji->RepeatClearKeyStart();
       
  1344         }
       
  1345     }
       
  1346 
       
  1347 void CPeninputHwrBoxLayout::SetCapturePointerEvent(TBool aFlag)
       
  1348     {
       
  1349     if (iCapturePointerEvent && !aFlag || !iCapturePointerEvent && aFlag)
       
  1350         {
       
  1351         TBool dimmFlag = (aFlag)? EFalse : ETrue;
       
  1352         TPtr ptr((TUint16*)&dimmFlag,sizeof(TBool)/sizeof(TUint16));
       
  1353         SendEventToWindow(EPeninputLayoutEventSetConversion, NULL, ptr);
       
  1354         //signal the owner that pointer needs not be captured
       
  1355         TBool capture = aFlag;
       
  1356         TPtrC captureData;
       
  1357         captureData.Set((const TUint16*)&capture,sizeof(TBool)/sizeof(TUint16));
       
  1358         SignalOwner(ESignalCapturePointer,captureData);
       
  1359         iCapturePointerEvent = aFlag;
       
  1360         }
       
  1361     }
       
  1362 
       
  1363 void CPeninputHwrBoxLayout::SetCapturePointerEventAgain()
       
  1364     {
       
  1365     if (iCapturePointerEvent)
       
  1366         {
       
  1367         //signal the owner that pointer needs not be captured
       
  1368         TBool capture = ETrue;
       
  1369         TPtrC captureData;
       
  1370         captureData.Set((const TUint16*)&capture,sizeof(TBool)/sizeof(TUint16));
       
  1371         SignalOwner(ESignalCapturePointer,captureData);
       
  1372         }
       
  1373     }
       
  1374 
       
  1375 void CPeninputHwrBoxLayout::HiraganaHandleControlEventJp(TInt aEventType, const TDesC& aEventData)
       
  1376     {
       
  1377     if (iHiraganaKanji)
       
  1378         {
       
  1379         TRAPD(err, iHiraganaKanji->HandleControlEventJpL(aEventType,aEventData));
       
  1380         if (KErrNone != err)
       
  1381             {   // close peninput
       
  1382             HiraganaKanjiCompleteAll();  // call ToPenStandBy()
       
  1383             SetCapturePointerEvent(EFalse);
       
  1384             Initialize();  //jump to init state
       
  1385             CPeninputCommonLayout::HandleControlEvent(EPeninputLayoutEventClose, NULL, KNullDesC);
       
  1386             }
       
  1387         }
       
  1388     }
       
  1389 
       
  1390 TBool CPeninputHwrBoxLayout::IsPredictiveWithNoChar() const
       
  1391     {
       
  1392     if (!iCapturePointerEvent    // without transitory chars
       
  1393     && UiStateMgr()->CurrentUiState() == UiStateMgr()->GetUiState(EPeninputHwrUiStateWithTransitoryChars))
       
  1394         {
       
  1395         return ETrue;
       
  1396         }
       
  1397     return EFalse;
       
  1398     }
       
  1399 
       
  1400 #ifdef __PENINPUT_HWR_STROKE_LOG_ON
       
  1401 // ---------------------------------------------------------------------------
       
  1402 // CPeninputHwrBoxLayout::WriteHwrStrokeLogClear
       
  1403 // write log "Clear"
       
  1404 // (other items were commented in a header)
       
  1405 // ---------------------------------------------------------------------------
       
  1406 //
       
  1407 void CPeninputHwrBoxLayout::WriteHwrStrokeLogClear()
       
  1408     {
       
  1409     if (iLogger.LogValid())
       
  1410         {
       
  1411         iLogger.Write(KHwrStrokeLogClear());
       
  1412         }
       
  1413     }
       
  1414 
       
  1415 // ---------------------------------------------------------------------------
       
  1416 // CPeninputHwrBoxLayout::WriteHwrStrokeLogRange
       
  1417 // write log characterrange
       
  1418 // (other items were commented in a header)
       
  1419 // ---------------------------------------------------------------------------
       
  1420 //
       
  1421 void CPeninputHwrBoxLayout::WriteHwrStrokeLogRange()
       
  1422     {
       
  1423     if (iLogger.LogValid() && !iLogOff)
       
  1424         {
       
  1425         TBuf<KHwrStrokeLogCharacterRangeLen> characterRange;
       
  1426         switch(static_cast<CPeninputHwrBoxDataMgr*>(iDataMgr)->CharacterRangeId())
       
  1427             {
       
  1428             case EPeninutCharacterRangeIdKanaKanji:
       
  1429                 characterRange.Append(KHwrStrokeLogRangeKanaKanji());
       
  1430                 break;
       
  1431             case EPeninutCharacterRangeIdLatin:
       
  1432                 characterRange.Append(KHwrStrokeLogRangeLatin());
       
  1433                 break;
       
  1434             case EPeninutCharacterRangeIdNumber:
       
  1435                 characterRange.Append(KHwrStrokeLogRangeNumber());
       
  1436                 break;
       
  1437             default:
       
  1438                 characterRange.Append(KHwrStrokeLogRangeAllTypes());
       
  1439                 break;
       
  1440             }
       
  1441         iLogger.WriteFormat(KHwrStrokeLogCharacterRange(), &characterRange);
       
  1442         }
       
  1443     }
       
  1444 #endif // __PENINPUT_HWR_STROKE_LOG_ON
       
  1445 // End Of File