textinput/peninputhwrtrui/src/truishortcuteditcontainer.cpp
changeset 40 2cb9bae34d17
parent 31 f1bdd6b078d1
child 49 37f5d84451bd
--- a/textinput/peninputhwrtrui/src/truishortcuteditcontainer.cpp	Tue Jul 06 14:38:41 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1235 +0,0 @@
-/*
-* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0""
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:  Implement of class CTruiShortcutEditContainer
-*
-*/
-
-
-#include <eikedwin.h>
-#include <aknbutton.h>
-#include <eiklabel.h>
-#include <barsread.h>
-#include <aknnavide.h>
-#include <aknnotewrappers.h> 
-#include <trui.rsg>
-#include <AknsBasicBackgroundControlContext.h>
-#include <AknsDrawUtils.h>
-#include <aknlayoutscalable_apps.cdl.h>
-#include <avkon.rsg>
-#include <layoutmetadata.cdl.h>
-#include <akntoolbar.h>
-#include <aknSctDialog.h>
-
-#include "truicontainerbase.h"
-#include "truishortcuteditcontainer.h"
-#include "truihwrbox.h"
-#include "truiengine.h"
-#include "truiappui.h"
-#include "truishortcutsview.h"
-#include "truiapplication.h"
-#include "truiappradiobutton.h"
-#include "truishortcutsview.h"
-#include "truiapplication.h"
-#include "truishortcutedittextview.h"
-#include "trui.hrh"
-#include "truishortcuteditview.h"
-
-const TInt KSimilarMsgLength = 160;
-
-// The maximum number of lines for tips
-const TInt KIndicatorBufSize = 2;
-
-// The index of each item in radio button groups
-const TInt KOwnIndex = 0;
-const TInt KPresetIndex = 1;
-
-// Layout for portrait
-const TPoint KLabelTipPosPortrait = TPoint( 0, 0 );
-const TSize KLabelTipSizePortrait = TSize( 360, 60 );
-const TPoint KRadioPosPortrait = TPoint( 5, 73 );
-const TSize KRadioSizePortrait = TSize( 196, 99 );
-const TPoint KLeftBtnPosPotrait = TPoint( 115, 160 );
-const TPoint KIndicatorPosPotrait = TPoint( 165, 160 );
-const TPoint KRightBtnPosPotrait = TPoint( 215, 160 );
-const TPoint KHwrBoxPosPortrait = TPoint( 90, 215 );
-
-const TSize KButtonSize = TSize( 50, 50 );
-
-// Layout for landscape
-const TPoint KRadioPosLandscape = TPoint( 5, 18 );
-const TPoint KLabelTipPosLandscape = TPoint( 5, 120 );
-const TSize KLabelTipSizeLandscape = TSize( 250, 120 );
-
-const TPoint KLeftBtnPos = TPoint( 300, 15 );
-
-const TPoint KRightBtnPos = TPoint( 400, 15 );
-const TPoint KIndicatorPosLandscape = TPoint( 350, 15 );
-const TSize KHwrBoxSizeLandscape = TSize( 200, 200 );
-const TPoint KHwrBoxPosLandscape = TPoint( 275, 80 );
-
-const TInt KTooltipPopupTimeOut = 0;
-const TInt KTooltipStayTimeOut = 3000;
-
-const TInt KSctBufferSize = 32;
-const TInt KHwrTooltipY = 20;
-
-_LIT( KActiveCharFormat, "%c" );
-
-// Varity of landscape for common components
-const TInt KVarityLandscape = 3;
-
-// Varity of portrait for common components
-const TInt KVarityPortrait = 2;
-
-const TInt KVarityListPane = 1;
-
-// ======== MEMBER FUNCTIONS ========
-
-CTruiShortcutEditContainer::CTruiShortcutEditContainer()
-    {  
-    iActiveCharPos = KErrNotFound;
-    }
-    
-void CTruiShortcutEditContainer::ConstructL( const TRect& aRect )
-    {    
-    // Initialize control array
-    InitComponentArrayL();
-        
-    // Set parent control or owning window
-    CreateWindowL();
-
-    iBackGround = CAknsBasicBackgroundControlContext::NewL
-                  ( KAknsIIDQsnBgAreaMain, Rect(), EFalse);
-    
-    // Initialize controls
-    InitializeControlsL();       
-    
-#ifdef TRAININGUI_FOR_PRESET
-    // Get all presets from Engine
-    HBufC* presetHBuf = iEikonEnv->AllocReadResourceLC( R_TRUI_PRESET_SYMBOLS );
-    for ( TInt i = 0; i < presetHBuf->Length(); i++ )
-        {
-        iPresets.Append( ( *presetHBuf )[i] );
-        }
-    CleanupStack::PopAndDestroy( presetHBuf );        
-#endif
-      
-    // Load setting data
-    CTruiShortcutEditView* view = static_cast<CTruiShortcutEditView*>
-                           ( iAppUi->View( KTruiShortcutEditViewId ) );
-    
-    if ( view->PreviousViewId() == TVwsViewId( KUidtruiApp, KTruiShortcutsViewId ) )
-        {
-        // Edit old shortcut
-        iEngine->GetShortcutModelL( iEngine->Shortcut(), 
-                                    iHwrBox->Model(), 
-                                    iUnicode );
-        // Backup shortcut model
-        BackupShortcutModel( iHwrBox->Model(), iUnicode );
-        // Load the current active char whether is own or preset.
-        iShortcutType = iUnicode ? KPresetIndex : KOwnIndex;
-        iIsEmptyHwrBox = iUnicode ? ETrue : EFalse;
-#ifdef TRAININGUI_FOR_PRESET
-        if ( iUnicode )
-            {
-            // Edit preset shortcut
-            iActiveCharPos = iPresets.Find( iUnicode );
-            }
-        else
-            {
-            // Edit own shortcut, get the first available preset shortcut
-            if ( FindFirstAvailableCharL( 0, iPresets.Count() - 1, 1, iUnicode ) )
-                {
-                iActiveCharPos = iPresets.Find( iUnicode );
-                }
-            else
-                {        
-                iActiveCharPos = KErrNotFound;
-                }            
-            }
-#endif
-        }
-    else
-        {
-        // Create new shortcut        
-        // Load the current active char whether is own or preset.
-        iShortcutType = KOwnIndex;
-        iIsEmptyHwrBox = ETrue;
-#ifdef TRAININGUI_FOR_PRESET
-        if ( FindFirstAvailableCharL( 0, iPresets.Count() - 1, 1, iUnicode ) )
-            {
-            iActiveCharPos = iPresets.Find( iUnicode );
-            }
-        else
-            {        
-            iActiveCharPos = KErrNotFound;
-            }
-#endif
-        }
-
-    // Set radio button
-    iRadioButtonContainer->HandlePointerRadioButtonL( iShortcutType, 
-                                                      EEventRequestFocus );
-    SetRect( aRect );
-    
-    ActivateL();
-    }
-    
-CTruiShortcutEditContainer* CTruiShortcutEditContainer::NewL( const TRect& aRect )
-    {
-    CTruiShortcutEditContainer* self = CTruiShortcutEditContainer::NewLC( aRect );
-    CleanupStack::Pop( self );
-    return self;
-    }
-    
-CTruiShortcutEditContainer* CTruiShortcutEditContainer::NewLC( const TRect& aRect )
-    {
-    CTruiShortcutEditContainer* self = new (ELeave) CTruiShortcutEditContainer();
-    CleanupStack::PushL( self );
-    self->ConstructL( aRect );
-    return self;
-    }
-    
-CTruiShortcutEditContainer::~CTruiShortcutEditContainer()
-    {
-    delete iBackGround;
-    delete iLabeltext;
-    delete iWrappedLabelText;
-    iModelBak.Close();
-    iPresets.Close();
-    iLineWidthArray.Close();
-    }
-    
-// ---------------------------------------------------------------------------
-// Create controls to be displayed in this container.
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::InitializeControlsL()
-    {
-    // Create fixed toolbar
-    CAknToolbar* toolbar = iAppUi->View( KTruiShortcutEditViewId )->Toolbar();
-    // Get Clear button from toolbar    
-    CAknButton* clearButton = static_cast<CAknButton*>
-                    ( toolbar->ControlOrNull( EShortcutEditViewDelete ) );
-
-    CreateRadioButtonL();         
-
-    CcnstructButtonL();
-    
-    CreateLabelL();
-    
-    CreateHwrBoxL();
-    }
-    
-// ---------------------------------------------------------------------------
-// From class CCoeControl.
-// Responds to changes to the size and position of the contents of this control.
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::SizeChanged()
-    {
-    TInt varity = Layout_Meta_Data::IsLandscapeOrientation() ? KVarityLandscape
-                                                             : KVarityPortrait;
-    DoSizeChanged( varity );
-    // Set hwrbox's rect to engine and set guiding line to hwrbox
-    iHwrBox->SetDisplayBottomGuideLine( ETrue );
-    TBool isDisplayTopGuideLine = ( iEngine->CurrentLanguageScript() 
-                             == EMainViewSubmenuHebrew ) ? ETrue : EFalse;
-    
-    iHwrBox->SetDisplayTopGuideLine( isDisplayTopGuideLine );
-        
-    if ( varity == KVarityLandscape )
-        {
-        DoLayoutLandscape();
-        }
-    else if ( varity == KVarityPortrait )  
-        {
-        DoLayoutPortait();
-        }
-    if ( iBackGround )
-        {
-        iBackGround->SetRect( Rect() );
-        }    
-    }
-
-// ---------------------------------------------------------------------------
-// Layout under landscape condition.
-// ---------------------------------------------------------------------------
-//    
-void CTruiShortcutEditContainer::DoLayoutLandscape()
-    {    
-#ifdef TRAININGUI_FOR_PRESET  
-    iRadioButtonContainer->SetRect( TRect( KRadioPosLandscape, 
-                                           KRadioSizePortrait ) );
-    iLeftBtn->SetRect( TRect( KLeftBtnPos, KButtonSize ) );
-    iRightBtn->SetRect( TRect( KRightBtnPos, KButtonSize ) );
-    iIndicator->SetRect( TRect( KIndicatorPosLandscape, KButtonSize ) );
-#endif
-    }
-    
-// ---------------------------------------------------------------------------
-// Layout under portait condition.
-// ---------------------------------------------------------------------------
-//    
-void CTruiShortcutEditContainer::DoLayoutPortait()
-    {
-#ifdef TRAININGUI_FOR_PRESET
-    iRadioButtonContainer->SetRect( TRect( KRadioPosPortrait, 
-                                           KRadioSizePortrait ) );    
-    iLeftBtn->SetRect( TRect( KLeftBtnPosPotrait, KButtonSize ) );
-    iRightBtn->SetRect( TRect( KRightBtnPosPotrait, KButtonSize ) );
-    iIndicator->SetRect( TRect( KIndicatorPosPotrait, KButtonSize ) );
-#endif
-    }    
-
-// ---------------------------------------------------------------------------
-// Save own shortcut.
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::SaveOwnShortcutL( const TDesC& aShortcut, 
-                                                   RArray<TPoint>& aModel,
-                                                   TDes& aErrMsg )
-    {
-    // Ensure the shortcut doesn't exist.
-    if ( iEngine->CheckShortcutModel( aShortcut ) )
-        {
-        iEngine->DeleteShortcut( aShortcut );
-        }
-    if ( aModel.Count() )
-        {
-        iEngine->SaveShortcutL( aShortcut, aModel, aErrMsg );
-        }
-    }    
-    
-// ---------------------------------------------------------------------------
-// Save preset shortcut.
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::SavePresetShortcutL( const TDesC& aShortcut, 
-                                                      TUint aUnicode )
-    {
-    // Ensure the shortcut doesn't exist.
-    if ( iEngine->CheckShortcutModel( aShortcut ) )
-        {
-        iEngine->DeleteShortcut( aShortcut );
-        }
-    // Check if aUnicode is in use.
-    RArray<TPoint> presetModel;
-    CleanupClosePushL( presetModel );
-    TBuf<KSimilarMsgLength> msg;
-    iEngine->GetPresetSymbolByUnicodeL( aUnicode, presetModel, msg );
-    if ( msg.Length() > 0 )
-        {
-        // In use, being assigned to some shortcut.
-        User::Leave( KErrInUse );
-        }
-    CleanupStack::PopAndDestroy( &presetModel );
-    iEngine->SavePresetShortcutL( aUnicode, aShortcut );
-    }
-
-// ---------------------------------------------------------------------------
-// Backup shortcut model. It is probably to be restored when press Back to exit.
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::BackupShortcutModel
-                                 ( const RArray<TPoint>& aOriginalModel,
-                                   TUint aOriginalUnicode )
-    {
-    iUnicodeBak = aOriginalUnicode;
-    if ( !iUnicodeBak )
-        {
-        // If old shortcut is own, it is necessary to store trails.
-        // If it is preset, backup is unecessary
-        for ( TInt i = 0; i < aOriginalModel.Count(); i++ )
-            {
-            iModelBak.Append( aOriginalModel[i] );
-            }        
-        }    
-    }
-
-// ---------------------------------------------------------------------------
-// Set active char.
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::SetActiveCharL( TUint aUnicode )
-    {
-    // Set active indicator
-    TBuf<KIndicatorBufSize> preset;
-
-    // Preset symbol
-    preset.Format( KActiveCharFormat, aUnicode );
-    iIndicator->SetTextL( preset );        
-    iIndicator->DrawNow();    
-    // Clear hwrbox and stop playing animation    
-    iHwrBox->ClearExistModel();
-    // Get model
-    TBuf<KSimilarMsgLength> similarMsg;
-    iEngine->GetPresetSymbolByUnicodeL( aUnicode, iHwrBox->Model(),
-                                        similarMsg );
-    // Play animation in HwrBox 
-    iHwrBox->ModelIsReady( ETrue );
-    if ( iShortcutType == KPresetIndex )
-        {
-        // As for preset, need to scale trails size firstly
-        iHwrBox->PlayAnimation( ETrue, CTruiContainerBase::OriginSymbolSize() );
-        }
-    else
-        {
-        iHwrBox->PlayAnimation();
-        }    
-    }
-
-// ---------------------------------------------------------------------------
-// Find the first available preset symbol.
-// ---------------------------------------------------------------------------
-//
-TBool CTruiShortcutEditContainer::FindFirstAvailableCharL( TInt aStartPos, 
-                                                           TInt aEndPos,
-                                                           TInt aDirection, 
-                                                           TUint& aUnicode )
-    {
-    while ( aStartPos != aEndPos && aStartPos < iPresets.Count() )
-        {
-        if ( !CheckPresetSymbolInUseL( iPresets[aStartPos] ) )
-            {            
-            aUnicode = iPresets[aStartPos];
-            return ETrue;
-            }
-        else
-            {
-            // In use
-            if ( iUnicodeBak == iPresets[aStartPos] )
-                {
-                // But the preset symbol is the old preset 
-                // which users are editting, 
-                // Still display the symbol in indicator                
-                aUnicode = iPresets[aStartPos];
-                return ETrue;
-                }
-            }
-        if ( aDirection )
-            {
-            // Go right           
-            aStartPos = ( ++aStartPos + iPresets.Count() ) % iPresets.Count();
-            }
-        else
-            {
-            // Go left
-            aStartPos = ( --aStartPos + iPresets.Count() ) % iPresets.Count();
-            }                    
-        }
-    if ( aEndPos < iPresets.Count() && !CheckPresetSymbolInUseL( iPresets[aEndPos] ) )
-        {
-        aUnicode = iPresets[aEndPos];
-        return ETrue;
-        }      
-    return EFalse;           
-    }
-    
-// ---------------------------------------------------------------------------
-// Return if the preset is in use.
-// ---------------------------------------------------------------------------
-//
-TBool CTruiShortcutEditContainer::CheckPresetSymbolInUseL( TUint aUnicode )
-    {
-    // Check if iUnicode is in use
-    RArray<TPoint> presetModels;
-    CleanupClosePushL( presetModels );
-    TBuf<KSimilarMsgLength> similarMsg;      
-    iEngine->GetPresetSymbolByUnicodeL( aUnicode,
-                                        presetModels,
-                                        similarMsg );
-    CleanupStack::PopAndDestroy( &presetModels );
-    if ( similarMsg.Length() )
-        {
-        return ETrue;
-        }
-    return EFalse;
-    }
-
-// ---------------------------------------------------------------------------
-// Do something to response to size changed.
-// ---------------------------------------------------------------------------
-// 
-void CTruiShortcutEditContainer::DoSizeChanged( TInt aVarity )
-    {
-    TRect rect = Rect();
-    
-    TAknWindowComponentLayout main_pane_layout = 
-                            AknLayoutScalable_Apps::main_hwr_training_pane();
-    TAknLayoutRect main_pane_layout_rect;
-    main_pane_layout_rect.LayoutRect( rect, main_pane_layout );
-    TRect main_pane_rect = main_pane_layout_rect.Rect();
-        
-    // hwr_training_write_pane
-    TAknWindowComponentLayout write_pane_layout = 
-               AknLayoutScalable_Apps::hwr_training_write_pane( aVarity );
-    TAknLayoutRect write_pane_layout_rect;
-    write_pane_layout_rect.LayoutRect( main_pane_rect, write_pane_layout );
-    iHwrBox->SetRect( write_pane_layout_rect.Rect() );
-    
-    TPoint hwrPos = iHwrBox->PositionRelativeToScreen();
-    iHwrBox->SetTooltipPosition( hwrPos + TPoint( iHwrBox->Size().iWidth, KHwrTooltipY ) );
-
-    // hwr_training_instruct_pane
-    TAknWindowComponentLayout instruct_pane_layout = 
-               AknLayoutScalable_Apps::hwr_training_instruct_pane( aVarity );
-    TAknLayoutRect instruct_pane_layout_rect;
-    instruct_pane_layout_rect.LayoutRect( main_pane_rect, instruct_pane_layout );    
-    // count of text rows
-    TInt count = AknLayoutScalable_Apps::
-                 list_single_hwr_training_instruct_pane_ParamLimits( KVarityListPane )
-                 .LastRow() + 1;
-
-    // array contains all text rows in help screen
-    RArray<TAknTextComponentLayout> textLayoutArray;
-    iLineWidthArray.Reset();
-    for( TInt i = 0; i < count; i++ )
-        {
-        // pane area for each row
-        TAknWindowComponentLayout each_row_layout =  
-            AknLayoutScalable_Apps::list_single_hwr_training_instruct_pane
-            ( KVarityListPane, 0, i );
-        TAknLayoutRect each_row_layout_rect;
-        each_row_layout_rect.LayoutRect( instruct_pane_layout_rect.Rect(), 
-                                         each_row_layout );
-        iLineWidthArray.Append( each_row_layout_rect.Rect().Width() );
-        // smaller pane for text itself
-        TAknTextComponentLayout each_row_text_layout =  
-            AknLayoutScalable_Apps::list_single_hwr_training_instruct_pane_t1();
-    
-        // composition of two latter componets
-        TAknTextComponentLayout textCompCompositionWiz = 
-            TAknWindowComponentLayout::ComposeText(
-                each_row_layout, each_row_text_layout );
- 
-        TRAPD(error, textLayoutArray.AppendL( textCompCompositionWiz ) );
-        // if error in append function, then just exit the loop      
-        if ( error != KErrNone )
-            {
-            break;
-            }
-        }       
-    iMultilineLayout = TAknTextComponentLayout::Multiline( textLayoutArray ); 
-    if ( iLabeltext && iWrappedLabelText )
-        {
-        // Be ready to show label
-        TAknLayoutText multilineTextLayout;
-        multilineTextLayout.LayoutText( instruct_pane_layout_rect.Rect(), iMultilineLayout );    
-        const CFont* font = AknLayoutUtils::FontFromId( iMultilineLayout.FontId() );
-        TRAPD( err, WrapLabelTextL( font, *iLabeltext, iLineWidthArray, iWrappedLabelText ) );
-        if ( err == KErrNone )
-            {
-            TRAP_IGNORE( iLabelTip->SetTextL( *iWrappedLabelText ) );
-            }
-        else
-            {
-            TRAP_IGNORE( iLabelTip->SetTextL( *iLabeltext ) );
-            }        
-        AknLayoutUtils::LayoutLabel( iLabelTip, 
-                                     instruct_pane_layout_rect.Rect(), 
-                                     iMultilineLayout );
-        }
-    textLayoutArray.Close();
-
-    TRgb labelColor = KRgbBlack;
-    TInt error = GetCachedLabelTextColor( labelColor );
-    if ( error == KErrNone )
-        {
-        TRAP_IGNORE( iLabelTip->OverrideColorL( EColorLabelText, labelColor ) );
-        TRAP_IGNORE( iIndicator->OverrideColorL( EColorLabelText, labelColor ) );
-        }
-    }
-        
-// ---------------------------------------------------------------------------
-// Create radio button.
-// ---------------------------------------------------------------------------
-//    
-void CTruiShortcutEditContainer::CreateRadioButtonL()
-    {
-    iRadioButtonContainer = CTruiRadioButton::NewL( this,
-                                             CTruiRadioButton::ERadioButton,
-                                             this );
-    Components().AppendLC( iRadioButtonContainer );
-    CleanupStack::Pop( iRadioButtonContainer );
-    
-    HBufC* radioTextOwn = iEikonEnv->AllocReadResourceLC
-                             ( R_TRUI_SHORTCUTEDITMODELVIEW_RADIOBUTTON_OWN );
-    iRadioButtonContainer->AddItem( radioTextOwn, CTruiRadioButton::ENonSelected );
-    CleanupStack::Pop( radioTextOwn ); // transfered ownership
-    HBufC* radioTextPreset = iEikonEnv->AllocReadResourceLC
-                             ( R_TRUI_SHORTCUTEDITMODELVIEW_RADIOBUTTON_PRESET );
-    iRadioButtonContainer->AddItem( radioTextPreset, CTruiRadioButton::ENonSelected );
-    CleanupStack::Pop( radioTextPreset ); // transfered ownership
-    iRadioButtonContainer->HandleItemAdditionL();
-    }
-   
-// ---------------------------------------------------------------------------
-// Create HWR box to write and play model
-// ---------------------------------------------------------------------------
-//    
-void CTruiShortcutEditContainer::CreateHwrBoxL()
-    {
-    CTruiHwrBox* hwrBox = CTruiHwrBox::NewL( this, this, iBackGround );    
-    hwrBox->SetHwrBoxFlag( CTruiHwrBox::EFrameHwrBox );
-    Components().AppendLC( hwrBox );
-    hwrBox->ActivateL();    
-    CleanupStack::Pop( hwrBox );
-    iHwrBox = hwrBox;
-    }
-
-// ---------------------------------------------------------------------------
-// Create buttons.
-// ---------------------------------------------------------------------------
-//    
-void CTruiShortcutEditContainer::CcnstructButtonL()
-    {
-    // Left button for last character
-    CAknButton* preButton = CreateButtonL( R_MAINVIEW_BUTTON_LEFT,
-                                           this,
-                                           this );
-    Components().AppendLC( preButton );
-    CleanupStack::Pop( preButton );    
-    iLeftBtn = preButton;
-
-    // Right button for next character
-    CAknButton* nextButton = CreateButtonL( R_MAINVIEW_BUTTON_RIGHT,
-                                           this,
-                                           this );
-    Components().AppendLC( nextButton );
-    CleanupStack::Pop( nextButton );    
-    iRightBtn = nextButton;    
-    }
-
-// ---------------------------------------------------------------------------
-// Create buttons.
-// ---------------------------------------------------------------------------
-//    
-void CTruiShortcutEditContainer::CreateLabelL()
-    {
-    //Create label tip
-    CEikLabel* tipLabel = new (ELeave) CEikLabel();
-    CleanupStack::PushL( tipLabel );    
-    tipLabel->SetContainerWindowL( *this );
-    tipLabel->SetTextL( KNullDesC );
-    tipLabel->ActivateL();
-    CleanupStack::Pop( tipLabel );
-    Components().AppendLC( tipLabel );
-    CleanupStack::Pop( tipLabel );
-    iLabelTip = tipLabel;    
-
-    // Create active character indicator
-    CEikLabel* aknLabel = new (ELeave) CEikLabel();
-    CleanupStack::PushL( aknLabel );
-    aknLabel->SetContainerWindowL( *this );
-    aknLabel->SetObserver( this );
-    aknLabel->SetAlignment( 
-         TGulAlignmentValue ( EEikLabelAlignHCenter|EEikLabelAlignVCenter ) );
-    aknLabel->SetTextL( KNullDesC );
-    aknLabel->ActivateL();
-    CleanupStack::Pop( aknLabel );
-    Components().AppendLC( aknLabel );    
-    CleanupStack::Pop( aknLabel );     
-    iIndicator = aknLabel;
-    iIndicator->SetObserver( this );    
-    }
-    
-// ---------------------------------------------------------------------------
-// Draw.
-// ---------------------------------------------------------------------------
-//    
-void CTruiShortcutEditContainer::Draw( const TRect& /*aRect*/ ) const
-    {
-    // Get the standard graphics context
-    CWindowGc& gc = SystemGc();
-    // Gets the control's extent
-    TRect rect( Rect());
-    // Clears the screen
-    gc.Clear( rect );
-
-    MAknsSkinInstance* skin = AknsUtils::SkinInstance();  
-    if ( AknsDrawUtils::HasBitmapBackground( skin, iBackGround ) ) 
-        {
-        AknsDrawUtils::Background( skin, iBackGround, gc, rect );
-        }   
-    }
-
-// ---------------------------------------------------------------------------
-// Switch to shortcuts view.
-// ---------------------------------------------------------------------------
-//  
-void CTruiShortcutEditContainer::SwitchToShortcutViewL()
-    {    
-    // Update shortcut list
-    iEngine->UpdateShortcutListL();
-    // Find the current shortcut's index in shortcut list
-    CDesCArray* shortcutList = iEngine->ShortcutTextList();
-    TInt index = DefaultSelectedIndex( shortcutList, iEngine->Shortcut() );
-    if ( index == KErrNotFound )
-        {
-        TInt oldIndex = iEngine->CurrentSelectedIndex();
-        if ( shortcutList )
-            {
-            index = ( oldIndex > shortcutList->Count() ) 
-                               ? shortcutList->Count() : oldIndex;
-            }
-        else
-            {
-            index = 0;
-            }
-        }
-       
-    // Set current index in Engine
-    iEngine->SetCurrentSelectedIndex( index );
-
-    // Close tooltip
-    iHwrBox->HideInfoPopupNote();
-
-    iAppUi->ActivateLocalViewL( KTruiShortcutsViewId );
-    // Show NaviDecorator
-    iAppUi->ShowNaviPaneL();
-    }
-
-// ---------------------------------------------------------------------------
-// Go back to previous view
-// ---------------------------------------------------------------------------
-//  
-void CTruiShortcutEditContainer::BackToPreviousViewL()
-    {
-    if ( iIsRestored )
-        {
-        // Check if restore the old shortcut
-        if ( iUnicodeBak )
-            {
-            // Old shortcut is preset, restore it.
-            SavePresetShortcutL( iEngine->Shortcut(), iUnicodeBak );
-            }
-        else
-            {
-            // Old shortcut is own, restore it.
-            // Or create new shortcut
-            TBuf<KSimilarMsgLength> similarMsg;
-            SaveOwnShortcutL( iEngine->Shortcut(), iModelBak, similarMsg );
-            }        
-        }  
-        
-    // Close tooltip
-    iHwrBox->HideInfoPopupNote();
-    
-    // Show NaviDecorator      
-    CTruiShortcutEditView* view = static_cast<CTruiShortcutEditView*>
-                           ( iAppUi->View( KTruiShortcutEditViewId ) );
-    iAppUi->ActivateLocalViewL( view->PreviousViewId().iViewUid );
-    
-    if ( view->PreviousViewId() == TVwsViewId( KUidtruiApp, KTruiShortcutsViewId ) )
-        {
-        iAppUi->ShowNaviPaneL();        
-        }    
-    }
-    
-// ---------------------------------------------------------------------------
-// Handles an event from an observed control.
-// ---------------------------------------------------------------------------
-//     
-void CTruiShortcutEditContainer::HandleControlEventL( CCoeControl* aControl,
-                                                      TCoeEvent aEventType )
-    {
-    if ( aControl == iLeftBtn && aEventType == EEventStateChanged )
-        {        
-        if ( iActiveCharPos != KErrNotFound )
-            {
-            // Edit an old preset
-            // Find first available preset, otherwise, show error note all in use
-            // Create a new preset shortcut but at least one is available
-            // Find first available preset, otherwise, nothing to do
-            TInt startPos = ( iActiveCharPos - 1 + iPresets.Count() ) 
-                            % iPresets.Count();
-            TInt endPos = ( iActiveCharPos + 1 + iPresets.Count() ) 
-                            % iPresets.Count();       
-            if ( FindFirstAvailableCharL( startPos, endPos, 0, iUnicode ) )
-                {
-                iActiveCharPos = iPresets.Find( iUnicode );
-                SetActiveCharL( iUnicode ); 
-                }
-            else if ( !iEngine->NewShortcut() )
-                {
-                // if Create a new preset shortcut but at least one is available
-                // nothing to do
-                // show error note : all in use
-                PopupTooltipL( R_TRUI_SHORTCUTEDITVIEW_ERROR_NOTE_ALL_IN_USE );
-                }
-            }
-        else
-            {
-            // Create a new preset, but all in use
-            // Show error note
-            PopupTooltipL( R_TRUI_SHORTCUTEDITVIEW_ERROR_NOTE_ALL_IN_USE );
-            }
-        }
-    else if ( aControl == iRightBtn && aEventType == EEventStateChanged )
-        {
-        if ( iActiveCharPos != KErrNotFound )
-            {
-            // Edit an old preset
-            // Find first available preset, otherwise, show error note all in use
-            // Create a new preset shortcut but at least one is available
-            // Find first available preset, otherwise, nothing to do
-            TInt startPos = ( iActiveCharPos + 1 + iPresets.Count() ) 
-                            % iPresets.Count();
-            TInt endPos = ( iActiveCharPos - 1 + iPresets.Count() ) 
-                            % iPresets.Count();       
-            if ( FindFirstAvailableCharL( startPos, endPos, 1, iUnicode ) )
-                {
-                iActiveCharPos = iPresets.Find( iUnicode );
-                SetActiveCharL( iUnicode ); 
-                }
-            else if ( !iEngine->NewShortcut() )
-                {
-                // show error note : all in use
-                PopupTooltipL( R_TRUI_SHORTCUTEDITVIEW_ERROR_NOTE_ALL_IN_USE );
-                }
-            }
-        else
-            {
-            // Create a new preset, but all in use
-            // Show error note
-            PopupTooltipL( R_TRUI_SHORTCUTEDITVIEW_ERROR_NOTE_ALL_IN_USE );
-            }
-        }
-    else if ( iShortcutType == KPresetIndex && aControl == iIndicator 
-              && aEventType == EEventRequestFocus )
-        {
-        PreviewShortcutModel();
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// From class MTruiHWRBoxObserver.
-// Handle the save model event
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::SaveNewModelL()
-    {
-    // Carry out saving new model
-    if ( iShortcutType == KOwnIndex )
-        {
-        iIsRestored = ETrue;
-        
-        // If shortcut is own, it will save new model
-        TBuf<KSimilarMsgLength> similarMsg;
-        TRAPD( err, SaveOwnShortcutL( iEngine->Shortcut(), 
-                                      iHwrBox->Model(), 
-                                      similarMsg ) );
-        switch ( err )
-            {
-            case KErrNone:
-                {
-                iIsEmptyHwrBox = EFalse;
-                CAknToolbar* toolbar = iAppUi->View( KTruiShortcutEditViewId )
-                                             ->Toolbar();
-                CAknButton* clearBtn = static_cast<CAknButton*>
-                          ( toolbar->ControlOrNull( EShortcutEditViewDelete ) );
-                clearBtn->SetDimmed( EFalse );
-                clearBtn->DrawNow(); 
-                CAknButton* previewBtn = static_cast<CAknButton*>
-                          ( toolbar->ControlOrNull( EShortcutEditViewPreviewModel ) );
-                previewBtn->SetDimmed( EFalse );
-                previewBtn->DrawNow(); 
-
-                TPoint hwrPos = iHwrBox->PositionRelativeToScreen();
-                HBufC* tooltipText = 
-                        iEikonEnv->AllocReadResourceLC( R_TRUI_TOOLTIP_SAVED );
-                iHwrBox->ShowTooltipL( *tooltipText, 
-                                  hwrPos + TPoint( iHwrBox->Size().iWidth, KHwrTooltipY ),
-                                       KTooltipPopupTimeOut, 
-                                       KTooltipStayTimeOut );
-                CleanupStack::PopAndDestroy( tooltipText );
-                break;
-                }
-            case KErrAlreadyExists:
-                {
-                //Clear invalid model
-                ClearCurrentModelL();
-                
-                //Popup err message
-                PopupTooltipL( R_TRUI_SHORTCUTEDITVIEW_ERROR_NOTE_IN_USE );
-                break;
-                }
-                
-            }
-        }       
-    }
-
-// ---------------------------------------------------------------------------
-// From class MTruiHWRBoxObserver.
-// Handle the message event from the HWRBox
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::HandleEventL( TMessageType aMessage )
-    {
-    if ( aMessage == EModelExist )
-        {
-        PopupTooltipL( R_TRUI_NOTE_CLEAR_BOX );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// From class MTruiHWRBoxObserver.
-// Notify that which radio button is selected.
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::SelectChangedL( TInt aIndex )
-    {
-    // Change the text below radio buttons
-    TInt tipResource = aIndex ? R_TRUI_SHORTCUTEDITVIEW_PRESET_SYMBOL
-                              : R_TRUI_SHORTCUTEDITVIEW_OWN_SYMBOL;    
-    delete iLabeltext;
-    iLabeltext = NULL;
-    iLabeltext = iEikonEnv->AllocReadResourceL( tipResource );
-    delete iWrappedLabelText;
-    iWrappedLabelText = NULL;
-    // count of text rows
-    TInt lines = AknLayoutScalable_Apps::
-                 list_single_hwr_training_instruct_pane_ParamLimits( KVarityListPane )
-                 .LastRow() + 1;         
-    iWrappedLabelText = HBufC::NewL( iLabeltext->Length() + lines
-                                     + KExtraSize );
-    // Be ready to show label
-    const CFont* font = AknLayoutUtils::FontFromId( iMultilineLayout.FontId() );
-    TRAPD( err, WrapLabelTextL( font, *iLabeltext, iLineWidthArray, iWrappedLabelText ) );
-    if ( err == KErrNone )
-        {
-        iLabelTip->SetTextL( *iWrappedLabelText );
-        }
-    else
-        {
-        iLabelTip->SetTextL( *iLabeltext );
-        }
-    // Get Clear button from toolbar
-    CAknToolbar* toolbar = iAppUi->View( KTruiShortcutEditViewId )->Toolbar();
-    CAknButton* clearBtn = static_cast<CAknButton*>
-                ( toolbar->ControlOrNull( EShortcutEditViewDelete ) );
-    CAknButton* gridBtn = static_cast<CAknButton*>
-                ( toolbar->ControlOrNull( EShortcutEditViewGrid ) );
-    // Dim left and right buttons when selecting "own symbol"
-    TBool btnDimmed = aIndex ? EFalse : ETrue;
-    iLeftBtn->SetDimmed( btnDimmed );
-    iLeftBtn->DrawNow();
-    iRightBtn->SetDimmed( btnDimmed );
-    iRightBtn->DrawNow();
-
-    // Set grid button status
-    gridBtn->SetDimmed( btnDimmed );
-    gridBtn->DrawNow();
-
-    // Set active indicator
-    TBuf<KIndicatorBufSize> preset;
-    if ( aIndex && iUnicode )
-        {
-        // Preset symbol
-        preset.Format( KActiveCharFormat, iUnicode );
-        }
-    else
-        {
-        // Own
-        preset.Copy( KNullDesC );
-        }
-    iIndicator->SetTextL( preset );        
-    iIndicator->DrawNow();    
-
-    // Update current shortcut type
-    iShortcutType = aIndex;   
-
-    // Clear hwrbox and stop playing animation    
-    iHwrBox->ClearExistModel();
-    
-    if ( iShortcutType == KPresetIndex )
-        {
-        // If preset shortcut, get trail points.
-        TBuf<KSimilarMsgLength> similarMsg;
-        iEngine->GetPresetSymbolByUnicodeL( iUnicode, 
-                                            iHwrBox->Model(), similarMsg );
-        iHwrBox->ModelIsReady( ETrue );
-        iHwrBox->PlayAnimation( ETrue, CTruiContainerBase::OriginSymbolSize() );
-        }
-    else if ( !iIsEmptyHwrBox )
-        {
-        // If own shortcut, get trail points
-        TUint unicode = 0;
-        iEngine->GetShortcutModelL( iEngine->Shortcut(), iHwrBox->Model(),
-                                    unicode );
-        iHwrBox->ModelIsReady( ETrue );
-        iHwrBox->PlayAnimation();
-        }
-
-    // Set hwrbox model
-    if ( iShortcutType == KPresetIndex )
-        {        
-        iHwrBox->SetHwrBoxReadOnly( ETrue );        
-        }
-    else
-        {
-        iHwrBox->SetHwrBoxReadOnly( EFalse );
-        }
-    
-    // Set clear button's status
-    clearBtn->SetDimmed( !( iHwrBox->Model().Count() ) | aIndex );
-    clearBtn->DrawNow();
-
-    // Set preview button status
-    CAknButton* previewBtn = static_cast<CAknButton*>
-              ( toolbar->ControlOrNull( EShortcutEditViewPreviewModel ) );
-
-    previewBtn->SetDimmed( !( iHwrBox->Model().Count() | aIndex ) );
-    previewBtn->DrawNow();
-    }
-    
-// ---------------------------------------------------------------------------
-// Preview shortcut model
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::PreviewShortcutModel()
-    {
-    //even hwrbox know if current character has existing model.
-    //ask for engine to confirm this
-    iHwrBox->PlayAnimation(); 
-    }
-
-// ---------------------------------------------------------------------------
-// Check if model exist
-// ---------------------------------------------------------------------------
-//
-TBool CTruiShortcutEditContainer::HasShortcutModel()
-    {    
-    return EFalse;
-    }
-    
-// ---------------------------------------------------------------------------
-// Prepare to exit
-// ---------------------------------------------------------------------------
-//
-TBool CTruiShortcutEditContainer::PrepareToExitL()
-    {
-    iHwrBox->HideInfoPopupNote();
-    //If previous char's model is not saved, save it before exit.
-    if ( iHwrBox->BoxState() == CTruiHwrBox::ENewModelDraw )
-        {
-        //Call save function from hwrbox,
-        //in order to stop periodics in the hwrbox
-        iHwrBox->SaveModelByManuallyL();
-        }
-        
-    //After saving model, if shortcut model is empty,
-    //notice user that shortcut will be delete.
-    if ( iHwrBox->Model().Count() == 0 )
-        {
-        // Not assign model to shortcut
-        CAknQueryDialog* dlg = CAknQueryDialog::NewL();
-        if ( dlg->ExecuteLD( R_TRUI_QUERYDIALOG_SHORTCUT_NOT_ASSIGNED ) )
-            {
-            // yes/ok pressed
-            iEngine->DeleteShortcut( iEngine->Shortcut() );
-            return ETrue;
-            }
-        else
-            {
-            return EFalse;
-            }
-        }
-    else
-        {
-        if ( iShortcutType == KPresetIndex )
-            {
-            // Save preset
-            // No need to save own preset again, because it has been saved before.
-            TRAPD( err, SavePresetShortcutL( iEngine->Shortcut(), iUnicode ) );
-            if ( err == KErrInUse )
-                {
-                // Pop information note
-                HBufC* errMsg = iEikonEnv->AllocReadResourceLC
-                              ( R_TRUI_SHORTCUTEDITVIEW_ERROR_NOTE_IN_USE );
-                CAknConfirmationNote* note = new (ELeave) CAknConfirmationNote 
-                                                                    ( ETrue );
-                note->ExecuteLD( *errMsg );                
-                CleanupStack::PopAndDestroy( errMsg );
-                return EFalse;
-                }                
-            }
-        }
-    return ETrue;
-    }
-
-// ---------------------------------------------------------------------------
-// Clear current model
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::ClearCurrentModelL()
-    {
-    // Get Clear button from toolbar
-    CAknToolbar* toolbar = iAppUi->View( KTruiShortcutEditViewId )->Toolbar();    
-    CAknButton* clearBtn = static_cast<CAknButton*>
-                ( toolbar->ControlOrNull( EShortcutEditViewDelete ) );    
-    clearBtn->SetDimmed( ETrue );
-    clearBtn->DrawNow();
-    
-    // Set preview button status
-    CAknButton* previewBtn = static_cast<CAknButton*>
-              ( toolbar->ControlOrNull( EShortcutEditViewPreviewModel ) );
-
-    previewBtn->SetDimmed( ETrue );
-    previewBtn->DrawNow();
-
-    iHwrBox->ClearExistModel();
-    HBufC* tipText = iEikonEnv->AllocReadResourceLC( R_TRUI_TOOLTIP_DELETED );
-    TPoint hwrPos = iHwrBox->PositionRelativeToScreen();
-    iHwrBox->ShowTooltipL( *tipText, 
-                           hwrPos + TPoint( iHwrBox->Size().iWidth, KHwrTooltipY ),
-                           KTooltipPopupTimeOut, KTooltipStayTimeOut );
-    CleanupStack::PopAndDestroy( tipText ); 
-    iIsEmptyHwrBox = ETrue;
-    }
-    
-// ---------------------------------------------------------------------------
-// Popup tooltip
-// ---------------------------------------------------------------------------
-//    
-void CTruiShortcutEditContainer::PopupTooltipL( TInt aResourceID )
-    {
-    HBufC* tooltiptext =iEikonEnv->AllocReadResourceLC( aResourceID );
-    CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue );
-    note->ExecuteLD( *tooltiptext );
-    CleanupStack::PopAndDestroy( tooltiptext );
-    }
-
-// ---------------------------------------------------------------------------
-// This is called whenever the control gains or loses focus, 
-// ---------------------------------------------------------------------------
-// 
-void CTruiShortcutEditContainer::FocusChanged( TDrawNow /*aDrawNow*/ )
-    {
-    if ( IsFocused() )
-        {
-        if ( iHwrBox->BoxState() == CTruiHwrBox::EExistModelStop )
-            {
-            iHwrBox->ResumePlaying();
-            }
-        }
-    else
-        {
-        if ( iHwrBox->BoxState() == CTruiHwrBox::EExistModelDraw )
-            {
-            iHwrBox->PausePlaying();
-            }
-        }
-    iHwrBox->SetFocus( IsFocused() );
-    }
-
-// ---------------------------------------------------------------------------
-// Return the currently selected index, which will be set in Shortcuts view.
-// ---------------------------------------------------------------------------
-//
-TInt CTruiShortcutEditContainer::DefaultSelectedIndex( const CDesCArray* aItemList,
-                                                       const TDesC& aText )
-    {    
-    if ( aItemList )
-        {
-        for ( TInt i = 0; i < aItemList->Count(); i++ )
-            {        
-            if ( (*aItemList)[i].Compare( aText ) == 0 )
-                {
-                return i + 1;
-                }
-            }
-        }
-    return KErrNotFound;
-    }
-
-// ---------------------------------------------------------------------------
-// Popup SCT dialog.
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::PopupSctDialogL()
-    {
-    TBuf<KSctBufferSize> selectedStr;
-    CAknCharMapDialog* sct = new (ELeave) CAknCharMapDialog( EAknSCTLowerCase, 
-                                           selectedStr, 
-                                           R_TRUI_SCT_CHARSET_PRESET );    
-    TInt keyboardMode = CurrentKeyBoardModeL(); 
-    if ( keyboardMode )
-        {
-        // QWERTY: Lock numeric keys.
-        sct->LockNumericKeys( ETrue );
-        }
-    else
-        {
-        // ITU-T: Unlock numeric keys.
-        sct->LockNumericKeys( EFalse );
-        }
-    sct->DisableRecentCharsRow();
-    if ( sct->ExecuteLD( R_TRUI_SCT_DIALOG ) )
-        {        
-        TInt selectedUnicode = selectedStr.Length() ? selectedStr[0] : NULL;
-        TBool isInUse = CheckPresetSymbolInUseL( selectedUnicode );
-        if ( isInUse && selectedUnicode != iUnicodeBak )
-            {
-            // Preset is in use
-            //Popup err message
-            PopupTooltipL( R_TRUI_SHORTCUTEDITVIEW_ERROR_NOTE_IN_USE );
-            return;
-            }
-        else
-            {
-            TInt activePos = iPresets.Find( selectedUnicode );
-            
-            // Set active char pos
-            iActiveCharPos = ( activePos != KErrNotFound ) ? activePos : 0;
-            iUnicode = iPresets[iActiveCharPos];
-            SetActiveCharL( selectedUnicode );            
-            }        
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// From class CCoeControl.
-// Handles a change to the control's resources.
-// ---------------------------------------------------------------------------
-//
-void CTruiShortcutEditContainer::HandleResourceChange( TInt aType )
-    {
-    CTruiContainerBase::HandleResourceChange( aType );
-    if ( aType == KEikDynamicLayoutVariantSwitch && iHwrBox )
-        {
-        if ( iHwrBox->BoxState() == CTruiHwrBox::ENewModelDraw )
-            {
-            TRAP_IGNORE( iHwrBox->SaveModelByManuallyL() );
-            }        
-        }    
-
-    if ( aType == KAknsMessageSkinChange )
-        {
-        TRgb labelColor = KRgbBlack;
-        TInt error = GetCachedLabelTextColor( labelColor );
-        if ( error == KErrNone )
-            {
-            TRAPD( errLable, iLabelTip->OverrideColorL( EColorLabelText, 
-                                                        labelColor ) );
-            if ( errLable != KErrNone )
-                {
-                return;
-                }
-            TRAP_IGNORE( iIndicator->OverrideColorL( EColorLabelText, 
-                                                     labelColor ) );
-            }        
-        }         
-    }