diff -r 000000000000 -r eb1f2e154e89 textinput/peninputhwrtrui/src/truishortcuteditcontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputhwrtrui/src/truishortcuteditcontainer.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,1235 @@ +/* +* 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 + ( 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 + ( 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& 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 presetModel; + CleanupClosePushL( presetModel ); + TBuf 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& 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 preset; + + // Preset symbol + preset.Format( KActiveCharFormat, aUnicode ); + iIndicator->SetTextL( preset ); + iIndicator->DrawNow(); + // Clear hwrbox and stop playing animation + iHwrBox->ClearExistModel(); + // Get model + TBuf 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 presetModels; + CleanupClosePushL( presetModels ); + TBuf 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 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 similarMsg; + SaveOwnShortcutL( iEngine->Shortcut(), iModelBak, similarMsg ); + } + } + + // Close tooltip + iHwrBox->HideInfoPopupNote(); + + // Show NaviDecorator + CTruiShortcutEditView* view = static_cast + ( 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 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 + ( toolbar->ControlOrNull( EShortcutEditViewDelete ) ); + clearBtn->SetDimmed( EFalse ); + clearBtn->DrawNow(); + CAknButton* previewBtn = static_cast + ( 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 + ( toolbar->ControlOrNull( EShortcutEditViewDelete ) ); + CAknButton* gridBtn = static_cast + ( 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 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 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 + ( 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 + ( toolbar->ControlOrNull( EShortcutEditViewDelete ) ); + clearBtn->SetDimmed( ETrue ); + clearBtn->DrawNow(); + + // Set preview button status + CAknButton* previewBtn = static_cast + ( 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 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 ) ); + } + } + }