diff -r 000000000000 -r 72b543305e3a mobilemessaging/postcard/postcardsrc/PostcardTextDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/postcard/postcardsrc/PostcardTextDialog.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,1069 @@ +/* +* Copyright (c) 2005 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: +* Provides CPostcardTextDialog class methods. +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include // for Feature Manager +#include // for Feature Flags +#include // for CEikMenuBar +#include // for RConeResourceLoader +#include +#include + +// AVKON +#include // for CAknTitlePane +#include // for CAknIndicatorContainer +#include // for MAknEditStateIndicator +#include // for AppShutter +#include // CAknWaitNoteWrapper +#include // CAknInformationNote +#include // CAknColourSelectionGrid +#include +#include +#include +#include +#include + +// For drawing +#include // For skinnable icons +#include // For skin stuff, too +#include + +// Richtextstuff +#include +#include +#include + +// COMMON ENGINE +#include // for StringLoader:: + +// MSG EDITOR BASE +#include +#include +#include "MsgAttachmentUtils.h" // for fetchdialogs + +#include // Notepad API + +#include + +#include // link against centralrepository.lib +#include // for Central Repository keys + +#include "MsgAttachmentUtils.h" + +#include +#include "Postcard.hrh" +#include "PostcardLaf.h" +#include "PostcardTextDialog.h" +#include "PostcardDocument.h" +#include "PostcardAppUi.h" +#include "PostcardTextDialogCustomDraw.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// Two-phased constructor +// --------------------------------------------------------- +CPostcardTextDialog* CPostcardTextDialog::NewL( CPostcardAppUi& aAppUi, CPostcardDocument& aDocument, CPlainText& aText, TInt& aRetValue, TKeyEvent aKeyEvent ) + { + CPostcardTextDialog* self = + new (ELeave) CPostcardTextDialog( aAppUi, aDocument, aText, aRetValue, aKeyEvent ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// Default destructor +// --------------------------------------------------------- +CPostcardTextDialog::~CPostcardTextDialog() + { + // Remove the navidecorator from status pane + CEikStatusPane *sp = iEikonEnv->AppUiFactory( )->StatusPane( ); + TRAP_IGNORE( + static_cast + ( sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) )->Pop( ); + ); // TRAP_IGNORE + + delete iNaviDecorator; + delete iTextEditor; + delete iCustomDraw; + } + +// --------------------------------------------------------- +// CPostcardTextDialog +// --------------------------------------------------------- +CPostcardTextDialog::CPostcardTextDialog( + CPostcardAppUi& aAppUi, + CPostcardDocument& aDocument, + CPlainText& aText, + TInt& aRetValue, + TKeyEvent aKeyEvent ) : + iAppUi( aAppUi ), + iDocument( aDocument ), + iOrigText( aText ), + iKeyEvent( aKeyEvent ), + iRetValue( aRetValue ) + { + } + +// --------------------------------------------------------- +// ExecLD() +// --------------------------------------------------------- +TInt CPostcardTextDialog::ExecLD( ) + { + PrepareLC( R_POSTCARD_TEXT_DIALOG ); + + return CAknDialog::RunLD( ); + } + +// --------------------------------------------------------- +// EPOC constructor +// --------------------------------------------------------- +void CPostcardTextDialog::ConstructL( ) + { + // Feature manager + FeatureManager::InitializeLibL( ); + + if( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + iTextFlags |= EPostcardTextHelpSupported; + } + + FeatureManager::UnInitializeLib( ); + + iMaxLen = iAppUi.MaxTextLength( EPostcardTextEditor ); + + // Call the base class' two-phased constructor + CAknDialog::ConstructL( R_POSTCARD_TEXT_MENUBAR ); + + iMenuBar->SetContextMenuTitleResourceId( R_POSTCARD_TEXT_CONTEXT_MENUBAR ); + } + +// ---------------------------------------------------- +// CPostcardTextDialog::PreLayoutDynInitL +// ---------------------------------------------------- +void CPostcardTextDialog::PreLayoutDynInitL( ) + { + TInt edwinFlags = + CEikEdwin::ENoHorizScrolling + | CEikEdwin::ENoAutoSelection + | CEikEdwin::EWidthInPixels + | CEikEdwin::EAllowUndo + | CEikEdwin::ELineCursor + | CEikEdwin::EResizable + | CEikEdwin::EInclusiveSizeFixed; + + if( iDocument.MessageType() == EPostcardSent ) + { + edwinFlags |= CEikEdwin::EReadOnly; + edwinFlags |= CEikEdwin::EAvkonDisableCursor; + } + + iTextEditor = new (ELeave) CEikRichTextEditor( TGulBorder( TGulBorder::EShallowRaised ) ); + iTextEditor->ConstructL( this, + 0, + iMaxLen, + edwinFlags ); + + TRect mainPane = PostcardLaf::WholeMainPaneForDialogs(); + TInt height = mainPane.Height( ); + TInt diff = height%MsgEditorCommons::MsgBaseLineDelta(); + height -= diff; // decrease the height if it is not dividable by baselinedelta + mainPane.iBr.iY = height; + + TMargins8 edwinMargins; + edwinMargins.SetAllValuesTo(2); + // This needs to be before SetRect() in order to take effect + iTextEditor->SetBorderViewMargins( edwinMargins ); + + // Set scrollbar size + TInt sbWidth = PostcardLaf::ScrollBarWidth(); + TRect edwinPane = mainPane; + if ( AknLayoutUtils::LayoutMirrored() ) + { + edwinPane.iTl.iX += sbWidth; + } + else + { + edwinPane.iBr.iX -= sbWidth; + } + iTextEditor->SetRect( edwinPane ); + + SetCharParaFormat(); + + CAknAppUiBase* appUi = static_cast( iEikonEnv->EikAppUi() ); + if (AknLayoutUtils::DefaultScrollBarType(appUi) == CEikScrollBarFrame::EDoubleSpan) + { // Create scrollbar only if double scrollbars supported + iTextEditor->CreateScrollBarFrameL( ); + iTextEditor->ScrollBarFrame( )->SetTypeOfVScrollBar(CEikScrollBarFrame::EDoubleSpan); + iTextEditor->ScrollBarFrame( )->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff,CEikScrollBarFrame::EOn); + } + + // Layout scrollbar correctly with text editor. + AknLayoutUtils::LayoutVerticalScrollBar( + iTextEditor->ScrollBarFrame(), + mainPane, + AknLayoutScalable_Apps::scroll_pane_cp06().LayoutLine() ); + + + iTextEditor->SetContainerWindowL( *this ); + + UpdateNavipaneL( ETrue ); + } + +// ---------------------------------------------------- +// CPostcardTextDialog::PostLayoutDynInitL +// ---------------------------------------------------- +void CPostcardTextDialog::PostLayoutDynInitL() + { + TInt docLength = iOrigText.DocumentLength(); + if( docLength > 0 ) + { + const TPtrC ptr = iOrigText.Read( 0, docLength ); + iTextEditor->SetTextL( &ptr ); + } + + // Set middle softkey button and menu resource to show on button press + SetMiddleSoftkeyL(); + } + +// --------------------------------------------------------- +// HandleEdwinEventL +// --------------------------------------------------------- +void CPostcardTextDialog::HandleEdwinEventL(CEikEdwin* aEdwin,TEdwinEvent aEventType) + { + if( aEdwin && aEventType == EEventTextUpdate ) + { // The functionality has been removed to HandleControlEventL + } + } + +// --------------------------------------------------------- +// Draw +// --------------------------------------------------------- +void CPostcardTextDialog::Draw(const TRect& /*aRect*/ ) const + { + CWindowGc& gc = SystemGc(); + TRect rect( PostcardLaf::WholeMainPaneForDialogs( ) ); + + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + MAknsControlContext* cc = AknsDrawUtils::ControlContext( this ); + + if( !AknsDrawUtils::Background( skin, cc, this, gc, rect ) ) + { + // clear entire header area. + gc.SetBrushColor( AKN_LAF_COLOR( 0 ) ); + gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc.SetPenStyle( CGraphicsContext::ENullPen ); + gc.DrawRect( rect ); + } + gc.SetPenColor( AKN_LAF_COLOR( 12 ) ); + } + +// --------------------------------------------------------- +// UpdateNavipaneL +// --------------------------------------------------------- +void CPostcardTextDialog::UpdateNavipaneL( TBool aForce ) + { + if( !aForce ) + { + return; + } + + if( iDocument.MessageType( ) == EPostcardSent ) + { + if( !iNaviDecorator ) + { + CEikStatusPane *sp = iEikonEnv->AppUiFactory( )->StatusPane( ); + + CAknNavigationControlContainer* container = + static_cast + ( sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) ); + + HBufC* buf = HBufC::NewLC(0); + iNaviDecorator = container->CreateMessageLabelL( *buf ); + iNaviDecorator->MakeScrollButtonVisible( EFalse ); + + container->PushL( *iNaviDecorator ); + CleanupStack::PopAndDestroy( buf ); // buf + } + return; + } + + MAknEditingStateIndicator* editIndi = + static_cast< CAknEnv* >( iEikonEnv->Extension( ) )->EditingStateIndicator(); + if( editIndi ) + { + CAknIndicatorContainer* indiContainer = editIndi->IndicatorContainer( ); + if ( indiContainer ) + { + + TInt cur = iTextEditor->TextLength( ); + CArrayFixFlat* array = new(ELeave) CArrayFixFlat( 2 ); + CleanupStack::PushL( array ); + array->AppendL( cur ); + array->AppendL( iMaxLen ); + HBufC* paneString = + StringLoader::LoadL( R_POSTCARD_CHARACTER_COUNTER, *array, iCoeEnv ); + CleanupStack::PopAndDestroy( array ); //array + CleanupStack::PushL( paneString ); + + indiContainer->SetIndicatorState( + TUid::Uid( EAknNaviPaneEditorIndicatorMessageLength ), + EAknIndicatorStateOn ); + indiContainer->SetIndicatorValueL( + TUid::Uid( EAknNaviPaneEditorIndicatorMessageLength ), + *paneString ); + + CleanupStack::PopAndDestroy( paneString ); //paneString + } + + } + } + +// --------------------------------------------------------- +// SetCharParaFormat +// --------------------------------------------------------- +void CPostcardTextDialog::SetCharParaFormat() + { + // CParaFormat can be created on the stack if it is not + // used to store tab stops, bullets or borders + CParaFormat paraFormat; + TParaFormatMask paraFormatMask; + TCharFormat charFormat; + TCharFormatMask charFormatMask; + + PostcardLaf::ActiveFont( charFormat, charFormatMask, paraFormat, paraFormatMask ); + + CParaFormatLayer* paraFormatLayer = NULL; + CCharFormatLayer* charFormatLayer = NULL; + + TRAPD( error, + { + paraFormatLayer = CParaFormatLayer::NewL( ¶Format, paraFormatMask ); + charFormatLayer = CCharFormatLayer::NewL( charFormat, charFormatMask ); + } ); + + if( error ) + { + delete paraFormatLayer; + delete charFormatLayer; + return; + } + // ownership moves + iTextEditor->SetParaFormatLayer( paraFormatLayer ); + iTextEditor->SetCharFormatLayer( charFormatLayer ); + } + +// --------------------------------------------------------- +// CPostcardTextDialog::ProcessCommandL( TInt aCommandId ) +// --------------------------------------------------------- +void CPostcardTextDialog::ProcessCommandL( TInt aCommandId ) + { + HideMenu( ); + + switch ( aCommandId ) + { + case EPostcardCmdSend: + SendL( ); + break; + + case EPostcardCmdForward: + ForwardMessageL( ); + break; + + case EPostcardCmdMessageInfo: + MessageInfoL( ); + break; + + case EPostcardCmdInsertTemplate: + InsertFromL( EFalse ); + break; + + case EPostcardCmdInsertNote: + InsertFromL( ETrue ); + break; + + case EMsgDispSizeAutomatic: + case EMsgDispSizeLarge: + case EMsgDispSizeNormal: + case EMsgDispSizeSmall: + iAppUi.HandleLocalZoomChangeL( (TMsgCommonCommands)aCommandId ); + break; + case EAknCmdHelp: + LaunchHelpL( ); + break; + + case EAknCmdExit: + case EEikCmdExit: + if( OkToExitL( aCommandId ) ) + { + iRetValue = EPostcardDialogExit; + TryExitL( EAknSoftkeyDone ); + } + break; + + default : + CAknDialog::ProcessCommandL( aCommandId ); + break; + } + } + +// --------------------------------------------------------- +// OfferKeyEventL +// --------------------------------------------------------- +TKeyResponse CPostcardTextDialog::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + // If a menu is showing offer key events to it. + if ( CAknDialog::MenuShowing( ) ) + { + return CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + } + + TUint code = aKeyEvent.iCode; + + TKeyResponse resp = EKeyWasNotConsumed; + + switch ( code ) + { + case EKeyOK: + { + if ( iDocument.MessageType() != EPostcardSent ) + { + iMenuBar->SetMenuType( CEikMenuBar::EMenuContext ); + iMenuBar->TryDisplayContextMenuBarL(); + } + resp = EKeyWasConsumed; + break; + } + + case EKeyBackspace: + case EKeyDelete: + { + resp = iTextEditor->OfferKeyEventL( aKeyEvent, aType ); + // Has to call draw here. Otherwise a couple of characters are left + // on the screen at the beginning of each line. + iTextEditor->DrawDeferred(); + UpdateNavipaneL( ETrue ); + CheckTextExceedingL(); + break; + } + + case EKeyYes: + { + if( iDocument.MessageType( ) != EPostcardSent ) + { // This is draft message + SendL(); + resp = EKeyWasConsumed; + break; + } + // If message is sent -> intentionally let it fall thru + } + //lint -fallthrough + case EKeyApplication: + case EKeyPhoneEnd: + case EKeyPowerOff: + case EKeyGripOpen: + case EKeyGripClose: + case EKeySide: + case EKeyEscape: + resp = CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + break; + + default: + { + resp = iTextEditor->OfferKeyEventL( aKeyEvent, aType ); + UpdateNavipaneL( ETrue ); + CheckTextExceedingL(); + } + } + return resp; + } + +// --------------------------------------------------------- +// DynInitMenuPaneL(TInt aMenuId, CEikMenuPane* aMenuPane) +// --------------------------------------------------------- +void CPostcardTextDialog::DynInitMenuPaneL( + TInt aMenuId, + CEikMenuPane* aMenuPane) + { + switch ( aMenuId ) + { + case R_POSTCARD_TEXT_OPTIONS: + DynInitMainMenuL( aMenuPane ); + break; + + case R_POSTCARD_TEXT_CONTEXT_OPTIONS: + DynInitContextMenuL( aMenuPane ); + break; + + case R_POSTCARD_ZOOM_SUBMENU: + { + TInt zoomLevel = KErrGeneral; + iAppUi.GetZoomLevelL( zoomLevel ); + switch ( zoomLevel ) + { + case EAknUiZoomAutomatic: + aMenuPane->SetItemButtonState( EMsgDispSizeAutomatic, + EEikMenuItemSymbolOn ); + break; + case EAknUiZoomNormal: + aMenuPane->SetItemButtonState( EMsgDispSizeNormal, + EEikMenuItemSymbolOn ); + break; + case EAknUiZoomSmall: + aMenuPane->SetItemButtonState( EMsgDispSizeSmall, + EEikMenuItemSymbolOn ); + break; + case EAknUiZoomLarge: + aMenuPane->SetItemButtonState( EMsgDispSizeLarge, + EEikMenuItemSymbolOn ); + break; + default: + break; + } + } + break; + default: + break; + } + + } + +// --------------------------------------------------------- +// DynInitMainMenuL +// --------------------------------------------------------- +void CPostcardTextDialog::DynInitMainMenuL( CEikMenuPane* aMenuPane ) + { + aMenuPane->SetItemDimmed( EPostcardCmdSend, + IsMainMenuOptionInvisible( EPostcardCmdSend )); + aMenuPane->SetItemDimmed( EPostcardCmdInsertSubmenu, + IsMainMenuOptionInvisible( EPostcardCmdInsertSubmenu )); + aMenuPane->SetItemDimmed( EPostcardCmdForward, + IsMainMenuOptionInvisible( EPostcardCmdForward )); + aMenuPane->SetItemDimmed( EPostcardCmdMessageInfo, + IsMainMenuOptionInvisible( EPostcardCmdMessageInfo )); + aMenuPane->SetItemDimmed( EAknCmdHelp, iTextFlags & EPostcardTextHelpSupported?EFalse:ETrue ); + aMenuPane->SetItemDimmed( EAknCmdExit, EFalse ); + } + +// --------------------------------------------------------- +// IsMainMenuOptionInvisible +// --------------------------------------------------------- +TBool CPostcardTextDialog::IsMainMenuOptionInvisible( TInt aMenuOptionId ) + { + TBool retVal = ETrue; + TPostcardMsgType msgType = iDocument.MessageType( ); + + switch ( aMenuOptionId ) + { + + case EPostcardCmdSend: + if( msgType != EPostcardSent ) + { + if( iAppUi.ContactHasData( ) ) + { + retVal = EFalse; + } + } + break; + case EPostcardCmdInsertSubmenu: + if( msgType != EPostcardSent ) + { + if( iTextEditor->TextLength( ) < iMaxLen ) + { + retVal = EFalse; + } + } + break; + case EPostcardCmdForward: + if( msgType == EPostcardSent ) + { + retVal = EFalse; + } + break; + case EPostcardCmdMessageInfo: + { + retVal = EFalse; + break; + } + case EAknCmdHelp: + if( iTextFlags & EPostcardTextHelpSupported ) + { + retVal = EFalse; + } + break; + + case EAknCmdExit: + retVal = EFalse; + break; + default: + ; + } + + return retVal; + } + + +// --------------------------------------------------------- +// DynInitInsertSubMenuL +// --------------------------------------------------------- +void CPostcardTextDialog::DynInitInsertSubMenuL( CEikMenuPane* aMenuPane ) + { // These are always shown when the submenu is shown + aMenuPane->SetItemDimmed( EPostcardCmdInsertTemplate, EFalse ); + aMenuPane->SetItemDimmed( EPostcardCmdInsertNote, EFalse ); + } + +// --------------------------------------------------------- +// DynInitContextMenuL +// --------------------------------------------------------- +void CPostcardTextDialog::DynInitContextMenuL( CEikMenuPane* aMenuPane ) + { // This is always shown when context menu is supported + TPostcardMsgType msgType = iDocument.MessageType( ); + if( msgType != EPostcardSent ) + { + aMenuPane->SetItemDimmed( EPostcardCmdInsertSubmenu, + iTextEditor->TextLength() < iMaxLen ? EFalse : ETrue ); + aMenuPane->SetItemDimmed( EPostcardCmdForward, ETrue ); + aMenuPane->SetItemDimmed( EPostcardCmdMessageInfo, ETrue ); + } + else + { + aMenuPane->SetItemDimmed( EPostcardCmdInsertSubmenu, ETrue ); + aMenuPane->SetItemDimmed( EPostcardCmdForward, EFalse ); + aMenuPane->SetItemDimmed( EPostcardCmdMessageInfo, EFalse ); + } + } + +// --------------------------------------------------------- +// CountComponentControls +// --------------------------------------------------------- +TInt CPostcardTextDialog::CountComponentControls( ) const + { + TInt count = 0; + + if ( iTextEditor ) + { + count++; + } + + return count; + } + +// --------------------------------------------------------- +// ComponentControl(TInt aIndex) const +// --------------------------------------------------------- +CCoeControl* CPostcardTextDialog::ComponentControl( TInt /*aIndex*/ ) const + { + CCoeControl* control = NULL; + + if ( iTextEditor ) + { + control = iTextEditor; + } + + return control; + } + +// --------------------------------------------------------- +// OkToExitL(TInt aButtonId) +// called by framework when softkey button is pressed +// --------------------------------------------------------- +TBool CPostcardTextDialog::OkToExitL( TInt aButtonId ) + { + if( aButtonId == EAknCmdExit ) + { + return ETrue; + } + if( aButtonId == EAknSoftkeyContextOptions ) + { + // Middle softkey was pressed. Display context menu. + // MSK is not active in viewer mode. + iMenuBar->TryDisplayContextMenuBarL(); + return EFalse; + } + TBool okToExit = CAknDialog::OkToExitL( aButtonId ); + if( !okToExit ) + { + return okToExit; + } + if( aButtonId == EAknSoftkeyBack || + aButtonId == EAknSoftkeyExit || + aButtonId == EAknSoftkeyDone || + aButtonId == EAknCmdExit || + aButtonId == EEikCmdExit || + aButtonId == EAknSoftkeyCancel || + aButtonId == EPostcardCmdSend ) + { + if( iDocument.MessageType( ) != EPostcardSent ) + { + CPlainText* text = CPlainText::NewL( CEditableText::ESegmentedStorage, KPostcardDefaultGreetingSegment ); + CleanupStack::PushL( text ); + + if( iTextEditor->TextLength() ) + { + text->InsertL( 0, iTextEditor->GlobalText( )->Read( 0, iTextEditor->TextLength( ) ) ); + } + iAppUi.SetTextL( *text ); + // Greeting changed, so we can change field to modified. + iDocument.SetChanged( EPostcardText ); + CleanupStack::Pop( text ); //ownership moves to AppUi + } + return okToExit; + } + return EFalse; + } + +// --------------------------------------------------------- +// ActivateL() +// --------------------------------------------------------- +void CPostcardTextDialog::ActivateL( ) + { + SetFocus( ETrue ); + iTextEditor->SetFocus( ETrue ); + if( iDocument.MessageType() == EPostcardSent ) + { + iTextEditor->TextView()->SetCursorVisibilityL( + TCursor::EFCursorInvisible, TCursor::EFCursorInvisible ); + // Prevent text exceeding confirmation query in viewer mode + iTextFlags |= EPostcardTextExceeded; + } + else + { + iTextEditor->TextView()->SetCursorVisibilityL( + TCursor::EFCursorFlashing, TCursor::EFCursorFlashing ); + } + iTextEditor->SetObserver( this ); // MCoeControlObserver + CCoeControl::ActivateL(); + // Swap the custom drawer to our own to show text lines. + // Lines are shown only in editor mode. + // Custom drawer must be set after call to CCoeControl::ActivateL. + if ( iDocument.MessageType() != EPostcardSent ) + { + if ( !iCustomDraw ) + { + const MFormCustomDraw* customDraw = iTextEditor->TextLayout()->CustomDraw(); + + iCustomDraw = CPostcardTextDialogCustomDraw::NewL( customDraw, this ); + + iTextEditor->TextLayout()->SetCustomDraw( iCustomDraw ); + } + } + // Set cursor to the end only if it is not sent. + if( iDocument.MessageType() != EPostcardSent && + iTextEditor->TextLength() > 0 ) + { + iTextEditor->SetCursorPosL( iTextEditor->TextLength(), EFalse ); + } + UpdateNavipaneL( ETrue ); + if( iKeyEvent.iCode != 0 ) + { + TEventCode type = EEventKey; + iCoeEnv->SyncNotifyFocusObserversOfChangeInFocus(); + iCoeEnv->SimulateKeyEventL( iKeyEvent, type ); + } + CheckTextExceedingL(); + } + +// --------------------------------------------------------- +// Panic +// --------------------------------------------------------- +void CPostcardTextDialog::Panic( TInt aReason ) + { + User::Panic( _L("CPostcardTextDialog"), aReason); + } + +// --------------------------------------------------------- +// HandleResourceChange +// --------------------------------------------------------- +void CPostcardTextDialog::HandleResourceChange(TInt aType ) + { + CAknDialog::HandleResourceChange( aType ); + + if(aType == KEikDynamicLayoutVariantSwitch ) + { + if( iTextEditor ) + { + TRect mainPane = PostcardLaf::WholeMainPaneForDialogs(); + TInt height = mainPane.Height( ); + TInt diff = height%MsgEditorCommons::MsgBaseLineDelta(); + height -= diff; // decrease the height if it is not dividable by baselinedelta + mainPane.iBr.iY = height; + + // Set scrollbar size + TInt sbWidth = PostcardLaf::ScrollBarWidth(); + TRect edwinPane = mainPane; + if ( AknLayoutUtils::LayoutMirrored() ) + { + edwinPane.iTl.iX += sbWidth; + } + else + { + edwinPane.iBr.iX -= sbWidth; + } + iTextEditor->SetRect( edwinPane ); + + // Layout scrollbar correctly with text editor. + AknLayoutUtils::LayoutVerticalScrollBar( + iTextEditor->ScrollBarFrame(), + mainPane, + AknLayoutScalable_Apps::scroll_pane_cp06().LayoutLine() ); + + SetCharParaFormat(); + + TRAP_IGNORE( iTextEditor->NotifyNewFormatL() ); + } + // Line rects needs also refreshing. + if ( iCustomDraw ) + { + iCustomDraw->ResolveLayouts(); + } + } + else if( aType == KAknsMessageSkinChange ) + { + if( iTextEditor ) + { + SetCharParaFormat( ); + } + } + } + +// --------------------------------------------------------- +// FocusChanged +// --------------------------------------------------------- +void CPostcardTextDialog::FocusChanged( TDrawNow aDrawNow ) + { + if ( iTextEditor ) + { + iTextEditor->SetFocus( IsFocused(), aDrawNow ); + } + } + +// --------------------------------------------------------- +// SendL +// --------------------------------------------------------- +void CPostcardTextDialog::SendL( ) + { + iRetValue = EPostcardDialogSend; + TryExitL( EPostcardCmdSend ); + } + +// --------------------------------------------------------- +// ForwardMessageL +// --------------------------------------------------------- +void CPostcardTextDialog::ForwardMessageL( ) + { + iRetValue = EPostcardDialogForward; + TryExitL( EAknSoftkeyDone ); + } + +// --------------------------------------------------------- +// MessageInfoL +// --------------------------------------------------------- +void CPostcardTextDialog::MessageInfoL( ) + { + TPostcardMsgType msgType = iDocument.MessageType( ); + if( msgType != EPostcardSent ) + { // We are dealing with unsent message -> save recipient details for now + TMmsMsvEntry tEntry = static_cast( iDocument.Entry() ); + tEntry.iDate.UniversalTime(); + tEntry.iDescription.Set( iTextEditor->Text( )->Read( 0, iTextEditor->TextLength( ) ) ); + tEntry.iBioType = KUidMsgSubTypeMmsPostcard.iUid; + iDocument.CurrentEntry().ChangeL( tEntry ); + } + iAppUi.DoShowMessageInfoL( ); + } + +// --------------------------------------------------------- +// InsertFromL +// --------------------------------------------------------- +void CPostcardTextDialog::InsertFromL( TBool aNote ) + { + + TInt resId = NULL; + + if( aNote ) + { + resId = R_QTN_NMAKE_FETCH_MEMO_PRMPT; + } + else + { + resId = R_QTN_MAIL_POPUP_TEXT_SEL_TEMP; + } + + HBufC* title = iAppUi.ReadFromResourceLC( resId ); + HBufC* buf = NULL; + + if( aNote ) + { // Read it from Notepad memos + buf = CNotepadApi::FetchMemoL( title ); + if( !buf ) + { // Cancel or empty + CleanupStack::PopAndDestroy( title ); // title + return; + } + CleanupStack::PushL( buf ); + } + else + { // Read it from Notepad templates + buf = CNotepadApi::FetchTemplateL( title ); + if( !buf ) + { // Cancel or empty + CleanupStack::PopAndDestroy( title ); // title + return; + } + CleanupStack::PushL( buf ); + } + + TCursorSelection selection = iTextEditor->TextView( )->Selection( ); + const TInt selLength = selection.Length( ); + + if ( selLength ) + { + iTextEditor->ClearSelectionL( ); + iTextEditor->RichText( )->DeleteL( selection.LowerPos( ), selLength ); + TCursorSelection sel( selection.LowerPos( ), selection.LowerPos( ) ); + iTextEditor->TextView( )->HandleInsertDeleteL( sel, selLength ); + } + iTextEditor->RichText( )->InsertL( selection.LowerPos( ), *buf ); + if ( buf->Length() > 1 ) + { + TCursorSelection sel( selection.LowerPos( ) + buf->Length( ), selection.LowerPos( ) ); + iTextEditor->TextView( )->HandleInsertDeleteL( sel, 0 ); + } + else + { + iTextEditor->TextView( )->HandleCharEditL( CTextLayout::EFCharacterInsert ); + } + TInt newPos=selection.iCursorPos + buf->Length( ); + iTextEditor->SetCursorPosL( newPos,EFalse ); + + CleanupStack::PopAndDestroy( 2, title ); // title, buf + UpdateNavipaneL( ETrue ); + CheckTextExceedingL( ); + + } + +// --------------------------------------------------------- +// LaunchHelpL +// --------------------------------------------------------- +void CPostcardTextDialog::LaunchHelpL( ) + { + if( iDocument.MessageType( ) == EPostcardSent ) + { + iAppUi.LaunchHelpL( KPOSTCARD_HLP_GREETING_VIEW() ); + } + else + { + iAppUi.LaunchHelpL( KPOSTCARD_HLP_GREETING_EDIT() ); + } + } + +// --------------------------------------------------------- +// CheckTextExceedingL +// --------------------------------------------------------- +void CPostcardTextDialog::CheckTextExceedingL( ) + { + if( iTextEditor->TextLength( ) >= iMaxLen ) + { + TInt howMany = iTextEditor->TextLength( ) - iMaxLen; + switch( howMany ) + { + case 0: + { + // No note shown anymore. + break; + } + case 1: + { + if( !(iTextFlags & EPostcardTextExceeded ) ) + { + iAppUi.ShowConfirmationQueryL( R_POSTCARD_GREETING_EXCEEDED, ETrue ); + } + break; + } + default: + { + if( !(iTextFlags & EPostcardTextExceeded ) ) + { + HBufC* warningString = + StringLoader::LoadLC( R_POSTCARD_GREETING_EXCEEDED_MANY, howMany, iCoeEnv ); + iAppUi.ShowConfirmationQueryL( *warningString, ETrue ); + CleanupStack::PopAndDestroy( warningString ); + } + break; + } + } + iTextFlags |= EPostcardTextExceeded; + } + else + { + iTextFlags &= ~EPostcardTextExceeded; + } + SetMiddleSoftkeyL(); + } + +// --------------------------------------------------------- +// HandleControlEventL +// --------------------------------------------------------- +void CPostcardTextDialog::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent aEventType) + { + if( aEventType == EEventStateChanged ) + { + UpdateNavipaneL( ETrue ); + // The length check is done in OfferKeyEventL + } + } + + +// --------------------------------------------------------- +// SetMiddleSoftkeyL +// --------------------------------------------------------- +void CPostcardTextDialog::SetMiddleSoftkeyL() + { + TInt resourceId; + + if( iDocument.MessageType() != EPostcardSent && + iTextEditor->TextLength() < iMaxLen ) + { + resourceId = R_POSTCARD_MSK_BUTTON_OPTIONS; + } + else + { + resourceId = R_POSTCARD_MSK_BUTTON_EMPTY; + } + + if ( resourceId != iMskResource ) + { + const TInt KMskPosition = 3; + CEikButtonGroupContainer& cba = ButtonGroupContainer(); + cba.SetCommandL( KMskPosition, resourceId ); + cba.DrawDeferred(); + iMskResource = resourceId; + } + } + +// End of File +