--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputhwrtrui/src/truimainviewcontainer.cpp Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,1333 @@
+/*
+* 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 CTruiMainViewContainer
+*
+*/
+
+
+#include <eiklabel.h>
+#include <barsread.h>
+#include <aknnavide.h>
+#include <akntabgrp.h>
+#include <eikspane.h>
+#include <aknViewAppUi.h>
+#include <eikedwin.h>
+#include <aknbutton.h>
+#include <aknchoicelist.h>
+#include <aknSctDialog.h>
+#include <trui.rsg>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <AknsBasicBackgroundControlContext.h>
+#include <AknsDrawUtils.h>
+#include <layoutmetadata.cdl.h>
+#include <akntoolbar.h>
+#include <AknPreviewPopUpController.h>
+#include <AknsConstants.h>
+#include <trui_icons.mbg>
+#include <featmgr.h>
+
+#include "truicontainerbase.h"
+#include "truimainviewcontainer.h"
+#include "truihwrbox.h"
+#include "truiengine.h"
+#include "truiappui.h"
+#include "truiapplication.h"
+#include "truihelp.h"
+#include "trui.hrh"
+#include "truimainview.h"
+
+// Max length of text in indicator
+const TInt KIndicatorTextLen = 10;
+
+// Max length of text of silimar message
+const TInt KSimilarMsgLength = 160;
+
+// Delay time of showing tooltip
+const TInt KTooltipShowDelay = 0;
+
+// Delay time of hiding tooltip
+const TInt KTooltipHideDelay = 3000;
+
+// Size for buffer to fill maximum characters from SCT.
+const TInt KSctBufferSize = 32;
+
+const TInt KHwrTooltipY = 20;
+
+const TInt KVarityNaviPaneContents = 0;
+
+//the special gesture characters
+_LIT(KDisplayBackspace, "\x2190");
+_LIT(KDisplaySpace, "\xF800");
+_LIT(KDisplayEnter, "\xF801");
+
+// ======== MEMBER FUNCTIONS ========
+
+CTruiMainViewContainer::CTruiMainViewContainer()
+ {
+ }
+
+void CTruiMainViewContainer::ConstructL( const TRect& aRect )
+ {
+ // Initialize control array
+ InitComponentArrayL();
+
+ // Set parent control or owning window
+ CreateWindowL();
+
+ iBackGround = CAknsBasicBackgroundControlContext::NewL
+ ( KAknsIIDQsnBgAreaMain,
+ Rect(),
+ EFalse );
+
+ // Initialize controls
+ InitializeControlsL();
+
+ SetRect( aRect );
+
+ // Set first character of the character set as the default trained character
+ const HBufC* charSet = iEngine->CharacterSet();
+ ASSERT( charSet );
+ SetCurrentCharL( charSet->Mid( 0, 1 ) );
+
+ TInt currentRangeId = iEngine->GetCurrentCharacterRange();
+ const RArray<TInt>& rangeIdArray =
+ iEngine->GetCurrentSupportedRangesId();
+ TInt indexOfMenuItems = rangeIdArray.Find( currentRangeId );
+ if ( indexOfMenuItems != KErrNotFound )
+ {
+ // Set choiclist' selected item to index.
+ iChoicelist->SetSelectedIndex( indexOfMenuItems );
+ }
+ else
+ {
+ iChoicelist->SetSelectedIndex( 0 );
+ }
+
+ // Set hwrbox's rect to engine and set guiding line to hwrbox
+ iHwrBox->SetDisplayBottomGuideLine( ETrue );
+ if ( iEngine->CurrentLanguageScript() == EMainViewSubmenuHebrew )
+ {
+ iHwrBox->SetDisplayTopGuideLine( ETrue );
+ }
+
+ ActivateL();
+
+ }
+
+CTruiMainViewContainer* CTruiMainViewContainer::NewL( const TRect& aRect )
+ {
+ CTruiMainViewContainer* self = CTruiMainViewContainer::NewLC( aRect );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+CTruiMainViewContainer* CTruiMainViewContainer::NewLC( const TRect& aRect )
+ {
+ CTruiMainViewContainer* self = new (ELeave) CTruiMainViewContainer();
+ CleanupStack::PushL( self );
+ self->ConstructL( aRect );
+ return self;
+ }
+
+CTruiMainViewContainer::~CTruiMainViewContainer()
+ {
+ if ( iBackGround )
+ {
+ delete iBackGround;
+ }
+ delete iWrappedLabelText;
+ delete iLabeltext;
+ iLineWidthArray.Close();
+ }
+
+// ---------------------------------------------------------------------------
+// Create controls to be displayed in this container.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::InitializeControlsL()
+ {
+ CAknToolbar* toolbar = iAppUi->View( KTruiMainViewId )->Toolbar();
+ // Get Clear button from toolbar
+ if ( toolbar )
+ {
+ iClearBtn = static_cast<CAknButton*>
+ ( toolbar->ControlOrNull( EMainViewButtonIdDelete ) );
+ iPreviewBtn = static_cast<CAknButton*>
+ ( toolbar->ControlOrNull( EMainViewButtonIdPreview ) );
+ }
+
+ // Create Label for text above writting box
+ iLabel = CreateLabelL( R_MAINVIEW_LABEL_TIP, this, NULL );
+ Components().AppendLC( iLabel );
+ CleanupStack::Pop( iLabel );
+
+ // Create left button
+ iLeftBtn = CreateButtonL( R_MAINVIEW_BUTTON_LEFT, this, this );
+ Components().AppendLC( iLeftBtn );
+ CleanupStack::Pop( iLeftBtn );
+
+ // Create indicator
+ iIindicator = CreateLabelL( R_MAINVIEW_LABEL_INDICATOR, this, this );
+ Components().AppendLC( iIindicator );
+ CleanupStack::Pop( iIindicator );
+
+ // Create right button
+ iRightBtn = CreateButtonL( R_MAINVIEW_BUTTON_RIGHT, this, this );
+ Components().AppendLC( iRightBtn );
+ CleanupStack::Pop( iRightBtn );
+
+ // Create choicelist
+ TInt buttonResource = ButtonResourceId
+ ( iEngine->GetCurrentCharacterRange() );
+ CAknButton* rangeButton = CreateButtonL( buttonResource,
+ this, NULL );
+ iCurChoiceListBtn = rangeButton;
+ CDesCArray* charRangeArray = iEngine->GetCharacterRangeName();
+ CDesCArray* ownedCharRangeArray = new ( ELeave ) CDesCArrayFlat
+ ( charRangeArray->MdcaCount() );
+
+ CleanupStack::PushL( ownedCharRangeArray );
+ for ( TInt i=0; i<charRangeArray->MdcaCount(); i++ )
+ {
+ ownedCharRangeArray->AppendL( charRangeArray->MdcaPoint( i ) );
+ }
+ iChoicelist = CreateChoiceListL( this, this,
+ ownedCharRangeArray,rangeButton );
+ CleanupStack::Pop( ownedCharRangeArray );
+ ownedCharRangeArray = NULL;// Ownership has been transfered to choicelist
+ Components().AppendLC( iChoicelist );
+ CleanupStack::Pop( iChoicelist );
+
+ iHwrBox = CreateHwrBoxL( this, this );
+ iHwrBox->SetHwrBoxFlag( CTruiHwrBox::EFrameHwrBox );
+ Components().AppendLC( iHwrBox );
+ CleanupStack::Pop( iHwrBox );
+ }
+
+// ---------------------------------------------------------------------------
+// Create label and display it in the container.
+// ---------------------------------------------------------------------------
+//
+CEikLabel* CTruiMainViewContainer::CreateLabelL( const TInt aResourceId,
+ const CCoeControl* aParent,
+ MCoeControlObserver* aObserver )
+ {
+ CEikLabel* aknLabel = new (ELeave) CEikLabel();
+ CleanupStack::PushL( aknLabel );
+ if ( aParent )
+ {
+ aknLabel->SetContainerWindowL( *aParent );
+ }
+ if ( aObserver )
+ {
+ aknLabel->SetObserver( aObserver );
+ }
+ if ( aResourceId != 0 )
+ {
+ TResourceReader reader;
+ iEikonEnv->CreateResourceReaderLC( reader, aResourceId );
+ aknLabel->ConstructFromResourceL( reader );
+ CleanupStack::PopAndDestroy(); // reader
+ }
+ aknLabel->ActivateL();
+ CleanupStack::Pop( aknLabel );
+ return aknLabel;
+ }
+
+// ---------------------------------------------------------------------------
+// Create choicelist and display it in the container.
+// ---------------------------------------------------------------------------
+//
+ CAknChoiceList* CTruiMainViewContainer::CreateChoiceListL
+ ( CCoeControl* aParent,
+ MCoeControlObserver* aObserver,
+ CDesCArray* aTextArray,
+ CAknButton* aButton )
+ {
+ CAknChoiceList* choiceList = CAknChoiceList::NewLC( aParent,
+ aTextArray,
+ CAknChoiceList::EAknChoiceListWithoutCurrentSelection,
+ aButton );
+ choiceList->SetObserver( aObserver );
+ CleanupStack::Pop( choiceList );
+ return choiceList;
+ }
+
+// ---------------------------------------------------------------------------
+// Create HWRBox and display it in the container.
+// ---------------------------------------------------------------------------
+//
+CTruiHwrBox* CTruiMainViewContainer::CreateHwrBoxL( CCoeControl* aParent,
+ MTruiHwrBoxObserver* aObserver )
+ {
+ return CTruiHwrBox::NewL( aParent, aObserver, iBackGround );
+ }
+
+// ---------------------------------------------------------------------------
+// Responds to changes to the size and position of the contents of this control.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::SizeChanged()
+ {
+ TInt varity = Layout_Meta_Data::IsLandscapeOrientation() ? KLandscapeVarity
+ : KPortraitVarity;
+ DoSizeChanged( varity );
+
+ if ( iBackGround )
+ {
+ iBackGround->SetRect( Rect() );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// From class CCoeControl.
+// Handles key event.
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CTruiMainViewContainer::OfferKeyEventL
+ ( const TKeyEvent& aKeyEvent,
+ TEventCode aType )
+ {
+ if ( aType == EEventKey )
+ {
+ switch ( aKeyEvent.iCode )
+ {
+ case EKeyLeftArrow:
+ {
+ return EKeyWasConsumed;
+ }
+ case EKeyRightArrow:
+ {
+ CAknNavigationDecorator* naviDecorator =
+ iAppUi->GetNaviDecorator();
+ CAknTabGroup* tabGroup = static_cast<CAknTabGroup*>
+ ( naviDecorator->DecoratedControl() );
+ return tabGroup->OfferKeyEventL( aKeyEvent, aType );
+ }
+ default:
+ break;
+ }
+ }
+ return EKeyWasNotConsumed;
+ }
+
+// ---------------------------------------------------------------------------
+// From class CCoeControl.
+// The region of the control to be redrawn.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::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 );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// From class CCoeControl.
+// Handles a change to the control's resources.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::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, iLabel->OverrideColorL( EColorLabelText,
+ labelColor ) );
+ if ( errLable != KErrNone )
+ {
+ return;
+ }
+ TRAP_IGNORE( iIindicator->OverrideColorL( EColorLabelText,
+ labelColor ) );
+ }
+ TRgb iconColor = KRgbBlack;
+ // Change left icon
+ iLeftBtn->State()->SetIcon( ConstructIconFromResourceL
+ ( R_MAINVIEW_BUTTON_LEFT ) );
+ // Change right icon
+ iRightBtn->State()->SetIcon( ConstructIconFromResourceL
+ ( R_MAINVIEW_BUTTON_RIGHT ) );
+
+ // Change choicelist button
+ TInt rangeId = iEngine->GetCurrentCharacterRange();
+ TInt buttonResoureId = ButtonResourceId( rangeId );
+ iCurChoiceListBtn->State()->SetIcon( ConstructIconFromResourceL
+ ( buttonResoureId ) );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Handles an event from an observed control.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::HandleControlEventL(CCoeControl* aControl,
+ TCoeEvent aEventType)
+ {
+ // Handle left button event
+ if ( aControl == iLeftBtn && aEventType == EEventStateChanged )
+ {
+ //Get character set
+ const HBufC* charSet = iEngine->CharacterSet();
+ ASSERT( charSet );
+ //Locate current position
+ TInt charPos = charSet->Find( iCurrentChar );
+ if ( charPos != KErrNotFound )
+ {
+ //Move left
+ TInt length = charSet->Length();
+ charPos = ( charPos - 1 + length ) % length;
+ SetCurrentCharL( charSet->Mid( charPos, 1 ) );
+ }
+ }
+ // Handle indicator button event
+ else if ( aControl == iIindicator && aEventType == EEventRequestFocus )
+ {
+ PreviewCharacterModel();
+ }
+ // Handle right button event
+ else if ( aControl == iRightBtn && aEventType == EEventStateChanged )
+ {
+ //Get character set
+ const HBufC* charSet = iEngine->CharacterSet();
+ ASSERT( charSet );
+ //Locate current position
+ TInt charPos = charSet->Find( iCurrentChar );
+ if ( charPos != KErrNotFound )
+ {
+ //Move left
+ TInt length = charSet->Length();
+ charPos = ( charPos + 1 + length ) % length;
+ SetCurrentCharL( charSet->Mid( charPos, 1 ) );
+ }
+ }
+ // Handle choicelist event
+ else if ( aControl == iChoicelist && aEventType == EEventStateChanged )
+ {
+ // Handle character range changing event
+ // Get the selected index
+ TInt index = iChoicelist->SelectedIndex();
+
+ // Set current character range by index in Engine
+ iEngine->SetCharacterRangeByIndexL( index );
+
+ // Get the current character range Id
+ TInt rangeId = iEngine->GetCurrentCharacterRange();
+
+ // Handle character range changed
+ HandleCharRangeChangedL( index, rangeId );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// From class MTruiHWRBoxObserver.
+// Responds to changes to the size and position of the contents of control.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::SaveNewModelL()
+ {
+ TBuf<KSimilarMsgLength> similarMsg;
+ TRAPD( err, iEngine->SetCharacterModelL( iCurrentChar,
+ iHwrBox->Model(),
+ similarMsg ) );
+ switch ( err )
+ {
+ case KErrNone:
+ {
+ //Dim clear button and preview button
+ if ( iClearBtn )
+ {
+ iClearBtn->SetDimmed( EFalse );
+ iClearBtn->DrawNow();
+ }
+ if ( iPreviewBtn )
+ {
+ iPreviewBtn->SetDimmed( EFalse );
+ iPreviewBtn->DrawNow();
+ }
+ TPoint hwrPos = iHwrBox->PositionRelativeToScreen();
+ HBufC* tooltipText =
+ iEikonEnv->AllocReadResourceLC( R_TRUI_TOOLTIP_SAVED );
+ iHwrBox->ShowTooltipL( *tooltipText,
+ hwrPos + TPoint( iHwrBox->Size().iWidth, KHwrTooltipY ),
+ KTooltipShowDelay, KTooltipHideDelay );
+ CleanupStack::PopAndDestroy( tooltipText );
+ break;
+ }
+ case KErrAlreadyExists:
+ {
+ //Clear invalid model
+ ClearCurrentModel();
+
+ // Transfer some special gesture chars into displayable chars.
+ AdjustDisplayChars( similarMsg );
+
+ //Popup err message
+ HBufC* errMsg = iEikonEnv->AllocReadResourceLC( R_TRUI_NOTE_SIMILAR_MODEL );
+ HBufC* tooltipText = HBufC::NewLC( errMsg->Length() + similarMsg.Length()
+ + KExtraSize );
+ TPtr tooltipTextPtr = tooltipText->Des();
+ tooltipTextPtr.Format( *errMsg, &similarMsg );
+ PopupInformationNoteL( *tooltipText );
+ CleanupStack::PopAndDestroy( tooltipText );
+ CleanupStack::PopAndDestroy( errMsg );
+ break;
+ }
+ default:
+ {
+ //Clear invalid model
+ ClearCurrentModel();
+ //Popup err message
+ HBufC* tooltipText = iEikonEnv->AllocReadResourceLC( R_TRUI_NOTE_SAVE_FAILED );
+ PopupInformationNoteL( *tooltipText );
+ CleanupStack::PopAndDestroy( tooltipText );
+ break;
+ }
+ }
+ };
+
+// ---------------------------------------------------------------------------
+// From class MTruiHWRBoxObserver.
+// Handle the message event from the HWRBox
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::HandleEventL( TMessageType aMessage )
+ {
+ if ( aMessage == EModelExist )
+ {
+ HBufC* tooltipText =
+ iEikonEnv->AllocReadResourceLC( R_TRUI_NOTE_CLEAR_BOX );
+ PopupInformationNoteL( *tooltipText );
+ CleanupStack::PopAndDestroy( tooltipText );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Handles language script changed.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::HandleLanguageScriptChangedL( TInt aScriptId )
+ {
+ CTruiEngine* engine = iAppUi->HwrEngine();
+ const RArray<TInt>& languageScriptId = engine->SupportedLanguageScript();
+ TInt index = languageScriptId.Find( aScriptId );
+ if ( index != KErrNotFound )
+ {
+ // Set the language script
+ engine->SetLanguageScriptByIndexL( aScriptId );
+
+ // Copy language script names array
+ CDesCArray* rangeNames = engine->GetCharacterRangeName();
+ CDesCArray* itemsInChoiceList = new (ELeave) CDesCArrayFlat
+ ( rangeNames->Count() );
+ CleanupStack::PushL( itemsInChoiceList );
+ for ( TInt i = 0; i < rangeNames->Count(); i++ )
+ {
+ itemsInChoiceList->AppendL( ( *rangeNames )[i] );
+ }
+
+ // Set the items in choicelist
+ iChoicelist->SetItems( itemsInChoiceList ); // Transfered ownership
+ CleanupStack::Pop( itemsInChoiceList );
+
+ // Set hwrbox's rect to engine and set guiding line to hwrbox
+ TBool isDisplayTopGuideLine = ( iEngine->CurrentLanguageScript()
+ == EMainViewSubmenuHebrew ) ? ETrue : EFalse;
+
+ iHwrBox->SetDisplayTopGuideLine( isDisplayTopGuideLine );
+
+ // Get the ative character range's ID.
+ TInt rangeId = engine->GetCurrentCharacterRange();
+ // Handle char range changed with index 0
+ HandleCharRangeChangedL( 0, rangeId );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Handles character range changed.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::HandleCharRangeChangedL( TInt aIndex,
+ TInt aRangeId )
+ {
+ // Get the button's resourceID by char range's ID
+ TInt buttonResoureId = ButtonResourceId( aRangeId );
+ // Create new button with the reourceID
+ // and add it to the AknChoiceList
+ if ( buttonResoureId )
+ {
+ CAknButton* rangeButton = CreateButtonL( buttonResoureId,
+ this, NULL );
+ iCurChoiceListBtn = rangeButton;
+ CleanupStack::PushL( rangeButton );
+ iChoicelist->SetButtonL( rangeButton );
+ CleanupStack::Pop( rangeButton );
+ iChoicelist->DrawNow();
+ }
+ // Set choiclist' selected item to index.
+ iChoicelist->SetSelectedIndex( aIndex );
+
+ // Refresh the active char with the first char in the character set
+ const HBufC* charSet = iEngine->CharacterSet();
+ ASSERT( charSet );
+ SetCurrentCharL( charSet->Mid( 0, 1 ) );
+ }
+
+// ---------------------------------------------------------------------------
+// Handles choosing an active char from SCT.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::HandleChooseCharEventL()
+ {
+ TInt rangeId =
+ iAppUi->HwrEngine()->GetCurrentCharacterRange();
+
+ // Get character set id by character range id
+ TInt characterSetId = SctCharacterSetId( rangeId );
+
+ // Popup SCT dialog
+ TBuf<KSctBufferSize> selectedStr;
+ TInt buttonId = PopupSctDialogL( EAknSCTLowerCase,
+ selectedStr,
+ characterSetId );
+ if ( buttonId != 0 && selectedStr.Length() > 0 )
+ {
+ SetCurrentCharL( selectedStr.Mid( 0, 1 ) );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Check if clear button has been dimmed.
+// ---------------------------------------------------------------------------
+//
+TBool CTruiMainViewContainer::IsButtonDimmed()
+ {
+ return iClearBtn ? iClearBtn->IsDimmed() : EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// Check if all delete button has been dimmed.
+// ---------------------------------------------------------------------------
+//
+TBool CTruiMainViewContainer::IsAllDelete()
+ {
+ const HBufC* charSet = iEngine->CharacterSet();
+ for ( TInt i = 0; i < charSet->Length(); i++ )
+ {
+ if ( iEngine->CheckCharacterModel( charSet->Mid( i, 1 ) ) )
+ {
+ return EFalse;
+ }
+ }
+ return ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// Return button's resourceId by Character Range Id.
+// Use this resoueceId to create the correct button.
+// ---------------------------------------------------------------------------
+//
+TInt CTruiMainViewContainer::ButtonResourceId( TInt aRangeId ) const
+ {
+ TInt resoureId;
+ switch ( aRangeId )
+ {
+ case ELatinLowerLetters:
+ {
+ resoureId = R_MAINVIEW_BUTTON_CHARRANGE_LATIN_LOWER;
+ }
+ break;
+ case ELatinUpperLetters:
+ {
+ resoureId = R_MAINVIEW_BUTTON_CHARRANGE_LATIN_UPPER;
+ }
+ break;
+ case ELatinAccent:
+ {
+ resoureId = R_MAINVIEW_BUTTON_CHARRANGE_LATIN_ACCENT;
+ }
+ break;
+ case ELatinDigital:
+ {
+ resoureId = R_MAINVIEW_BUTTON_CHARRANGE_NUMERIC;
+ }
+ break;
+ case ELatinSymbol:
+ {
+ resoureId = R_MAINVIEW_BUTTON_CHARRANGE_SYMBOL;
+ }
+ break;
+ case ECyrillicLowerLetters:
+ { //
+ resoureId = R_MAINVIEW_BUTTON_CHARRANGE_CYRILLIC_LOWER;
+ }
+ break;
+ case ECyrillicUpperLetters:
+ {
+ resoureId = R_MAINVIEW_BUTTON_CHARRANGE_CYRILLIC_UPPER;
+ }
+ break;
+ case ECyrillicAccent:
+ {
+ resoureId = R_MAINVIEW_BUTTON_CHARRANGE_CYRILLIC_ACCENT;
+ }
+ break;
+ case EGreekLowerLetters:
+ {
+ resoureId = R_MAINVIEW_BUTTON_CHARRANGE_GREEK_LOWER;
+ }
+ break;
+ case EGreekUpperLetters:
+ {
+ resoureId = R_MAINVIEW_BUTTON_CHARRANGE_GREEK_UPPER;
+ }
+ break;
+ case EHebrewLetters:
+ {
+ resoureId = R_MAINVIEW_BUTTON_CHARRANGE_HEBREW_LETTERS;
+ }
+ break;
+ default:
+ {
+ resoureId = 0;
+ }
+ }
+ return resoureId;
+ }
+
+// ---------------------------------------------------------------------------
+// Pop Sct dialog.
+// ---------------------------------------------------------------------------
+//
+TInt CTruiMainViewContainer::PopupSctDialogL( TInt aCharCase,
+ TDes& aSpecialChars,
+ TInt aCharSetResourceId )
+ {
+ CAknCharMapDialog* sct = new (ELeave) CAknCharMapDialog( aCharCase,
+ aSpecialChars,
+ aCharSetResourceId );
+ TInt keyboardMode = CurrentKeyBoardModeL();
+ if ( keyboardMode )
+ {
+ // QWERTY: Lock numeric keys.
+ sct->LockNumericKeys( ETrue );
+ }
+ else
+ {
+ // ITU-T: Unlock numeric keys.
+ sct->LockNumericKeys( EFalse );
+ }
+
+ sct->DisableRecentCharsRow();
+ TInt retValue = sct->ExecuteLD( R_TRUI_SCT_DIALOG );
+ return retValue;
+ }
+
+// ---------------------------------------------------------------------------
+// Set current trained char
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::SetCurrentCharL( const TPtrC& aChar )
+ {
+ //If previous char's model is not saved, save it before setting new char.
+ if ( iHwrBox->BoxState() == CTruiHwrBox::ENewModelDraw )
+ {
+ //Call save function from hwrbox,
+ //in order to stop periodics in the hwrbox
+ iHwrBox->SaveModelByManuallyL();
+ }
+ // In case of new localization not check-in, temporary
+ if ( iCurrentChar != aChar )
+ {
+ //Set current char
+ iCurrentChar = aChar;
+ //Set Top Label's text
+ HBufC* teachCharacter = NULL;
+ teachCharacter = StringLoader::LoadLC
+ ( R_TRUI_MAINVIEW_TEXT_TEACH_CHARACTER, aChar );
+ if ( !iLabeltext )
+ {
+ delete iLabeltext;
+ iLabeltext = NULL;
+ iLabeltext = HBufC::NewL( teachCharacter->Length() + KExtraSize );
+ }
+ TPtr labelOldPtr = iLabeltext->Des();
+ if ( labelOldPtr.MaxLength() < teachCharacter->Length() )
+ {
+ iLabeltext = iLabeltext->ReAlloc( teachCharacter->Length() + KExtraSize );
+ }
+ TPtr labelTextPtr = iLabeltext->Des();
+ labelTextPtr.Copy( *teachCharacter );
+ CleanupStack::PopAndDestroy( teachCharacter );
+
+ delete iWrappedLabelText;
+ iWrappedLabelText = NULL;
+ iWrappedLabelText = HBufC::NewL( iLabeltext->Length()
+ + iLineWidthArray.Count()
+ + KExtraSize );
+ // Be ready to show label
+ const CFont* font = AknLayoutUtils::FontFromId( iMultilineLayout.FontId() );
+ TRAPD( err, WrapLabelTextL( font, *iLabeltext, iLineWidthArray, iWrappedLabelText ) );
+ if ( err == KErrNone )
+ {
+ iLabel->SetTextL( *iWrappedLabelText );
+ }
+ else
+ {
+ iLabel->SetTextL( *iLabeltext );
+ }
+ AknLayoutUtils::LayoutLabel( iLabel,
+ iLabelPaneRect,
+ iMultilineLayout );
+ TRgb labelColor = KRgbBlack;
+ if ( GetCachedLabelTextColor( labelColor ) == KErrNone )
+ {
+ iLabel->OverrideColorL( EColorLabelText, labelColor );
+ }
+
+ //Set Indicator's text
+ const HBufC* charIndicator = iEikonEnv->AllocReadResourceL
+ ( R_TRUI_MAINVIEW_ACTIVE_CHAR_INDICATOR );
+ TBuf<KIndicatorTextLen> indicatortext;
+ indicatortext.Format( *charIndicator, &aChar );
+ delete charIndicator;
+ charIndicator = NULL;
+ iIindicator->SetTextL( indicatortext );
+ }
+
+ iHwrBox->ClearExistModel();
+ //Load existing model and dim clear button
+ if ( iEngine->CheckCharacterModel( iCurrentChar ) )
+ {
+ //Get model from engine
+ TRAPD( err, iEngine->GetCharacterModelL( iCurrentChar, iHwrBox->Model() ) );
+ if ( err == KErrNone )
+ {
+ iHwrBox->ModelIsReady();
+ //Activate clear button and preview button
+ if ( iClearBtn )
+ {
+ iClearBtn->SetDimmed( EFalse );
+ iClearBtn->DrawNow();
+ }
+ if ( iPreviewBtn )
+ {
+ iPreviewBtn->SetDimmed( EFalse );
+ iPreviewBtn->DrawNow();
+ }
+ }
+ //Preview
+ iHwrBox->PlayAnimation( EFalse );
+ }
+ else
+ {
+ iHwrBox->ModelIsReady( EFalse );
+ if ( iClearBtn )
+ {
+ //Dim clear button and preview button
+ iClearBtn->SetDimmed( ETrue );
+ iClearBtn->DrawNow();
+ }
+ if ( iPreviewBtn )
+ {
+ iPreviewBtn->SetDimmed( ETrue );
+ iPreviewBtn->DrawNow();
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Preview character model
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::PreviewCharacterModel()
+ {
+ if ( iEngine->CheckCharacterModel( iCurrentChar ) )
+ {
+ iHwrBox->PlayAnimation( EFalse );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Clear current model
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::ClearCurrentModel()
+ {
+ if ( iClearBtn )
+ {
+ iClearBtn->SetDimmed( ETrue );
+ iClearBtn->DrawNow();
+ }
+ if ( iPreviewBtn )
+ {
+ iPreviewBtn->SetDimmed( ETrue );
+ iPreviewBtn->DrawNow();
+ }
+ iHwrBox->ClearExistModel();
+ }
+
+// ---------------------------------------------------------------------------
+// Popup information note
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::PopupInformationNoteL( const TDesC& aText )
+ {
+ CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue );
+ note->ExecuteLD( aText );
+ }
+// ---------------------------------------------------------------------------
+// Adjust special behavior characters to displayable characters.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::AdjustDisplayChars( TDes& aResult )
+ {
+ if ( aResult.Length() > 0 && aResult.Length() <= 1 )
+ {
+ switch ( aResult[0] )
+ {
+ case EKeyEnter:
+ {
+ aResult.Replace( 0, 1, KDisplayEnter );
+ break;
+ }
+ case EKeySpace:
+ {
+ aResult.Replace( 0, 1, KDisplaySpace );
+ break;
+ }
+ case EKeyBackspace:
+ {
+ aResult.Replace( 0, 1, KDisplayBackspace );
+ break;
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Delete model of the shortcut
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::DeleteModelL()
+ {
+ // Delete shortcut from engine
+ if ( iEngine->DeleteCharacterModel( *iIindicator->Text() )
+ == KErrNone )
+ {
+ ClearCurrentModel();
+
+ // Pop tooltip
+ HBufC* tooltipText =
+ iEikonEnv->AllocReadResourceLC( R_TRUI_TOOLTIP_DELETED );
+ TPoint hwrPos = iHwrBox->PositionRelativeToScreen();
+ iHwrBox->ShowTooltipL( *tooltipText,
+ hwrPos + TPoint( iHwrBox->Size().iWidth, KHwrTooltipY ),
+ KTooltipShowDelay, KTooltipHideDelay );
+ CleanupStack::PopAndDestroy( tooltipText );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Delete all models of current character
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::DeleteAllModelL()
+ {
+ // Popup note dialog
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+ if ( dlg->ExecuteLD( R_TRUI_QUERYDIALOG_DELETE_ALL_MODELS ) )
+ {
+ // press yes
+ const HBufC* charSet = iEngine->CharacterSet();
+ for ( TInt i = 0; i < charSet->Length(); i++ )
+ {
+ if ( iEngine->CheckCharacterModel( charSet->Mid( i, 1 ) ) )
+ {
+ if ( *iIindicator->Text() == charSet->Mid( i, 1 ) )
+ {
+ DeleteModelL();
+ }
+ else
+ {
+ iEngine->DeleteCharacterModel( charSet->Mid( i, 1 ) );
+ }
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Get character set Id,
+// used to choose which characters will be displayed in SCT
+// ---------------------------------------------------------------------------
+//
+TInt CTruiMainViewContainer::SctCharacterSetId( TInt aRangeId )
+ {
+ TInt characterSetId;
+ switch ( aRangeId )
+ {
+ case EMainViewSubmenuLatinLowerLetter:
+ {
+ characterSetId = R_TRUI_SCT_CHARSET_LATIN_LOWER;
+ break;
+ }
+ case EMainViewSubmenuCyrillicLowerLetters:
+ {
+ characterSetId = SctCyrillicLowerCharacterSetId
+ ( iEngine->InputLanguage() );
+ break;
+ }
+ case EMainViewSubmenuGreekLowerLetters:
+ {
+ characterSetId = R_TRUI_SCT_CHARSET_GREEK_LOWER;
+ break;
+ }
+ case EMainViewSubmenuHebrewLetters:
+ {
+ characterSetId = R_TRUI_SCT_CHARSET_HEBREW_LETTERS;
+ break;
+ }
+ case EMainViewSubmenuLatinAccent:
+ {
+ characterSetId = R_TRUI_SCT_CHARSET_LATIN_ACCENT;
+ break;
+ }
+ case EMainViewSubmenuLatinUpperLetter:
+ {
+ characterSetId = R_TRUI_SCT_CHARSET_LATIN_UPPER;
+ break;
+ }
+ case EMainViewSubmenuCyrillicUpperLetters:
+ {
+ characterSetId = SctCyrillicUpperCharacterSetId
+ ( iEngine->InputLanguage() );
+ break;
+ }
+ case EMainViewSubmenuCyrillicAccent:
+ {
+ characterSetId = R_TRUI_SCT_CHARSET_CYRILLIC_ACCENT;
+ break;
+ }
+ case EMainViewSubmenuGreekUpperLetters:
+ {
+ characterSetId = R_TRUI_SCT_CHARSET_GREEK_UPPER;
+ break;
+ }
+ case EMainViewSubmenuDigital:
+ {
+ characterSetId = R_TRUI_SCT_CHARSET_LATIN_NUMERIC;
+ break;
+ }
+ case EMainViewSubmenuSymbols:
+ {
+ if ( FeatureManager::FeatureSupported(KFeatureIdChinese) )
+ {
+ characterSetId = R_TRUI_SCT_CHARSET_LATIN_SYMBOL_CHINESE;
+ }
+ else
+ {
+ characterSetId = R_TRUI_SCT_CHARSET_LATIN_SYMBOL;
+ }
+ break;
+ }
+ default:
+ {
+ characterSetId = 0;
+ }
+ }
+ return characterSetId;
+ }
+
+// ---------------------------------------------------------------------------
+// Get cyrillic lower character set Id.
+// ---------------------------------------------------------------------------
+//
+TInt CTruiMainViewContainer::SctCyrillicLowerCharacterSetId
+ ( TLanguage aInputLanguage )
+ {
+ if ( aInputLanguage == ELangBulgarian )
+ {
+ return R_TRUI_SCT_CHARSET_CYRILLIC_LOWER_BULGARIAN;
+ }
+ else if ( aInputLanguage == ELangRussian )
+ {
+ return R_TRUI_SCT_CHARSET_CYRILLIC_LOWER_RUSSIAN;
+ }
+ else if ( aInputLanguage == ELangUkrainian )
+ {
+ return R_TRUI_SCT_CHARSET_CYRILLIC_LOWER_UKRAINE;
+ }
+ else
+ {
+ return R_TRUI_SCT_CHARSET_CYRILLIC_LOWER;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Get cyrillic upper character set Id.
+// ---------------------------------------------------------------------------
+//
+TInt CTruiMainViewContainer::SctCyrillicUpperCharacterSetId
+ ( TLanguage aInputLanguage )
+ {
+ if ( aInputLanguage == ELangBulgarian )
+ {
+ return R_TRUI_SCT_CHARSET_CYRILLIC_UPPER_BULGARIAN;
+ }
+ else if ( aInputLanguage == ELangRussian )
+ {
+ return R_TRUI_SCT_CHARSET_CYRILLIC_UPPER_RUSSIAN;
+ }
+ else if ( aInputLanguage == ELangUkrainian )
+ {
+ return R_TRUI_SCT_CHARSET_CYRILLIC_UPPER_UKRAINE;
+ }
+ else
+ {
+ return R_TRUI_SCT_CHARSET_CYRILLIC_UPPER;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Before exit, do some necessary operation
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::PrepareToExitL()
+ {
+ //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();
+ }
+ iHwrBox->HideInfoPopupNote();
+ }
+
+// ---------------------------------------------------------------------------
+// This is called whenever the control gains or loses focus,
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::FocusChanged( TDrawNow /*aDrawNow*/ )
+ {
+ if ( IsFocused() )
+ {
+ if ( iHwrBox->BoxState() == CTruiHwrBox::EExistModelStop )
+ {
+ iHwrBox->ResumePlaying();
+ }
+ }
+ else
+ {
+ if ( iHwrBox->BoxState() == CTruiHwrBox::EExistModelDraw )
+ {
+ iHwrBox->PausePlaying();
+ }
+ }
+ iHwrBox->SetFocus( IsFocused() );
+ }
+
+// ---------------------------------------------------------------------------
+// Gets the control's help context. Returns a NULL context by default.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::GetHelpContext( TCoeHelpContext& aContext ) const
+ {
+ aContext.iMajor = KUidtruiApp;
+ aContext.iContext = HWRT_HLP_MAIN_VIEW;
+ }
+
+// ---------------------------------------------------------------------------
+// Handle size changed.
+// ---------------------------------------------------------------------------
+//
+void CTruiMainViewContainer::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();
+
+ // Caculate hwr_training_navi_pane
+ TAknWindowComponentLayout navi_pane_layout =
+ AknLayoutScalable_Apps::hwr_training_navi_pane( aVarity );
+ TAknLayoutRect navi_pane_layout_rect;
+ navi_pane_layout_rect.LayoutRect( main_pane_rect, navi_pane_layout );
+ TRect navi_pane_rect = navi_pane_layout_rect.Rect();
+ // Caculate navi pane contents
+ // hwr_training_navi_pane_g1
+ TAknWindowComponentLayout navi_pane_g1_layout =
+ AknLayoutScalable_Apps::hwr_training_navi_pane_g1
+ ( KVarityNaviPaneContents );
+ TAknLayoutRect navi_pane_g1_layout_rect;
+ navi_pane_g1_layout_rect.LayoutRect( navi_pane_rect, navi_pane_g1_layout );
+ TRect choicelistRect = navi_pane_g1_layout_rect.Rect();
+ iChoicelist->SetRect( choicelistRect );
+
+ // hwr_training_navi_pane_g2
+ // hwr_training_navi_pane_g3
+ TAknWindowComponentLayout navi_pane_g3_layout =
+ AknLayoutScalable_Apps::hwr_training_navi_pane_g3
+ ( KVarityNaviPaneContents );
+ TAknLayoutRect navi_pane_g3_layout_rect;
+ navi_pane_g3_layout_rect.LayoutRect( navi_pane_rect, navi_pane_g3_layout );
+ iLeftBtn->SetRect( navi_pane_g3_layout_rect.Rect() );
+ // hwr_training_navi_pane_g4
+ TAknWindowComponentLayout navi_pane_g4_layout =
+ AknLayoutScalable_Apps::hwr_training_navi_pane_g4
+ ( KVarityNaviPaneContents );
+ TAknLayoutRect navi_pane_g4_layout_rect;
+ navi_pane_g4_layout_rect.LayoutRect( navi_pane_rect, navi_pane_g4_layout );
+ iRightBtn->SetRect( navi_pane_g4_layout_rect.Rect() );
+ // hwr_training_navi_pane_g5
+ TAknWindowComponentLayout navi_pane_g5_layout =
+ AknLayoutScalable_Apps::hwr_training_navi_pane_g5
+ ( KVarityNaviPaneContents );
+ TAknLayoutRect navi_pane_g5_layout_rect;
+ navi_pane_g5_layout_rect.LayoutRect( navi_pane_rect, navi_pane_g5_layout );
+ TRect indicator_rect = navi_pane_g5_layout_rect.Rect();
+ iIindicator->SetRect( indicator_rect );
+ // hwr_training_navi_pane_t1
+ TAknTextComponentLayout nave_pane_t1_layout =
+ AknLayoutScalable_Apps::hwr_training_navi_pane_t1
+ ( KVarityNaviPaneContents );
+ TAknLayoutText navi_pane_t1_layout_text;
+ navi_pane_t1_layout_text.LayoutText( indicator_rect, nave_pane_t1_layout );
+ iIindicator->SetFont( navi_pane_t1_layout_text.Font() );
+ iIindicator->SetLabelAlignment( navi_pane_t1_layout_text.Align() );
+
+ // 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 );
+ iLabelPaneRect = instruct_pane_layout_rect.Rect();
+
+ // count of text rows
+ TInt count = AknLayoutScalable_Apps::
+ list_single_hwr_training_instruct_pane_ParamLimits().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( 0, 0, i );
+ TAknLayoutRect each_row_layout_rect;
+ each_row_layout_rect.LayoutRect( iLabelPaneRect,
+ 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( iLabelPaneRect, iMultilineLayout );
+ const CFont* font = AknLayoutUtils::FontFromId( iMultilineLayout.FontId() );
+ TRAPD( err, WrapLabelTextL( font, *iLabeltext, iLineWidthArray, iWrappedLabelText ) );
+ if ( err == KErrNone )
+ {
+ TRAP_IGNORE( iLabel->SetTextL( *iWrappedLabelText ) );
+ }
+ else
+ {
+ TRAP_IGNORE( iLabel->SetTextL( *iLabeltext ) );
+ }
+ AknLayoutUtils::LayoutLabel( iLabel,
+ iLabelPaneRect,
+ iMultilineLayout );
+ }
+ textLayoutArray.Close();
+
+ TRgb labelColor = KRgbBlack;
+ TInt error = GetCachedLabelTextColor( labelColor );
+ if ( error == KErrNone )
+ {
+ TRAP_IGNORE( iLabel->OverrideColorL( EColorLabelText, labelColor ) );
+ TRAP_IGNORE( iIindicator->OverrideColorL( EColorLabelText, labelColor ) );
+ }
+ }
+
+void CTruiMainViewContainer::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+ {
+ if ( iHwrBox->BoxState() == CTruiHwrBox::ENewModelDraw )
+ {
+ //Call save function from hwrbox,
+ //in order to stop periodics in the hwrbox
+ iHwrBox->HandlePointerEventL( aPointerEvent );
+ }
+ else
+ {
+ CCoeControl::HandlePointerEventL( aPointerEvent );
+ }
+ }
+