textinput/peninputgenericvkb/src/peninputgenericvkbwindow.cpp
branchRCL_3
changeset 21 ecbabf52600f
equal deleted inserted replaced
20:ebd48d2de13c 21:ecbabf52600f
       
     1 /*
       
     2 * Copyright (c) 2002-2005 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 vkb window class
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // System includes
       
    20 
       
    21 
       
    22 #include <peninputvkbwindow.rsg>
       
    23 #include <peninputvkbwindowconfiginfo_01.rsg>
       
    24 #include <aknfeppeninputenums.h>
       
    25 #include <peninputinputcontextfield.h>
       
    26 #include <peninputpluginutils.h>
       
    27 #include <peninputcommonlayoutext.h>
       
    28 #include <peninputvkbctrllayout.h>
       
    29 #include <peninputvkbctrlext.h>
       
    30 #include <peninputeventbutton.h>
       
    31 #include <peninputdragbutton.h>
       
    32 #include <peninputrepeatbutton.h>
       
    33 #include <peninputmultimodebutton.h>
       
    34 #include <peninputrangebar.h>
       
    35 #include <peninputdataconverter.h>
       
    36 #include <peninputdataprovider.h>
       
    37 #include <peninputclientlayoutinfo.h>
       
    38 #include <peninputlayoutchoicelist.h>
       
    39 #include <peninputlongpressbutton.h>
       
    40 #include <bautils.h>
       
    41 #include <aknlayoutscalable_apps.cdl.h>
       
    42 #include <peninputlayoutbubblectrl.h>
       
    43 #include <peninputscrollablelist.h>
       
    44 
       
    45 #include <e32keys.h>
       
    46 #include <AknIconUtils.h>
       
    47 #include <AknLayoutDef.h>
       
    48 #include <AknUtils.h>
       
    49 #include <aknlayoutscalable_avkon.cdl.h>
       
    50 #include <AknsUtils.h>
       
    51 #include <AknFepGlobalEnums.h>
       
    52 #include <peninputlayoutinputmodechoice.h>
       
    53 #include <peninputlayoutmultilineicf.h>
       
    54 #include <s32mem.h>
       
    55 // User includes
       
    56 #include "peninputgenericvkb.hrh"
       
    57 #include "peninputgenericvkbwindow.h"
       
    58 #include "peninputgenericvkbenum.h"
       
    59 #include "peninputrangebarinfo.h"
       
    60 #include "peninputgenericvkblafdatamgr.h"
       
    61 #include "peninputgenericvkblangmeritpair.h"
       
    62 #include "peninputgenericvkblayout.h"
       
    63 
       
    64 // Constants
       
    65 const TInt KPeninputVkbWndInvalidIndex = -1;
       
    66 const TInt KInvalidImg = -1 ;
       
    67 const TInt KKeyCodeSize = 1;
       
    68 
       
    69 const TInt KTooltipLeftMargin = 10;
       
    70 const TInt KTooltipTopMargin = 0;
       
    71 const TInt KTooltipRightMargin = 10;
       
    72 const TInt KTooltipBottomMargin = 0;
       
    73 
       
    74 _LIT( KVkbWindowResourceFile, 
       
    75       "z:\\resource\\plugins\\peninputvkbwindow.RSC" );
       
    76 _LIT( KConfigurationResourceFile, 
       
    77       "z:\\resource\\plugins\\peninputvkbwindowconfiginfo_" );
       
    78 _LIT( KResourceFileExtName, ".RSC" );
       
    79 
       
    80 _LIT(KEmptyString, "");
       
    81 
       
    82 // ======== MEMBER FUNCTIONS ========
       
    83 
       
    84 // --------------------------------------------------------------------------
       
    85 // CPeninputGenericVkbWindow::CPeninputGenericVkbWindow
       
    86 // (other items were commented in a header)
       
    87 // --------------------------------------------------------------------------
       
    88 //
       
    89 CPeninputGenericVkbWindow::CPeninputGenericVkbWindow( 
       
    90     CFepUiLayout* aUiLayout, MPeninputLayoutContext* aLayoutContext, 
       
    91     MPeninputUiStateMgr* aUiStateMgr )
       
    92     : CPeninputLayoutWindowExt( aUiLayout, aLayoutContext ),
       
    93       iUiStateMgr(aUiStateMgr),
       
    94       iPopupInited(EFalse),
       
    95       iPopupSet(EFalse),
       
    96       iLafMgr(NULL),
       
    97       iFirstConstruct(ETrue),
       
    98       iIndiWithText( EFalse ),
       
    99       iUSRscFileExist( EFalse )
       
   100     {
       
   101     }
       
   102 
       
   103 // --------------------------------------------------------------------------
       
   104 // CPeninputGenericVkbWindow::NewL
       
   105 // (other items were commented in a header)
       
   106 // --------------------------------------------------------------------------
       
   107 // 
       
   108 CPeninputGenericVkbWindow* CPeninputGenericVkbWindow::NewL( 
       
   109     CFepUiLayout* aUiLayout, MPeninputLayoutContext* aLayoutContext, 
       
   110     MPeninputUiStateMgr* aUiStateMgr )
       
   111     {
       
   112     CPeninputGenericVkbWindow* self = 
       
   113         new ( ELeave ) CPeninputGenericVkbWindow( aUiLayout, aLayoutContext, aUiStateMgr );
       
   114     CleanupStack::PushL( self );
       
   115     self->ConstructL();
       
   116     CleanupStack::Pop( self );
       
   117 
       
   118     return self;
       
   119     }
       
   120 
       
   121 // --------------------------------------------------------------------------
       
   122 // CPeninputGenericVkbWindow::~CPeninputGenericVkbWindow
       
   123 // (other items were commented in a header)
       
   124 // --------------------------------------------------------------------------
       
   125 //
       
   126 CPeninputGenericVkbWindow::~CPeninputGenericVkbWindow()
       
   127     {
       
   128     delete iIdle;
       
   129     iUnits.Close();
       
   130     
       
   131     delete iLafMgr;
       
   132     iLafMgr = NULL;
       
   133     delete iBmpRotator;
       
   134     iAccentCmdList.Close();
       
   135     }
       
   136 void CPeninputGenericVkbWindow::ConstructL()
       
   137     {
       
   138     iHandleRangeShortPress = ETrue;
       
   139     iBmpRotator = CPeninputSyncBitmapRotator::NewL();
       
   140     iLafMgr = CPeninputGenericVkbLafMgr::NewL();
       
   141     iLafMgr->SetInputModeL(TPluginInputMode (iLayoutContext->LayoutType()));
       
   142     CPeninputLayoutWindowExt::ConstructL();
       
   143 
       
   144     // Save whether American rsc file exist or not
       
   145     TBuf<KMaxFileLength>  usUSRscFileName; 
       
   146     usUSRscFileName= KConfigurationResourceFile();
       
   147     usUSRscFileName.AppendNum( ELangAmerican );
       
   148     usUSRscFileName.Append( KResourceFileExtName );
       
   149 
       
   150     RFs fileSession;
       
   151     User::LeaveIfError( fileSession.Connect() );
       
   152     CleanupClosePushL( fileSession );
       
   153     if ( BaflUtils::FileExists( fileSession , usUSRscFileName ))
       
   154     	{
       
   155         iUSRscFileExist = ETrue;
       
   156     	}
       
   157     CleanupStack::PopAndDestroy( 1 );
       
   158     // For addition of ITI features, add a candidate list in vkb window   
       
   159     CreateCandidateListL();    
       
   160     }
       
   161 
       
   162 // --------------------------------------------------------------------------
       
   163 // CPeninputGenericVkbWindow::HandleControlEvent
       
   164 // (other items were commented in a header)
       
   165 // --------------------------------------------------------------------------
       
   166 //
       
   167 void CPeninputGenericVkbWindow::HandleControlEvent( TInt aEventType,
       
   168                                                     CFepUiBaseCtrl* aCtrl, 
       
   169                                                     const TDesC& aEventData )
       
   170     {
       
   171     // Call this function in base class
       
   172     CPeninputLayoutWindowExt::HandleControlEvent( aEventType, aCtrl, 
       
   173                                                   aEventData );
       
   174     
       
   175     TInt* data = ( TInt* ) aEventData.Ptr(); 
       
   176     
       
   177     switch ( aEventType )
       
   178         {
       
   179         case EPeninputLayoutEventMultiRange:
       
   180             {
       
   181             if ( aCtrl->ControlId() == EPeninutWindowCtrlIdMultiRangeBtn )
       
   182                 {
       
   183                 if ( iHandleRangeShortPress )
       
   184                     {
       
   185                     HandleRangeButtonShortPress();
       
   186                     }
       
   187                 }
       
   188                 iHandleRangeShortPress = ETrue;
       
   189             }
       
   190             break;
       
   191         case EPeninputLayoutEventMultiRangeLongPress:
       
   192             {
       
   193             if ( aCtrl->ControlId() == EPeninutWindowCtrlIdMultiRangeBtn )
       
   194                 {
       
   195                 // Before pop up list, cancel down event, and set range button un-highlight.
       
   196                 TRAP_IGNORE( aCtrl->CancelPointerDownL());
       
   197                 static_cast<CAknFepCtrlCommonButton*>(aCtrl)->SetHighlight( EFalse );
       
   198                 PopupChoiceList();                
       
   199                 }
       
   200             }
       
   201             break;
       
   202         case EPeninputLayoutVkbEventResetShift: 
       
   203             {
       
   204             HandleShiftAndCapslockBtnClicked();
       
   205             }
       
   206             break;  
       
   207         case EPenInputLayoutEventClosePopup:
       
   208         	{
       
   209             if ( iPopupWnd && !iPopupWnd->Hiden() )
       
   210                 {
       
   211                 iPopupWnd->CloseWindow();
       
   212                 if ( iLayoutContext->LayoutType() != EPluginInputModeFSQ )
       
   213                     {
       
   214                     ResetAccentButton();
       
   215                     }
       
   216                 iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
       
   217                 }
       
   218         	}
       
   219             break;
       
   220         case EEventChoiceSelected:
       
   221             {
       
   222             CFepUiBaseCtrl* btn = Control( EPeninutWindowCtrlIdMultiRangeBtn );
       
   223             
       
   224             if ( btn )
       
   225                 {
       
   226                 iHandleRangeShortPress = EFalse;
       
   227                 TRAP_IGNORE( btn->HandlePointerUpEventL( btn->Rect().iBr ) );
       
   228                 iHandleRangeShortPress = ETrue;
       
   229                 }
       
   230             CFepLayoutChoiceList::SEvent* event = 
       
   231                 ( CFepLayoutChoiceList::SEvent* ) aEventData.Ptr();
       
   232 
       
   233             if ( event->iIndex != KPeninputVkbWndInvalidIndex )
       
   234                 {
       
   235                 if (aCtrl->ControlId() == EPeninutWindowCtrlIdAccentPopupWindow)
       
   236                     {
       
   237                     if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
       
   238                         {
       
   239                         TRAP_IGNORE( HandleRangeListSelectedL( aCtrl, aEventData ));
       
   240                         }
       
   241                     else
       
   242                         {
       
   243                         TInt currentRange = CPeninputDataConverter::AnyToInt(
       
   244                                           iLayoutContext->RequestData(EPeninputDataTypeCurrentRange));
       
   245                         TInt currentAccent = CPeninputDataConverter::AnyToInt(
       
   246                                           iLayoutContext->RequestData(EPeninputDataTypeCurrentAccent));
       
   247                     
       
   248                         if ((currentRange == ERangeAccent) && (currentAccent == event->iIndex))
       
   249                             {
       
   250                             iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
       
   251                             return;
       
   252                             }
       
   253     
       
   254                         iLayoutContext->SetData( EPeninputDataTypeCurrentAccent, &(event->iIndex));
       
   255                                              
       
   256                         // Active range, update rangebar and vkb layout
       
   257                         //ChangeRange( ERangeAccent, EPeninputVkbLayoutAccented1 + 2 * event->iIndex);
       
   258                         (currentRange == ERangeAccent) ? ChangeRange(ERangeAccent, 
       
   259                                            EPeninputVkbLayoutAccented1 + 2 * event->iIndex, EFalse) :
       
   260                                                          ChangeRange(ERangeAccent, 
       
   261                                            EPeninputVkbLayoutAccented1 + 2 * event->iIndex, ETrue);
       
   262                         }
       
   263                     }
       
   264                 else if (aCtrl->ControlId() == EPeninutWindowCtrlIdSwitcherPopupWindow)
       
   265                     {
       
   266                     if (iLayoutContext->LayoutType() != event->iCommand)
       
   267                         {
       
   268                         TBool switchByMode = ETrue;
       
   269                         TInt  mode = event->iCommand;
       
   270 
       
   271                         TBuf<8> buf;
       
   272                         buf.Append(reinterpret_cast<TText*>(&switchByMode), 
       
   273                                                             sizeof(TBool)/sizeof(TText));
       
   274                         buf.Append(reinterpret_cast<TText*>(&mode), sizeof(TInt)/sizeof(TText));
       
   275                         UiLayout()->SignalOwner(ESignalLayoutUIChanged,buf);
       
   276                         }
       
   277                     }
       
   278                 else if ( aCtrl->ControlId() == EPentinputHwrCandidateList )
       
   279                     {
       
   280                     TRAP_IGNORE( HandleCandidateListSelectedL( aCtrl, aEventData ) );
       
   281                     }
       
   282                 }
       
   283             else
       
   284                 {
       
   285                 if ( iLayoutContext->LayoutType() != EPluginInputModeFSQ )
       
   286                     {
       
   287                     ResetAccentButton();
       
   288                     }
       
   289                 }
       
   290             iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
       
   291             }
       
   292             break;
       
   293         case EPeninputLayoutEventToHwr:
       
   294             {
       
   295             TRAP_IGNORE( UpdateICFTextL() );
       
   296             TRAP_IGNORE(PopupSwitchWindowL());
       
   297             }
       
   298             break; 
       
   299         case EEventVirtualKeyLatched:
       
   300             {
       
   301             HandleVirtualKeyLatchedEvent(aEventType, aCtrl, aEventData);
       
   302             }
       
   303             break;
       
   304         case EEventVirtualKeyUnLatched:
       
   305             {
       
   306             HBufC* newCharBuf = HBufC::New( 2*iNewDeadKeyBuf.Length() );
       
   307             if( newCharBuf )
       
   308                 {
       
   309                 CPeninputGenericVkbLayout* layout 
       
   310                         = static_cast<CPeninputGenericVkbLayout*>( UiLayout() );
       
   311                 if( layout->IsEnableITIOnFSQ() )
       
   312                     {
       
   313                     // If ITI is open, double same keys should be send for one dead key,
       
   314                     // core will handle them as one key.
       
   315                     newCharBuf->Des().Append( iNewDeadKeyBuf );
       
   316                     }
       
   317                 newCharBuf->Des().Append( iNewDeadKeyBuf );
       
   318                 }
       
   319             
       
   320             // Submit DeadKey
       
   321             UiLayout()->SignalOwner(ESignalKeyEvent, *newCharBuf);
       
   322             delete newCharBuf;
       
   323              
       
   324             TBool deadKeyChange = EFalse;
       
   325             iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange);
       
   326             iNewDeadKeyBuf = KNullDesC;
       
   327             }
       
   328             break;
       
   329         case EPeninputLayoutEventBack:
       
   330             {
       
   331             TInt latchedFlag = CPeninputDataConverter::AnyToInt
       
   332                                (iLayoutContext->RequestData(EAkninputDataTypeLatchedSet));
       
   333             // If one DeadKey is latched, only unlatch the DeadKey and reset the iNewDeadKeyBuf
       
   334             // Don't delete the visible charater in ICF
       
   335             if(latchedFlag)
       
   336                 {
       
   337                 UnLatchDeadKey(iNewDeadKeyBuf);
       
   338 
       
   339                 TBool deadKeyChange = EFalse;
       
   340                 iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange);
       
   341                 iNewDeadKeyBuf = KNullDesC;
       
   342                 }
       
   343             }
       
   344             break;
       
   345         case EPeninputLayoutEventEnter:
       
   346         case EPeninputLayoutEventSpace:
       
   347             {
       
   348             TInt latchedFlag = CPeninputDataConverter::AnyToInt
       
   349                                (iLayoutContext->RequestData(EAkninputDataTypeLatchedSet));
       
   350             if(latchedFlag)
       
   351                 {
       
   352                 HBufC* newCharBuf = HBufC::New( aEventData.Length() + 2*iNewDeadKeyBuf.Length() );
       
   353                 if( newCharBuf )
       
   354                     {
       
   355                     CPeninputGenericVkbLayout* layout 
       
   356                              = static_cast<CPeninputGenericVkbLayout*>( UiLayout() );
       
   357                     if( layout->IsEnableITIOnFSQ() )
       
   358                         {
       
   359                         // If ITI is open, double same keys should be send for one dead key,
       
   360                         // core will handle them as one key.                    
       
   361                         newCharBuf->Des().Append( iNewDeadKeyBuf );
       
   362                         }
       
   363                     newCharBuf->Des().Append( iNewDeadKeyBuf );
       
   364                     newCharBuf->Des().Append( aEventData );
       
   365                     }
       
   366                 
       
   367                 UnLatchDeadKey(iNewDeadKeyBuf);
       
   368 
       
   369                 TBool deadKeyChange = EFalse;
       
   370                 iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange);
       
   371                 
       
   372                 // Submit DeadKey + Space or Enter at the same time
       
   373                 
       
   374                 if( newCharBuf != NULL )
       
   375                     {
       
   376                     UiLayout()->SignalOwner(ESignalKeyEvent,*newCharBuf);
       
   377                     }
       
   378                 iNewDeadKeyBuf = KNullDesC;
       
   379                 delete newCharBuf;
       
   380                 }
       
   381             }
       
   382             break;
       
   383             
       
   384 /*        case EPeninputLayoutEventLeftArrow:
       
   385             SimulateRawEvent(EStdKeyLeftArrow,TRawEvent::EKeyDown);
       
   386             SimulateRawEvent(EStdKeyLeftArrow,TRawEvent::EKeyUp);
       
   387             break;
       
   388 
       
   389         case EPeninputLayoutEventRightArrow:
       
   390             SimulateRawEvent(EStdKeyRightArrow,TRawEvent::EKeyDown);
       
   391             SimulateRawEvent(EStdKeyRightArrow,TRawEvent::EKeyUp);
       
   392             break;*/
       
   393             
       
   394         default:
       
   395             break;
       
   396         }
       
   397     }
       
   398     
       
   399 // --------------------------------------------------------------------------
       
   400 // CPeninputGenericVkbWindow::SimulateRawEvent
       
   401 // (other items were commented in a header)
       
   402 // --------------------------------------------------------------------------
       
   403 //
       
   404 void CPeninputGenericVkbWindow::SimulateRawEvent(TInt aScanCode, TRawEvent::TType aType)
       
   405     {
       
   406     TRawEvent event; 
       
   407     event.Set(aType,aScanCode);
       
   408     
       
   409     TPtrC eventPtr(reinterpret_cast<const TUint16*>(&event),sizeof(event)/sizeof(TUint16));
       
   410 
       
   411     UiLayout()->SignalOwner(ESignalSimulateEvent,eventPtr);
       
   412     }
       
   413 
       
   414 // --------------------------------------------------------------------------
       
   415 // CPeninputGenericVkbWindow::GetWindowConfigResId
       
   416 // (other items were commented in a header)
       
   417 // --------------------------------------------------------------------------
       
   418 //
       
   419 TInt CPeninputGenericVkbWindow::GetWindowConfigResId()
       
   420     {
       
   421     return R_PENINPUT_LAYOUT_CONFIG_INFO;
       
   422     }
       
   423 
       
   424 // --------------------------------------------------------------------------
       
   425 // CPeninputGenericVkbWindow::GetWindowResId
       
   426 // (other items were commented in a header)
       
   427 // --------------------------------------------------------------------------
       
   428 //
       
   429 TInt CPeninputGenericVkbWindow::GetWindowResId()
       
   430     {
       
   431     if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
       
   432         {
       
   433         return R_PENINPUT_LAYOUT_FSQ_WINDOW_INFO;
       
   434         }
       
   435     return R_PENINPUT_LAYOUT_VKB_WINDOW_INFO;        
       
   436     }
       
   437 
       
   438 // --------------------------------------------------------------------------
       
   439 // CPeninputGenericVkbWindow::GetNumKeymappingResId
       
   440 // (other items were commented in a header)
       
   441 // --------------------------------------------------------------------------
       
   442 //
       
   443 TInt CPeninputGenericVkbWindow::GetNumKeymappingResId()
       
   444     {
       
   445     return R_PENINPUT_LAYOUT_KEY_MAPPING_STRING_LIST;
       
   446     }
       
   447 
       
   448 // --------------------------------------------------------------------------
       
   449 // CPeninputGenericVkbWindow::GetWindowConfigResFileName
       
   450 // (other items were commented in a header)
       
   451 // --------------------------------------------------------------------------
       
   452 //
       
   453 const TDesC& CPeninputGenericVkbWindow::GetWindowConfigResFileName( 
       
   454     TInt aLangID )
       
   455     {
       
   456     if ( aLangID <= 0 ) 
       
   457         {
       
   458         return KNullDesC;
       
   459         }
       
   460         
       
   461      if ( aLangID == ELangFrench )
       
   462         {
       
   463 
       
   464         TBuf<KMaxFileLength>  canadianfrenchresfilename; 
       
   465         canadianfrenchresfilename= KConfigurationResourceFile();
       
   466         canadianfrenchresfilename.AppendNum( ELangCanadianFrench );
       
   467         canadianfrenchresfilename.Append( KResourceFileExtName );
       
   468 
       
   469         RFile file;
       
   470         TInt rs = file.Open( CCoeEnv::Static()->FsSession(),canadianfrenchresfilename, EFileRead );
       
   471         if ( rs == KErrNone )
       
   472             {
       
   473             file.Close();
       
   474             aLangID = ELangCanadianFrench;   
       
   475             }
       
   476         }
       
   477      // If US Rsc file exist, use it instead of English rsc file
       
   478      if(( aLangID == ELangEnglish ) && ( iUSRscFileExist ))
       
   479     	 {
       
   480          aLangID = ELangAmerican; 
       
   481     	 }
       
   482     iResourceFilename.Zero();
       
   483     // Generate resource file name according to language id
       
   484     iResourceFilename = KConfigurationResourceFile();
       
   485     
       
   486     if ( aLangID < 10 )
       
   487         {
       
   488         iResourceFilename.AppendNum( 0 );
       
   489         iResourceFilename.AppendNum( aLangID );
       
   490         }
       
   491     else
       
   492         {
       
   493         iResourceFilename.AppendNum( aLangID );
       
   494         }
       
   495     iResourceFilename.Append( KResourceFileExtName );
       
   496     
       
   497     return iResourceFilename;
       
   498     }
       
   499 
       
   500 // --------------------------------------------------------------------------
       
   501 // CPeninputGenericVkbWindow::GetWindowResFileName
       
   502 // (other items were commented in a header)
       
   503 // --------------------------------------------------------------------------
       
   504 //
       
   505 const TDesC& CPeninputGenericVkbWindow::GetWindowResFileName()
       
   506     {
       
   507     return KVkbWindowResourceFile();
       
   508     }
       
   509 
       
   510 // --------------------------------------------------------------------------
       
   511 // CPeninputGenericVkbWindow::CreateAllControls
       
   512 // (other items were commented in a header)
       
   513 // --------------------------------------------------------------------------
       
   514 //
       
   515 void CPeninputGenericVkbWindow::CreateAllControlsL()
       
   516     {
       
   517     CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
       
   518                                                    (Control(EPeninputWindowCtrlIdMultiLineICF));
       
   519     iBubbleSize = AknLayoutScalable_Apps::popup_char_count_window().LayoutLine();
       
   520     iBubbleTextLayout = AknLayoutScalable_Apps::popup_char_count_window_t1(0).LayoutLine();
       
   521     
       
   522     icf->MsgBubbleCtrl()->SetTextFormat(iBubbleTextLayout);
       
   523     icf->MsgBubbleCtrl()->SetTextColorIndex( EAknsCIQsnTextColorsCG67 );
       
   524     //Change the ID when ID into release
       
   525     icf->MsgBubbleCtrl()->SetBitmapParam(NULL,
       
   526     									  NULL,
       
   527     									  KAknsIIDQsnFrInputPreviewSideL,
       
   528     									  KAknsIIDQsnFrInputPreviewMiddle,
       
   529     									  KAknsIIDQsnFrInputPreviewSideR);  
       
   530     icf->MsgBubbleCtrl()->SetTextL( KEmptyString );
       
   531     icf->InfoBubbleCtrl()->SetTextFormat(iBubbleTextLayout);
       
   532     icf->InfoBubbleCtrl()->SetTextColorIndex( EAknsCIQsnTextColorsCG67 );
       
   533     icf->InfoBubbleCtrl()->SetBitmapParam(NULL,
       
   534     									  NULL,
       
   535     									  KAknsIIDQsnFrInputPreviewSideL,
       
   536     									  KAknsIIDQsnFrInputPreviewMiddle,
       
   537     									  KAknsIIDQsnFrInputPreviewSideR);
       
   538     if (iLayoutContext->LayoutType() == EPluginInputModeFSQ)
       
   539         {
       
   540         icf->SetMsgBubbleCtrlSize(TSize(iBubbleSize.iW,iBubbleSize.iH));
       
   541         icf->SetInfoBubbleCtrlSize(TSize(iBubbleSize.iW,iBubbleSize.iH));
       
   542         }
       
   543         
       
   544     if ( !( iLayoutContext->LayoutType() == EPluginInputModeFSQ ))
       
   545         {
       
   546         // Range bar
       
   547         AddRangeBarL();
       
   548         }
       
   549 
       
   550     // Vkb control
       
   551     iVkbCtrl = CPeninputVkbCtrlExt::NewL( TRect(), UiLayout(), 
       
   552         EPeninutWindowCtrlIdVkbCtrl, NULL  );
       
   553     iVkbCtrl->SetResourceId( R_PENINPUT_LAYOUT_VKB_KEYBOARD );
       
   554     iVkbCtrl->ConstructFromResourceL();
       
   555     iVkbCtrl->SetKeyTextColorGroup( EAknsCIQsnTextColorsCG68 );
       
   556     iVkbLayout->SetVkbKeyboard( iVkbCtrl );
       
   557     if (iLayoutContext->LayoutType() != EPluginInputModeFSQ)
       
   558         {
       
   559         iVkbCtrl->SetIrregularKeyBoard(ETrue);
       
   560         iVkbLayout->SetIrregularResourceId(R_AKN_FEP_VKB_IRREGULAR_BITMAP);
       
   561         iVkbLayout->ConstructFromIrregularResourceL();
       
   562         }
       
   563     else
       
   564         {
       
   565         iVkbCtrl->SetIrregularKeyBoard(EFalse);
       
   566         iVkbLayout->SetNonIrregularResourceId(R_AKN_FEP_VKB_NONIRREGULAR_BITMAP);
       
   567         iVkbLayout->ConstructFromNonIrregularResourceL();        
       
   568         }
       
   569 
       
   570     // Add bubble support
       
   571     iVkbCtrl->ShowBubble(ETrue);    
       
   572     iVkbCtrl->SetGowithPointerDown(ETrue);
       
   573     iVkbCtrl->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview);  //Change the ID when ID into release
       
   574     
       
   575     //set key to be 9 piece graphics
       
   576     if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
       
   577         {
       
   578         iVkbCtrl->SetKeySkinId( EKeyBmpNormal, KAknsIIDQsnFrKeypadButtonFrNormal );
       
   579         iVkbCtrl->SetKeySkinId( EKeyBmpHighlight, KAknsIIDQsnFrKeypadButtonFrPressed );
       
   580         iVkbCtrl->SetKeySkinId( EKeyBmpDim, KAknsIIDQsnFrKeypadButtonFrInactive );
       
   581         }
       
   582     
       
   583     AddControlL( iVkbCtrl );
       
   584     iVkbCtrl->AddEventObserver( UiLayout() );
       
   585     
       
   586     AddButtonL( EPeninutWindowCtrlIdEnterBtn, 
       
   587                 EPeninputLayoutEventEnter, 
       
   588                 R_PENINPUT_LAYOUT_VKB_ENTER, 
       
   589                 EKeyEnter );
       
   590        
       
   591     // Shift and capslock merged button
       
   592 
       
   593   	CAknFepCtrlMultiModeButton* button = 
       
   594   		CAknFepCtrlMultiModeButton::NewLC( UiLayout(), 
       
   595   										   EPeninutWindowCtrlIdShiftBtn );
       
   596     if ( button )
       
   597 	    {
       
   598 	    // Read resource
       
   599 	    TResourceReader reader;
       
   600 	    
       
   601 	    CCoeEnv::Static()->CreateResourceReaderLC( reader,
       
   602 	    	 			   R_PENINPUT_LAYOUT_VKB_SHIFT_CAPSLOCK );  
       
   603 	    button->SetResourceId( R_PENINPUT_LAYOUT_VKB_SHIFT_CAPSLOCK );      
       
   604 	    button->ConstructFromResourceL();  
       
   605 	    // Pop and destroy reader
       
   606 	    CleanupStack::PopAndDestroy( 1 );
       
   607 	    
       
   608 	    // Add into the control pool                                                   
       
   609 	    AddControlL( button );
       
   610 	    
       
   611 	    button->AddEventObserver( UiLayout() );
       
   612 	    }
       
   613     CleanupStack::Pop( button );  
       
   614     // Space button          
       
   615     CAknFepCtrlEventButton* spaceButton = static_cast<CAknFepCtrlEventButton*>
       
   616                                                    (Control(EPeninutWindowCtrlIdSpaceBtn));
       
   617     // Create 3-pieces color icon for space button
       
   618 	CPenInput3PiecesColorIcons* colorIcons = 
       
   619 				CPenInput3PiecesColorIcons::NewL( R_AKN_FEP_VKB_SPACE_ICON1,
       
   620 												  R_AKN_FEP_VKB_SPACE_ICON2,
       
   621 												  R_AKN_FEP_VKB_SPACE_ICON3 );
       
   622 	spaceButton->Set3PiecesColorIcons( colorIcons );
       
   623 
       
   624 	//set background of space button to be 9 piece graphics
       
   625 	if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
       
   626 	    {
       
   627 	    spaceButton->SetImageFrameId( KAknsIIDQsnFrKeypadButtonFrNormal, 
       
   628 	                                  KAknsIIDQsnFrKeypadButtonFrPressed,
       
   629 	                                  KAknsIIDQsnFrKeypadButtonFrInactive );
       
   630 	    }
       
   631 	
       
   632 	if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
       
   633 	    {
       
   634         // Switch to hwr button  
       
   635         AddButtonL( EPeninutWindowCtrlIdMultiRangeBtn, 
       
   636                     EPeninputLayoutEventMultiRange, 
       
   637                     R_PENINPUT_LAYOUT_FSQ_MULTIRANGE );
       
   638 	    }
       
   639 	else
       
   640 	    {
       
   641 	    // Switch to hwr button  
       
   642 	    AddButtonL( EPeninutWindowCtrlIdSwitchToHwrBtn, 
       
   643                     EPeninputLayoutEventToHwr, 
       
   644                     R_PENINPUT_LAYOUT_VKB_HWR );
       
   645 	    }
       
   646                   
       
   647     // Add popup window
       
   648     AddPopupWindowL();
       
   649   
       
   650     }
       
   651     
       
   652 // --------------------------------------------------------------------------
       
   653 // CPeninputGenericVkbWindow::ChangeUnitSize
       
   654 // (other items were commented in a header)
       
   655 // --------------------------------------------------------------------------
       
   656 //
       
   657 const TRect CPeninputGenericVkbWindow::ChangeUnitSize()
       
   658     {
       
   659     return TRect();
       
   660     }
       
   661 
       
   662 // --------------------------------------------------------------------------
       
   663 // CPeninputGenericVkbWindow::ChangeClientSize
       
   664 // (other items were commented in a header)
       
   665 // --------------------------------------------------------------------------
       
   666 //
       
   667 void CPeninputGenericVkbWindow::ChangeClientSize()
       
   668     {
       
   669     if ( !iPopupWnd->Hiden() )
       
   670         {
       
   671         iPopupWnd->CloseWindow();
       
   672         if ( iLayoutContext->LayoutType() != EPluginInputModeFSQ )
       
   673             {
       
   674             ResetAccentButton();
       
   675             }
       
   676         iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
       
   677         }
       
   678         
       
   679     PopupWindowSizeChange();
       
   680             
       
   681     TInt clientLayoutId = CPeninputDataConverter::AnyToInt
       
   682         ( iLayoutContext->RequestData( EPeninputDataTypeClientLayout ) );
       
   683     CPeninputClientLayoutInfo* clientLayout = 
       
   684         ConfigInfo()->FindClientLayoutInfo( clientLayoutId );
       
   685         
       
   686     if ( clientLayout )
       
   687         {
       
   688         ReorganizeControls( clientLayout->LayoutID(), EFalse );
       
   689         } 
       
   690 
       
   691     UpdateArea( iVkbCtrl->Rect(), EFalse );
       
   692     }
       
   693 void CPeninputGenericVkbWindow::SetVkbLayoutSize()
       
   694     {
       
   695     TRect outrect,innerrect;   
       
   696     iLafMgr->GetPreviewWndRect(outrect,innerrect);
       
   697     iVkbCtrl->SetTextFormat(iLafMgr->PreviewWndText());  //Read laf 
       
   698     iVkbCtrl->SetBubbleSize(TSize(outrect.Width(),outrect.Height()));  // Read laf
       
   699     iVkbCtrl->SetFrameDiff(innerrect.iTl.iX - outrect.iTl.iX,
       
   700                            innerrect.iTl.iY - outrect.iTl.iY,
       
   701                            outrect.iBr.iX - innerrect.iBr.iX,
       
   702                            outrect.iBr.iY - innerrect.iBr.iY);
       
   703     
       
   704     TInt vkbLayoutid = CPeninputDataConverter::AnyToInt
       
   705         ( iLayoutContext->RequestData( EPeninputDataTypeVkbLayout ) );
       
   706     CPeninputVkbLayoutInfo* vkbLayout = 
       
   707         ConfigInfo()->FindVkbLayoutInfo( vkbLayoutid );
       
   708 
       
   709     // Calculate current vkblayout according current layout
       
   710     if ( vkbLayout )
       
   711         {
       
   712         const TInt columns = vkbLayout->Columns();
       
   713         const TInt rows = vkbLayout->Rows();
       
   714         TRect keyRect;
       
   715         TRect charRect;
       
   716         
       
   717         //iLafMgr->SetLayoutType(iLafMgr->LayoutTypeFromRowsColumns(rows,columns));
       
   718         
       
   719  
       
   720         for (TInt exter = 0; exter < rows; exter ++)
       
   721             {
       
   722             for (TInt inter = 0; inter < columns; inter ++ )
       
   723                 {
       
   724                 iLafMgr->GetKeyRect(inter,exter, keyRect, charRect);
       
   725                 vkbLayout->SetKeyInfo(exter,inter,keyRect,charRect,iLafMgr->KeyTextFont());
       
   726                 }
       
   727             }
       
   728      
       
   729         if ( iVkbCtrl->IsIrregularKeyBoard() )
       
   730             {
       
   731             TSize curSize = vkbLayout->KeyInfoList()[0]->Key()->Rect().Size();
       
   732             TSize size = iVkbCtrl->IrregularKeyBitmap(EKeyLeftDown,
       
   733                                                       EKeyStateNormal)->SizeInPixels();
       
   734             if ( curSize != size )
       
   735                 {
       
   736                 for ( TInt i = 0; i <= EKeyRightUp; i++ )
       
   737                     {
       
   738                     for ( TInt j = 0; j <= EKeyStateDimmedMask; j++ )
       
   739                         {
       
   740                         AknIconUtils::SetSize( iVkbCtrl->IrregularKeyBitmap(
       
   741                             (TVirtualKeyIrregularKeyType)i,(TVirtualKeyIrregularKeyState)j), 
       
   742                              curSize, EAspectRatioNotPreserved ); 
       
   743                             
       
   744                         AknIconUtils::SetSize( iVkbCtrl->IrregularKeyBitmap(
       
   745                             (TVirtualKeyIrregularKeyType)i,(TVirtualKeyIrregularKeyState)j), 
       
   746                              curSize, EAspectRatioNotPreserved );
       
   747                         }
       
   748                     }
       
   749                 }
       
   750             }
       
   751         else
       
   752         	{
       
   753         	TSize curSize = vkbLayout->KeyInfoList()[0]->Key()->Rect().Size();
       
   754         	TSize size = iVkbCtrl->NonIrregularKeyBitmap(EKeyBmpNormal)->SizeInPixels();
       
   755         	if( curSize != size )	
       
   756         		{
       
   757                 for ( TInt i = 0; i <= EKeyBmpLastType; i++ )
       
   758                     {
       
   759                     if( iVkbCtrl->NonIrregularKeyBitmap((TVirtualKeyBmpType)i) )
       
   760                     	{
       
   761                         AknIconUtils::SetSize( 
       
   762                                            iVkbCtrl->NonIrregularKeyBitmap((TVirtualKeyBmpType)i), 
       
   763                                            curSize, EAspectRatioNotPreserved );
       
   764                     	}
       
   765                     }
       
   766         		}
       
   767         	}
       
   768         }
       
   769     }
       
   770 
       
   771 // --------------------------------------------------------------------------
       
   772 // CPeninputGenericVkbWindow::ReorganizeControls
       
   773 // (other items were commented in a header)
       
   774 // --------------------------------------------------------------------------
       
   775 //
       
   776 void CPeninputGenericVkbWindow::ReorganizeControls( TInt aClientLayoutId,
       
   777                                                     TBool aNeedReset )
       
   778     {
       
   779     CPeninputClientLayoutInfo* clientLayout = 
       
   780         ConfigInfo()->FindClientLayoutInfo( aClientLayoutId ); 
       
   781     RPointerArray<CPeninputControlInfo>& controlList = 
       
   782         clientLayout->ControlInfoList();
       
   783   
       
   784     const TInt keyColumns = clientLayout->Columns();
       
   785     const TInt keyRows = clientLayout->Rows();
       
   786     
       
   787     if( iLastUsedTotalColumns == keyColumns &&
       
   788     	iLastUsedTotalRows == keyRows )
       
   789 		{
       
   790 		return;
       
   791 		}    
       
   792 
       
   793     iLafMgr->SetLayoutType(iLafMgr->LayoutTypeFromRowsColumns(keyRows,keyColumns));
       
   794     
       
   795     iLastUsedTotalColumns = keyColumns;
       
   796     iLastUsedTotalRows = keyRows;
       
   797     
       
   798     TRect winRect( Rect().iTl, iLafMgr->EntirePaneRect().Size());
       
   799         
       
   800     SetWindowRect(winRect);  
       
   801     //ReorgnizeTitleBar();
       
   802     ReorgnizeICFAndButtons();
       
   803     
       
   804     const TInt count = controlList.Count();
       
   805     TInt controlID = 0;
       
   806     CFepUiBaseCtrl* ctrl = NULL;
       
   807     TRect rect;
       
   808     TRect inRect;
       
   809     TRect exRect;
       
   810 
       
   811     TPoint winPoint = Rect().iTl;
       
   812     TPoint LafPoint = iLafMgr->EntirePaneRect().iTl;
       
   813     
       
   814     TInt x = winPoint.iX - LafPoint.iX;
       
   815     TInt y = winPoint.iY - LafPoint.iY;
       
   816 
       
   817     if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
       
   818         {
       
   819         x = 0;
       
   820         y = 0;
       
   821         }
       
   822     for ( TInt i = 0; i < count; i++ )
       
   823         {
       
   824         controlID = controlList[i]->ControlID();
       
   825         ctrl = Control( controlID );
       
   826 
       
   827         if ( ctrl )
       
   828             { 
       
   829             AddNotOwnedControl( ctrl );
       
   830             if ( ( ctrl->ControlType() | ECtrlButton ) == ECtrlButton )
       
   831                 {
       
   832                 
       
   833                 iLafMgr->GetButtonRect(TPeninputCommonCtrlID(ctrl->ControlId()),exRect ,inRect);
       
   834                 
       
   835                 exRect.Move(x, y);
       
   836                 inRect.Move(x, y);
       
   837                 if( controlID ==  EPeninutWindowCtrlIdShiftBtn)
       
   838 	                {
       
   839 					( static_cast<CAknFepCtrlMultiModeButton*> (ctrl) )->
       
   840 						SizeChanged( exRect, inRect, ETrue );		            	                	
       
   841 	                }
       
   842 	            else
       
   843 		            {
       
   844 		            if (TPeninputCommonCtrlID(ctrl->ControlId()) == EPeninutWindowCtrlIdSpaceBtn)
       
   845 		            	{
       
   846 		            	// config 3 pieces icon info       
       
   847 		            	TRect iconsFrameRect, middleIconRect;
       
   848 		            	iLafMgr->GetSpaceButtonExLayoutInfo( iconsFrameRect, middleIconRect );
       
   849 		            	iconsFrameRect.Move( x, y );
       
   850 		               	middleIconRect.Move( x, y );
       
   851 			            inRect = iconsFrameRect;
       
   852 			            
       
   853 						( static_cast<CAknFepCtrlCommonButton*> (ctrl) )->SetDraw3PieceFrameInfo(
       
   854 														  TDraw3PiecesFrame(KAknsIIDQgnIndiInputSpaceL,
       
   855     													  KAknsIIDQgnIndiInputSpaceMiddle,
       
   856     													  KAknsIIDQgnIndiInputSpaceR,
       
   857     													  middleIconRect));			            
       
   858 		            	}
       
   859 	                ( static_cast<CAknFepCtrlCommonButton*> (ctrl) )->SizeChanged( exRect, 
       
   860                                                                                  inRect, 
       
   861                                                                                  ETrue );
       
   862 		            }
       
   863                 }
       
   864             else if ( ctrl->ControlId() == EPeninutWindowCtrlIdVkbCtrl )
       
   865                 {
       
   866 				iVkbCtrl->SetFont( iLafMgr->KeyTextFont() );
       
   867 				iVkbCtrl->SetTextLineLayout( iLafMgr->KeyTextLayout() );
       
   868 			    iVkbCtrl->SetTextFormat( iLafMgr->PreviewWndText() );  //Read laf 
       
   869 				if (aNeedReset)
       
   870 			        {
       
   871 			        iVkbCtrl->Reset();
       
   872 			        }
       
   873     
       
   874                 rect = iLafMgr->KeypadRect();
       
   875                 
       
   876                 rect.Move(x, y);
       
   877 
       
   878                 ( static_cast<CPeninputVkbCtrlExt*> (ctrl) )->SizeChanged(rect);
       
   879                 }
       
   880                 
       
   881             else if ( ctrl->ControlId() == EPeninutWindowCtrlIdRangeBar )
       
   882                 {
       
   883                 TRAP_IGNORE(SetRangeBarSizeL(x, y));
       
   884                 }
       
   885             }
       
   886         }
       
   887 
       
   888     // Addition for ITI features, read LAF data for candidate list
       
   889     const TPeninputCandidateListLayoutData& candidateListLAF =    
       
   890                                         iLafMgr->CandidateListLayoutData();
       
   891     iCandidateList->SizeChanged( candidateListLAF.iSelectionItemSize, 
       
   892                                  candidateListLAF.iSelectionHorMargin,
       
   893                                  candidateListLAF.iSelectionVerMargin,
       
   894                                  candidateListLAF.iSelectionNaviSize,
       
   895                                  candidateListLAF.iSelectionNaviInnerSize );    
       
   896     iCandidateList->SetPageInfoTextLineLayout
       
   897                                 ( candidateListLAF.iSelectionPageTextLine );
       
   898     
       
   899     
       
   900     const CFont* itemFont = candidateListLAF.iFont;    
       
   901     TRgb textColor = CandidateListTextColor();
       
   902     if ( itemFont )
       
   903         {
       
   904         // Set font defined in LAF
       
   905         iCandidateList->SetTextProperty( itemFont, textColor );
       
   906         }
       
   907     else
       
   908         {
       
   909         // If font in LAF is NULL, set ICF text font to candidate list
       
   910         iCandidateList->SetTextProperty( iLafMgr->ICFTextFont(), textColor );
       
   911         }
       
   912     
       
   913     CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
       
   914                                    (Control(EPeninputWindowCtrlIdMultiLineICF));
       
   915     if ( icf )
       
   916         {
       
   917         // read LAF data for tooltip box
       
   918         const TPeninputTooltipBoxLayoutData& tooltipBoxLAF 
       
   919                                           = iLafMgr->TooltipBoxLayoutData();
       
   920         icf->TooltipBubbleCtrl()->SetTextFormat( tooltipBoxLAF.iTooltipTextLayout );
       
   921         icf->TooltipBubbleCtrl()->SetTextColorIndex( EAknsCIQsnTextColorsCG55 );
       
   922         icf->TooltipBubbleCtrl()->SetBitmapParam(NULL,
       
   923 									  NULL,
       
   924 									  KAknsIIDQsnFrInputPreviewSideL,
       
   925 									  KAknsIIDQsnFrInputPreviewMiddle,
       
   926 									  KAknsIIDQsnFrInputPreviewSideR);
       
   927         icf->TooltipBubbleCtrl()->SetFrameDiff( KTooltipLeftMargin, 
       
   928         		                                KTooltipTopMargin,
       
   929         		                                KTooltipRightMargin,
       
   930         		                                KTooltipBottomMargin );
       
   931         // read color from skin for autocompletion part
       
   932         icf->SetAutoCompleteTextColor( AutoCompletionPartColor() );               
       
   933         }       
       
   934     }
       
   935 
       
   936 void CPeninputGenericVkbWindow::SetRangeBarSizeL(TInt x, TInt y)
       
   937 	{
       
   938 	TRect exRect; 
       
   939     exRect = iLafMgr->RangbarRect();
       
   940     exRect.Move(x, y);
       
   941     // Get range bar display cell rects
       
   942 	TRect rect, innerRect;
       
   943 	RArray<TRect> displayCellRects, dispalyCellInnerRects;
       
   944 	CleanupClosePushL( displayCellRects );
       
   945 	CleanupClosePushL( dispalyCellInnerRects );
       
   946     for( TInt i = 0; i < iLafMgr->RangbarCellCount(); i++ )
       
   947     	{
       
   948     	iLafMgr->RangbarCellAt( i, rect, innerRect );
       
   949 		rect.Move(x, y);
       
   950 		displayCellRects.AppendL( rect );
       
   951 		innerRect.Move(x, y);
       
   952 		dispalyCellInnerRects.AppendL( innerRect );               	
       
   953     	}
       
   954 	iRangeBar->SetDispalyCellRectsL( displayCellRects, dispalyCellInnerRects );
       
   955 	CleanupStack::PopAndDestroy(2);
       
   956     iRangeBar->SizeChanged( exRect );
       
   957 	}
       
   958 
       
   959 // --------------------------------------------------------------------------
       
   960 // CPeninputGenericVkbWindow::SetControlsFont
       
   961 // (other items were commented in a header)
       
   962 // --------------------------------------------------------------------------
       
   963 //
       
   964 void CPeninputGenericVkbWindow::SetControlsFont()
       
   965     {
       
   966 /*    
       
   967     CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>(Control(EPeninputWindowCtrlIdMultiLineICF));
       
   968     
       
   969     const CFont* icfFont = iLafMgr->ICFTextFont();
       
   970     
       
   971     // set icf margin
       
   972     TPeninputICFConfig icfConfig;
       
   973     iLafMgr->GetICFConfig( icfConfig );
       
   974     icf->SetTextMargin( icfConfig.iLeftMargin,
       
   975     					icfConfig.iRightMargin,
       
   976     					icfConfig.iTopMargin,
       
   977     					0 );    			
       
   978     
       
   979     TRAP_IGNORE(icf->SizeChangedL( 
       
   980           		icf->Rect(), 
       
   981 				icfConfig.iTextLineHeight,
       
   982 				icfFont->FontMaxHeight(),
       
   983 				icfFont));
       
   984 */    
       
   985     }
       
   986 
       
   987 // --------------------------------------------------------------------------
       
   988 // CPeninputGenericVkbWindow::AddPopupWindowL
       
   989 // (other items were commented in a header)
       
   990 // --------------------------------------------------------------------------
       
   991 //
       
   992 void CPeninputGenericVkbWindow::AddPopupWindowL()
       
   993     {
       
   994     iPopupWnd = CPeninputCommonChoiceList::NewL( UiLayout(), 
       
   995         			EPeninutWindowCtrlIdAccentPopupWindow,
       
   996         			KAknsIIDQsnFrList,
       
   997         			KAknsIIDQsnFrPopupSub );
       
   998     
       
   999         
       
  1000    
       
  1001     iPopupWnd->AddEventObserver( UiLayout() );
       
  1002     
       
  1003     AddControlL( iPopupWnd );
       
  1004     iIdle = CIdle::NewL(CActive::EPriorityIdle );
       
  1005     iIdle ->Start(TCallBack(BackgroundTaskL,this));
       
  1006     }
       
  1007 
       
  1008 // --------------------------------------------------------------------------
       
  1009 // CPeninputGenericVkbWindow::PopupChoiceList
       
  1010 // (other items were commented in a header)
       
  1011 // --------------------------------------------------------------------------
       
  1012 //
       
  1013 void CPeninputGenericVkbWindow::PopupChoiceList()
       
  1014     {
       
  1015     if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
       
  1016         {
       
  1017         TRAP_IGNORE( PopupRangeListL());
       
  1018         }
       
  1019     else
       
  1020         {
       
  1021         CFepUiBaseCtrl* accentBtn = Control( EPeninutWindowCtrlIdAccentedBtn );
       
  1022         
       
  1023         if ( accentBtn )
       
  1024             {
       
  1025             if(!iPopupInited)
       
  1026                 TRAP_IGNORE(DoIdleConstructL());
       
  1027             iPopupWnd->Display( accentBtn->Rect() );
       
  1028             iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStatePopup );
       
  1029             }
       
  1030         }
       
  1031     }
       
  1032 // ---------------------------------------------------------------------------
       
  1033 // Show range list
       
  1034 // ---------------------------------------------------------------------------
       
  1035 //
       
  1036 void CPeninputGenericVkbWindow::PopupRangeListL()
       
  1037     {
       
  1038     if ( !iPopupInited )
       
  1039         {
       
  1040         TRAP_IGNORE( DoIdleConstructL() );
       
  1041         }
       
  1042     
       
  1043 
       
  1044     iPopupWnd->ClearItemsL();
       
  1045     RArray<CFepLayoutChoiceList::SItem> items;
       
  1046     PrepareRangeListItems( items );
       
  1047     TInt count = items.Count();
       
  1048     for ( TInt i = 0; i < count; i++ )
       
  1049         {
       
  1050         iPopupWnd->AddItemL( items[i] );
       
  1051         }
       
  1052     items.Close();
       
  1053 
       
  1054     if ( iPopupWnd->ItemsCount() < 1 ) 
       
  1055         {
       
  1056         return;
       
  1057         }
       
  1058     
       
  1059     if ( iPopupWnd->ItemsCount() < 2 )
       
  1060         {
       
  1061         const CFepLayoutChoiceList::SItem* item = iPopupWnd->ItemByIndex( 0 );
       
  1062         CFepLayoutChoiceList::SEvent event;
       
  1063         event.iIndex = 0;
       
  1064         event.iCommand = item->iCommand;
       
  1065         TPtrC ptr;
       
  1066         ptr.Set(reinterpret_cast<TText*>(&event), sizeof(event));
       
  1067         HandleRangeListSelectedL( iPopupWnd, ptr );
       
  1068         return;
       
  1069         }
       
  1070     
       
  1071     CFepUiBaseCtrl* btn = Control( EPeninutWindowCtrlIdMultiRangeBtn );    
       
  1072     iPopupWnd->SetListColumnNumWithLafL( iPopupWnd->ItemsCount() );    
       
  1073     iPopupWnd->SetCurrentFocusedIndex( - 1 ); //no active item
       
  1074     iPopupWnd->Display( btn->Rect() );
       
  1075     iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStatePopup );    
       
  1076     }
       
  1077 
       
  1078 // ---------------------------------------------------------------------------
       
  1079 // Handle range list event
       
  1080 // ---------------------------------------------------------------------------
       
  1081 //
       
  1082 void CPeninputGenericVkbWindow::HandleRangeListSelectedL( CFepUiBaseCtrl* /*aCtrl*/, 
       
  1083                                                        const TDesC& aData )
       
  1084     {
       
  1085     CFepLayoutChoiceList::SEvent* event = 
       
  1086         (CFepLayoutChoiceList::SEvent*)aData.Ptr();
       
  1087     
       
  1088     TInt index = -1;
       
  1089     TInt range = ERangeInvalid;
       
  1090 
       
  1091     if ( event->iCommand == EPeninputVkbLayoutNativeChar )
       
  1092         {
       
  1093         range = ERangeNative;
       
  1094         }
       
  1095 
       
  1096     else if ( event->iCommand == EPeninputVkbLayoutNativeNumber )
       
  1097         {
       
  1098         range = ERangeNativeNumber;
       
  1099         }
       
  1100     
       
  1101     else if ( event->iCommand == EPeninputVkbLayoutLatinChar )
       
  1102         {
       
  1103         range = ERangeEnglish;
       
  1104         }
       
  1105     
       
  1106     else if ( event->iCommand == EPeninputVkbLayoutLatinNumber )
       
  1107         {
       
  1108         range = ERangeNumber;
       
  1109         }
       
  1110     
       
  1111     else if ( event->iCommand == EPeninputVkbLayoutSymbol )
       
  1112         {
       
  1113         range = ERangeSymbol;
       
  1114         }
       
  1115 
       
  1116     else if ( event->iCommand == EPeninputVkbLayoutAccented1 )
       
  1117         {
       
  1118         index = 0;
       
  1119         range = ERangeAccent;
       
  1120         }
       
  1121     
       
  1122     else if ( event->iCommand == EPeninputVkbLayoutAccented2 )
       
  1123         {
       
  1124         index = 1;
       
  1125         range = ERangeAccent;
       
  1126         }
       
  1127     
       
  1128     else if ( event->iCommand == EPeninputVkbLayoutAccented3 )
       
  1129         {
       
  1130         index = 2;
       
  1131         range = ERangeAccent;
       
  1132         }
       
  1133         
       
  1134     TInt currentRange = IntContext( EPeninputDataTypeCurrentRange );
       
  1135     TInt currentAccent = IntContext( EPeninputDataTypeCurrentAccent );
       
  1136 
       
  1137     if ( currentRange == range )
       
  1138         {
       
  1139         if ( range != ERangeAccent || currentAccent == index )
       
  1140             {
       
  1141             iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
       
  1142             return;
       
  1143             }
       
  1144         }
       
  1145 
       
  1146     iLayoutContext->SetData( EPeninputDataTypeCurrentAccent, &index );
       
  1147 
       
  1148     if ( range != ERangeAccent )
       
  1149         {
       
  1150         ChangeRange( range );
       
  1151         }
       
  1152     else
       
  1153         {
       
  1154         ChangeRange( ERangeAccent, 
       
  1155                 EPeninputVkbLayoutAccented1 + 2 * index, ETrue );
       
  1156         }
       
  1157     UpdateRangeCtrlsL();
       
  1158     }
       
  1159 
       
  1160 // ---------------------------------------------------------------------------
       
  1161 // Update state of range button
       
  1162 // ---------------------------------------------------------------------------
       
  1163 //
       
  1164 void CPeninputGenericVkbWindow::UpdateRangeCtrlsL()
       
  1165     {
       
  1166     CAknFepCtrlCommonButton* rangeBtn = 
       
  1167         static_cast<CAknFepCtrlCommonButton*>( 
       
  1168                 Control(EPeninutWindowCtrlIdMultiRangeBtn));
       
  1169     if ( !rangeBtn )
       
  1170         {
       
  1171         return;
       
  1172         }
       
  1173     
       
  1174     RArray<CFepLayoutChoiceList::SItem> items;
       
  1175     PrepareRangeListItems( items );
       
  1176     TInt count = items.Count();
       
  1177     items.Close();
       
  1178     
       
  1179     TInt languageId = IntContext( EPeninputDataTypeInputLanguage );
       
  1180     TInt range = IntContext( EPeninputDataTypeCurrentRange );
       
  1181 
       
  1182     TInt resId = -1;
       
  1183     TInt aplhaRangeResId = -1;
       
  1184     TInt numberRangeResId = -1;
       
  1185     GetRangeIconResource( languageId, aplhaRangeResId, numberRangeResId );
       
  1186     
       
  1187     if ( range == ERangeEnglish || range == ERangeNative ) 
       
  1188         {
       
  1189         resId = aplhaRangeResId;
       
  1190         }
       
  1191     else
       
  1192         {
       
  1193         resId = numberRangeResId; 
       
  1194         }
       
  1195         
       
  1196     if( rangeBtn->ResourceId() != resId )
       
  1197     	{
       
  1198 		rangeBtn->SetResourceId( resId );
       
  1199 		rangeBtn->ConstructFromResourceL(); 
       
  1200     	}
       
  1201 
       
  1202     rangeBtn->SetDimmed( count < 1 );    
       
  1203     }
       
  1204 
       
  1205 // ---------------------------------------------------------------------------
       
  1206 // Get resource ids of range button icon
       
  1207 // ---------------------------------------------------------------------------
       
  1208 //
       
  1209 void CPeninputGenericVkbWindow::GetRangeIconResource( TInt aLangId, 
       
  1210                                                       TInt& aAlphaRange, 
       
  1211                                                       TInt& aOtherRange  )
       
  1212     {   
       
  1213     switch ( aLangId )
       
  1214         {
       
  1215         case ELangRussian:    //Cyrillic
       
  1216         case ELangBulgarian:
       
  1217         case ELangUkrainian:
       
  1218             {
       
  1219             aAlphaRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_CYRILLIC_ALPHA;
       
  1220             aOtherRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_CYRILLIC_NUMERIC;
       
  1221             }
       
  1222             break;
       
  1223         case ELangGreek:       //Greek
       
  1224         case ELangCyprusGreek:
       
  1225             {
       
  1226             aAlphaRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_GREEK_ALPHA;
       
  1227             aOtherRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_GREEK_NUMERIC;
       
  1228             }
       
  1229             break;        
       
  1230         case ELangHebrew:     //Hebrew
       
  1231             {
       
  1232             aAlphaRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_HEBREW_ALPHA;
       
  1233             aOtherRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_HEBREW_NUMERIC;
       
  1234             }
       
  1235             break;  
       
  1236         case ELangArabic:     //Arabic
       
  1237         case ELangFarsi:      //Farsi
       
  1238         case ELangUrdu:       //Urdu
       
  1239             {
       
  1240             aAlphaRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_ARABIC_ALPHA;
       
  1241             aOtherRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_ARABIC_NUMERIC;
       
  1242             }
       
  1243             break;
       
  1244         case ELangThai:       //Thai
       
  1245             {
       
  1246             aAlphaRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_THAI_ALPHA;
       
  1247             aOtherRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_THAI_NUMERIC;
       
  1248             }
       
  1249             break;
       
  1250         default:              //others       
       
  1251             {
       
  1252             aAlphaRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_LATIN_ALPHA;
       
  1253             aOtherRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_LATIN_NUMERIC;
       
  1254             }
       
  1255         }
       
  1256     }
       
  1257 
       
  1258 // ---------------------------------------------------------------------------
       
  1259 // Prepare range list items
       
  1260 // ---------------------------------------------------------------------------
       
  1261 //
       
  1262 void CPeninputGenericVkbWindow::PrepareRangeListItems( 
       
  1263                      RArray<CFepLayoutChoiceList::SItem>& aRangeItems )
       
  1264     {
       
  1265     aRangeItems.Reset();
       
  1266     TInt currentRange = IntContext( EPeninputDataTypeCurrentRange );
       
  1267     TInt permittedRange = IntContext( EPeninputDataTypePermittedRange );
       
  1268     TInt currentAccent = IntContext( EPeninputDataTypeCurrentAccent );
       
  1269     TInt currentLanguage = IntContext( EPeninputDataTypeInputLanguage );
       
  1270     
       
  1271     CPeninputRangeBarInfo* rbinfo= ConfigInfo()->RangeBarInfo();
       
  1272     CPeninputRangeInfo* rgninfo = NULL;
       
  1273    
       
  1274     //add accent items
       
  1275     if ( permittedRange & ERangeAccent )
       
  1276         {
       
  1277         rgninfo = rbinfo->FindRange( ERangeAccent );
       
  1278         if ( rgninfo )
       
  1279             {
       
  1280             for ( TInt i = 0; i < iAccentCmdList.Count(); i++ )
       
  1281                 {
       
  1282                 if( currentRange != ERangeAccent || currentAccent != i )
       
  1283                     {
       
  1284                     aRangeItems.Append( iAccentCmdList[i] );
       
  1285                     }
       
  1286                 }
       
  1287             }
       
  1288         }
       
  1289     
       
  1290     //add range items  
       
  1291     CFepLayoutChoiceList::SItem item;
       
  1292     
       
  1293     if ( permittedRange & ERangeNative )
       
  1294         {
       
  1295         rgninfo = rbinfo->FindRange( ERangeNative );
       
  1296         if ( rgninfo && currentRange != ERangeNative )
       
  1297             {
       
  1298             item.iCommand = EPeninputVkbLayoutNativeChar;
       
  1299             item.iText.Copy( iRangeLabels.iLabelNativeChar );
       
  1300             aRangeItems.Append( item );
       
  1301             }
       
  1302         }
       
  1303     
       
  1304     if (( permittedRange & ERangeNativeNumber ) && ( currentRange != ERangeNumber ) 
       
  1305     && (( ELangArabic == currentLanguage ) || ( ELangFarsi == currentLanguage ) 
       
  1306     || ( ELangUrdu == currentLanguage )))
       
  1307         {
       
  1308         rgninfo = rbinfo->FindRange( ERangeNativeNumber );
       
  1309         if ( rgninfo && currentRange != ERangeNativeNumber )
       
  1310             {
       
  1311             item.iCommand = EPeninputVkbLayoutNativeNumber;
       
  1312             item.iText.Copy( iRangeLabels.iLabelNativeNumber );
       
  1313             aRangeItems.Append( item );
       
  1314             }
       
  1315         }
       
  1316     else if(( permittedRange & ERangeNumber ) && ( currentRange != ERangeNumber ) 
       
  1317     		&& !(( ELangThai == currentLanguage ) && ( currentRange == ERangeNativeNumber )))
       
  1318        {
       
  1319        rgninfo = rbinfo->FindRange( ERangeNumber );
       
  1320        if ( rgninfo && currentRange != ERangeNumber )
       
  1321            {
       
  1322            item.iCommand = EPeninputVkbLayoutLatinNumber;
       
  1323            item.iText.Copy( iRangeLabels.iLabelLatinNumber );
       
  1324     	   aRangeItems.Append( item );
       
  1325     	   }
       
  1326         }
       
  1327     else
       
  1328       	{        
       
  1329             // Do nothing
       
  1330        }    
       
  1331    
       
  1332     if ( permittedRange & ERangeEnglish )
       
  1333         {
       
  1334         rgninfo = rbinfo->FindRange( ERangeEnglish );
       
  1335         if ( rgninfo && currentRange != ERangeEnglish )
       
  1336             {
       
  1337             item.iCommand = EPeninputVkbLayoutLatinChar;
       
  1338             item.iText.Copy( iRangeLabels.iLabelLatinChar );
       
  1339             aRangeItems.Append( item );
       
  1340             }
       
  1341         }
       
  1342     
       
  1343     }
       
  1344 
       
  1345 // ---------------------------------------------------------------------------
       
  1346 // Load range labels for range list
       
  1347 // ---------------------------------------------------------------------------
       
  1348 //
       
  1349 void CPeninputGenericVkbWindow::ConstructRangeLabelListL( TInt /*aLangId*/ )
       
  1350     {
       
  1351     iRangeLabels.iLabelNativeChar.Zero();
       
  1352     iRangeLabels.iLabelNativeNumber.Zero();
       
  1353     iRangeLabels.iLabelLatinChar.Zero();
       
  1354     iRangeLabels.iLabelLatinNumber.Zero();
       
  1355     iRangeLabels.iLabelSymbol.Zero();
       
  1356     iRangeLabels.iLabelAccent.Zero();
       
  1357     
       
  1358     TInt resid = R_PENINPUT_LAYOUT_VKB_RANGES;
       
  1359     
       
  1360     TResourceReader reader;   
       
  1361     CCoeEnv::Static()->CreateResourceReaderLC( reader, resid );
       
  1362     TPtrC ptr1 = reader.ReadTPtrC();
       
  1363     TPtrC ptr2 = reader.ReadTPtrC();
       
  1364     TPtrC ptr3 = reader.ReadTPtrC();
       
  1365     TPtrC ptr4 = reader.ReadTPtrC();
       
  1366     TPtrC ptr5 = reader.ReadTPtrC();
       
  1367     TPtrC ptr6 = reader.ReadTPtrC();
       
  1368     
       
  1369     iRangeLabels.iLabelNativeChar.Copy( ptr1 );
       
  1370     iRangeLabels.iLabelNativeNumber.Copy( ptr2 );
       
  1371     iRangeLabels.iLabelLatinChar.Copy( ptr3 );
       
  1372     iRangeLabels.iLabelLatinNumber.Copy( ptr4 );
       
  1373     iRangeLabels.iLabelSymbol.Copy( ptr5 );
       
  1374     iRangeLabels.iLabelAccent.Copy( ptr6 );
       
  1375     
       
  1376     CleanupStack::PopAndDestroy( 1 ); //reader        
       
  1377     }
       
  1378 
       
  1379 // ---------------------------------------------------------------------------
       
  1380 // Utils to get context value 
       
  1381 // ---------------------------------------------------------------------------
       
  1382 //
       
  1383 TInt CPeninputGenericVkbWindow::IntContext( TPeninputDataType aDataIndex )
       
  1384     {
       
  1385     return CPeninputDataConverter::AnyToInt( 
       
  1386                            iLayoutContext->RequestData( aDataIndex ));
       
  1387     }
       
  1388 
       
  1389 // --------------------------------------------------------------------------
       
  1390 // CPeninputGenericVkbWindow::ResetAccentButton
       
  1391 // (other items were commented in a header)
       
  1392 // --------------------------------------------------------------------------
       
  1393 //
       
  1394 void CPeninputGenericVkbWindow::ResetAccentButton()
       
  1395     {
       
  1396     TInt curRange = CPeninputDataConverter::AnyToInt
       
  1397         ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) );
       
  1398         
       
  1399     if ( iRangeBar )
       
  1400         {
       
  1401         iRangeBar->ActiveRange( curRange );
       
  1402         }        
       
  1403     }
       
  1404 
       
  1405 // --------------------------------------------------------------------------
       
  1406 // CPeninputGenericVkbWindow::PopupWindowSizeChange
       
  1407 // (other items were commented in a header)
       
  1408 // --------------------------------------------------------------------------
       
  1409 //
       
  1410 void CPeninputGenericVkbWindow::PopupWindowSizeChange()
       
  1411     {
       
  1412     if (CPeninputDataConverter::AnyToInt(
       
  1413         iLayoutContext->RequestData(EAkninputDataTypeSizeChanging)) || (!iPopupSet))
       
  1414     	{
       
  1415     	// if size changing, or popup window's property has not been set yet
       
  1416         TAknWindowLineLayout appWnd = AknLayoutScalable_Avkon::application_window(0).LayoutLine();
       
  1417         iAppWndRect = appWnd.Rect();
       
  1418     	
       
  1419         TAknWindowLineLayout mainPane = AknLayoutScalable_Avkon::main_pane(4).LayoutLine();
       
  1420         TAknLayoutRect mainPaneRect;
       
  1421         mainPaneRect.LayoutRect(iAppWndRect, mainPane);
       
  1422         
       
  1423         TAknWindowLineLayout choiceWnd = 
       
  1424                          AknLayoutScalable_Avkon::popup_choice_list_window(1).LayoutLine();
       
  1425         TAknLayoutRect choiceRect;
       
  1426         choiceRect.LayoutRect(mainPaneRect.Rect(), choiceWnd);
       
  1427         
       
  1428         iPopupItemRect = TRect(0, 0, choiceRect.Rect().Width(), 
       
  1429                          AknLayoutScalable_Avkon::list_single_choice_list_pane(0).LayoutLine().iH);
       
  1430         
       
  1431         iChoiceTextLayout = 
       
  1432                          AknLayoutScalable_Avkon::list_single_choice_list_pane_t1(1).LayoutLine();
       
  1433     	}
       
  1434     	
       
  1435     const CFont* font = AknLayoutUtils::FontFromId(iChoiceTextLayout.iFont, NULL);
       
  1436     iPopupWnd->SetFont(font);
       
  1437     iPopupWnd->SetItemRect(iPopupItemRect, iPopupItemRect);
       
  1438 
       
  1439     TInt leftMargin = iChoiceTextLayout.il;
       
  1440     
       
  1441     iPopupWnd->SetMarginAndBaseline(leftMargin, font->HeightInPixels());
       
  1442     
       
  1443     iPopupWnd->SetFontColor(AKN_LAF_COLOR_STATIC(iChoiceTextLayout.iC));
       
  1444 
       
  1445     AknIconUtils::SetSize(iPopupWndBgImg, TSize(iPopupItemRect.Width(), 
       
  1446                           iPopupItemRect.Height()*3), EAspectRatioNotPreserved);
       
  1447     AknIconUtils::SetSize(iPopupWndFocusImg, TSize(iPopupItemRect.Width(), 
       
  1448                           iPopupItemRect.Height()* 3), EAspectRatioNotPreserved);
       
  1449     
       
  1450     iPopupSet = ETrue;
       
  1451     }
       
  1452 
       
  1453 
       
  1454 // --------------------------------------------------------------------------
       
  1455 // CPeninputGenericVkbWindow::GetPopupWndInfoFromRes
       
  1456 // (other items were commented in a header)
       
  1457 // --------------------------------------------------------------------------
       
  1458 //
       
  1459 void CPeninputGenericVkbWindow::GetPopupWndInfoFromResL( TResourceReader aRes,
       
  1460                                                         const TRect& aRect )
       
  1461     {
       
  1462     TPtrC bmpFileName = aRes.ReadTPtrC();        
       
  1463     TInt32 imgMajorSkinId = aRes.ReadInt32();
       
  1464 
       
  1465     TAknsItemID id;
       
  1466     
       
  1467     MAknsSkinInstance* skininstance = UiLayout()->SkinInstance();
       
  1468 
       
  1469     TInt popWinBmpId = aRes.ReadInt16();
       
  1470     TInt popWinBmpMaskId = aRes.ReadInt16();
       
  1471     TInt popWinBmpSkinId = aRes.ReadInt16();
       
  1472     
       
  1473     id.Set( TInt( imgMajorSkinId ), popWinBmpSkinId );
       
  1474     
       
  1475     if ( popWinBmpId != KInvalidImg )
       
  1476     	{
       
  1477         AknsUtils::CreateIconL( skininstance,
       
  1478                                 id,
       
  1479                                 iPopupWndBgImg,
       
  1480                                 bmpFileName,
       
  1481                                 popWinBmpId );
       
  1482             
       
  1483     	AknIconUtils::SetSize( iPopupWndBgImg, TSize( aRect.Width(), 
       
  1484             aRect.Height() * 3 ), EAspectRatioNotPreserved );
       
  1485         iPopupWnd->SetBackgroundBitmapL( iPopupWndBgImg );
       
  1486     	}
       
  1487     	
       
  1488     TInt focusBmpId = aRes.ReadInt16();
       
  1489     TInt focusBmpMaskId = aRes.ReadInt16();
       
  1490     TInt focusBmpSkinId = aRes.ReadInt16();
       
  1491 
       
  1492     id.Set( TInt( imgMajorSkinId ), focusBmpSkinId );
       
  1493     
       
  1494     if ( focusBmpId != KInvalidImg )
       
  1495     	{
       
  1496         AknsUtils::CreateIconL( skininstance,
       
  1497                                 id,
       
  1498                                 iPopupWndFocusImg,
       
  1499                                 bmpFileName,
       
  1500                                 focusBmpId );
       
  1501 
       
  1502     	AknIconUtils::SetSize( iPopupWndFocusImg, TSize( aRect.Width(), 
       
  1503             aRect.Height() * 3 ), EAspectRatioNotPreserved );
       
  1504         iPopupWnd->SetFocusBmp( iPopupWndFocusImg );
       
  1505     	}
       
  1506     }
       
  1507       
       
  1508 // --------------------------------------------------------------------------
       
  1509 // CAknFepVkbClientArea::AddRangeBarL
       
  1510 // (other items were commented in a header)
       
  1511 // --------------------------------------------------------------------------
       
  1512 //
       
  1513 void CPeninputGenericVkbWindow::AddRangeBarL()
       
  1514     {
       
  1515     // Range bar
       
  1516     iRangeBar = CAknFepCtrlRangeBar::NewL( UiLayout(),
       
  1517         EPeninutWindowCtrlIdRangeBar, 
       
  1518         CAknFepCtrlRangeBar::EBtnGroupHorizontal );
       
  1519 
       
  1520     // Set event id    
       
  1521     iRangeBar->SetEventIdForRange( EPeninputLayoutEventRange );
       
  1522     iRangeBar->SetEventIdForCase( EPeninputLayoutEventRangeLoop );
       
  1523 
       
  1524     AddControlL( iRangeBar );
       
  1525     iRangeBar->AddEventObserver(UiLayout());    
       
  1526     }
       
  1527     
       
  1528 // --------------------------------------------------------------------------
       
  1529 // CPeninputGenericVkbWindow::AddButtonL
       
  1530 // (other items were commented in a header)
       
  1531 // --------------------------------------------------------------------------
       
  1532 //
       
  1533 CAknFepCtrlEventButton* CPeninputGenericVkbWindow::AddButtonL( 
       
  1534     const TInt aControlId, const TInt aEventId, const TInt aResId, 
       
  1535     const TInt aUnicode, const TBool aIsRepeat )
       
  1536     {
       
  1537     CAknFepCtrlEventButton* button = NULL;
       
  1538     
       
  1539     if ( aIsRepeat )
       
  1540         {
       
  1541         button = CAknFepCtrlRepeatButton::NewL( UiLayout(), aControlId, 
       
  1542             aEventId, aUnicode );
       
  1543         }
       
  1544     else
       
  1545         {
       
  1546         if ( aControlId == EPeninutWindowCtrlIdMultiRangeBtn )
       
  1547             {
       
  1548             button = CAknFepCtrlLongPressButton::NewL( UiLayout(), aControlId, 
       
  1549                 aEventId, aUnicode,
       
  1550                 KAknsIIDQsnFrFunctionButtonNormal,
       
  1551                 KAknsIIDQsnFrFunctionButtonPressed,
       
  1552                 KAknsIIDQsnFrFunctionButtonInactive );                
       
  1553             }
       
  1554         else
       
  1555             {
       
  1556             button = CAknFepCtrlEventButton::NewL( UiLayout(), aControlId, 
       
  1557                 aEventId, aUnicode,
       
  1558                 KAknsIIDQsnFrFunctionButtonNormal,
       
  1559                 KAknsIIDQsnFrFunctionButtonPressed,
       
  1560                 KAknsIIDQsnFrFunctionButtonInactive );        
       
  1561             }
       
  1562         }
       
  1563         
       
  1564     CleanupStack::PushL( button );  
       
  1565     if ( button )
       
  1566         {
       
  1567         // Read resource
       
  1568         TResourceReader reader;
       
  1569         
       
  1570         CCoeEnv::Static()->CreateResourceReaderLC( reader, aResId );  
       
  1571         button->SetResourceId( aResId );      
       
  1572         button->ConstructFromResourceL();  
       
  1573         // Pop and destroy reader
       
  1574         CleanupStack::PopAndDestroy( 1 );
       
  1575         
       
  1576         // Add into the control pool                                                   
       
  1577         AddControlL( button );
       
  1578         button->AddEventObserver(UiLayout());
       
  1579         
       
  1580         }
       
  1581     CleanupStack::Pop( button );  
       
  1582     	  
       
  1583     return button;
       
  1584     }
       
  1585 
       
  1586 // --------------------------------------------------------------------------
       
  1587 // CPeninputGenericVkbWindow::DoCaseChange
       
  1588 // (other items were commented in a header)
       
  1589 // --------------------------------------------------------------------------
       
  1590 //
       
  1591 void CPeninputGenericVkbWindow::DoCaseChange( TInt aNewCase )
       
  1592     {
       
  1593     TInt curCase = CPeninputDataConverter::AnyToInt
       
  1594         ( iLayoutContext->RequestData( EPeninputDataTypeCase ) );            
       
  1595     
       
  1596     if ( aNewCase == curCase )
       
  1597         {
       
  1598         return;
       
  1599         }
       
  1600         
       
  1601     TInt curRange = CPeninputDataConverter::AnyToInt
       
  1602         ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) ); 
       
  1603                                
       
  1604     if ((( curRange == ERangeAccent ) || ( ( curRange == ERangeEnglish ) 
       
  1605             || ( ( curRange == ERangeNative ) && ( ConfigInfo()->CaseSensitive()) ) ) ) )
       
  1606         {
       
  1607         // Set shift and caplock button
       
  1608         TInt shfit;  
       
  1609         TInt capslock;  
       
  1610         
       
  1611         CPeninputDataConverter::ShiftCapslockByCase( aNewCase, 
       
  1612             shfit, capslock );
       
  1613 
       
  1614         iLayoutContext->SetData( EPeninputDataTypeShiftDown, &shfit );
       
  1615         //ChangeButtonStatus( shfit, EPeninutWindowCtrlIdShiftBtn );          
       
  1616         iLayoutContext->SetData( EPeninputDataTypeCapslockDown, &capslock );        
       
  1617         //ChangeButtonStatus( capslock, EPeninutWindowCtrlIdCapslockBtn );
       
  1618         iLayoutContext->SetData( EPeninputDataTypeCase, &aNewCase ); 
       
  1619         ChangeMergedButtonStatus( shfit, capslock );
       
  1620         
       
  1621         TInt vkblayout = ConfigInfo()->ShiftCapsSingleVkbLayoutByCase
       
  1622             ( curRange, aNewCase );
       
  1623 
       
  1624         if ( curRange == ERangeAccent ) 
       
  1625            {
       
  1626            TInt curAccentIndex = CPeninputDataConverter::AnyToInt
       
  1627                ( iLayoutContext->RequestData( EPeninputDataTypeCurrentAccent ) );
       
  1628                  vkblayout = vkblayout + curAccentIndex * 2;
       
  1629            }
       
  1630         
       
  1631         ChangeVkbLayout( vkblayout );
       
  1632         }
       
  1633     }
       
  1634 
       
  1635 // ---------------------------------------------------------------------------
       
  1636 // CPeninputGenericVkbWindow::BackgroundConstructL
       
  1637 // Do background construct.
       
  1638 // ---------------------------------------------------------------------------
       
  1639 //
       
  1640 TInt CPeninputGenericVkbWindow::BackgroundTaskL(TAny* aPtr)
       
  1641     {
       
  1642     CPeninputGenericVkbWindow* self = static_cast<CPeninputGenericVkbWindow*>(aPtr);
       
  1643     self->DoIdleConstructL();
       
  1644     return EFalse; // only run once
       
  1645     }
       
  1646 
       
  1647 
       
  1648 void CPeninputGenericVkbWindow::DoIdleConstructL()
       
  1649     {   
       
  1650     if(iPopupInited)
       
  1651         return;
       
  1652     
       
  1653 
       
  1654     // Read resource
       
  1655     TResourceReader reader;
       
  1656     
       
  1657     CCoeEnv::Static()->CreateResourceReaderLC( reader, 
       
  1658         R_PENINPUT_LAYOUT_VKB_POPUP_WINDOW ); 
       
  1659         
       
  1660     GetPopupWndInfoFromResL(reader, iPopupItemRect);    
       
  1661        
       
  1662     // Pop and destroy reader
       
  1663     CleanupStack::PopAndDestroy( 1 );
       
  1664 
       
  1665     }
       
  1666     
       
  1667 // -----------------------------------------------------------------------------
       
  1668 // CPeninputGenericVkbWindow::ConstructFromResourceL
       
  1669 // (other items were commented in a header).
       
  1670 // -----------------------------------------------------------------------------
       
  1671 //
       
  1672 void CPeninputGenericVkbWindow::ConstructFromResourceL()
       
  1673     {     	        
       
  1674     CPeninputLayoutWindowExt::ConstructFromResourceL();
       
  1675     if( iVkbLayout && !iFirstConstruct )
       
  1676     	{
       
  1677     	if( iVkbCtrl->IsIrregularKeyBoard() )    	
       
  1678     		iVkbLayout->ConstructFromIrregularResourceL();
       
  1679     	else
       
  1680     		iVkbLayout->ConstructFromNonIrregularResourceL();
       
  1681     	
       
  1682     	//SetVkbLayoutSize();
       
  1683     	
       
  1684     	if( IsRtoLLanguage( iLanguage ) )
       
  1685     		{
       
  1686 			//Mirror backspace graphic
       
  1687 			HandleButtonResOnLangDirChange( EPeninutWindowCtrlIdBackspaceBtn );    			
       
  1688     		}
       
  1689     	}
       
  1690     	
       
  1691     iFirstConstruct = EFalse;
       
  1692     }
       
  1693     
       
  1694 // -----------------------------------------------------------------------------
       
  1695 // CPeninputGenericVkbWindow::SetSwitchlistLanguage
       
  1696 // (other items were commented in a header).
       
  1697 // -----------------------------------------------------------------------------
       
  1698 //
       
  1699 void  CPeninputGenericVkbWindow::SetSwitchlistLanguage(TInt aLang)
       
  1700     {
       
  1701     ASSERT( IsValidLanguage( aLang ) );
       
  1702     //Check language input direction change
       
  1703     TBool isLangDirectionChange = EFalse;
       
  1704     if( IsValidLanguage( iLanguage ) )
       
  1705     	isLangDirectionChange =  IsRtoLLanguage( aLang ) ^ IsRtoLLanguage( iLanguage );    
       
  1706     else
       
  1707     	isLangDirectionChange = IsRtoLLanguage( aLang );
       
  1708     
       
  1709     if( aLang ==ELangHebrew || 
       
  1710 	    aLang == ELangGreek ||
       
  1711 		aLang == ELangHindi ||
       
  1712 		aLang == ELangMarathi ) 
       
  1713 		{
       
  1714 		iLafMgr->SetLafOption( (TPeninputVkbLafOption)
       
  1715 							   ( iLafMgr->OptionType() &(~EOption3CellRange) ) );	
       
  1716 		}
       
  1717 	else
       
  1718 		{
       
  1719 		iLafMgr->SetLafOption( (TPeninputVkbLafOption)
       
  1720 				   ( iLafMgr->OptionType() | EOption3CellRange) );	
       
  1721 		}
       
  1722 			
       
  1723 	if( isLangDirectionChange )
       
  1724 		{
       
  1725 		//Mirror backspace graphic
       
  1726 		HandleButtonResOnLangDirChange( EPeninutWindowCtrlIdBackspaceBtn );
       
  1727 		}
       
  1728 			
       
  1729 	iLanguage = aLang;	
       
  1730     }
       
  1731 
       
  1732 // -----------------------------------------------------------------------------
       
  1733 // CPeninputGenericVkbWindow::SetSwitchlistSecretFlag
       
  1734 // (other items were commented in a header).
       
  1735 // -----------------------------------------------------------------------------
       
  1736 //    
       
  1737 void  CPeninputGenericVkbWindow::SetSwitchlistSecretFlag(TBool aSecret)
       
  1738     {
       
  1739     CPeninputLayoutInputmodelChoice* choiceList = 
       
  1740         static_cast<CPeninputLayoutInputmodelChoice*>( 
       
  1741             Control(EPeninutWindowCtrlIdSwitcherPopupWindow ));
       
  1742         
       
  1743     if ( choiceList )
       
  1744         {
       
  1745         choiceList->SetSecretEditor( aSecret );
       
  1746         }
       
  1747 	//disable or enable arrow keys of FSQ in secret editor.    	
       
  1748     }
       
  1749     
       
  1750 // ---------------------------------------------------------------------------
       
  1751 // CPeninputGenericVkbWindow::DimArrowKeys
       
  1752 // (other items were commented in a header).
       
  1753 // ---------------------------------------------------------------------------
       
  1754 //
       
  1755 void CPeninputGenericVkbWindow::DimArrowKeys( TBool aDimArrow )
       
  1756     {
       
  1757     if(iLayoutContext->LayoutType() == EPluginInputModeFSQ 
       
  1758        && iArrowLeftButton && iArrowRightButton)
       
  1759         {
       
  1760         iArrowLeftButton->SetDimmed( aDimArrow );
       
  1761         iArrowRightButton->SetDimmed( aDimArrow );
       
  1762         }	    	
       
  1763     }
       
  1764 
       
  1765 void CPeninputGenericVkbWindow::DimEnterKey( TBool aDimmed )
       
  1766     {
       
  1767 	CAknFepCtrlEventButton* enterBtn = static_cast<CAknFepCtrlEventButton*>
       
  1768 	                              ( Control(EPeninutWindowCtrlIdEnterBtn) );	
       
  1769     if(iLayoutContext->LayoutType() == EPluginInputModeFSQ 
       
  1770        && enterBtn )
       
  1771         {
       
  1772         enterBtn->SetDimmed( aDimmed );        
       
  1773         }
       
  1774     }
       
  1775 
       
  1776 // ---------------------------------------------------------------------------
       
  1777 // CAknFepVkbWindow::PopupAccentWindow
       
  1778 // (other items were commented in a header).
       
  1779 // ---------------------------------------------------------------------------
       
  1780 //
       
  1781 void CPeninputGenericVkbWindow::PopupSwitchWindowL()
       
  1782     {
       
  1783     CFepUiBaseCtrl* accentBtn = Control(EPeninutWindowCtrlIdSwitchToHwrBtn);
       
  1784 
       
  1785     if ( accentBtn )
       
  1786         {
       
  1787         if (!iPopupInited)
       
  1788             {
       
  1789         	  DoIdleConstructL();
       
  1790             }
       
  1791         TRect rect = accentBtn->Rect();   
       
  1792 		static_cast<CPeninputLayoutInputmodelChoice*>
       
  1793 		    	(Control(EPeninutWindowCtrlIdSwitcherPopupWindow))->PopUpSwitchListL( accentBtn->Rect() );
       
  1794         }         
       
  1795     }
       
  1796 
       
  1797 // ---------------------------------------------------------------------------
       
  1798 // CPeninputGenericVkbWindow::SetDeadKey
       
  1799 // (Set DeadKey)
       
  1800 // ---------------------------------------------------------------------------
       
  1801 //     
       
  1802 void CPeninputGenericVkbWindow::SetDeadKey()
       
  1803     {
       
  1804     // Get VKB list
       
  1805     RPointerArray<CPeninputVkbLayoutInfo> vkbListInfo;
       
  1806     vkbListInfo = iVkbLayout->VkbLayoutInfoList();
       
  1807     TInt vkbListNum = vkbListInfo.Count();
       
  1808     
       
  1809     CPeninputVkbKeyInfo* pVKBKeyInfo;
       
  1810     CVirtualKey* pKey;
       
  1811     TInt count = sizeof(KSupportLanguages)/sizeof(TLangMeritPair);
       
  1812     for(TInt i = 0; i < vkbListNum; i++)
       
  1813         {
       
  1814         for(TInt j = 0; j < count; j++)
       
  1815             {
       
  1816             if(vkbListInfo[i]->LayoutID() == EPeninputVkbLayoutNativeChar ||
       
  1817                vkbListInfo[i]->LayoutID() == EPeninputVkbLayoutNativeCharShift)
       
  1818                 {
       
  1819                 pVKBKeyInfo = vkbListInfo[i]->FindKey( KSupportLanguages[j].iDeadKey );
       
  1820                 if(pVKBKeyInfo)
       
  1821                     {
       
  1822                     // Set the DeadKey as a latch button
       
  1823                     pKey = pVKBKeyInfo->Key();
       
  1824                     pKey->SetLatchKey(ETrue);
       
  1825                     }
       
  1826                 }
       
  1827             }
       
  1828         }
       
  1829     }
       
  1830     
       
  1831     
       
  1832 // ---------------------------------------------------------------------------
       
  1833 // CPeninputGenericVkbWindow::UnLatchDeadKey
       
  1834 // (Unlatch the DeadKey)
       
  1835 // ---------------------------------------------------------------------------
       
  1836 //     
       
  1837 void CPeninputGenericVkbWindow::UnLatchDeadKey( const TDesC& abuf )
       
  1838     {
       
  1839     RPointerArray<CPeninputVkbLayoutInfo> vkbListInfo;
       
  1840     vkbListInfo = iVkbLayout->VkbLayoutInfoList();
       
  1841     TInt vkbListNum = vkbListInfo.Count();
       
  1842     
       
  1843     CPeninputVkbKeyInfo* pVKBKeyInfo;
       
  1844     CVirtualKey* pKey;
       
  1845     TInt count = sizeof(KSupportLanguages)/sizeof(TLangMeritPair);
       
  1846     for(TInt i = 0; i < vkbListNum; i++)
       
  1847         {
       
  1848         for(TInt j = 0; j < count; j++)
       
  1849             {
       
  1850             // Only NativeChar and NativeCharShift layout contain DeadKey
       
  1851             if(vkbListInfo[i]->LayoutID() == EPeninputVkbLayoutNativeChar ||
       
  1852                vkbListInfo[i]->LayoutID() == EPeninputVkbLayoutNativeCharShift)
       
  1853                 {
       
  1854                 // Find the DeadKey in NativeChar or NativeCharShift layout
       
  1855                 pVKBKeyInfo = vkbListInfo[i]->FindKey( KSupportLanguages[j].iDeadKey );
       
  1856                 if(pVKBKeyInfo)
       
  1857                     {
       
  1858                     pKey = pVKBKeyInfo->Key();
       
  1859                     if(pKey->Latched())
       
  1860                         {
       
  1861                         if(abuf == KNullDesC)
       
  1862                             {
       
  1863                             // When focus change, the latched key will be released
       
  1864                             TBool deadKeyChange = EFalse;
       
  1865                             iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange);
       
  1866                             pKey->SetLatched(EFalse);
       
  1867                             TRect rect = pKey->Rect();
       
  1868                             rect.Move( iVkbCtrl->Rect().iTl );
       
  1869                             UpdateArea( rect, EFalse ); 
       
  1870                             return;
       
  1871                             }
       
  1872                         if(abuf[0] == KSupportLanguages[j].iDeadKey)
       
  1873                             {
       
  1874                             // When another DeadKey is clicked, the old one will be released
       
  1875                             pKey->SetLatched(EFalse);
       
  1876                             TRect rect = pKey->Rect();
       
  1877                             rect.Move( iVkbCtrl->Rect().iTl );
       
  1878                             UpdateArea( rect, EFalse ); 
       
  1879                             return;
       
  1880                             }
       
  1881                         }
       
  1882                     }
       
  1883                 }
       
  1884             }
       
  1885         }
       
  1886     }
       
  1887 
       
  1888 // ---------------------------------------------------------------------------
       
  1889 // CPeninputGenericVkbWindow::HandleAccentCharEvent
       
  1890 // (Unlatch the DeadKey)
       
  1891 // ---------------------------------------------------------------------------
       
  1892 //     
       
  1893 TBool CPeninputGenericVkbWindow::HandleAccentCharEvent( TInt /*aEventType*/, 
       
  1894                                                     const TDesC& aEventData, 
       
  1895                                                     const TDesC& aDeadKey, 
       
  1896                                                     HBufC* anewCharBuf )
       
  1897     {
       
  1898     // Get the unicode of virtual key char
       
  1899     TBuf<16> buf;
       
  1900     TKeyEvent* event = (TKeyEvent*) aEventData.Ptr();
       
  1901     buf.Append(event->iCode);
       
  1902     TBool rs = EFalse;
       
  1903     
       
  1904     // Caculate the accent char number
       
  1905     TInt count = sizeof(KSupportLanguages)/sizeof(TLangMeritPair);
       
  1906     TInt i = 0; 
       
  1907     if(aDeadKey.Compare( KNullDesC ) != 0) // One DeadKey is latched
       
  1908         {
       
  1909         for(i = 0; i < count; i++)
       
  1910             {
       
  1911             if((aDeadKey[0] == KSupportLanguages[i].iDeadKey) && 
       
  1912                (buf[0] == KSupportLanguages[i].iChar))
       
  1913                 {
       
  1914                 if(anewCharBuf)
       
  1915                     {                    
       
  1916                     anewCharBuf->Des().Append(KSupportLanguages[i].iAccentedChar);
       
  1917                     rs = ETrue;
       
  1918                     }
       
  1919                 break;
       
  1920                 }
       
  1921             }
       
  1922         }
       
  1923     return rs;
       
  1924     }
       
  1925     
       
  1926  
       
  1927 // ---------------------------------------------------------------------------
       
  1928 // CPeninputGenericVkbWindow::HandleVirtualKeyLatchedEvent
       
  1929 // (Handle virtual key latched event).
       
  1930 // ---------------------------------------------------------------------------
       
  1931 //
       
  1932 void CPeninputGenericVkbWindow::HandleVirtualKeyLatchedEvent(TInt /*aEventType*/, 
       
  1933                                                          CFepUiBaseCtrl* /*aCtrl*/, 
       
  1934                                                          const TDesC& aEventData )
       
  1935     {
       
  1936     TBuf<16> deadKey(KNullDesC);
       
  1937     TKeyEvent* event = (TKeyEvent*) aEventData.Ptr();
       
  1938     deadKey.Append(event->iCode);
       
  1939 
       
  1940     TInt latchedFlag = CPeninputDataConverter::AnyToInt(
       
  1941                        iLayoutContext->RequestData(EAkninputDataTypeLatchedSet));
       
  1942     if(latchedFlag)
       
  1943         {
       
  1944         // Update the new and old DeadKey buffer
       
  1945         iOldDeadKeyBuf = iNewDeadKeyBuf;
       
  1946         iNewDeadKeyBuf = deadKey;
       
  1947 
       
  1948         HBufC* newCharBuf = HBufC::New( 2*iOldDeadKeyBuf.Length() );
       
  1949         if( newCharBuf )
       
  1950             {
       
  1951             CPeninputGenericVkbLayout* layout 
       
  1952                     = static_cast<CPeninputGenericVkbLayout*>( UiLayout() );
       
  1953             if( layout->IsEnableITIOnFSQ() )
       
  1954                 {
       
  1955                 // If ITI is open, double same keys should be send for one dead key,
       
  1956                 // core will handle them as one key.
       
  1957                 newCharBuf->Des().Append( iOldDeadKeyBuf );
       
  1958                 }
       
  1959             newCharBuf->Des().Append( iOldDeadKeyBuf );
       
  1960             }
       
  1961         
       
  1962         // Submit old DeadKey
       
  1963         UiLayout()->SignalOwner(ESignalKeyEvent, *newCharBuf);
       
  1964         delete newCharBuf;                     
       
  1965      
       
  1966         // Unlatch the previous DeadKey
       
  1967         UnLatchDeadKey(iOldDeadKeyBuf);
       
  1968         
       
  1969 
       
  1970         }
       
  1971     else
       
  1972         {
       
  1973         iNewDeadKeyBuf = deadKey;
       
  1974         
       
  1975         // Set DeadKey state to latched
       
  1976         TBool deadKeyChange = ETrue;
       
  1977         iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange);
       
  1978         }
       
  1979     }
       
  1980 
       
  1981 // ---------------------------------------------------------------------------
       
  1982 // CPeninputCommonLayout::HandleVirtualKeyUpEvent
       
  1983 // (Handle virtual key up event).
       
  1984 // ---------------------------------------------------------------------------
       
  1985 //
       
  1986 TBool CPeninputGenericVkbWindow::HandleVirtualKeyUpEvent(TInt aEventType, 
       
  1987                                                     CFepUiBaseCtrl* /*aCtrl*/, 
       
  1988                                                     const TDesC& aEventData )
       
  1989     {
       
  1990     // Get DeadKey state
       
  1991     TInt latchedFlag = CPeninputDataConverter::AnyToInt(
       
  1992                        iLayoutContext->RequestData(EAkninputDataTypeLatchedSet));
       
  1993     if(latchedFlag)
       
  1994         {
       
  1995         TBool ret = EFalse;
       
  1996         
       
  1997         TRAP_IGNORE(ret = HandleDeadKeyL(aEventType,aEventData))
       
  1998         
       
  1999         if(ret)
       
  2000         	{
       
  2001         	return ETrue;	
       
  2002         	}
       
  2003         else
       
  2004             {
       
  2005             // When the DeadKey can not combine with current character,
       
  2006             // Sumit current DeadKey
       
  2007             UiLayout()->SignalOwner( ESignalKeyEvent, iNewDeadKeyBuf );
       
  2008             }
       
  2009         }
       
  2010         
       
  2011     iNewDeadKeyBuf = KNullDesC;
       
  2012     return EFalse;
       
  2013     } 
       
  2014  
       
  2015  TBool CPeninputGenericVkbWindow::HandleDeadKeyL(TInt aEventType, 
       
  2016                                                  const TDesC& aEventData )
       
  2017  	{
       
  2018     // Set DeadKey to unlatched state
       
  2019     TBool deadKeyChange = EFalse;
       
  2020     iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange);
       
  2021     UnLatchDeadKey(iNewDeadKeyBuf);
       
  2022 
       
  2023     CPeninputGenericVkbLayout* layout 
       
  2024                       = static_cast<CPeninputGenericVkbLayout*>( UiLayout() );
       
  2025  	if ( layout->IsEnableITIOnFSQ() )
       
  2026  		{
       
  2027  	    TBuf<KKeyCodeSize> buf;
       
  2028  	    TKeyEvent* event = (TKeyEvent*) aEventData.Ptr();
       
  2029  	    buf.Append(event->iCode);
       
  2030 
       
  2031 		HBufC* newCharBuf = HBufC::New( iNewDeadKeyBuf.Length() + buf.Length() );
       
  2032 		if( newCharBuf )
       
  2033 			{
       
  2034 			newCharBuf->Des().Append( iNewDeadKeyBuf );
       
  2035 			newCharBuf->Des().Append( buf );
       
  2036 			}
       
  2037  	    
       
  2038         // Submit DeadKey + Key at the same time
       
  2039         UiLayout()->SignalOwner(ESignalKeyEvent,*newCharBuf);
       
  2040 		
       
  2041         delete newCharBuf;
       
  2042  		
       
  2043  		return ETrue;
       
  2044  		}
       
  2045  	
       
  2046     // Get the accent char
       
  2047     HBufC* newCharBuf = HBufC::NewL(1);
       
  2048     if(HandleAccentCharEvent(aEventType, 
       
  2049                              aEventData, 
       
  2050                              iNewDeadKeyBuf, 
       
  2051                              newCharBuf))
       
  2052         {
       
  2053         // Send ths accent key to FEP
       
  2054         UiLayout()->SignalOwner( ESignalKeyEvent, *newCharBuf);
       
  2055         iNewDeadKeyBuf = KNullDesC;
       
  2056         delete newCharBuf;
       
  2057         return ETrue;
       
  2058         }
       
  2059     delete newCharBuf;
       
  2060     
       
  2061     return EFalse; 		
       
  2062  	}
       
  2063  
       
  2064 void CPeninputGenericVkbWindow::SetLafLayOut(TInt aRows, TInt aColumns)
       
  2065     {
       
  2066     iLafMgr->SetLayoutType(iLafMgr->LayoutTypeFromRowsColumns(aRows,aColumns));
       
  2067     }
       
  2068 
       
  2069     
       
  2070 void CPeninputGenericVkbWindow::AddCustomControlGroupL(CFepUiBaseCtrl* aCtrl)
       
  2071 	{
       
  2072 	AddControlL(aCtrl);
       
  2073 	}    
       
  2074 
       
  2075 TBool CPeninputGenericVkbWindow::CreateCustomControlL( TInt16 aControlId, TInt32 aImageId )
       
  2076 	{
       
  2077 	TBool create = ETrue;
       
  2078     switch ( aControlId )
       
  2079         {
       
  2080         case EPeninutWindowCtrlIdMoveBtn:
       
  2081             {
       
  2082             if ( !iMoveButton )
       
  2083                 {
       
  2084                 iMoveButton = CAknFepCtrlDragButton::NewL(UiLayout(), EPeninutWindowCtrlIdMoveBtn);
       
  2085                 AddControlL(iMoveButton);
       
  2086                 iMoveButton->AddPositionObserver(this);
       
  2087                 iMoveButton->AddEventObserver( UiLayout() );
       
  2088                 iMoveButton->SetResourceId( aImageId );
       
  2089                 iMoveButton->SetImageFrameId(KAknsIIDQsnFrFunctionButtonNormal,
       
  2090         									  KAknsIIDQsnFrFunctionButtonPressed,
       
  2091         									  KAknsIIDQsnFrFunctionButtonInactive);
       
  2092                 UiLayout()->EnableLayoutMoving( static_cast<CDragBar*>( iMoveButton ) );
       
  2093                 }
       
  2094             iMoveButton->ConstructFromResourceL();
       
  2095             }
       
  2096             break;
       
  2097         case EPeninupWindowCtrlIdArrowLeftBtn:
       
  2098             {
       
  2099             if ( iLayoutContext->LayoutType() != EPluginInputModeFSQ )
       
  2100                 {
       
  2101                 break;
       
  2102                 }
       
  2103 
       
  2104             if (!iArrowLeftButton)
       
  2105                 {
       
  2106                 
       
  2107 	            iArrowLeftButton = CAknFepCtrlRepeatButton::NewL( 
       
  2108 	                UiLayout(), aControlId, EPeninputLayoutEventLeftArrow, EKeyLeftArrow, 
       
  2109 	            								  KAknsIIDQsnFrFunctionButtonNormal,
       
  2110 	        									  KAknsIIDQsnFrFunctionButtonPressed,
       
  2111 	        									  KAknsIIDQsnFrFunctionButtonInactive );
       
  2112 
       
  2113                 AddControlL(iArrowLeftButton);
       
  2114                 iArrowLeftButton->AddEventObserver(UiLayout());
       
  2115                 iArrowLeftButton->SetResourceId( aImageId );
       
  2116                 }
       
  2117 
       
  2118             iArrowLeftButton->ConstructFromResourceL();
       
  2119             }
       
  2120             break;
       
  2121         case EPeninupWindowCtrlIdArrowRightBtn:
       
  2122             {
       
  2123             if ( iLayoutContext->LayoutType() != EPluginInputModeFSQ )
       
  2124                 {
       
  2125                 break;
       
  2126                 }
       
  2127 
       
  2128             if (!iArrowRightButton)
       
  2129                 {
       
  2130 	            iArrowRightButton = CAknFepCtrlRepeatButton::NewL( 
       
  2131 	                UiLayout(), aControlId, EPeninputLayoutEventRightArrow, EKeyRightArrow, 
       
  2132 	            								  KAknsIIDQsnFrFunctionButtonNormal,
       
  2133 	        									  KAknsIIDQsnFrFunctionButtonPressed,
       
  2134 	        									  KAknsIIDQsnFrFunctionButtonInactive );
       
  2135 
       
  2136                 AddControlL(iArrowRightButton);
       
  2137                 iArrowRightButton->AddEventObserver(UiLayout());
       
  2138                 iArrowRightButton->SetResourceId( aImageId );
       
  2139 
       
  2140                 }
       
  2141             iArrowRightButton->ConstructFromResourceL();
       
  2142             }
       
  2143             break;
       
  2144         default:
       
  2145             {
       
  2146             create = EFalse;
       
  2147             }
       
  2148         }
       
  2149         return create;
       
  2150     }
       
  2151     
       
  2152 void CPeninputGenericVkbWindow::SetPromptTextL(TUint8* aData)
       
  2153     {
       
  2154     RDesReadStream readStream;
       
  2155 
       
  2156     TPtr8 countPtr(aData, 2*sizeof(TInt), 2*sizeof(TInt));
       
  2157 	  readStream.Open(countPtr);
       
  2158 	  CleanupClosePushL(readStream);
       
  2159     const TInt dataCount = readStream.ReadInt32L();
       
  2160 	  const TInt textCount = readStream.ReadInt32L();
       
  2161     CleanupStack::PopAndDestroy(&readStream);
       
  2162     
       
  2163     TPtr8 ptr( aData+2*sizeof(TInt), dataCount+textCount, dataCount+textCount );            
       
  2164 	  readStream.Open(ptr);
       
  2165 	  CleanupClosePushL(readStream);
       
  2166 	
       
  2167 	  HBufC8* dataBuf = HBufC8::NewLC(dataCount);
       
  2168 	  TPtr8 dataBufPtr = dataBuf->Des();
       
  2169 	  readStream.ReadL(dataBufPtr, dataCount);
       
  2170 
       
  2171     TFepPromptText* pIcfData = 
       
  2172         reinterpret_cast<TFepPromptText*>(const_cast<TUint8*>(dataBufPtr.Ptr()));
       
  2173 
       
  2174     HBufC* textBuf;
       
  2175     if (textCount > 0)
       
  2176         {
       
  2177         textBuf = HBufC::NewLC(textCount/2);
       
  2178     	  TPtr textBufPtr = textBuf->Des();
       
  2179     	  readStream.ReadL(textBufPtr, textCount/2);
       
  2180         static_cast<CFepLayoutMultiLineIcf*>
       
  2181             (Control(EPeninputWindowCtrlIdMultiLineICF))->SetPromptTextL
       
  2182                 (textBuf->Des(), pIcfData->iCleanContent);
       
  2183         CleanupStack::PopAndDestroy(textBuf);
       
  2184         }
       
  2185     else
       
  2186         {
       
  2187         static_cast<CFepLayoutMultiLineIcf*>
       
  2188             (Control(EPeninputWindowCtrlIdMultiLineICF))->SetPromptTextL(KNullDesC, pIcfData->iCleanContent);
       
  2189         }
       
  2190 
       
  2191     CleanupStack::PopAndDestroy(dataBuf);
       
  2192 	CleanupStack::PopAndDestroy(&readStream);
       
  2193     }    
       
  2194 
       
  2195 void CPeninputGenericVkbWindow::UpdateLafData()
       
  2196     {
       
  2197     TRAP_IGNORE( iLafMgr->UpdateLafDataL() );
       
  2198     }
       
  2199 
       
  2200 void CPeninputGenericVkbWindow::ReorgnizeICFAndButtons()
       
  2201 	{
       
  2202     TRect rect;
       
  2203     
       
  2204     TPoint winPoint = Rect().iTl;
       
  2205     TPoint LafPoint = iLafMgr->EntirePaneRect().iTl;
       
  2206     
       
  2207     TInt x = winPoint.iX - LafPoint.iX;
       
  2208     TInt y = winPoint.iY - LafPoint.iY;    
       
  2209     if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
       
  2210         {
       
  2211         x = 0;
       
  2212         y = 0;
       
  2213         }
       
  2214         
       
  2215     TRect inRect;
       
  2216     TRect exRect;
       
  2217     
       
  2218    
       
  2219     rect = iLafMgr->ICFRect();
       
  2220     rect.Move(x, y);
       
  2221     
       
  2222     CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
       
  2223                                   (Control(EPeninputWindowCtrlIdMultiLineICF));
       
  2224 
       
  2225     const CFont* icfFont = iLafMgr->ICFTextFont();
       
  2226     
       
  2227     // set icf margin
       
  2228     TPeninputICFConfig icfConfig;
       
  2229     iLafMgr->GetICFConfig( icfConfig );
       
  2230     icf->SetTextMargin( icfConfig.iLeftMargin,
       
  2231     					icfConfig.iRightMargin,
       
  2232     					icfConfig.iTopMargin,
       
  2233     					0 );    			
       
  2234     icf->SetLineSpace( icfConfig.iLineSpaceMargin );
       
  2235     TRAP_IGNORE(icf->SizeChangedL( 
       
  2236           		rect, 
       
  2237 				icfConfig.iTextLineHeight,
       
  2238 				icfFont->FontMaxHeight(),
       
  2239 				icfFont));
       
  2240 
       
  2241     if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
       
  2242         {
       
  2243         iLafMgr->GetButtonRect( 
       
  2244                 EPeninutWindowCtrlIdMultiRangeBtn, exRect, inRect );
       
  2245         exRect.Move(x, y); 
       
  2246         inRect.Move(x, y);
       
  2247         static_cast<CAknFepCtrlEventButton*>
       
  2248             ( Control( EPeninutWindowCtrlIdMultiRangeBtn ))->SizeChanged( 
       
  2249               exRect, inRect, ETrue );
       
  2250             
       
  2251         TRAP_IGNORE( icf->MsgBubbleCtrl()->SetTextL( KEmptyString ));
       
  2252         iIndiWithText = EFalse;
       
  2253         IndiBubbleWithoutText();
       
  2254         }
       
  2255     
       
  2256     iLafMgr->GetButtonRect(EPeninutWindowCtrlIdOptionBtn,exRect ,inRect);
       
  2257     exRect.Move(x, y); 
       
  2258     inRect.Move(x, y);
       
  2259     static_cast<CAknFepCtrlEventButton*>
       
  2260         ( Control( EPeninutWindowCtrlIdOptionBtn ) )->SizeChanged( exRect, inRect, ETrue );
       
  2261 
       
  2262     iLafMgr->GetButtonRect(EPeninutWindowCtrlIdCloseBtn,exRect ,inRect);
       
  2263     exRect.Move(x, y); 
       
  2264     inRect.Move(x, y);
       
  2265     static_cast<CAknFepCtrlCommonButton*>
       
  2266         ( Control( EPeninutWindowCtrlIdCloseBtn ) )->SizeChanged( exRect, inRect, ETrue );
       
  2267 
       
  2268     iLafMgr->GetButtonRect(EPeninutWindowCtrlIdBackspaceBtn,exRect ,inRect);
       
  2269     exRect.Move(x, y); 
       
  2270     inRect.Move(x, y);
       
  2271     
       
  2272     // Check size change of bk button, need for mirroring when arabic
       
  2273     CAknFepCtrlCommonButton* bkBtn = static_cast<CAknFepCtrlCommonButton*>
       
  2274         ( Control( EPeninutWindowCtrlIdBackspaceBtn ) );
       
  2275     TBool bBKSizeChanged = EFalse;
       
  2276 	if( exRect.Size() != bkBtn->Rect().Size() &&
       
  2277 		inRect.Size() != bkBtn->ForgroundBmpRect().Size() )
       
  2278 		{
       
  2279 		bBKSizeChanged = ETrue;
       
  2280 		}    
       
  2281     bkBtn->SizeChanged( exRect, inRect, ETrue );
       
  2282 
       
  2283 
       
  2284     iLafMgr->GetButtonRect(EPeninutWindowCtrlIdSpaceBtn,exRect ,inRect);
       
  2285     inRect = exRect;
       
  2286     inRect.Shrink(10, 0);
       
  2287     
       
  2288     exRect.Move(x, y); 
       
  2289     inRect.Move(x, y);
       
  2290     static_cast<CAknFepCtrlCommonButton*>
       
  2291         ( Control( EPeninutWindowCtrlIdSpaceBtn ) )->SizeChanged( exRect, inRect, ETrue );
       
  2292         
       
  2293     TRect spaceIconRect = inRect;
       
  2294     spaceIconRect.Shrink(10, 0);
       
  2295 	static_cast<CAknFepCtrlCommonButton*>
       
  2296         ( Control( EPeninutWindowCtrlIdSpaceBtn ) )->SetDraw3PieceFrameInfo(
       
  2297                       TDraw3PiecesFrame(KAknsIIDQgnIndiInputSpaceL,
       
  2298             													  KAknsIIDQgnIndiInputSpaceMiddle,
       
  2299             													  KAknsIIDQgnIndiInputSpaceR,
       
  2300             													  spaceIconRect));
       
  2301 
       
  2302     if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
       
  2303         {
       
  2304         iLafMgr->GetButtonRect(EPeninupWindowCtrlIdArrowLeftBtn,exRect ,inRect);
       
  2305         exRect.Move(x, y); 
       
  2306         inRect.Move(x, y);
       
  2307         iArrowLeftButton->SizeChanged( exRect, inRect, ETrue );
       
  2308         
       
  2309         iLafMgr->GetButtonRect(EPeninupWindowCtrlIdArrowRightBtn,exRect ,inRect);
       
  2310         exRect.Move(x, y);
       
  2311         inRect.Move(x, y); 
       
  2312         iArrowRightButton->SizeChanged( exRect, inRect, ETrue );
       
  2313         }
       
  2314 	else
       
  2315 		{
       
  2316 	    iLafMgr->GetButtonRect(EPeninutWindowCtrlIdMoveBtn,exRect ,inRect);
       
  2317 	    exRect.Move(x, y); 
       
  2318 	    inRect.Move(x, y);
       
  2319 	    static_cast<CAknFepCtrlDragButton*>
       
  2320 	        ( Control( EPeninutWindowCtrlIdMoveBtn ) )->SizeChanged( exRect, inRect, ETrue );
       
  2321 		}    
       
  2322 
       
  2323     //If backspace size changed when language is RtoL mirror should be used    
       
  2324     if( bBKSizeChanged && IsRtoLLanguage( iLanguage ) )
       
  2325     	{
       
  2326 		//Mirror backspace graphic
       
  2327 		HandleButtonResOnLangDirChange( EPeninutWindowCtrlIdBackspaceBtn );
       
  2328     	}		
       
  2329 		    
       
  2330 	}
       
  2331 void CPeninputGenericVkbWindow::ShowBubble(TInt aShow)
       
  2332     {
       
  2333     if (aShow > 0)
       
  2334         {
       
  2335         iVkbCtrl->ShowBubble(ETrue);    
       
  2336         }
       
  2337     else
       
  2338         {
       
  2339         iVkbCtrl->ShowBubble(EFalse);     
       
  2340         }
       
  2341     }
       
  2342 	
       
  2343 void CPeninputGenericVkbWindow::ConstructAccentListL(TInt aLang)
       
  2344 	{
       
  2345 	iPopupWnd->ClearItemsL();
       
  2346 	
       
  2347 	if (aLang == ELangVietnamese)
       
  2348 		{
       
  2349 		_LIT( KVietAccentList1, "\x00E0 - \x013A" );
       
  2350 		_LIT( KVietAccentList2, "\x013C - \x017E" );
       
  2351 		
       
  2352 	    CFepLayoutChoiceList::SItem item;
       
  2353 
       
  2354 	    item.iCommand = EPeninputVkbLayoutAccented1;
       
  2355 	    item.iText.Copy( KVietAccentList1 );
       
  2356 	    iPopupWnd->AddItemL( item );
       
  2357 	    
       
  2358 	    item.iCommand = EPeninputVkbLayoutAccented2;
       
  2359 	    item.iText.Copy( KVietAccentList2 );
       
  2360 	    iPopupWnd->AddItemL( item );
       
  2361 		}
       
  2362 	// 10X3
       
  2363 	else if (aLang == ELangEnglish
       
  2364 	        || aLang == ELangAmerican
       
  2365 	        || aLang == ELangDutch
       
  2366 	        || aLang == ELangTagalog
       
  2367 	        || aLang == ELangIndonesian
       
  2368 	        || aLang == ELangMalay)
       
  2369 		    {
       
  2370 	        _LIT( KVietAccentList1, "\x00E0 - \x0121" );
       
  2371 	        _LIT( KVietAccentList2, "\x0123 - \x014F" );
       
  2372 	        _LIT( KVietAccentList3, "\x0151 - \x017E" );
       
  2373 	        
       
  2374 	        CFepLayoutChoiceList::SItem item;
       
  2375 
       
  2376 	        item.iCommand = EPeninputVkbLayoutAccented1;
       
  2377 	        item.iText.Copy( KVietAccentList1 );
       
  2378 	        iPopupWnd->AddItemL( item );
       
  2379 	        
       
  2380 	        item.iCommand = EPeninputVkbLayoutAccented2;
       
  2381 	        item.iText.Copy( KVietAccentList2 );
       
  2382 	        iPopupWnd->AddItemL( item );
       
  2383 	        
       
  2384             item.iCommand = EPeninputVkbLayoutAccented3;
       
  2385             item.iText.Copy( KVietAccentList3 );
       
  2386             iPopupWnd->AddItemL( item );
       
  2387 		    }
       
  2388 	//10X4
       
  2389 	else
       
  2390 		{
       
  2391 	    // Add item
       
  2392 	    TResourceReader reader;
       
  2393 	    CFepLayoutChoiceList::SItem item;
       
  2394 
       
  2395 	    item.iCommand = EPeninputVkbLayoutAccented1;
       
  2396 	    CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT1 );
       
  2397 	    TPtrC p1 = reader.ReadTPtrC();
       
  2398 	    item.iText.Copy( p1 );
       
  2399 	    iPopupWnd->AddItemL( item );
       
  2400 	    CleanupStack::PopAndDestroy( 1 );
       
  2401 	    item.iCommand = EPeninputVkbLayoutAccented2;
       
  2402 	    CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT2 );
       
  2403 	    TPtrC p2 = reader.ReadTPtrC();
       
  2404 	    item.iText.Copy( p2 );
       
  2405 	    iPopupWnd->AddItemL( item );
       
  2406 	    CleanupStack::PopAndDestroy( 1 );
       
  2407 	    
       
  2408 		item.iCommand = EPeninputVkbLayoutAccented3;
       
  2409 		CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT3 );
       
  2410 		TPtrC p3 = reader.ReadTPtrC();
       
  2411 		item.iText.Copy( p3 );
       
  2412 		iPopupWnd->AddItemL( item );
       
  2413 		CleanupStack::PopAndDestroy( 1 );      	
       
  2414 		}
       
  2415 	iPopupWnd->SetListColumnNumWithLafL( iPopupWnd->ItemsCount() );
       
  2416     iPopupInited = ETrue;
       
  2417     iPopupSet = ETrue;
       
  2418 	}
       
  2419 // ---------------------------------------------------------------------------
       
  2420 // Load accent labels for range list
       
  2421 // ---------------------------------------------------------------------------
       
  2422 //
       
  2423 void CPeninputGenericVkbWindow::ConstructFSQAccentListL( TInt aLangId )
       
  2424     {  
       
  2425     iAccentCmdList.Reset();
       
  2426     
       
  2427     TBool is10x3 = ( aLangId == ELangEnglish ) || ( aLangId == ELangAmerican )
       
  2428                    || ( aLangId == ELangDutch)  || (aLangId == ELangTagalog ) 
       
  2429                    || ( aLangId == ELangIndonesian) || (aLangId == ELangMalay );
       
  2430     
       
  2431     if ( aLangId == ELangVietnamese )
       
  2432         {
       
  2433         _LIT( KVietAccentList1, "\x00E0 - \x013A" );
       
  2434         _LIT( KVietAccentList2, "\x013C - \x017E" );
       
  2435         
       
  2436         CFepLayoutChoiceList::SItem item;
       
  2437 
       
  2438         item.iCommand = EPeninputVkbLayoutAccented1;
       
  2439         item.iText.Copy( KVietAccentList1 );      
       
  2440         iAccentCmdList.Append( item );
       
  2441         
       
  2442         item.iCommand = EPeninputVkbLayoutAccented2;
       
  2443         item.iText.Copy( KVietAccentList2 );
       
  2444         iAccentCmdList.Append( item );
       
  2445         }
       
  2446     else if( aLangId == ELangRussian || aLangId == ELangUkrainian || aLangId == ELangBulgarian )
       
  2447     	{
       
  2448         _LIT( KCyrillicAccent, "\x00E0 - \x017E" );
       
  2449         CFepLayoutChoiceList::SItem item;
       
  2450 
       
  2451         item.iCommand = EPeninputVkbLayoutAccented1;
       
  2452         item.iText.Copy( KCyrillicAccent );      
       
  2453         iAccentCmdList.Append( item );        
       
  2454     	}
       
  2455     // 10X3
       
  2456     else if ( is10x3 )
       
  2457         {
       
  2458         _LIT( KVietAccentList1, "\x00E0 - \x0121" );
       
  2459         _LIT( KVietAccentList2, "\x0123 - \x014F" );
       
  2460         _LIT( KVietAccentList3, "\x0151 - \x017E" );
       
  2461         
       
  2462         CFepLayoutChoiceList::SItem item;
       
  2463 
       
  2464         item.iCommand = EPeninputVkbLayoutAccented1;
       
  2465         item.iText.Copy( KVietAccentList1 );
       
  2466         iAccentCmdList.Append( item );
       
  2467         
       
  2468         item.iCommand = EPeninputVkbLayoutAccented2;
       
  2469         item.iText.Copy( KVietAccentList2 );
       
  2470         iAccentCmdList.Append( item );
       
  2471 
       
  2472         
       
  2473         item.iCommand = EPeninputVkbLayoutAccented3;
       
  2474         item.iText.Copy( KVietAccentList3 );
       
  2475         iAccentCmdList.Append( item );
       
  2476         }
       
  2477     //10X4
       
  2478     else
       
  2479         {
       
  2480         // Add item
       
  2481         TResourceReader reader;
       
  2482         CFepLayoutChoiceList::SItem item;
       
  2483 
       
  2484         item.iCommand = EPeninputVkbLayoutAccented1;
       
  2485         CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT1 );
       
  2486         TPtrC p1 = reader.ReadTPtrC();
       
  2487         item.iText.Copy( p1 );
       
  2488         iAccentCmdList.Append( item );
       
  2489         CleanupStack::PopAndDestroy( 1 ); //reader
       
  2490         
       
  2491         item.iCommand = EPeninputVkbLayoutAccented2;
       
  2492         CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT2 );
       
  2493         TPtrC p2 = reader.ReadTPtrC();
       
  2494         item.iText.Copy( p2 );
       
  2495         iAccentCmdList.Append( item );
       
  2496         CleanupStack::PopAndDestroy( 1 ); //reader
       
  2497         
       
  2498         item.iCommand = EPeninputVkbLayoutAccented3;
       
  2499         CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT3 );
       
  2500         TPtrC p3 = reader.ReadTPtrC();
       
  2501         item.iText.Copy( p3 );
       
  2502         iAccentCmdList.Append( item );
       
  2503         CleanupStack::PopAndDestroy( 1 );//reader          
       
  2504         }
       
  2505 
       
  2506     iPopupInited = ETrue;
       
  2507     iPopupSet = ETrue;
       
  2508     }
       
  2509 void CPeninputGenericVkbWindow::UpdateICFTextL()
       
  2510     {
       
  2511     CFepLayoutMultiLineIcf* icf = 
       
  2512         static_cast<CFepLayoutMultiLineIcf*>(Control(EPeninputWindowCtrlIdMultiLineICF));
       
  2513     if( icf )
       
  2514         {
       
  2515         icf->UpdateSecretTextL();    
       
  2516         }
       
  2517     }
       
  2518     
       
  2519 void CPeninputGenericVkbWindow::HandleButtonResOnLangDirChange( TInt aControlId )
       
  2520 	{
       
  2521     TRAP_IGNORE(HandleButtonResOnLangDirChangeL(aControlId));
       
  2522     }
       
  2523 void CPeninputGenericVkbWindow::HandleButtonResOnLangDirChangeL( TInt aControlId )
       
  2524 	{
       
  2525 	CAknFepCtrlCommonButton* ctrl = static_cast<CAknFepCtrlCommonButton*>(
       
  2526 										Control(aControlId) );
       
  2527 	if( ctrl && iBmpRotator)
       
  2528 		{
       
  2529 		TSyncRotationAngle rotChoice = CBitmapRotator::EMirrorVerticalAxis; 
       
  2530 		User::LeaveIfError( iBmpRotator->Rotate( *ctrl->ForgroundBmp() ,
       
  2531 								  				 rotChoice ) );
       
  2532 		User::LeaveIfError( iBmpRotator->Rotate( *ctrl->ForgroundBmpMask() ,
       
  2533 								  				 rotChoice ) );   								  
       
  2534 		}		
       
  2535 	}    
       
  2536 		
       
  2537 // --------------------------------------------------------------------------
       
  2538 // Show tooltip of ICF
       
  2539 // --------------------------------------------------------------------------
       
  2540 //
       
  2541 void CPeninputGenericVkbWindow::ShowTooltipL( const TDesC& aText, TInt aLangCode )
       
  2542     {
       
  2543     CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
       
  2544                                 (Control(EPeninputWindowCtrlIdMultiLineICF));    
       
  2545     CPeninputGenericVkbLayout* layout 
       
  2546                       = static_cast<CPeninputGenericVkbLayout*>( UiLayout() );    
       
  2547     if ( !icf || !( layout->IsEnableITIOnFSQ() ) )
       
  2548         {
       
  2549         return;
       
  2550         }    
       
  2551     
       
  2552     // Calculate tooltip width
       
  2553     const TPeninputTooltipBoxLayoutData& tooltipBoxLAF 
       
  2554                                       = iLafMgr->TooltipBoxLayoutData();
       
  2555     TRect tooltipRect = tooltipBoxLAF.iRect;
       
  2556     // Calculate inner rect
       
  2557     TRect innerRect = tooltipRect;
       
  2558     innerRect.iTl += TPoint( KTooltipLeftMargin, KTooltipTopMargin );
       
  2559     innerRect.iBr -= TPoint( KTooltipRightMargin, KTooltipBottomMargin );          
       
  2560     const CFont* font = tooltipBoxLAF.iFont;
       
  2561     // Set inner width in terms of text width
       
  2562     innerRect.SetWidth( font->TextWidthInPixels( aText ) );    
       
  2563     tooltipRect.iTl 
       
  2564            = innerRect.iTl - TPoint( KTooltipLeftMargin, KTooltipTopMargin );
       
  2565     tooltipRect.iBr 
       
  2566            = innerRect.iBr + TPoint( KTooltipRightMargin, KTooltipBottomMargin );
       
  2567     // Set tooltip rect in terms of inner rect
       
  2568     icf->ShowTooltipL( aText, tooltipRect, aLangCode );
       
  2569     }
       
  2570 	
       
  2571 // --------------------------------------------------------------------------
       
  2572 // Hide tooltip of ICF
       
  2573 // --------------------------------------------------------------------------
       
  2574 //
       
  2575 void CPeninputGenericVkbWindow::HideTooltip()
       
  2576     {
       
  2577     CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
       
  2578                                 (Control(EPeninputWindowCtrlIdMultiLineICF));
       
  2579     if ( !icf  )
       
  2580         {
       
  2581         return;
       
  2582         }
       
  2583     icf->HideTooltip();
       
  2584     }
       
  2585 
       
  2586 // --------------------------------------------------------------------------
       
  2587 // Hide candidate list
       
  2588 // --------------------------------------------------------------------------
       
  2589 //
       
  2590 void CPeninputGenericVkbWindow::HideCandidateList()
       
  2591     {
       
  2592     if ( !iCandidateList )
       
  2593         {
       
  2594         return;
       
  2595         }
       
  2596     iCandidateList->Hide( ETrue );
       
  2597     }
       
  2598 	
       
  2599 // --------------------------------------------------------------------------
       
  2600 // Show candidate list
       
  2601 // --------------------------------------------------------------------------
       
  2602 //
       
  2603 void CPeninputGenericVkbWindow::ShowCandidateListL( TInt aAlign, const CDesCArray* aItemArray,
       
  2604                                                    TInt aActiveIndex )
       
  2605     {
       
  2606     if ( !iCandidateList )
       
  2607         {
       
  2608         return;
       
  2609         }                
       
  2610     iCandidateList->ClearItemsL();
       
  2611 	iCandidateList->SetTextAlignment((CGraphicsContext::TTextAlign) aAlign);
       
  2612 
       
  2613     if ( aItemArray )
       
  2614         {
       
  2615 		CFepLayoutChoiceList::SItem item;
       
  2616 		item.iCommand = 0;
       
  2617 		
       
  2618         for (TInt i = 0; i < aItemArray->Count(); ++i)
       
  2619             {
       
  2620             if ((*aItemArray)[i].Length() <= item.iText.MaxLength())
       
  2621                 {
       
  2622                 item.iText.Copy((*aItemArray)[i]);
       
  2623                 }
       
  2624             else
       
  2625                 {
       
  2626                 // Given longer than maxlength, display the part of less than max
       
  2627                 item.iText.Copy((*aItemArray)[i].Left(item.iText.MaxLength()));
       
  2628                 }
       
  2629 			
       
  2630             iCandidateList->AddItemL( item );
       
  2631             }
       
  2632         }
       
  2633     iCandidateList->SetCurrentFocusedIndex( aActiveIndex );
       
  2634     
       
  2635     CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
       
  2636          (Control(EPeninputWindowCtrlIdMultiLineICF)); 
       
  2637 
       
  2638     TPoint posBelow( 0, 0 );
       
  2639     TPoint posRight( 0, 0 );
       
  2640     posBelow = posRight = icf->Rect().iTl;
       
  2641     icf->InlineTextPos( posBelow, posRight );
       
  2642     TPoint tlPos = posRight;
       
  2643     iCandidateList->Display( TRect( tlPos, tlPos ), 
       
  2644                              CFepLayoutPopupWnd::EDispBottomRight );
       
  2645     }
       
  2646 
       
  2647 // --------------------------------------------------------------------------
       
  2648 // Handle candidate list selected events.
       
  2649 // --------------------------------------------------------------------------
       
  2650 //
       
  2651 void CPeninputGenericVkbWindow::HandleCandidateListSelectedL
       
  2652                          ( CFepUiBaseCtrl* aCtrl, const TDesC& aEventData )
       
  2653     {
       
  2654     if ( aCtrl != iCandidateList )
       
  2655         {
       
  2656         return;
       
  2657         }
       
  2658 
       
  2659     CFepLayoutChoiceList::SEvent* event = 
       
  2660             (CFepLayoutChoiceList::SEvent*)aEventData.Ptr();
       
  2661     if ( event->iIndex != KErrNotFound )
       
  2662         {
       
  2663         TPtrC ptr;
       
  2664         ptr.Set( reinterpret_cast<TUint16*>(&( event->iIndex ) ), 
       
  2665                  sizeof( TInt ) );            
       
  2666         UiLayout()->SignalOwner( ESignalSelectCandidate, ptr );
       
  2667         }
       
  2668     }
       
  2669 
       
  2670 // --------------------------------------------------------------------------
       
  2671 // Create a candidate list control.
       
  2672 // --------------------------------------------------------------------------
       
  2673 //    
       
  2674 void CPeninputGenericVkbWindow::CreateCandidateListL()
       
  2675     {
       
  2676     iCandidateList = CFepLayoutScrollableList::NewL( 
       
  2677                             UiLayout(), 
       
  2678                             EPentinputHwrCandidateList,
       
  2679                             TSize( 0, 0 ),
       
  2680                             0,
       
  2681                             0,
       
  2682                             TSize( 0, 0 ),
       
  2683                             TSize( 0, 0 ) );
       
  2684          
       
  2685     iCandidateList->SetImgFrId(KAknsIIDQsnFrPopupSub, 
       
  2686                                 KAknsIIDQsnFrFunctionButtonNormal,
       
  2687 								KAknsIIDQsnFrFunctionButtonPressed,
       
  2688 								KAknsIIDQsnFrFunctionButtonInactive,
       
  2689                                 KAknsIIDQsnFrList,
       
  2690                                 KAknsIIDQsnFrPopupSub);
       
  2691                                 
       
  2692     iCandidateList->SetResourceId(R_PENINPUT_FSQ_CANDIDATE_LIST);
       
  2693     iCandidateList->ConstructFromResourceL();
       
  2694     iCandidateList->SetPageInfoResID( R_PENINPUT_FSQ_CANDIDATE_LIST_PAGE_NUM );
       
  2695     iCandidateList->AddEventObserver( UiLayout() );
       
  2696     AddControlL(iCandidateList);    
       
  2697     }
       
  2698 
       
  2699 // --------------------------------------------------------------------------
       
  2700 // Retrieve text color from skin for candidiate list.
       
  2701 // --------------------------------------------------------------------------
       
  2702 //
       
  2703 TRgb CPeninputGenericVkbWindow::CandidateListTextColor()
       
  2704     {
       
  2705     MAknsSkinInstance* skininstance = UiLayout()->SkinInstance();
       
  2706     TRgb matchlistcolor = KRgbBlack;
       
  2707     AknsUtils::GetCachedColor( skininstance, 
       
  2708                                 matchlistcolor, 
       
  2709                                 KAknsIIDQsnTextColors,
       
  2710                                 EAknsCIQsnTextColorsCG43 );
       
  2711     return matchlistcolor;
       
  2712     }
       
  2713 
       
  2714 // --------------------------------------------------------------------------
       
  2715 // Retrieve text color from skin for autocompletion part.
       
  2716 // --------------------------------------------------------------------------
       
  2717 //
       
  2718 TRgb CPeninputGenericVkbWindow::AutoCompletionPartColor()
       
  2719     {
       
  2720     MAknsSkinInstance* skininstance = UiLayout()->SkinInstance();
       
  2721     TRgb matchlistcolor = KRgbBlack;
       
  2722     AknsUtils::GetCachedColor( skininstance, 
       
  2723                                 matchlistcolor, 
       
  2724                                 KAknsIIDQsnTextColors,
       
  2725                                 EAknsCIQsnTextColorsCG64 );
       
  2726     return matchlistcolor;
       
  2727     }
       
  2728 
       
  2729 void CPeninputGenericVkbWindow::SetIndiBubbleImageL( const TInt aImgID1,
       
  2730                                               const TInt aMaskID1,
       
  2731                                               const TInt aImgID2,
       
  2732                                               const TInt aMaskID2 )
       
  2733     {
       
  2734     MAknsSkinInstance* skininstance = UiLayout()->SkinInstance();
       
  2735 
       
  2736     CFbsBitmap* bmp1 = NULL;
       
  2737     CFbsBitmap* mask1 = NULL;
       
  2738     
       
  2739     TInt colorIndex = EAknsCIQsnIconColorsCG30;
       
  2740 
       
  2741     AknsUtils::CreateColorIconL(skininstance,
       
  2742                                 KAknsIIDQsnIconColors,
       
  2743                                 KAknsIIDQsnIconColors,
       
  2744                                 colorIndex,
       
  2745                                 bmp1,
       
  2746                                 mask1,
       
  2747                                 AknIconUtils::AvkonIconFileName(),
       
  2748                                 aImgID1,
       
  2749                                 aMaskID1,
       
  2750                                 KRgbGray);
       
  2751     CleanupStack::PushL( bmp1 );
       
  2752     CleanupStack::PushL( mask1 );
       
  2753                                 
       
  2754     AknIconUtils::GetContentDimensions(bmp1, iIndicatorSize);
       
  2755 
       
  2756     CFbsBitmap* bmp2 = NULL;
       
  2757     CFbsBitmap* mask2 = NULL;
       
  2758     AknsUtils::CreateColorIconL(skininstance,
       
  2759                                 KAknsIIDQsnIconColors,
       
  2760                                 KAknsIIDQsnIconColors,
       
  2761                                 colorIndex,
       
  2762                                 bmp2,
       
  2763                                 mask2,
       
  2764                                 AknIconUtils::AvkonIconFileName(),
       
  2765                                 aImgID2,
       
  2766                                 aMaskID2,
       
  2767                                 KRgbGray);
       
  2768  
       
  2769     CleanupStack::PushL( bmp2 );
       
  2770     CleanupStack::PushL( mask2 );
       
  2771     
       
  2772     AknIconUtils::GetContentDimensions(bmp2, iIndicatorTextSize);
       
  2773     
       
  2774     TRect boundRect;
       
  2775     if ( iIndiWithText )
       
  2776         {
       
  2777         boundRect = iLafMgr->IndiIconRectWithText();
       
  2778         }
       
  2779     else
       
  2780         {
       
  2781         boundRect = iLafMgr->IndiIconRectWithoutText();
       
  2782         }
       
  2783     
       
  2784     TRect imgrect, textrect;
       
  2785     
       
  2786     CalIndicatorRect(boundRect, imgrect, textrect, EIndiAlignCenter);
       
  2787     AknIconUtils::SetSize(bmp1, imgrect.Size(), EAspectRatioNotPreserved);
       
  2788     AknIconUtils::SetSize(mask1, imgrect.Size(), EAspectRatioNotPreserved);
       
  2789     AknIconUtils::SetSize(bmp2, textrect.Size(), EAspectRatioNotPreserved);
       
  2790     AknIconUtils::SetSize(mask2, textrect.Size(), EAspectRatioNotPreserved);
       
  2791 
       
  2792     CFbsBitmap* bmp3 = AknPenImageUtils::CombineTwoImagesL(bmp1, bmp2, bmp1->DisplayMode());
       
  2793     CFbsBitmap* mask3 = AknPenImageUtils::CombineTwoImagesL(mask1, mask2, EGray256);
       
  2794     
       
  2795     CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
       
  2796                                    (Control(EPeninputWindowCtrlIdMultiLineICF));
       
  2797     icf->MsgBubbleCtrl()->SetBitmapParam( bmp3, mask3, 
       
  2798                     KAknsIIDQsnFrInputPreviewSideL,
       
  2799                     KAknsIIDQsnFrInputPreviewMiddle,
       
  2800                     KAknsIIDQsnFrInputPreviewSideR );
       
  2801     
       
  2802     CleanupStack::PopAndDestroy( mask2 );
       
  2803     CleanupStack::PopAndDestroy( bmp2 );
       
  2804     CleanupStack::PopAndDestroy( mask1 );
       
  2805     CleanupStack::PopAndDestroy( bmp1 );
       
  2806     }
       
  2807 
       
  2808 void CPeninputGenericVkbWindow::CalIndicatorRect(const TRect& aBoundRect,
       
  2809                                           TRect& aRealRect1,
       
  2810                                           TRect& aRealRect2,
       
  2811                                           TIndicatorAlign aAlign) 
       
  2812     {
       
  2813     TInt imgAspectText = iIndicatorTextSize.iWidth / iIndicatorTextSize.iHeight;
       
  2814     TInt imgAspectIndi = iIndicatorSize.iWidth / iIndicatorSize.iHeight;
       
  2815     TSize imgSizeText( aBoundRect.Size().iHeight * imgAspectText, 
       
  2816                        aBoundRect.Size().iHeight );
       
  2817     TSize imgSizeIndi( aBoundRect.Size().iHeight * imgAspectIndi, 
       
  2818                                aBoundRect.Size().iHeight );
       
  2819     // check if the length of img > bound rect width
       
  2820     TInt nTotalWidth = imgSizeText.iWidth + imgSizeIndi.iWidth;
       
  2821     if( nTotalWidth > aBoundRect.Size().iWidth )
       
  2822         {
       
  2823         TReal nAspect = (TReal)imgSizeText.iWidth / nTotalWidth;
       
  2824         imgSizeText.iWidth = aBoundRect.Size().iWidth * nAspect;
       
  2825         imgSizeIndi.iWidth = aBoundRect.Size().iWidth - imgSizeText.iWidth;
       
  2826         imgSizeText.iHeight = imgSizeText.iWidth / imgAspectText;
       
  2827         // make sure the height of two rect is equal
       
  2828         imgSizeIndi.iHeight = imgSizeText.iHeight;
       
  2829         }
       
  2830     if( aAlign == EIndiAlignRight )
       
  2831         {
       
  2832         aRealRect2 = TRect(TPoint( aBoundRect.iBr.iX - imgSizeText.iWidth, aBoundRect.iTl.iY),
       
  2833                        imgSizeText);
       
  2834         aRealRect1 = TRect(TPoint(aRealRect2.iTl.iX - imgSizeIndi.iWidth, aRealRect2.iTl.iY),
       
  2835                        imgSizeIndi);
       
  2836         }
       
  2837     else if( aAlign == EIndiAlignCenter )
       
  2838         {
       
  2839         TInt offsetX = ( aBoundRect.Size().iWidth - imgSizeText.iWidth - imgSizeIndi.iWidth ) / 2;
       
  2840         TInt offsetY = ( aBoundRect.Size().iHeight - imgSizeText.iHeight ) / 2;
       
  2841         aRealRect2 = TRect( TPoint( aBoundRect.iBr.iX - imgSizeText.iWidth - offsetX, 
       
  2842                                    aBoundRect.iTl.iY + offsetY),
       
  2843                             imgSizeText );
       
  2844         aRealRect1 = TRect( TPoint(aRealRect2.iTl.iX - imgSizeIndi.iWidth, aRealRect2.iTl.iY),
       
  2845                        imgSizeIndi );
       
  2846         }
       
  2847     else if( aAlign == EIndiAlignLeft )
       
  2848         {
       
  2849         aRealRect1 = TRect( aBoundRect.iTl, imgSizeIndi );
       
  2850         aRealRect2 = TRect( TPoint( aRealRect1.iBr.iX, aRealRect1.iTl.iY ), imgSizeText );
       
  2851         }
       
  2852     }
       
  2853 
       
  2854 void CPeninputGenericVkbWindow::IndiBubbleWithText()
       
  2855     {
       
  2856     CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
       
  2857                            (Control(EPeninputWindowCtrlIdMultiLineICF));
       
  2858     if ( icf )
       
  2859         {
       
  2860         TAknTextLineLayout textLine = iLafMgr->IndiText();
       
  2861         TRect bubbleRect = iLafMgr->IndiPaneRectWithText();
       
  2862         TRect iconRect = iLafMgr->IndiIconRectWithText();
       
  2863         TSize offset;
       
  2864         offset.iHeight = iconRect.iTl.iY - bubbleRect.iTl.iY;
       
  2865         offset.iWidth = iconRect.iTl.iX - bubbleRect.iTl.iX;
       
  2866         TSize size( iconRect.Width(), iconRect.Height());
       
  2867         
       
  2868         icf->MsgBubbleCtrl()->SetRect( bubbleRect );
       
  2869         icf->MsgBubbleCtrl()->SetIconOffsetAndSize( offset, size );
       
  2870         icf->MsgBubbleCtrl()->SetTextFormat( textLine );
       
  2871         icf->MsgBubbleCtrl()->SetTextColorIndex( EAknsCIQsnTextColorsCG67 );
       
  2872         }
       
  2873     }
       
  2874 
       
  2875 void CPeninputGenericVkbWindow::IndiBubbleWithoutText()
       
  2876     {
       
  2877     CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
       
  2878                                (Control(EPeninputWindowCtrlIdMultiLineICF));
       
  2879     if ( icf )
       
  2880         {
       
  2881         TRect bubbleRect = iLafMgr->IndiPaneRectWithoutText();
       
  2882         TRect iconRect = iLafMgr->IndiIconRectWithoutText();
       
  2883         TSize offset;
       
  2884         offset.iHeight = iconRect.iTl.iY - bubbleRect.iTl.iY;
       
  2885         offset.iWidth = iconRect.iTl.iX - bubbleRect.iTl.iX;
       
  2886         TSize size( iconRect.Width(), iconRect.Height());
       
  2887         
       
  2888         icf->MsgBubbleCtrl()->SetRect( bubbleRect );
       
  2889         icf->MsgBubbleCtrl()->SetIconOffsetAndSize( offset, size );
       
  2890         }
       
  2891     }
       
  2892 
       
  2893 void CPeninputGenericVkbWindow::SetIndiWithTextFlag( TBool aFlag )
       
  2894     {
       
  2895     iIndiWithText = aFlag;
       
  2896     }
       
  2897 
       
  2898 void CPeninputGenericVkbWindow::UpdateIndiBubbleL( TUint8* aData )
       
  2899     {
       
  2900     CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
       
  2901                                (Control(EPeninputWindowCtrlIdMultiLineICF));
       
  2902     
       
  2903     RDesReadStream readStream;
       
  2904     TFepIndicatorInfo indicatorData;
       
  2905 
       
  2906     TPtr8 countPtr( aData, 4*sizeof(TInt), 4*sizeof(TInt) );            
       
  2907     readStream.Open(countPtr);
       
  2908     CleanupClosePushL(readStream);
       
  2909 
       
  2910     indicatorData.iIndicatorImgID = readStream.ReadInt32L();
       
  2911     indicatorData.iIndicatorMaskID = readStream.ReadInt32L();
       
  2912     indicatorData.iIndicatorTextImgID = readStream.ReadInt32L();
       
  2913     indicatorData.iIndicatorTextMaskID = readStream.ReadInt32L();
       
  2914 
       
  2915     CleanupStack::PopAndDestroy(&readStream);
       
  2916     
       
  2917     if ( indicatorData.iIndicatorImgID != 0 && 
       
  2918         indicatorData.iIndicatorMaskID != 0 && 
       
  2919         indicatorData.iIndicatorTextImgID != 0 &&
       
  2920         indicatorData.iIndicatorTextMaskID != 0 )
       
  2921         { 
       
  2922         SetIndicatorData( indicatorData );
       
  2923         
       
  2924         if ( icf )
       
  2925             {
       
  2926             SetIndiBubbleImageL( indicatorData.iIndicatorImgID,
       
  2927                     indicatorData.iIndicatorMaskID,
       
  2928                     indicatorData.iIndicatorTextImgID,
       
  2929                     indicatorData.iIndicatorTextMaskID );
       
  2930                  
       
  2931             TBuf<100> text;
       
  2932             icf->MsgBubbleCtrl()->GetText( text );
       
  2933             icf->ShowBubble( text, icf->MsgBubbleCtrl()->Rect());
       
  2934             }
       
  2935         }
       
  2936     }
       
  2937 
       
  2938 void CPeninputGenericVkbWindow::HandleRangeButtonShortPress()
       
  2939     {
       
  2940     const TInt range = CPeninputDataConverter::AnyToInt(
       
  2941         iLayoutContext->RequestData(EPeninputDataTypeCurrentRange));
       
  2942     
       
  2943     const TInt langId = IntContext( EPeninputDataTypeInputLanguage );
       
  2944 
       
  2945     switch ( langId )
       
  2946         {
       
  2947         case ELangRussian:
       
  2948         case ELangBulgarian:
       
  2949         case ELangUkrainian:
       
  2950             {
       
  2951             range == ERangeNative ? ChangeRange( ERangeNumber ) : ChangeRange( ERangeNative );
       
  2952             }
       
  2953             break;
       
  2954 
       
  2955         case ELangArabic:
       
  2956         case ELangFarsi:
       
  2957         case ELangUrdu:
       
  2958             {
       
  2959             range == ERangeNative ? ChangeRange( ERangeNativeNumber ) : ChangeRange( ERangeNative );
       
  2960             }
       
  2961             break;
       
  2962             
       
  2963         case ELangThai:
       
  2964             {
       
  2965             range == ERangeNative ? ChangeRange( ERangeNumber ) : ChangeRange( ERangeNative ); 
       
  2966             }
       
  2967             break;
       
  2968 
       
  2969         case ELangGreek:
       
  2970         case ELangHebrew:
       
  2971             {
       
  2972             range == ERangeNative ? ChangeRange( ERangeNumber ) : ChangeRange( ERangeNative ); 
       
  2973             }
       
  2974             break;
       
  2975         default: // Latin, vietnamese, and other possible languages
       
  2976             {
       
  2977             if ( ConfigInfo()->RangeBarInfo()->FindRange( ERangeNative ) )
       
  2978                 {
       
  2979                 if ( range == ERangeNative )
       
  2980                     {
       
  2981                     if ( ConfigInfo()->RangeBarInfo()->FindRange( ERangeNativeNumber ) )
       
  2982                         {
       
  2983                         ChangeRange( ERangeNativeNumber );
       
  2984                         }
       
  2985                     else if ( ConfigInfo()->RangeBarInfo()->FindRange( ERangeNumber ) )
       
  2986                         {
       
  2987                         ChangeRange( ERangeNumber );
       
  2988                         }
       
  2989                     }
       
  2990                 else
       
  2991                     {
       
  2992                     ChangeRange( ERangeNative );
       
  2993                     }
       
  2994                 }
       
  2995             else if ( ConfigInfo()->RangeBarInfo()->FindRange( ERangeEnglish ) )
       
  2996                 {
       
  2997                 range == ERangeEnglish ? ChangeRange( ERangeNumber ) : ChangeRange( ERangeEnglish );
       
  2998                 }
       
  2999             }
       
  3000             break;
       
  3001         }
       
  3002     
       
  3003     TRAP_IGNORE( UpdateRangeCtrlsL() );
       
  3004     }
       
  3005 // End Of File