/*
* 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 CTruiTextSettingPageContainer
*
*/
#include <aknlayoutscalable_apps.cdl.h>
#include <aknscontrolcontext.h>
#include <aknpreviewpopupcontroller.h>
#include <aknpreviewpopupobserver.h>
#include <layoutmetadata.cdl.h>
#include "truitextsettingpagecontainer.h"
#include "truihwrbox.h"
#include "truiappui.h"
#include "truiengine.h"
#include "truishortcutsview.h"
#include "truiapplication.h"
#include "truiinfomessageview.h"
#include "truishortcuteditview.h"
#include "truishortcutedittextview.h"
#include "trui.hrh"
#include "truicontainerbase.h"
// Initialized size for hwrbox
const TSize KHwrboxSize = TSize( 100, 100 );
// The x-cordination of hwrbox pos
const TInt KHwrBoxPosPortraitX = 60;
const TInt KHwrBoxPosLandscapeX = 100;
const TInt KPopupWindowVarity = 1;
const TInt KParaDelimiterSize = 1;
_LIT( KParaDelimiterFormat, "%c" );
// ======== MEMBER FUNCTIONS ========
// ---------------------------------------------------------------------------
// Constructor.
// ---------------------------------------------------------------------------
//
CTruiTextSettingPageContainer::CTruiTextSettingPageContainer
( TInt aResourceID, TDes& aText, TInt aTextSettingPageFlags )
:CAknTextSettingPage( aResourceID, aText, aTextSettingPageFlags )
{
}
// ---------------------------------------------------------------------------
// Perform the second phase construction of a CTruiMainViewContainer object.
// ---------------------------------------------------------------------------
//
void CTruiTextSettingPageContainer::ConstructL( const TRect& aRect, TBool aEnableHwrBox )
{
CAknTextSettingPage::ConstructL();
TextControl()->SetObserver( this );
// Check character model
CEikEdwin* edwin = static_cast<CEikEdwin*>( EditorControl() );
HBufC* shortcutText = edwin->GetTextInHBufL();
if ( shortcutText )
{
// Replace paragraph seperator to line break
TPtr ptr = shortcutText->Des();
TBuf<KParaDelimiterSize> paraDelimiter;
paraDelimiter.Format( KParaDelimiterFormat, EKeyEnter );
AknTextUtils::ReplaceCharacters( ptr, paraDelimiter,
TChar( CEditableText::EParagraphDelimiter ) );
CleanupStack::PushL( shortcutText );
edwin->SetTextL( shortcutText );
CleanupStack::PopAndDestroy( shortcutText );
}
if ( aEnableHwrBox )
{
CTruiAppUi* appUi = static_cast<CTruiAppUi*>( iAvkonViewAppUi );
CTruiEngine* engine = appUi->HwrEngine();
if ( engine->CheckShortcutModel( engine->Shortcut() ) )
{
// Create hwrbox
iHwrBox = CTruiHwrBox::NewL( NULL, NULL );
iHwrBox->SetHwrBoxFlag( CTruiHwrBox::ENoFrameHwrBox
| CTruiHwrBox::EReadOnlyHwrBox);
// Create preview popup
iPopupController = CAknPreviewPopUpController::NewL
( *iHwrBox, CAknPreviewPopUpController::EPermanentMode );
iPopupController->AddObserverL( *this );
// Set guide line
iHwrBox->SetDisplayBottomGuideLine( ETrue );
if ( engine->CurrentLanguageScript() == EMainViewSubmenuHebrew )
{
iHwrBox->SetDisplayTopGuideLine( ETrue );
}
iPopupController->SetPopUpShowDelay( 0 );
}
}
SetRect( aRect );
if ( iPopupController )
{
iPopupController->ShowPopUp();
}
ActivateL();
}
// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
CTruiTextSettingPageContainer* CTruiTextSettingPageContainer::NewL
( TInt aResourceId,
TDes& aText,
const TRect& aRect,
TBool aEnableHwrBox,
TInt aTextSettingPageFlags )
{
CTruiTextSettingPageContainer* self = CTruiTextSettingPageContainer::NewLC
( aResourceId, aText,
aRect,
aEnableHwrBox,
aTextSettingPageFlags );
CleanupStack::Pop( self );
return self;
}
// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
CTruiTextSettingPageContainer* CTruiTextSettingPageContainer::NewLC
( TInt aResourceId,
TDes& aText,
const TRect& aRect,
TBool aEnableHwrBox,
TInt aTextSettingPageFlags )
{
CTruiTextSettingPageContainer* self = new (ELeave)
CTruiTextSettingPageContainer
( aResourceId, aText,
aTextSettingPageFlags );
CleanupStack::PushL( self );
self->ConstructL( aRect, aEnableHwrBox );
return self;
}
// ---------------------------------------------------------------------------
// Destructor.
// ---------------------------------------------------------------------------
//
CTruiTextSettingPageContainer::~CTruiTextSettingPageContainer()
{
delete iPopupController;
delete iHwrBox;
}
// ---------------------------------------------------------------------------
// Responds to changes to the size and position of the contents of this control.
// ---------------------------------------------------------------------------
//
void CTruiTextSettingPageContainer::SizeChanged()
{
CAknTextSettingPage::SizeChanged();
if ( iHwrBox )
{
// caculate main pane
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();
// Calculate popup_hwr_training_preview_window
TAknWindowComponentLayout preview_popup_layout =
AknLayoutScalable_Apps::popup_hwr_training_preview_window
( KPopupWindowVarity );
TAknLayoutRect preview_popup_layout_rect;
preview_popup_layout_rect.LayoutRect( main_pane_rect, preview_popup_layout );
TPoint labelPos = TextLabel()->PositionRelativeToScreen();
TPoint hwrPos = TPoint( 0, 0 );
if ( TBidiText::ScriptDirectionality( User::Language() )
== TBidiText::ELeftToRight )
{
TInt offset = Layout_Meta_Data::IsLandscapeOrientation() ?
KHwrBoxPosLandscapeX : KHwrBoxPosPortraitX;
hwrPos = labelPos + TPoint( offset, TextLabel()->Size().iHeight );
}
else
{
hwrPos = labelPos + TPoint( TextLabel()->Size().iWidth,
TextLabel()->Size().iHeight );
}
iHwrBox->SetSize( preview_popup_layout_rect.Rect().Size() );
iPopupController->SetPosition( hwrPos );
}
}
// ---------------------------------------------------------------------------
// Processes events from the softkeys.
// ---------------------------------------------------------------------------
//
void CTruiTextSettingPageContainer::ProcessCommandL( TInt aCommandId )
{
HideMenu();
switch ( aCommandId )
{
case EAknSoftkeyOk:
case EAknSoftkeySelect:
{
// Get the current text in setting page
CTruiAppUi* appUi = static_cast<CTruiAppUi*>( iAvkonViewAppUi );
CTruiEngine* engine = appUi->HwrEngine();
CEikEdwin* edwin = static_cast<CEikEdwin*>( EditorControl() );
HBufC* shortcutText = edwin->GetTextInHBufL();
CleanupStack::PushL( shortcutText );
// Replace paragraph seperator to line break
TPtr ptr = shortcutText->Des();
TBuf<KParaDelimiterSize> paraDelimiter;
paraDelimiter.Format( KParaDelimiterFormat, CEditableText::EParagraphDelimiter );
AknTextUtils::ReplaceCharacters( ptr, paraDelimiter, TChar( EKeyEnter ) );
// Update new text
engine->ChangeShortcutTextL( *shortcutText );
// Recalculate selected index of shortcut list
// Update shortcut list
engine->UpdateShortcutListL();
// Find the current shortcut's index in shortcut list
TInt index = 0;
CDesCArray* shortcutList = engine->ShortcutTextList();
if ( shortcutList )
{
TInt ret = 0;
ret = shortcutList->Find( *shortcutText, index );
if ( ret == KErrNotFound )
{
TInt oldIndex = engine->CurrentSelectedIndex();
index = ( oldIndex > shortcutList->Count() )
? shortcutList->Count() : oldIndex;
}
}
// Set current index in Engine
engine->SetCurrentSelectedIndex( index + 1 );
CleanupStack::PopAndDestroy( shortcutText );
// Store the content of setting page
UpdateSettingL();
CTruiShortcutEditTextView* view =
static_cast<CTruiShortcutEditTextView*>
( appUi->View( KTruiShortcutEditTextViewId ) );
if ( view->StartViewId() ==
TVwsViewId( KUidtruiApp, KTruiInfoMessageViewId ) )
{
ProcessCommandL( EAknSoftkeyNext );
}
else
{
// Switch to shortcuts view.
iAvkonViewAppUi->ActivateLocalViewL
( view->StartViewId().iViewUid );
}
break;
}
case EAknSoftkeyCancel:
{
iAvkonViewAppUi->ActivateLocalViewL( KTruiShortcutsViewId );
break;
}
case EAknSoftkeyNext:
{
UpdateSettingL();
// Get the current text in setting page
CTruiAppUi* appUi = static_cast<CTruiAppUi*>( iAvkonViewAppUi );
CTruiEngine* engine = appUi->HwrEngine();
CEikEdwin* edwin = static_cast<CEikEdwin*>( EditorControl() );
HBufC* shortcutText = edwin->GetTextInHBufL();
CleanupStack::PushL( shortcutText );
// Replace paragraph seperator to line break
TPtr ptr = shortcutText->Des();
TBuf<KParaDelimiterSize> paraDelimiter;
paraDelimiter.Format( KParaDelimiterFormat, CEditableText::EParagraphDelimiter );
AknTextUtils::ReplaceCharacters( ptr, paraDelimiter, TChar( EKeyEnter ) );
engine->SetShortcut( ptr );
CleanupStack::PopAndDestroy( shortcutText );
iAvkonViewAppUi->ActivateLocalViewL( KTruiShortcutEditViewId );
break;
}
case EAknSoftkeyBack:
{
CTruiAppUi* appUi = static_cast<CTruiAppUi*>( iAvkonViewAppUi );
CTruiEngine* engine = appUi->HwrEngine();
if ( engine->DisplayWizard() )
{
iAvkonViewAppUi->ActivateLocalViewL( KTruiInfoMessageViewId );
}
else
{
iAvkonViewAppUi->ActivateLocalViewL( KTruiShortcutsViewId );
}
break;
}
}
}
// ---------------------------------------------------------------------------
// From MAknPreviewPopUpObserver
// Called by the preview popup when an appropriate event takes place.
// ---------------------------------------------------------------------------
//
void CTruiTextSettingPageContainer::HandlePreviewPopUpEventL(
CAknPreviewPopUpController* aController, TPreviewPopUpEvent aEvent )
{
if ( aController == iPopupController && aEvent == EPreviewPopUpShown )
{
CTruiAppUi* appUi = static_cast<CTruiAppUi*>( iAvkonViewAppUi );
CTruiEngine* engine = appUi->HwrEngine();
CEikEdwin* edwin = TextControl();
HBufC* shortcutText = edwin->GetTextInHBufL();
CleanupStack::PushL( shortcutText );
// Get character model
TUint unicode = 0;
TRAPD( err, engine->GetShortcutModelL( engine->Shortcut(), iHwrBox->Model(), unicode ) );
if ( err == KErrNone )
{
TSize refSize = CTruiContainerBase::OriginSymbolSize();
iHwrBox->ShowTrails( iHwrBox->Model(), ETrue, refSize );
}
CleanupStack::PopAndDestroy( shortcutText );
}
}