/*
* Copyright (c) 2006-2009 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 Uni Editor App UI methods.
*
*/
// ========== INCLUDE FILES ================================
// Symbian OS
#include <apmstd.h> // TDataType, KMaxDataTypeLength
#include <data_caging_path_literals.hrh>
#include <eiklbv.h>
// Messaging
#include <msvapi.h>
#include <msvuids.h> // Msgs Uids
#include <msvstd.hrh> // KUidMsvMessageEntryValue
#include <mtmdef.h> // TMsvPartList
#include <mtmuidef.hrh> // EMtmUiFlagEditorPreferEmbedded
#include <MtmExtendedCapabilities.hrh> // function id of MessageInfo
// Eikon
#include <eikedwin.h> // Editor TextLenght etc
#include <eikrted.h> // for CEikRichTextEditor
#include <eikcolib.h>
#include <DocumentHandler.h>
// Avkon
#include <aknenv.h>
#include <aknnavi.h>
#include <aknnavide.h> // CAknNavigationDecorator
#include <aknnavilabel.h>
#include <aknEditStateIndicator.h>
#include <AknIndicatorContainer.h>
#include <akntitle.h>
#include <aknclearer.h>
#include <AknsConstants.h>
#include <AknInfoPopupNoteController.h>
#include <akninputblock.h> // for CAknInputBlock
#include <aknbutton.h>
#include <aknlayoutscalable_apps.cdl.h>
#include <aknlayoutscalable_avkon.cdl.h>
#include <aknnotewrappers.h> // CAknNoteWrappers
#include <aknnotedialog.h> // CAknNoteDialog
#include <AknQueryDialog.h> // CAknQueryDialog
#include <AknWaitDialog.h> // CAknWaitDialog
#include <akncheckboxsettingpage.h> // also CSelectionItemList and CSelectableItem
#include <aknsettingpage.h> // for Priority bit dialog
#include <aknradiobuttonsettingpage.h>
#include <akntoolbar.h>
#include <akntoolbarextension.h>
#include <AknIconArray.h> // CAknIconArray
#include <avkon.mbg> //
#include <AknStatuspaneUtils.h> // AknStatuspaneUtils
#include <AknUtils.h>
#include <AknFepGlobalEnums.h> // Global Fep enums (ELatin, ENumber)
#include <AknFepInternalCRKeys.h>
// Misc
#include <txtrich.h> // for CRichText
#include <badesca.h> // CDesC16Array
#include <barsread.h> // TResReader
// MUIU
#include <MuiuOperationWait.h> // CMuiuOperationWait
#include <MuiuMsvUiServiceUtilities.h> //Disk space check, offline check
#include <muiumsvuiserviceutilitiesinternal.h>
#include <fileprotectionresolver.h>
// Common components
#include <StringLoader.h> // for StringLoader (load and foramt strings from resources)
#include <AiwGenericParam.h> // CAiwGenericParamList
// Base editor
#include <MsgRecipientItem.h> // for CMsgRecipientItem
#include <MsgAttachmentUtils.h> // for MsgAttachmentUtils
#include <MsgBaseControl.h> // for CMsgBaseControl
#include <MsgBodyControl.h> // for CMsgBodyControl
#include <MsgAddressControl.h> // for CMsgAddressControl
#include <MsgEditorView.h> // for CMsgEditorView
#include <MsgEditor.hrh> // for TMsgIndicatorFlags
#include <msgimagecontrol.h> // for CMsgImageControl
#include <MsgAttachmentModel.h> // for CMsgAttachmentModel
#include <MsgEditorCommon.h>
#include <MsgEditorAppUiExtension.h>// for iMsgEditorAppUiExtension
#include <MsgEditorSettingCacheUpdatePlugin.h>
// MmsEngine
#include <mmsgenutils.h>
// Features
#include <featmgr.h>
#include <messagingvariant.hrh>
#include <centralrepository.h> // link against centralrepository.lib
#include <messaginginternalcrkeys.h> // for Central Repository keys
#include <CoreApplicationUIsSDKCRKeys.h>
#include <RCustomerServiceProfileCache.h> // CSP bits
// HELP
#include <hlplch.h>
#include <csxhelp/unif.hlp.hrh>
// SMIL Player
#include <MMediaFactoryFileInfo.h>
#include <SmilPlayerDialog.h>
// Other SMIL stuff
#include <gmxmldocument.h>
// MsgMedia
#include <MsgMimeTypes.h>
#include <MsgAudioInfo.h>
#include <MsgVideoInfo.h>
#include <MsgImageInfo.h>
#include <MsgTextInfo.h>
#include <MsgMediaResolver.h>
#include <MsgMedia.hrh>
#include <MmsConformance.h>
// Resource identifiers
#include <UniEditor.rsg>
#include <MsgEditorAppUi.rsg>
#include "UniSendingSettings.h"
#include "UniPluginApi.h"
#include "UniSmsPlugin.h"
#include "UniClientMtm.h"
/// UniEditor other component
#include "uniutils.h" // Object type flags, MBM filename
#include <uniutils.mbg>
#include <unimsventry.h>
#include "unislideloader.h"
#include "unidatautils.h"
#include "uniobjectlist.h"
#include "unidatamodel.h" // CUniDataModel
#include "unismilmodel.h" // CUniSmilModel
#include "unimodelconst.h" // Uni constants
#include "uniobjectsmodel.h" // Model part of the objects view
#include "unitextobject.h"
#include "unimimeinfo.h"
#include "uniobjectsviewdialog.h"
#include "unidrminfo.h"
// This must be included after unidatamodel.h as both GMXMParserxxx and this define KNewLine
#include <aknconsts.h> // KAvkonBitmapFile
// UniEditor application
#include "UniEditorApp.h" // To get app UID
#include "UniEditorEnum.h" // Panic codes
#include "UniEditorApp.hrh" // application specific commands
#include "UniEditorAppUi.h" // MmsEditorAppUi class
#include "UniEditorHeader.h"
#include "UniEditorChangeSlideOperation.h"
#include "UniEditorInsertOperation.h"
#include "UniEditorLaunchOperation.h"
#include "UniEditorSaveOperation.h"
#include "UniEditorSendOperation.h"
#include "UniEditorVCardOperation.h"
#include "UniEditorAddHeaderDialog.h"
#include "UniSendingSettingsDialog.h"
#include "UniEditorLogging.h"
#include <gsmuelem.h> // Turkish SMS-PREQ2265 specific
#include <aknstyluspopupmenu.h> //Added for displaying object specific stylus menus in editor
// ========== LOCAL CONSTANTS AND MACROS ===================
// SMS related
// Character count used in unicode check buffer
const TInt KUnicodeCheckChars = 10;
// Downwards arrow with tip leftwards
// This does not count as unconvertible character as it will be
// replaced by paragraph separator or line feed by UI
const TUint KSmsDownwardsArrowLeft = 0x21B2;
const TInt KSmsEdPDUInfoCalcReplaceCharacterCount = 2;
const TUint KSmsEdUnicodeLFSupportedByBasicPhones = 0x000A;
const TUint KSmsEnterCharacter = 0x2029;
// Unicode char codes for GSM 03.38 7 bit ext table characters
const TUint KUniEdEuroSymbol = 0x20ac;
const TUint KUniEdLeftSquareBracket = 0x5b;
const TUint KUniEdReverseSolidus = 0x5c;
const TUint KUniEdRightSquareBracket = 0x5d;
const TUint KUniEdCircumflexAccent = 0x5e;
const TUint KUniEdLeftCurlyBracket = 0x7b;
const TUint KUniEdVerticalLine = 0x7c;
const TUint KUniEdRightCurlyBracket = 0x7d;
const TUint KUniEdTilde = 0x7e;
const TUid KUniEditorAppId = { 0x102072D8 };
// Amount of chars reserved for msg length and message count indication text
const TInt KMsgLengthIndicationBuffer = 64;
// Bytes. Estimated disk space needed in addition to filesize when file is created as an attachment.
const TInt KUniAttachmentOverhead = 1024;
// Some functions determine and return the info note
// resource id at error situations. When not determined
// this value is returned.
const TInt KUniInvalidResourceId = -1;
// Non-empty par tag + one media object takes ~90 bytes
const TInt KEmptySlideSize = 90;
// Kilobyte is 1024 not 1000 bytes
const TInt KBytesInKilo = 1024;
// Kilobyte limit when to stop showing message size
// with kilo accuracy
const TInt KOneDigitLimit = 10;
// BodyText + subject, needed when counted the message size
const TInt KUniEdNumberOfEditors = 2;
// Extra length added to SMS length when there's subject
const TInt KUniEdExtraLenCausedBySubject = 2;
const TInt KUniEdMaxSubjectLen = 40;
// For creation of checkbox list
_LIT(KItemStart, "1\t");
// Exiting in launch. Let this time to show error notes
const TInt KDelayedExitShort = 100000;
// ========== MODULE DATA STRUCTURES =======================
// ========== LOCAL FUNCTION PROTOTYPES ====================
// ========== LOCAL FUNCTIONS ==============================
// ========== MEMBER FUNCTIONS ==============================
// ---------------------------------------------------------
// CUniEditorAppUi::CUniEditorAppUi
// C++ default constructor can NOT contain any code, that
// might leave.
// ---------------------------------------------------------
//
CUniEditorAppUi::CUniEditorAppUi() :
iDisplaySize( -1 ),
iWaitResId( -1 ),
iOriginalSlide( -1 ),
iNextFocus( EMsgComponentIdNull ),
iEditorFlags( EShowInfoPopups ),
iMskResId( R_UNIEDITOR_OPTIONS_CLOSE )
{
}
// ---------------------------------------------------------
// CUniEditorAppUi::ConstructL
// Second phase contructor
// NOTE: Don't call here any function that uses iMtm
// and/or iSmilModel members, because they are
// initialized at LaunchViewL.
// ---------------------------------------------------------
//
void CUniEditorAppUi::ConstructL()
{
iFinalizeLaunchL = EFalse;
// We don't have any app ui if launched from idle
if ( iEikonEnv->EikAppUi() )
{
ActivateInputBlockerL( NULL );
}
CMsgEditorAppUi::ConstructL();
SetKeyEventFlags( EDisableSendKeyShort | EDisableSendKeyLong );
SetCloseWithEndKey( ETrue );
FeatureManager::InitializeLibL();
// Get supported features from feature manager.
if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
{
iSupportedFeatures |= EUniFeatureHelp;
}
if ( FeatureManager::FeatureSupported( KFeatureIdOfflineMode ) )
{
iSupportedFeatures |= EUniFeatureOffline;
}
if ( FeatureManager::FeatureSupported( KFeatureIdDrmFull ) )
{
iSupportedFeatures |= EUniFeatureDrmFull;
}
if ( FeatureManager::FeatureSupported( KFeatureIdCamera ) )
{
iSupportedFeatures |= EUniFeatureCamcorder;
}
if ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) )
{
iSupportedFeatures |= EUniFeatureJapanese;
}
//Turkish SMS-PREQ2265 specific
if( FeatureManager::FeatureSupported( KFeatureIdNltSupport ) )
{
iNLTFeatureSupport = ETrue;
}
else
{
iNLTFeatureSupport = EFalse;
}
FeatureManager::UnInitializeLib();
iMuiuSettRepository = CRepository::NewL( KCRUidMuiuSettings );
TInt featureBitmask = 0;
CRepository* repository = CRepository::NewL( KCRUidMuiuVariation );
repository->Get( KMuiuMmsFeatures, featureBitmask );
if ( featureBitmask & KMmsFeatureIdEditorSubjectField )
{
iSupportedFeatures |= EUniFeatureSubject;
}
if ( featureBitmask & KMmsFeatureIdPrioritySupport )
{
iSupportedFeatures |= EUniFeaturePriority;
}
iInputTxtLangRepository = CRepository::NewL( KCRUidAknFep );
iNotifyHandler = CCenRepNotifyHandler::NewL( *this,
*iInputTxtLangRepository,
CCenRepNotifyHandler::EIntKey,
KAknFepInputTxtLang );
featureBitmask = 0;
repository->Get( KMuiuUniEditorFeatures, featureBitmask );
if ( featureBitmask & KUniEditorFeatureIdHideMsgTypeChangedPopup )
{
iEditorFlags &= ~EShowInfoPopups;
}
if ( featureBitmask & KUniEditorFeatureIdHideSizeCounter )
{
iEditorFlags |= EHideSizeCounter;
}
if ( featureBitmask & KUniEditorFeatureIdHideMessageTypeOption )
{
iEditorFlags |= EHideMessageTypeOption;
}
repository->Get( KMuiuSmsFeatures, featureBitmask );
if ( featureBitmask & KSmsFeatureIdShowConcatenatedQuery )
{
iEditorFlags |= EShowSmsSentInManyParts;
}
delete repository;
iNotifyHandler->StartListeningL();
// Disable task swapper from options menu during launch
MenuBar()->SetMenuType( CEikMenuBar::EMenuOptionsNoTaskSwapper );
iTitleSms = StringLoader::LoadL( R_UNIEDITOR_TITLE_SMS, iCoeEnv );
iTitleMms = StringLoader::LoadL( R_UNIEDITOR_TITLE_MMS, iCoeEnv );
// Load msg length format string from resource
iSmsLengthFormatBuffer = StringLoader::LoadL( R_UNIEDITOR_SMS_LENGTH, iCoeEnv );
iMmsLengthFormatBuffer = StringLoader::LoadL( R_UNIEDITOR_MMS_LENGTH, iCoeEnv );
CEikStatusPane* statusPane = StatusPane();
// Set generic title text as message type is not known yet.
HBufC* titleString = StringLoader::LoadLC( R_UNIEDITOR_TITLE, iCoeEnv );
iTitlePane = static_cast<CAknTitlePane*>( statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
iTitlePane->SetTextL( titleString->Des(), ETrue );
CleanupStack::PopAndDestroy( titleString );
iNaviPane = static_cast<CAknNavigationControlContainer*>( statusPane->ControlL(
TUid::Uid( EEikStatusPaneUidNavi ) ) );
iNaviDecorator = iNaviPane->CreateEditorIndicatorContainerL();
TParse fileParse;
fileParse.Set( KUniUtilsMBMFileName, &KDC_APP_BITMAP_DIR, NULL );
iIconSms = AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(),
KAknsIIDQgnPropMceSmsTitle,
fileParse.FullName(),
EMbmUniutilsQgn_prop_mce_sms_title,
EMbmUniutilsQgn_prop_mce_sms_title_mask );
iIconMms = AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(),
KAknsIIDQgnPropMceMmsTitle,
fileParse.FullName(),
EMbmUniutilsQgn_prop_mce_mms_title,
EMbmUniutilsQgn_prop_mce_mms_title_mask );
SetTitleIconsSizeL();
if ( Document()->CreationMode() == EMmsCreationModeWarning )
{
iEditorFlags |= EShowGuidedConf;
}
// Prepare to launch msgeditorview to display the message
if ( !iEikonEnv->StartedAsServerApp() )
{
Document()->PrepareToLaunchL( this );
}
iScreenClearer = CAknLocalScreenClearer::NewLC( ETrue );
CleanupStack::Pop( iScreenClearer );
CreateFixedToolbarL( ETrue);
// Priority must be lower than the priority of iWrappedWaitDialog
// Constructed here to ensure exit on low memory situations.
iIdle = CPeriodic::NewL( EPriorityNormal - 1 );
#ifdef RD_SCALABLE_UI_V2
if ( AknLayoutUtils::PenEnabled() )
{
User::LeaveIfError( iPeninputServer.Connect() );
iPeninputServer.AddPenUiActivationHandler( this, EPluginInputModeAll );
iPrevSmsLength = -1;
iMsgLenToVKB = ETrue;
}
#endif
iLongTapDetector = CAknLongTapDetector::NewL( this );
iLongTapDetector->SetTimeDelayBeforeAnimation( KUniLongTapStartDelay );
iLongTapDetector->SetLongTapDelay( KUniLongTapTimeDelay );
iTapConsumed = EFalse;
}
// ---------------------------------------------------------
// CUniEditorAppUi::~CUniEditorAppUi
// Destructor
// ---------------------------------------------------------
//
CUniEditorAppUi::~CUniEditorAppUi()
{
iEditorFlags |= EEditorExiting;
if ( iView )
{
// To prevent focus changes caused by input blocker deletion & toolbar extension
// closing.
iEikonEnv->EikAppUi()->RemoveFromStack( iView );
if ( iEditorFlags & ELaunchSuccessful )
{
TInt id( EMsgComponentIdNull );
// remember input mode:
// observer does not get event, if editor is closed
CMsgBaseControl* ctrl = iView->FocusedControl(); // ctrl can be NULL.
if ( ctrl )
{
id = ctrl->ControlId();
if ( iHeader &&
!iHeader->IsAddressControl( id ) )
{
id = EMsgComponentIdNull;
}
}
if ( id == EMsgComponentIdNull )
{
id = EMsgComponentIdTo;
}
CUniBaseHeader::THeaderFields headerField = CUniBaseHeader::EHeaderAddressTo;
if ( id == EMsgComponentIdCc )
{
headerField = CUniBaseHeader::EHeaderAddressCc;
}
else if ( id == EMsgComponentIdBcc )
{
headerField = CUniBaseHeader::EHeaderAddressBcc;
}
CMsgAddressControl* rec =
iHeader ? static_cast<CMsgAddressControl*>( iHeader->AddressControl( headerField ) ) :
NULL;
if ( rec )
{
TInt inputMode = rec->Editor().AknEditorCurrentInputMode();
if ( iMuiuSettRepository )
{
iMuiuSettRepository->Set( KMuiuToInputMode, inputMode );
}
}
}
}
delete iLaunchOperation;
delete iSaveOperation;
delete iSendOperation;
delete iInsertOperation;
delete iChangeSlideOperation;
delete iVCardOperation;
delete iParser;
delete iDom;
delete iInputBlocker;
#ifdef RD_SCALABLE_UI_V2
if ( AknLayoutUtils::PenEnabled() )
{
iPeninputServer.Close();
}
#endif
delete iTitleSms;
delete iTitleMms;
delete iIconSms;
delete iIconMms;
delete iSmsLengthFormatBuffer;
delete iMmsLengthFormatBuffer;
delete iPopupNote;
delete iPopupChangedMmsBuffer;
delete iPopupChangedSmsBuffer;
delete iMuiuSettRepository;
delete iWaitDialog;
delete iIdle;
delete iInsertingMedia;
delete iHeader;
delete iSlideLoader;
delete iScreenClearer;
delete iDocHandler;
delete iStoredBodyControl;
delete iFixedToolbar;
if( iNotifyHandler )
{
iNotifyHandler->StopListening();
delete iNotifyHandler;
}
if(iInputTxtLangRepository)
{
delete iInputTxtLangRepository;
}
if(iNLTFeatureSupport)
{
delete iPrevBuffer;
}
delete iPopupSmsSizeAboveLimitBuffer;
delete iPopupSmsSizeBelowLimitBuffer;
if(iLongTapDetector)
{
delete iLongTapDetector;
}
if(iEmbeddedObjectStylusPopup)
{
delete iEmbeddedObjectStylusPopup;
iEmbeddedObjectStylusPopup = NULL;
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::LaunchViewL
//
// Called by the document when application view launch should be
// started.
// ---------------------------------------------------------
//
void CUniEditorAppUi::LaunchViewL()
{
// Initialize these members here.
iMtm = &( Document()->Mtm() );
const TMsvEntry& entry = Document()->Entry();
if ( entry.iType.iUid != KUidMsvMessageEntryValue )
{
// Fixing: JHUA-5SCF8W
// Backup / Restore restarts editor without proper
// context. Leave with KErrGeneral.
User::Leave( KErrGeneral );
}
if ( entry.Parent() != KMsvDraftEntryIdValue )
{
User::Leave( KErrNotSupported );
}
if ( !( Document()->LaunchFlags() & EMsgCreateNewMessage ) )
{
TRAPD( error, iMtm->LoadMessageL() );
if ( error )
{
if ( error != KErrNoMemory &&
error != KErrDiskFull )
{
ShowErrorNoteL( R_UNIEDITOR_ERROR_MSG_CORRUPT, ETrue );
}
User::Leave( error );
}
}
Document()->SetMessageType();
if ( TUniMsvEntry::IsMmsUpload( Document()->Entry() ) )
{
Document()->SetCreationMode( EMmsCreationModeFree );
if ( iFixedToolbar )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarAddRecipient, ETrue, EFalse );
}
}
iView = CMsgEditorView::NewL( *this, CMsgEditorView::EMsgDoNotUseDefaultBodyControl );
iView->SetEdwinObserverL( this );
iLaunchOperation = CUniEditorLaunchOperation::NewL( *this,
*this,
*Document(),
*iView,
*this,
FsSession() );
iLaunchOperation->Launch();
}
// ---------------------------------------------------------
// CUniEditorAppUi::FinalizeLaunchL
//
// Performs all the last actions before editor launch ends.
// ---------------------------------------------------------
//
void CUniEditorAppUi::FinalizeLaunchL()
{
iFinalizeLaunchL = ETrue;
iSmilModel = &Document()->DataModel()->SmilModel();
iHeader = iLaunchOperation->DetachHeader();
iSlideLoader = iLaunchOperation->DetachSlideLoader();
SetMessageTypeLockingL();
TInt headersVariation = iHeader->AddHeadersVariation();
if ( Document()->EmailOverSmsSupported() ||
( headersVariation & EUniFeatureSubject &&
!( headersVariation & EUniFeatureSubjectConfigurable ) ) )
{
// Enable subject in SMS when it's not selectable in additional headers
// and when EmailOverSms is supported
iEditorFlags |= ESubjectOkInSms;
}
SetAddressSize();
SetSubjectSize();
// "Remember input mode" feature
TInt inputMode = EAknEditorNumericInputMode;
if ( iMuiuSettRepository->Get( KMuiuToInputMode, inputMode ) != KErrNone )
{
inputMode = EAknEditorNumericInputMode;
}
SetInputModeToAddressFields( inputMode );
CheckLockedSmsWithAttaL();
if ( iSupportedFeatures & EUniFeatureJapanese &&
Document()->MessageType() != EUniForward )
{
// Image first layout is always used in Japanese variant when dealing
// with any other messages than those that where originally forwarded by user.
// With forwarded messages the original layout is kept unchanged.
ChangeOrderL( EUniImageFirst );
iSmilModel->SetLayoutL( EUniImageFirst );
}
TMsgControlId focusedControlId = ResolveLaunchFocusedControlL();
CEikStatusPane* statusPane = StatusPane();
if ( focusedControlId == EMsgComponentIdBody )
{
BodyCtrl()->SetCursorPosL( BodyCtrlEditor()->TextLength() );
}
if( iNLTFeatureSupport )
{
iPrevBuffer = NULL;
//Turskish SMS-PREQ2265 specific
TSmsEncoding alternateEncodingType;
TUniMessageCharSetSupport charSet;
TInt inputLang = iAvkonEnv->SettingCache().InputLanguage();
CUniEditorDocument* doc = Document();
alternateEncodingType = doc->GetLanguageSpecificAltEncodingType(inputLang);
charSet = doc->CharSetSupport();
doc->SetAlternativeEncodingType(alternateEncodingType);
if(SmsPlugin())
{
//Initialize corresponding language alternative encoding types and character set selected
SmsPlugin()->SetEncodingSettings(EFalse, alternateEncodingType, charSet);
}
}
CheckBodyForMessageTypeL();
CheckHeaderForMessageTypeL();
SetOrRemoveMaxSizeInEdwin();
InitNaviPaneL();
SetTitleL();
if ( Document()->MessageType() == EUniSendUi )
{
// Show invalid contact notes and verify unvalidated addresses.
iHeader->ShowInvalidContactNotesL();
TBool unused;
VerifyAddressesL( unused );
}
if ( iEditorFlags & EShowInfoPopups )
{
iPopupNote = CAknInfoPopupNoteController::NewL();
iPopupNote->SetTimeDelayBeforeShow( 0 );
iPopupNote->SetTimePopupInView( 3000 );
iPopupChangedMmsBuffer = StringLoader::LoadL( R_UNIEDITOR_POPUP_MSG_CHANGED_MMS, iCoeEnv );
iPopupChangedSmsBuffer = StringLoader::LoadL( R_UNIEDITOR_POPUP_MSG_CHANGED_SMS, iCoeEnv );
//Korean Req: 415-5434
iPopupSmsSizeAboveLimitBuffer = StringLoader::LoadL( R_UNIEDITOR_POPUP_SMS_SIZE_ABOVE_LIMIT, Document()->SmsSizeWarningBytes(), iCoeEnv );
iPopupSmsSizeBelowLimitBuffer = StringLoader::LoadL( R_UNIEDITOR_POPUP_SMS_SIZE_UNDER_LIMIT, Document()->SmsSizeWarningBytes(), iCoeEnv );
}
CheckMaxRecipientsAndShowNoteL();
// Enable task swapper to options menu after launch has been completed.
MenuBar()->SetMenuType( CEikMenuBar::EMenuOptions );
UpdateToolbarL();
iEditorFlags |= ELaunchSuccessful;
iView->ExecuteL( ClientRect(), focusedControlId );
delete iScreenClearer;
iScreenClearer = NULL;
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowLaunchNotesL
//
// Tries to resolve correct note(s) to be shown when editor is
// launched. First disables showing of guided conformance note if
// message is forwarded with non-conformant content as viewer should
// be responsible of showing this. After this goes through
// error list and sets correct error resource depending of
// editor mode and message content. Priority & plural solving
// is performed on SetErrorResource function. Some notes can
// be grouped together so that if error notes from different
// groups are set then general error note should be shown instead.
// After correct error note resource is resolved then notes
// related to conformance are shown. Do note that there is
// a EShowGuidedConf flag that controls the visibility of guided
// note. After this if still appropriate and specified
// error note is shown to user.
// ---------------------------------------------------------
//
void CUniEditorAppUi::ShowLaunchNotesL( TBool& aShutDown )
{
TInt errRes( KErrNotFound );
if ( Document()->LaunchFlags() & EMsgForwardMessage &&
( Document()->UpdatedNonConformantCount() > 0 ||
Document()->DataModel()->SmilType() == ETemplateSmil ||
Document()->DataModel()->SmilType() == E3GPPSmil ) )
{
iEditorFlags &= ~EShowGuidedConf;
}
// Tells whether message has files included.
TBool containsFiles = Document()->DataModel()->ObjectList().Count() > 0 ||
Document()->DataModel()->AttachmentList().Count() > 0;
TBool useRModeStrings = Document()->CreationModeUserChangeable() &&
Document()->CreationMode() == EMmsCreationModeRestricted;
CArrayFixFlat<TInt>* errors = iLaunchOperation->GetErrors();
if ( Document()->DataModel()->ParseResult() & EObjectRemoved )
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_MAX_SLIDES_SOME );
}
for ( TInt i = 0; i < errors->Count(); i++ )
{
switch ( errors->At( i ) )
{
case KUniLaunchAbortPresRestricted:
{
// Set only for 3GPP or template SMIL presentations when creation
// mode is restricted.
if ( useRModeStrings )
{
SetErrorResource( errRes, R_UNIEDITOR_ERROR_RMODE_CANNOT_OPEN );
}
else
{
SetErrorResource( errRes, R_UNIEDITOR_ERROR_CANNOT_OPEN );
}
break;
}
case KUniLaunchPresGuided:
{
// Set only for 3GPP or template SMIL presentations when creation
// mode is guided.
SetErrorResource( errRes, R_UNIEDITOR_QUEST_GUIDED_PRESENTATION );
break;
}
case EUniProcessImgOutOfMemory:
case EUniProcessImgOutOfDisk:
case EUniProcessImgNotFound:
case EUniProcessImgNonConformant:
case EUniProcessImgScalingFailed:
case EUniProcessImgCompressFailed:
case EUniProcessImgCouldNotScale:
{
if ( useRModeStrings )
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_RMODE_SCALING_FAILED );
}
else
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_SCALING_FAILED );
}
break;
}
case EUniSendUiUnsupported:
{
if ( containsFiles )
{
if ( useRModeStrings )
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_RMODE_SOME_NOT_SUPPORTED );
}
else
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_SOME_NOT_SUPPORTED );
}
}
else
{
if ( useRModeStrings )
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECT );
}
else
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_UNSUPPORTED_OBJECT );
}
}
break;
}
case EUniSendUiForbidden:
{
// Note showing should be handled by SendUI in this case.
break;
}
case EUniSendUiTooBig:
{
if ( containsFiles )
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_OBJECT_SEND_AS_TOO_BIG );
}
else
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_OBJECT_TOO_BIG );
}
break;
}
case EUniEditorExit:
case EUniProcessImgUserAbort:
{
// Program error or user has selected to abort image processing at some stage.
// -> shutdown immediatelly.
aShutDown = ETrue;
return;
}
default:
{
// e.g leave in startup
break;
}
}
}
if ( errRes == R_UNIEDITOR_ERROR_CANNOT_OPEN ||
errRes == R_UNIEDITOR_ERROR_RMODE_CANNOT_OPEN )
{
// Message cannot be opened.
ShowConfirmableInfoL( errRes );
aShutDown = ETrue;
return;
}
else if ( errRes == R_UNIEDITOR_INFO_OBJECT_TOO_BIG ||
errRes == R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECT ||
errRes == R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECTS ||
errRes == R_UNIEDITOR_INFO_UNSUPPORTED_OBJECT ||
errRes == R_UNIEDITOR_INFO_UNSUPPORTED_OBJECTS )
{
ShowInformationNoteL( errRes, ETrue );
aShutDown = ETrue;
return;
}
else if ( errRes == R_UNIEDITOR_INFO_OBJECT_SEND_AS_TOO_BIG ||
errRes == R_UNIEDITOR_INFO_RMODE_SOME_NOT_SUPPORTED ||
errRes == R_UNIEDITOR_INFO_SOME_NOT_SUPPORTED )
{
ShowInformationNoteL( errRes, ETrue );
}
else if ( errRes == R_UNIEDITOR_INFO_MAX_SLIDES_SOME )
{
ShowConfirmableInfoL( errRes );
}
if ( errRes == R_UNIEDITOR_QUEST_GUIDED_PRESENTATION )
{
if ( !ShowGuidedModeConfirmationQueryL( errRes ) )
{
aShutDown = ETrue;
}
}
else
{
if ( Document()->CreationMode() != EMmsCreationModeFree )
{
TInt nonConformantObjects = iLaunchOperation->ParseResult();
if ( nonConformantObjects > 0 )
{
if ( Document()->CreationMode() == EMmsCreationModeRestricted )
{
if ( Document()->CreationModeUserChangeable() )
{
ShowConfirmableInfoL( R_UNIEDITOR_ERROR_RMODE_CANNOT_OPEN );
}
else
{
ShowConfirmableInfoL( R_UNIEDITOR_ERROR_CANNOT_OPEN );
}
aShutDown = ETrue;
return;
}
else if ( Document()->SuperDistributableObjectCount() == 0 ||
Document()->MessageType() != EUniSendUi )
{
// Not shown if DRM note has been shown already by SendUi.
TInt confRes( KErrNotFound );
if ( Document()->Saved() )
{
confRes = R_UNIEDITOR_QUEST_GUIDED_INC_OBJ;
if ( nonConformantObjects > 1 )
{
confRes = R_UNIEDITOR_QUEST_GUIDED_INC_OBJS;
}
}
else
{
confRes = R_UNIEDITOR_QUEST_GUIDED_OBJ;
if ( nonConformantObjects > 1 )
{
confRes = R_UNIEDITOR_QUEST_GUIDED_OBJS;
}
}
if ( !ShowGuidedModeConfirmationQueryL( confRes ) )
{
// Query not accepted
aShutDown = ETrue;
return;
}
}
}
}
}
if ( errRes == R_UNIEDITOR_INFO_RMODE_SCALING_FAILED ||
errRes == R_UNIEDITOR_INFO_SCALING_FAILED )
{
ShowInformationNoteL( errRes, ETrue );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::InsertPresentation
// ---------------------------------------------------------
//
void CUniEditorAppUi::InsertPresentationL( TBool aEditable )
{
if ( Document()->DataModel()->SmilType() != EMmsSmil )
{
//Delete body control. OK if dooesn't exist.
iView->DeleteControlL( EMsgComponentIdBody );
CMsgImageControl* imgCtrl = CMsgImageControl::NewL( *iView,
this );
CleanupStack::PushL( imgCtrl );
TAknsItemID id = KAknsIIDQgnGrafMmsUnedit;
TInt icon = EMbmUniutilsQgn_graf_mms_unedit;
TInt mask = EMbmUniutilsQgn_graf_mms_unedit_mask;
if ( aEditable )
{
id.Set( KAknsIIDQgnGrafMmsEdit );
icon = EMbmUniutilsQgn_graf_mms_edit;
mask = EMbmUniutilsQgn_graf_mms_edit_mask;
}
TParse fileParse;
fileParse.Set( KUniUtilsMBMFileName, &KDC_APP_BITMAP_DIR, NULL );
imgCtrl->LoadIconL( fileParse.FullName(), id, icon, mask );
TAknLayoutRect iconLayout;
iconLayout.LayoutRect( MsgEditorCommons::MsgDataPane(),
AknLayoutScalable_Apps::msg_data_pane_g4().LayoutLine() );
imgCtrl->SetIconSizeL( iconLayout.Rect().Size() );
//Draw it
imgCtrl->SetIconVisible( ETrue );
iView->AddControlL( imgCtrl, EMsgComponentIdImage, EMsgFirstControl, EMsgBody );
CleanupStack::Pop( imgCtrl );
}
else
{
User::Leave( KErrNotSupported );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::MsgLengthToNavipaneL
// ---------------------------------------------------------
//
void CUniEditorAppUi::MsgLengthToNavipaneL( TBool aForceDraw )
{
UNILOGGER_WRITE( "-> CUniEditorAppUi::MsgLengthToNavipaneL" );
TBuf<KMsgLengthIndicationBuffer> sizeString;
// If message is SMS type, iSmsBodyLength + iSmsSubjectLnegth will be used as length
// If EUnicodeMode is set, they will be handled as unicode length
if ( !( iEditorFlags & EHideSizeCounter ) )
{
CUniEditorDocument* doc = Document();
// It's ok to show the counter
if ( doc->UniState() == EUniSms )
{
CUniDataModel* model = doc->DataModel();
TInt charsLeft,msgsParts;
TInt lengthOne = 0;
TInt lengthMany = 0;
doc->SmsCharacterLimits( lengthOne, lengthMany );
TInt maxSmsCharacters = doc->AbsoluteMaxSmsCharacters();
TInt maxSmsParts = doc->AbsoluteMaxSmsParts();
if ( maxSmsCharacters <= 0 )
{
// No absolute maximum characters defined -> Calculate
// character maximum using maximum SMS part limit.
maxSmsCharacters = maxSmsParts * lengthMany;
}
CalculateSMSMsgLen(charsLeft,msgsParts);
if( model->ObjectList().Count() == 0 &&
model->AttachmentList().Count() == 1 &&
iSmilModel->SlideCount() == 1 &&
iSmsSubjectLength == 0)
{
sizeString.AppendNum( msgsParts );
}
else if ( maxSmsCharacters <= lengthOne )
{
// Maximum less or equal to length of
// one part -> show only characters left value.
sizeString.AppendNum( charsLeft );
}
else
{
HBufC* tempBuf = iSmsLengthFormatBuffer;
if ( AknLayoutUtils::LayoutMirrored() )
{
// Add the RTL marker in the format buffer
tempBuf = iSmsLengthFormatBuffer->AllocL();
tempBuf = tempBuf->ReAllocL( tempBuf->Length() + 2 );
CleanupStack::PushL( tempBuf );
TPtr tempPtr = tempBuf->Des();
TChar KUniRLMUnicode( 0x200F ); // Right to Left Marker
TBuf<1> charBuf;
charBuf.Append(KUniRLMUnicode);
tempPtr.Insert( 4, charBuf );
tempPtr.Insert( 9, charBuf );
}
StringLoader::Format( sizeString, tempBuf->Des(), 0, charsLeft );
if( tempBuf != iSmsLengthFormatBuffer )
{
CleanupStack::PopAndDestroy( tempBuf );
}
HBufC* temp = sizeString.AllocLC();
StringLoader::Format( sizeString, *temp, 1, msgsParts );
CleanupStack::PopAndDestroy( temp );
}
iEditorFlags |= ESmsCounterShownLast;
// Now the string is in buf
#ifdef RD_SCALABLE_UI_V2
if ( ( AknLayoutUtils::PenEnabled() && iPrevSmsLength != charsLeft ) || ( AknLayoutUtils::PenEnabled() && aForceDraw ))
{
if(!(iPrevSmsLength == -1 && !UpdateMsgLenToPenInput() ) ) // converted from MMS back to SMS
{
iPrevSmsLength = charsLeft;
iPeninputServer.UpdateAppInfo( sizeString, EAppIndicatorMsg );
}
}
#endif
// Reset this so that MMS size is drawn when it's shown next time
iDisplaySize = 0;
}
else
{
// OK we are dealing with MMS now
// Just take the size of the whole message and show it in the navipane
TInt bytes = MessageSizeInBytes();
TInt integer = iDisplaySize / 10;
TInt fragment = iDisplaySize % 10;
CreateMmsNaviSizeStringL( bytes, sizeString,
integer, fragment );
TInt tempDispSize = integer * 10 + fragment;
if ( !aForceDraw && iDisplaySize == tempDispSize && !( iEditorFlags & ESmsCounterShownLast ) )
{
// No changes to navipane
return;
}
#ifdef RD_SCALABLE_UI_V2
if ( AknLayoutUtils::PenEnabled() && (iEditorFlags & ESmsCounterShownLast ))
{
iPeninputServer.UpdateAppInfo( KNullDesC, EAppIndicatorMsg );
iPrevSmsLength = -1;
}
#endif
iEditorFlags &= ~ESmsCounterShownLast;
iDisplaySize = tempDispSize;
}
}
// Update both Edwin indicator pane and navi indicator pane
MAknEditingStateIndicator* editIndi = iAvkonEnv->EditingStateIndicator();
CAknIndicatorContainer* naviIndi =
static_cast<CAknIndicatorContainer*>( iNaviDecorator->DecoratedControl() );
if( editIndi )
{
CAknIndicatorContainer* indiContainer = editIndi->IndicatorContainer();
if ( indiContainer )
{
if( iEditorFlags & EHideSizeCounter )
{
// Just hide it
indiContainer->SetIndicatorState(TUid::Uid(EAknNaviPaneEditorIndicatorMessageLength),
EAknIndicatorStateOff);
}
else
{
indiContainer->SetIndicatorValueL(TUid::Uid(EAknNaviPaneEditorIndicatorMessageLength), sizeString);
indiContainer->SetIndicatorState(TUid::Uid(EAknNaviPaneEditorIndicatorMessageLength),
EAknIndicatorStateOn);
}
}
}
if( naviIndi )
{
if( iEditorFlags & EHideSizeCounter )
{
// Just hide it
naviIndi->SetIndicatorState(TUid::Uid(EAknNaviPaneEditorIndicatorMessageLength),
EAknIndicatorStateOff);
}
else
{
naviIndi->SetIndicatorValueL(TUid::Uid(EAknNaviPaneEditorIndicatorMessageLength), sizeString);
naviIndi->SetIndicatorState(TUid::Uid(EAknNaviPaneEditorIndicatorMessageLength),
EAknIndicatorStateOn);
}
}
UNILOGGER_WRITE( "<- CUniEditorAppUi::MsgLengthToNavipaneL" );
}
// ---------------------------------------------------------
// CUniEditorAppUi::CalculateSMSMsgLen
// ---------------------------------------------------------
//
void CUniEditorAppUi::CalculateSMSMsgLen(TInt& charsLeft, TInt& msgsParts)
{
CUniEditorDocument* doc = Document();
if ( doc->UniState() == EUniSms )
{
CUniDataModel* model = doc->DataModel();
TInt lengthOne = 0;
TInt lengthMany = 0;
doc->SmsCharacterLimits( lengthOne, lengthMany );
TInt totalLen = iSmsBodyLength + iSmsSubjectLength;
if ( doc->EmailOverSmsSupported() )
{
// Email over Sms so get the longest email address from To field
TInt emailLen = iHeader->LongestEmailAddress();
if ( emailLen > 0 )
{
// increase by one so that the separator sign is included too
emailLen++;
}
totalLen += emailLen;
}
TInt maxSmsCharacters = doc->AbsoluteMaxSmsCharacters();
TInt maxSmsParts = doc->AbsoluteMaxSmsParts();
if ( maxSmsCharacters <= 0 )
{
// maxSmsCharacters is set to minimum lengthOne.
if( maxSmsParts > 1 )
{
maxSmsCharacters = maxSmsParts * lengthMany;
}
else
{
maxSmsCharacters = lengthOne;
}
}
TInt thisPartChars = 0;
TInt maxThisPartChars = 0;
if( iNLTFeatureSupport )
{
//Turkish SMS-PREQ2265 specific
msgsParts = iNumOfPDUs;
maxThisPartChars = iCharsLeft;
thisPartChars = totalLen;
if(msgsParts > 1)
{
// More characters than one SMS segment.
// Calculate characters that are located on this part.
thisPartChars = lengthMany - maxThisPartChars;
}
}
else
{
if ( totalLen <= lengthOne )
{
// Less or equal characters than one SMS segment.
// All the characters are located in this part
thisPartChars = totalLen;
maxThisPartChars = lengthOne - thisPartChars;
msgsParts = 1;
}
else
{
// More characters than one SMS segment.
// Calculate characters that are located on
// this part.
thisPartChars = totalLen % lengthMany;
if ( thisPartChars == 0 )
{
// Last part has maximum characters.
thisPartChars = lengthMany;
}
maxThisPartChars = lengthMany - thisPartChars;
msgsParts = totalLen / lengthMany;
if ( thisPartChars != lengthMany )
{
// Chars in this part so lets add one part.
msgsParts++;
}
}
}
if ( totalLen <= maxSmsCharacters )
{
// Calculate the characters left in this part.
charsLeft = maxSmsCharacters - ( msgsParts - 1 ) * lengthMany - thisPartChars;
// Bound check.
charsLeft = Min( charsLeft, maxThisPartChars );
}
else
{
// More than max -> show -xx(yy)
charsLeft = maxSmsCharacters - totalLen;
}
if( model->ObjectList().Count() == 0 &&
model->AttachmentList().Count() == 1 &&
iSmilModel->SlideCount() == 1 &&
iSmsSubjectLength == 0)
{
charsLeft = msgsParts;
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::HandleCommandL
// ---------------------------------------------------------
//
void CUniEditorAppUi::HandleCommandL( TInt aCommand )
{
if ( iFixedToolbar )
{
SetFixedToolbarDimmed();
}
if ( !IsLaunched() || ( iEditorFlags & ( EEditorClosing | EEditorExiting ) ) )
{
if ( aCommand == EEikCmdExit )
{
TRAPD( error, DoHandleCommandL( EEikCmdExit ) );
User::LeaveIfError(error);
}
}
else
{
TRAPD( error, DoHandleCommandL( aCommand ) );
if ( iFixedToolbar )
{
UpdateToolbarL();
}
User::LeaveIfError( error );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoHandleCommandL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoHandleCommandL( TInt aCommand )
{
if ( !IsLaunched() || ( iEditorFlags & ( EEditorClosing | EEditorExiting | EMsgEditInProgress ) ) )
{
if ( aCommand != EEikCmdExit )
{
// Do not handle other than exit command if application has not
// finished launching.
return;
}
}
switch (aCommand)
{
// Main options menu commands
case EUniCmdViewImage:
case EUniCmdPlayAudio:
case EUniCmdPlayVideo:
case EUniCmdPlaySvg:
case EUniCmdPlayPres:
{
PlayFocusedItemL();
break;
}
case EUniCmdRemovePres:
{
RemoveTemplateL();
break;
}
case EUniCmdSendSMS:
case EUniCmdSendMMS:
{
if ( iHeader->HasRecipients() > 0 )
{
// has addresses -> Send
DoUserSendL();
}
else
{
DoUserAddRecipientL();
}
break;
}
case EUniCmdAddRecipient:
{
DoUserAddRecipientL();
break;
}
case EUniCmdAddRecipientMSK:
{
// Call this function so that check name functionality is called first
DoSelectionKeyL();
break;
}
case EUniCmdInsertMedia:
{
DoUserInsertMediaL();
break;
}
case EUniCmdInsertTemplateText:
{
DoUserInsertTextL( ETemplateText );
break;
}
case EUniCmdInsertNote:
{
DoUserInsertTextL( EMemoText );
break;
}
case EUniCmdPlaceTextFirst:
{
DoUserChangeOrderL( EUniTextFirst );
break;
}
case EUniCmdPlaceTextSecond:
{
DoUserChangeOrderL( EUniImageFirst );
break;
}
case EUniCmdMovePage:
{
DoUserMoveOrSelectPageL( ETrue );
break;
}
case EUniCmdSelectPage:
{
DoUserMoveOrSelectPageL( EFalse );
break;
}
case EUniCmdAddHeaders:
{
DoUserAddHeadersL();
break;
}
case EUniCmdObjects:
{
DoUserObjectsViewL( EFalse );
break;
}
case EUniCmdObjectsAttachment:
{
DoUserObjectsViewL( ETrue );
break;
}
case EUniCmdSendingOptions:
{
DoUserSendingOptionsL();
break;
}
case EUniCmdMessageInfo:
{
DoUserMessageInfoL();
break;
}
case EUniCmdRemovePage:
{
DoUserRemoveSlideL();
break;
}
case EUniCmdRemoveText:
{
RemoveCurrentTextObjectL();
break;
}
case EUniCmdChangePriority:
{
DoEditMmsPriorityL();
break;
}
case EUniCmdRemoveImage:
{
DoUserRemoveMediaL( EMsgComponentIdImage, EUniRegionImage );
break;
}
case EUniCmdRemoveAudio:
{
DoUserRemoveMediaL( EMsgComponentIdAudio, EUniRegionAudio );
break;
}
case EUniCmdRemoveVideo:
{
DoUserRemoveMediaL( EMsgComponentIdVideo, EUniRegionImage );
break;
}
case EUniCmdRemoveSvg:
{
DoUserRemoveMediaL( EMsgComponentIdSvg, EUniRegionImage );
break;
}
case EUniCmdRemove:
{
CMsgBaseControl* ctrl = iView->FocusedControl(); // ctrl can be NULL.
if(ctrl)
{
TMsgControlId controlId = TMsgControlId(ctrl->ControlId());
if(controlId == EMsgComponentIdAudio)
{
DoUserRemoveMediaL( controlId, EUniRegionAudio );
}
else if ( controlId == EMsgComponentIdImage ||
controlId == EMsgComponentIdVideo ||
controlId == EMsgComponentIdSvg )
{
if( (Document()->DataModel()->SmilType() == ETemplateSmil) || (Document()->DataModel()->SmilType() == E3GPPSmil))
{
// focus is on SMIL presentation icon
RemoveTemplateL();
}
else
{
DoUserRemoveMediaL( controlId, EUniRegionImage );
}
}
}
break;
}
case EMsgDispSizeAutomatic:
case EMsgDispSizeLarge:
case EMsgDispSizeNormal:
case EMsgDispSizeSmall:
{
HandleLocalZoomChangeL( (TMsgCommonCommands)aCommand );
break;
}
case EEikCmdExit:
{
RemoveWaitNote();
ExitAndSaveL();
break;
}
case EAknSoftkeyClose:
{
DoBackSaveL();
break;
}
case EAknCmdHelp:
{
LaunchHelpL();
break;
}
default:
{
CMsgEditorAppUi::HandleCommandL(aCommand);
break;
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::EditorObserver
// ---------------------------------------------------------
//
void CUniEditorAppUi::EditorObserver( TMsgEditorObserverFunc aFunc,
TAny* aArg1,
TAny* aArg2,
TAny* aArg3)
{
TRAPD( error, DoEditorObserverL( aFunc, aArg1, aArg2, aArg3 ) );
if ( error == KLeaveExit )
{
User::Leave( KLeaveExit );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoEditorObserverL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoEditorObserverL( TMsgEditorObserverFunc aFunc,
TAny* aArg1,
TAny* aArg2,
TAny* aArg3)
{
UNILOGGER_WRITE( "-> CUniEditorAppUi::DoEditorObserverL" );
TInt slides = iSmilModel->SlideCount();
TInt currSlide = Document()->CurrentSlide();
switch( aFunc )
{
case EMsgScrollParts:
{
TInt* parts = static_cast<TInt*>( aArg1 );
*parts = slides;
break;
}
case MMsgEditorObserver::EMsgHandleFocusChange:
{
TMsgFocusEvent* event = static_cast<TMsgFocusEvent*>( aArg1 );
TMsgAfterFocusEventFunc* after = static_cast<TMsgAfterFocusEventFunc*>( aArg2 );
TInt* currPart = static_cast<TInt*>( aArg3 );
*after = EMsgAfterFocusNone;
UNILOGGER_WRITE( "-> DoEditorObserverL ->MMsgEditorObserver::EMsgHandleFocusChange " );
switch ( *event )
{
case EMsgFocusAtBottom:
{
UNILOGGER_WRITE( "-> DoEditorObserverL ->EMsgFocusAtBottom ");
if ( currSlide + 1 < slides )
{
#ifdef RD_SCALABLE_UI_V2
DoUserChangeSlideL( *currPart );
*after = EMsgCursorToBodyBeginning;
*currPart = Document()->CurrentSlide();
#else
DoUserChangeSlideL( currSlide + 1 );
*after = EMsgCursorToBodyBeginning;
*currPart = currSlide + 1;
#endif
}
break;
}
case EMsgFocusAtTop:
{
UNILOGGER_WRITE( "-> DoEditorObserverL ->EMsgFocusAtTop ");
if ( currSlide > 0 )
{
#ifdef RD_SCALABLE_UI_V2
DoUserChangeSlideL( *currPart );
*after = EMsgCursorToBodyEnd;
*currPart = Document()->CurrentSlide();
#else
DoUserChangeSlideL( currSlide - 1 );
*after = EMsgCursorToBodyEnd;
*currPart = currSlide - 1;
#endif
}
break;
}
case EMsgFocusMovingFrom:
{
UNILOGGER_WRITE( "-> DoEditorObserverL ->EMsgFocusMovingFrom ");
TInt id( EMsgComponentIdNull );
CMsgBaseControl* ctrl = iView->FocusedControl(); // ctrl can be NULL.
if ( !ctrl )
{
break;
}
id = ctrl->ControlId();
if ( id == EMsgComponentIdAudio ||
id == EMsgComponentIdImage ||
id == EMsgComponentIdVideo )
{
break;
}
// not in first slide -> return
if ( currSlide > 0 )
{
break;
}
if ( iHeader &&
iHeader->IsAddressControl( id ) )
{
// We are moving from address control -> set max edwin sizes..
SetOrRemoveMaxSizeInEdwin();
CMsgAddressControl* rec = iView ?
static_cast<CMsgAddressControl*>( iView->ControlById( id ) ) :
NULL;
if ( rec )
{
TInt inputMode = rec->Editor().AknEditorCurrentInputMode();
SetInputModeToAddressFields( inputMode );
}
}
break;
}
case EMsgFocusMovedTo:
{
UNILOGGER_WRITE( "-> DoEditorObserverL ->EMsgFocusMovedTo ");
TInt id( EMsgComponentIdNull );
CMsgBaseControl* ctrl = iView->FocusedControl(); // ctrl can be NULL.
if ( !ctrl )
{
break;
}
id = ctrl->ControlId();
if ( id == EMsgComponentIdAudio ||
id == EMsgComponentIdImage ||
id == EMsgComponentIdVideo ||
id == EMsgComponentIdAttachment ||
id == EMsgComponentIdSvg )
{
iNaviPane->PushL( *iNaviDecorator );
}
UpdateMiddleSoftkeyL();
break;
}
case EMsgFocusToBody:
case EMsgFocusToHeader:
{
UNILOGGER_WRITE( "-> DoEditorObserverL ->EMsgFocusToBody or EMsgFocusToHeader ");
SmsMsgLenToPenInputL();
UpdateMiddleSoftkeyL(); // fallthrough
break;
}
default:
{
break;
}
}
break;
}
case MMsgEditorObserver::EMsgControlPointerEvent:
{
TPointerEvent* event = static_cast<TPointerEvent*>( aArg2 );
CMsgBaseControl* control = static_cast<CMsgBaseControl*>( aArg1 );
TWsEvent* wsEvent = static_cast<TWsEvent*>(aArg2);
if ( event->iType == TPointerEvent::EButton1Down )
{
iFocusedControl = control;
if ( control &&
( control->ControlId() == EMsgComponentIdAudio ||
control->ControlId() == EMsgComponentIdImage ||
control->ControlId() == EMsgComponentIdVideo ||
control->ControlId() == EMsgComponentIdAttachment ||
control->ControlId() == EMsgComponentIdSvg ) )
{
if(iLongTapDetector)
{
iLongTapDetector->EnableLongTapAnimation(ETrue);
iLongTapDetector->PointerEventL( *event );
}
}
iTapConsumed = EFalse;
}
else if ( (!iTapConsumed) && (event->iType == TPointerEvent::EButton1Up) )
{
iLongTapDetector->MonitorWsMessage(*wsEvent);
iTapConsumed = ETrue;
if ( control &&
iFocusedControl == control &&
( control->ControlId() == EMsgComponentIdAudio ||
control->ControlId() == EMsgComponentIdImage ||
control->ControlId() == EMsgComponentIdVideo ||
control->ControlId() == EMsgComponentIdAttachment ||
control->ControlId() == EMsgComponentIdSvg ) )
{
DoSelectionKeyL();
}
}
break;
}
case MMsgEditorObserver::EMsgButtonEvent:
{
CMsgBaseControl* control = static_cast<CMsgBaseControl*>( aArg1 );
if ( control &&
( control->ControlId() != EMsgComponentIdAttachment ||
iFocusedControl != control ) )
{
DoSelectionKeyL();
}
break;
}
default:
{
// Other events not handled.
break;
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::FetchFileL
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::FetchFileL( MsgAttachmentUtils::TMsgAttachmentFetchType aFetchType )
{
// do not start if()ing. Sets parameter always
TAiwVariant sizeLimit( Document()->MaxMessageSize()
- ( MessageSizeInBytes() + KUniAttachmentOverhead ) );
TAiwGenericParam sizeLimitParam( EGenericParamMMSSizeLimit, sizeLimit );
CAiwGenericParamList* paramList = CAiwGenericParamList::NewLC();
paramList->AppendL( sizeLimitParam );
CDesCArrayFlat* files = new( ELeave ) CDesC16ArrayFlat( 1 );
CleanupStack::PushL( files );
TBool fetchOK = MsgAttachmentUtils::FetchFileL( aFetchType,
*files,
paramList,
EFalse, // disk space checked in VerifySelectionL or CUniEditorInsertOperation, if image scaled/compressed
EFalse,
this );
switch ( aFetchType )
{
case MsgAttachmentUtils::ENewImage:
case MsgAttachmentUtils::ENewAudio:
case MsgAttachmentUtils::ENewVideo:
case MsgAttachmentUtils::ENote:
{
if ( fetchOK )
{
TFileName* fileName = new( ELeave ) TFileName;
CleanupStack::PushL( fileName );
if ( files->MdcaCount() > 0 )
{
*fileName = files->MdcaPoint( 0 );
}
// Something was fetched
__ASSERT_DEBUG( !iInsertingMedia, Panic( EUniIllegalMediaObject ) );
fetchOK = CreateMediaInfoForInsertL( iInsertingType, *fileName ) ? ETrue :
EFalse;
CleanupStack::PopAndDestroy( fileName );
}
break;
}
case MsgAttachmentUtils::EImage:
case MsgAttachmentUtils::EAudio:
case MsgAttachmentUtils::EVideo:
case MsgAttachmentUtils::ESVG:
default:
{
// CreateMediaInfoForInsertL is called in VeritySelectionL
break;
}
}
CleanupStack::PopAndDestroy( 2, paramList ); // + files
return fetchOK;
}
// ---------------------------------------------------------
// CUniEditorAppUi::VerifySelectionL
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::VerifySelectionL( const MDesCArray* aSelectedFiles )
{
CAknInputBlock::NewLC();
TBool ret = EFalse;
if ( aSelectedFiles->MdcaCount() == 1 )
{
__ASSERT_DEBUG( !iInsertingMedia, Panic( EUniIllegalMediaObject ) );
if ( CreateMediaInfoForInsertL( iInsertingType, aSelectedFiles->MdcaPoint( 0 ) ) )
{
ret = ETrue;
}
}
CleanupStack::PopAndDestroy(); // CAknInputBlock
return ret;
}
// ---------------------------------------------------------
// CUniEditorAppUi::DynInitToolbarL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DynInitToolbarL( TInt aResourceId, CAknToolbar* aToolbar )
{
if ( aResourceId == EUniCmdFixedToolbarInsert )
{
CAknToolbarExtension* extension = aToolbar->ToolbarExtension();
if ( iSmilModel )
{
if ( iSmilModel->SlideCount() >= iSmilModel->MaxSlideCount() )
{
if ( ObjectsAvailable() & ( EUniImageFlag | EUniSvgFlag | EUniVideoFlag ) )
{
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtInsertImage, ETrue );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtNewImage, ETrue );
}
else
{
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtInsertImage, EFalse );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtNewImage, EFalse );
}
if ( ObjectsAvailable() & ( EUniImageFlag | EUniSvgFlag | EUniVideoFlag | EUniAudioFlag ) )
{
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtInsertVideo, ETrue );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtNewVideo, ETrue );
}
else
{
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtInsertVideo, EFalse );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtNewVideo, EFalse );
}
if ( ObjectsAvailable() & ( EUniVideoFlag | EUniAudioFlag | EUniSvgFlag ) )
{
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtInsertAudio, ETrue );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtNewAudio, ETrue );
}
else
{
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtInsertAudio, EFalse );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtNewAudio, EFalse );
}
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtInsertSlide, ETrue );
}
else
{
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtInsertImage, EFalse );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtNewImage, EFalse );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtInsertVideo, EFalse );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtNewVideo, EFalse );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtInsertAudio, EFalse );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtNewAudio, EFalse );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtInsertSlide, EFalse );
}
}
if ( !( iSupportedFeatures & EUniFeatureCamcorder ) )
{
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtNewImage, ETrue );
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtNewVideo, ETrue );
}
if ( Document()->CreationMode() == EMmsCreationModeRestricted )
{
SetExtensionButtonDimmed( extension, EUniCmdFixedToolbarExtNewSmil, ETrue );
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::OfferToolbarEventL
// ---------------------------------------------------------
//
void CUniEditorAppUi::OfferToolbarEventL( TInt aCommand )
{
if ( iFixedToolbar )
{
iFixedToolbar->ToolbarExtension()->SetShown( EFalse );
}
TRAPD( error, DoOfferToolbarEventL( aCommand ) );
User::LeaveIfError( error );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoOfferToolbarEventL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoOfferToolbarEventL( TInt aCommand )
{
switch( aCommand )
{
case EUniCmdFixedToolbarSend:
{
DoHandleCommandL( EUniCmdSendSMS );
break;
}
case EUniCmdFixedToolbarInsert:
{
DoHandleCommandL( EUniCmdInsertMedia );
break;
}
case EUniCmdFixedToolbarAddRecipient:
{
DoHandleCommandL( EUniCmdAddRecipient );
break;
}
case EUniCmdFixedToolbarExtInsertImage:
{
DoUserInsertImageL( MsgAttachmentUtils::EImage );
break;
}
case EUniCmdFixedToolbarExtInsertVideo:
{
DoUserInsertVideoL( MsgAttachmentUtils::EVideo );
break;
}
case EUniCmdFixedToolbarExtInsertAudio:
{
DoUserInsertAudioL( MsgAttachmentUtils::EAudio );
break;
}
case EUniCmdFixedToolbarExtNewImage:
{
DoUserInsertImageL( MsgAttachmentUtils::ENewImage );
break;
}
case EUniCmdFixedToolbarExtNewVideo:
{
DoUserInsertVideoL( MsgAttachmentUtils::ENewVideo );
break;
}
case EUniCmdFixedToolbarExtNewAudio:
{
DoUserInsertAudioL( MsgAttachmentUtils::ENewAudio );
break;
}
case EUniCmdFixedToolbarExtInsertSlide:
{
DoUserInsertSlideL();
break;
}
case EUniCmdFixedToolbarExtInsertTemplate:
{
DoUserInsertTextL( ETemplateText );
break;
}
case EUniCmdFixedToolbarExtInsertNote:
{
DoUserInsertTextL( EMemoText );
break;
}
case EUniCmdFixedToolbarExtInsertvCard:
{
DoUserInsertVCardL();
break;
}
case EUniCmdFixedToolbarExtOther:
{
DoToolbarInsertOtherL();
break;
}
default:
{
break;
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::HandleServerAppExit
// ---------------------------------------------------------
//
void CUniEditorAppUi::HandleServerAppExit( TInt /*aReason*/ )
{
CMsgBaseControl* ctrl = iView->FocusedControl();
if ( ctrl )
{
TUniRegion region = EUniRegionImage;
switch ( ctrl->ControlId() )
{
case EMsgComponentIdAudio:
{
region = EUniRegionAudio;
// Fallthrough.
}
case EMsgComponentIdVideo:
{
CUniObject* object = iSmilModel->GetObject( Document()->CurrentSlide(), region );
// Coverty fix, Null pointer return, http://ousrv057/cov.cgi?cid=37172
if ( object )
{
if ( object->DrmInfo() )
{
object->DrmInfo()->FreezeRights();
}
}
TRAP_IGNORE( iSlideLoader->UpdateControlIconL(
*static_cast<CMsgMediaControl*>( ctrl ),
object ) );
ctrl->DrawNow();
break;
}
default:
{
break;
}
}
}
iEditorFlags &= ~EMsgEditInProgress;
DeactivateInputBlocker();
}
// ---------------------------------------------------------
// CUniEditorAppUi::HandleEdwinEventL
//
// Performs character counter updating if neccessary. This is needed
// for supporting on-screen keyboard. Normally character input
// is handled already on OfferKeyEventL function but it does no
// harm to do it here again. Character input is not handled if editor
// is not fully launched or it is about to close. Modified flag is turned
// on here since control state change event that should turn it on might
// come after this event and HandleCharInputL will not work correctly if
// modified flag is not set. Text update event is expected to come only
// in such cases that control is modified.
// ---------------------------------------------------------
//
void CUniEditorAppUi::HandleEdwinEventL( CEikEdwin* /*aEdwin*/, TEdwinEvent aEventType )
{
if ( aEventType == MEikEdwinObserver::EEventTextUpdate &&
!( iEditorFlags & EEditorClosing ||
iEditorFlags & EEditorExiting ) &&
IsLaunched() )
{
CMsgBaseControl* focusedControl = iView->FocusedControl();
if ( focusedControl )
{
focusedControl->SetModified( ETrue );
HandleCharInputL();
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::HandleEntryMovedL
// ---------------------------------------------------------
//
void CUniEditorAppUi::HandleEntryMovedL( TMsvId /*aOldParent*/, TMsvId /*aNewParent*/ )
{
}
// ---------------------------------------------------------
// CUniEditorAppUi::HandleKeyEventL
// ---------------------------------------------------------
//
TKeyResponse CUniEditorAppUi::HandleKeyEventL( const TKeyEvent& aKeyEvent,
TEventCode aType )
{
if ( !IsLaunched() )
{
// Still launching
return EKeyWasNotConsumed;
}
if ( !IsDisplayingMenuOrDialog() &&
!( iEditorFlags & EEditorClosing ||
iEditorFlags & EEditorExiting ) )
{
switch ( aKeyEvent.iCode )
{
case EKeyEnter:
{
if ( DoEnterKeyL() )
{
return EKeyWasConsumed;
}
break;
}
case EKeyOK:
{
// Selection key: Show context menus
DoSelectionKeyL();
return EKeyWasConsumed;
}
case EKeyYes:
{
// CallCreationKey: Send message if recipients.
// Otherwise fetch recipients
if ( iHeader->HasRecipients() )
{
// has addresses -> Send
DoUserSendL();
}
else
{
DoUserAddRecipientL();
}
return EKeyWasConsumed;
}
case EKeyBackspace:
case EKeyDelete:
{
CMsgBaseControl* ctrl = iView->FocusedControl();
if ( ctrl )
{
switch( ctrl->ControlId() )
{
case EMsgComponentIdImage:
{
switch ( Document()->DataModel()->SmilType() )
{
case ETemplateSmil:
case E3GPPSmil:
{
// focus is on SMIL presentation icon
RemoveTemplateL();
break;
}
default:
{
// real image
DoUserRemoveMediaL( EMsgComponentIdImage, EUniRegionImage );
break;
}
}
return EKeyWasConsumed;
}
case EMsgComponentIdAudio:
{
DoUserRemoveMediaL( EMsgComponentIdAudio, EUniRegionAudio );
return EKeyWasConsumed;
}
case EMsgComponentIdVideo:
{
DoUserRemoveMediaL( EMsgComponentIdVideo, EUniRegionImage );
return EKeyWasConsumed;
}
case EMsgComponentIdSvg:
{
DoUserRemoveMediaL( EMsgComponentIdSvg, EUniRegionImage );
return EKeyWasConsumed;
}
default:
{
break;
}
}
}
break;
}
default:
{
break;
}
}
switch ( aKeyEvent.iScanCode )
{
case EStdKeyUpArrow:
case EStdKeyDownArrow:
case EStdKeyLeftArrow:
case EStdKeyRightArrow:
case EStdKeyDevice1: // Close key
case EStdKeyRightShift: // Shift
case EStdKeyApplication0: // Task switching
{
return CMsgEditorAppUi::HandleKeyEventL( aKeyEvent, aType );
}
default:
{
break;
}
}
TKeyResponse resp = CMsgEditorAppUi::HandleKeyEventL( aKeyEvent, aType );
if ( aType == EEventKeyUp )
{
// Check if character inserted to controls
HandleCharInputL();
}
return resp;
}
else
{
return CMsgEditorAppUi::HandleKeyEventL(aKeyEvent, aType);
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::HandleCharInputL
// Updates model
// ---------------------------------------------------------
//
void CUniEditorAppUi::HandleCharInputL()
{
if ( IsLaunched() )
{
CMsgBaseControl* ctrl = iView->FocusedControl();
TBool changed = EFalse;
if ( ctrl )
{
switch ( ctrl->ControlId() )
{
case EMsgComponentIdTo:
case EMsgComponentIdCc:
case EMsgComponentIdBcc:
{
if ( ctrl->IsModified() )
{
Document()->SetHeaderModified( ETrue );
CheckHeaderForMessageTypeL();
changed = ETrue;
}
SetAddressSize();
break;
}
case EMsgComponentIdSubject:
{
if ( ctrl->IsModified() )
{
Document()->SetHeaderModified( ETrue );
changed = ETrue;
}
SetSubjectSize();
CheckBodyForMessageTypeL();
CheckMaxSmsSizeAndShowNoteL();
SetOrRemoveMaxSizeInEdwin();
break;
}
case EMsgComponentIdBody:
{
if ( ctrl->IsModified() )
{
UpdateSmilTextAttaL();
Document()->SetBodyModified( ETrue );
CheckBodyForMessageTypeL();
CheckMaxSmsSizeAndShowNoteL();
SetOrRemoveMaxSizeInEdwin();
changed = ETrue;
}
break;
}
default:
{
// Text control not focused.
break;
}
}
}
if ( changed )
{
MsgLengthToNavipaneL();
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::HandleForegroundEventL
//
// Updates navipane at editor start when launched from
// ---------------------------------------------------------
//
void CUniEditorAppUi::HandleForegroundEventL( TBool aForeground )
{
UNILOGGER_WRITE( "-> CUniEditorAppUi::HandleForegroundEventL" );
CAknAppUi::HandleForegroundEventL( aForeground );
if ( IsLaunched() &&
aForeground &&
!IsDisplayingDialog() &&
!( iEditorFlags & ( EEditorExiting | EEditorClosing ) ) )
{
// This must be init.. not MsgLen... Otherwise returning
// from embedded app loses msglength
InitNaviPaneL();
}
UNILOGGER_WRITE( "-> CUniEditorAppUi::HandleForegroundEventL" );
}
// ---------------------------------------------------------
// CUniEditorAppUi::UpdateSmilTextAttaL
//
// NOTE: This function should only be called when text is
// added/removed to/from bodycontrol.
// ---------------------------------------------------------
//
void CUniEditorAppUi::UpdateSmilTextAttaL()
{
__ASSERT_DEBUG( Document()->DataModel()->SmilType() == EMmsSmil, Panic( EUniIllegalSmilType ) );
TInt slideNum = Document()->CurrentSlide();
if ( slideNum < 0 || slideNum >= iSmilModel->SlideCount() )
{
return;
}
// Update smilmodel
if ( !BodyCtrl() ||
BodyCtrl()->TextContent().DocumentLength() == 0 )
{
// Body control does not exist or it is empty
CUniObject* obj = iSmilModel->GetObject( slideNum, EUniRegionText );
if ( obj )
{
// If there is text atta in presentation it should be removed.
// Note: Text atta is not removed from store at this point (removed in save)
iSmilModel->RemoveObjectL( slideNum, obj );
}
}
else
{
// Text added -> see if model already has text atta
if ( !iSmilModel->GetObject( slideNum, EUniRegionText ) )
{
if ( !iSmilModel->IsSlide( slideNum ) )
{
// Add slide
iSmilModel->AddSlideL( slideNum );
}
iSmilModel->AddTextObjectL( slideNum,
&( BodyCtrl()->Editor() ) );
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DynInitMenuPaneL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane )
{
// Confirm app is running properly (needed atleast now)
if ( !IsLaunched() )
{
// If not, hide everything and return
TInt amountOfItems = aMenuPane->NumberOfItemsInPane();
if ( amountOfItems )
{
aMenuPane->DeleteBetweenMenuItems( 0, amountOfItems-1 );
}
return;
}
TUint32 objects = ObjectsAvailable();
switch ( aResourceId )
{
case R_UNIEDITOR_MAIN_MENU:
{
// Features always visible:
// EEikCmdExit
// EUniCmdSendingOptions
// EUniCmdMessageInfo
// Features checked commonly
if ( !( iSupportedFeatures & EUniFeatureHelp ) )
{
// Help
aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
}
// Features in locked SMS mode
if ( IsHardcodedSms() )
{
// Dim these items always in locked SMS mode
aMenuPane->SetItemDimmed( EUniCmdPlayPreview, ETrue );
aMenuPane->SetItemDimmed( EUniCmdSendMMS, ETrue );
aMenuPane->SetItemDimmed( EUniCmdInsertMedia, ETrue );
aMenuPane->SetItemDimmed( EUniCmdPlaceTextFirst, ETrue );
aMenuPane->SetItemDimmed( EUniCmdPlaceTextSecond, ETrue );
aMenuPane->SetItemDimmed( EUniCmdMovePage, ETrue );
aMenuPane->SetItemDimmed( EUniCmdSelectPage, ETrue );
aMenuPane->SetItemDimmed( EUniCmdChangePriority, ETrue );
if ( Document()->DataModel()->ObjectList().Count() == 0 &&
Document()->DataModel()->AttachmentList().Count() == 0 )
{
// If no objects -> hide the option
aMenuPane->SetItemDimmed( EUniCmdObjects, ETrue );
}
if ( !Document()->EmailOverSmsSupported() ||
( iHeader &&
!( iHeader->AddHeadersVariation() & EUniFeatureSubjectConfigurable ) ) )
{
// Locked SMS and no email over sms or email over SMS without selectable subject.
aMenuPane->SetItemDimmed( EUniCmdAddHeaders, ETrue );
}
if ( !BodyCtrl() )
{
aMenuPane->SetItemDimmed( EUniCmdRemoveSubmenu, ETrue );
aMenuPane->SetItemDimmed( EUniCmdInsertSubmenu, ETrue );
}
else if ( BodyCtrlEditor()->TextLength() == 0 )
{
aMenuPane->SetItemDimmed( EUniCmdRemoveSubmenu, ETrue );
}
}
else if ( TUniMsvEntry::IsMmsUpload( Document()->Entry() ) )
{
// MMS upload message
aMenuPane->SetItemDimmed( EUniCmdInsertSubmenu, ETrue );
aMenuPane->SetItemDimmed( EUniCmdAddHeaders, ETrue );
aMenuPane->SetItemDimmed( EUniCmdAddRecipient, ETrue );
aMenuPane->SetItemDimmed( EUniCmdChangePriority, ETrue );
if ( Document()->DataModel()->ObjectList().Count() == 0 &&
Document()->DataModel()->AttachmentList().Count() == 0 )
{
// If no objects -> hide the option
aMenuPane->SetItemDimmed( EUniCmdObjects, ETrue );
}
DynInitFocusedMediaBasedOptionsL( aMenuPane );
}
else
{
// It's automatic mode
aMenuPane->SetItemDimmed( EUniCmdInsertSubmenu, ETrue );
if ( Document()->DataModel()->ObjectList().Count() == 0 &&
Document()->DataModel()->AttachmentList().Count() == 0 )
{ // If no objects -> hide the option
aMenuPane->SetItemDimmed( EUniCmdObjects, ETrue );
}
if ( Document()->UniState() == EUniSms )
{
// It's currently a SMS message
aMenuPane->SetItemDimmed( EUniCmdPlayPreview, ETrue );
aMenuPane->SetItemDimmed( EUniCmdSendMMS, ETrue );
aMenuPane->SetItemDimmed( EUniCmdPlaceTextFirst, ETrue );
aMenuPane->SetItemDimmed( EUniCmdPlaceTextSecond, ETrue );
aMenuPane->SetItemDimmed( EUniCmdPlayPreview, ETrue );
aMenuPane->SetItemDimmed( EUniCmdMovePage, ETrue );
aMenuPane->SetItemDimmed( EUniCmdSelectPage, ETrue );
aMenuPane->SetItemDimmed( EUniCmdChangePriority, ETrue );
if ( !BodyCtrlEditor() || BodyCtrlEditor()->TextLength() == 0 )
{
aMenuPane->SetItemDimmed( EUniCmdRemoveSubmenu, ETrue );
}
}
else
{
// It's currently a MMS message
/*
* Do not show "Sending Options" menu item if:
* 1. It is a MMS and
* 2. The feature flag MpMessagingHideMessageTypeId is set
* This is because when we are composing a MMS,
* "Character Support" option is not displayed in "Sending Options"
* and because of this flag, we are not going to show "Message Type"
* option as well - resulting in an empty "Sendings Options" dialog.
* Therefore, it was decided to hide this menu option when
* composing a MMS (if flag is defined)
*/
if ( iEditorFlags & EHideMessageTypeOption ||
iMtm->MessageTypeLocking() == EUniMessageTypeLocked )
{
// Also, if message is permanently locked ( to mms ) -> no sending options
aMenuPane->SetItemDimmed( EUniCmdSendingOptions, ETrue );
}
if ( !(iSupportedFeatures & EUniFeaturePriority) )
{
aMenuPane->SetItemDimmed( EUniCmdChangePriority, ETrue );
}
// Always visible in MMS message:
// EUniCmdAddRecipient
if ( iHeader &&
!iHeader->AddHeadersVariation() )
{
aMenuPane->SetItemDimmed( EUniCmdAddHeaders, ETrue );
}
DynInitFocusedMediaBasedOptionsL( aMenuPane );
}
}
break;
}
case R_UNIEDITOR_REMOVE_SUBMENU:
{
// Remove submenu is visible only for MMS SMIL messages
if ( !( objects & EUniImageFlag &&
Document()->DataModel()->SmilType() == EMmsSmil ) )
{
aMenuPane->SetItemDimmed( EUniCmdRemoveImage, ETrue );
}
if ( !( objects & EUniAudioFlag ) )
{
aMenuPane->SetItemDimmed( EUniCmdRemoveAudio, ETrue );
}
if ( !( objects & EUniVideoFlag ) )
{
aMenuPane->SetItemDimmed( EUniCmdRemoveVideo, ETrue );
}
if ( !( objects & EUniTextFlag ) )
{
aMenuPane->SetItemDimmed( EUniCmdRemoveText, ETrue );
}
if ( !( objects & EUniSvgFlag ) )
{
aMenuPane->SetItemDimmed( EUniCmdRemoveSvg, ETrue );
}
if ( Document()->DataModel()->SmilType() != ETemplateSmil &&
Document()->DataModel()->SmilType() != E3GPPSmil )
{
aMenuPane->SetItemDimmed( EUniCmdRemovePres, ETrue );
}
if ( iSmilModel->SlideCount() <= 1 )
{
aMenuPane->SetItemDimmed( EUniCmdRemovePage, ETrue );
}
break;
}
case R_UNIEDITOR_CONTEXT_MENU:
{
if ( Document()->UniState() == EUniSms )
{
aMenuPane->SetItemDimmed( EUniCmdSendMMS, ETrue );
}
else
{
aMenuPane->SetItemDimmed( EUniCmdSendSMS, ETrue );
}
if ( IsHardcodedSms() )
{
aMenuPane->SetItemDimmed( EUniCmdInsertMedia, ETrue );
}
if ( !( iSupportedFeatures & EUniFeatureJapanese ) ||
iSmilModel->SlideCount() <= 1 )
{
// Only shown on Japanese variant.
aMenuPane->SetItemDimmed( EUniCmdSelectPage, ETrue );
}
break;
}
case R_UNIEDITOR_ZOOM_SUBMENU:
{
TInt zoomLevel = KErrGeneral;
iMsgEditorAppUiExtension->iSettingCachePlugin.GetValue( KAknLocalZoomLayoutSwitch,
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;
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DynInitFocusedMediaBasedOptionsL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DynInitFocusedMediaBasedOptionsL( CEikMenuPane* aMenuPane )
{
// Lets dim all the context sensitive options first
aMenuPane->SetItemDimmed( EUniCmdPlayPreview, ETrue );
aMenuPane->SetItemDimmed( EUniCmdSendSMS, ETrue );
if ( Document()->DataModel()->SmilType() != EMmsSmil )
{
// It's 3GPP presentation
aMenuPane->SetItemDimmed( EUniCmdInsertMedia, ETrue );
aMenuPane->SetItemDimmed( EUniCmdPlaceTextFirst, ETrue );
aMenuPane->SetItemDimmed( EUniCmdPlaceTextSecond, ETrue );
}
else if ( iSupportedFeatures & EUniFeatureJapanese )
{
// Not shown on japanese variant ever.
aMenuPane->SetItemDimmed( EUniCmdPlaceTextFirst, ETrue );
aMenuPane->SetItemDimmed( EUniCmdPlaceTextSecond, ETrue );
}
else
{
if ( iSmilModel->Layout() == EUniImageFirst )
{
aMenuPane->SetItemDimmed( EUniCmdPlaceTextSecond, ETrue );
}
else
{
aMenuPane->SetItemDimmed( EUniCmdPlaceTextFirst, ETrue );
}
}
if ( Document()->DataModel()->SmilType() != EMmsSmil ||
iSmilModel->SlideCount() <= 1 )
{
// No move if not MmsSmil or only one page
aMenuPane->SetItemDimmed( EUniCmdMovePage, ETrue );
aMenuPane->SetItemDimmed( EUniCmdSelectPage, ETrue );
}
else if ( !( iSupportedFeatures & EUniFeatureJapanese ) )
{
// Only shown on Japanese variant.
aMenuPane->SetItemDimmed( EUniCmdSelectPage, ETrue );
}
if( Document()->DataModel()->SmilType() == EMmsSmil &&
Document()->DataModel()->ObjectList().Count() == 0 &&
iSmilModel->SlideCount() == 1 )
{
aMenuPane->SetItemDimmed( EUniCmdRemoveSubmenu, ETrue );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::IsMessageEmpty
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::IsMessageEmpty() const
{
TBool smil = EFalse;
if ( Document()->DataModel()->SmilType() != EMmsSmil &&
Document()->DataModel()->SmilList().Count() > 0 )
{
smil = ETrue;
}
return !smil &&
IsHeaderEmpty() &&
IsBodyEmpty() &&
Document()->DataModel()->AttachmentList().Count() == 0;
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserSendL
//
// Message must be unlocked before coming here.
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserSendL()
{
// Force FEP Update done only when SMIL is not 3GPP SMIL
if ( Document()->DataModel()->SmilType() == EMmsSmil )
{
if ( BodyCtrl() )
{
BodyCtrl()->SetFocus( EFalse );
}
iCoeEnv->SyncNotifyFocusObserversOfChangeInFocus();
}
TUniState currentState = Document()->UniState();
if(currentState == EUniMms)
{
TInt PrevSlidecount = iSmilModel->SlideCount();
iSmilModel->RemoveEmptySlides();
if( PrevSlidecount != iSmilModel->SlideCount() )
{
Document()->SetBodyModified( ETrue );
CheckBodyForMessageTypeL();
}
}
TBool modified( EFalse );
if ( !VerifyAddressesL( modified ) )
{
// Invalid recipient found -> abort sending.
return;
}
if ( modified &&
currentState != Document()->UniState() )
{
if ( !ShowConfirmationQueryL( R_UNIEDITOR_MSG_TYPE_CHANGED_WHILE_SENDING ) )
{
return;
}
}
// Check MMS message size
if ( TUint( MessageSizeInBytes() ) > Document()->MaxMessageSize() )
{
TInt maxInKilos = ( Document()->MaxMessageSize() + KBytesInKilo - 1 ) / KBytesInKilo;
HBufC* string = StringLoader::LoadLC( R_UNIEDITOR_SEND_BIG_TEXT,
maxInKilos,
iCoeEnv );
CAknInformationNote* note = new ( ELeave ) CAknInformationNote();
note->ExecuteLD( *string );
CleanupStack::PopAndDestroy( string );
return;
}
// Check the max sms size
CheckMaxSmsSizeAndShowNoteL( ETrue );
if( iEditorFlags & EMaxSmsSizeNoteShown )
{
// This flag was set by the funtion call above and it means an error note was shown to user
return;
}
if( !CheckMaxRecipientsAndShowNoteL( ETrue ) )
{
// Too many recipients. Info was shown so just return
return;
}
CUniEditorPlugin* plugin = NULL;
TInt resourceId = NULL;
// Get the plugin
if( Document()->UniState() == EUniSms )
{
plugin = SmsPlugin();
resourceId = R_QTN_MSG_WAIT_SENDING_SMS;
// Ask if it's ok to send the message in N parts
if( !ConfirmSmsSendInMultiplePartsL() )
{
return;
}
}
else
{
plugin = MmsPlugin();
resourceId = R_QTN_MSG_WAIT_SENDING_MMS;
}
if( plugin )
{
TBool checkEmailSettings = EFalse;
if( Document()->EmailOverSmsSupported() && iHeader->LongestEmailAddress() )
{
checkEmailSettings = ETrue;
}
if ( iFixedToolbar && !plugin->IsServiceValidL() )
{
iFixedToolbar->HideItemsAndDrawOnlyBackground( ETrue );
}
iEditorFlags |= EToolbarHidden;
CleanupStack::PushL( TCleanupItem( EnableFixedToolbar, this ) );
if (!plugin->IsServiceValidL())
{
SetKeyEventFlags(0);
}
CleanupStack::PushL( TCleanupItem( DisableSendKey, this ) );
iMsgLenToVKB = EFalse;
TBool serviceValid( plugin->ValidateServiceL( checkEmailSettings ) );
CleanupStack::PopAndDestroy(2); //DisableSendKey,EnableFixedToolbar
if( !serviceValid )
{
// Settings are not valid (AP/SC missing)
iMsgLenToVKB = ETrue;
return;
}
}
else
{
// The plugin is not ok -> cannot send the message
return;
}
if( IsPhoneOfflineL() )
{
resourceId = R_QTN_WAIT_MSG_SAVED_OUTBOX;
}
iSendOperation = CUniEditorSendOperation::NewL( *this,
*Document(),
*iHeader,
*plugin,
*iView,
FsSession() );
ActivateInputBlockerL( iSendOperation );
ShowWaitNoteL( resourceId );
iEditorFlags |= EEditorClosing;
iSendOperation->Send();
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoMsgSaveExitL
// Exit from option menu
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoMsgSaveExitL()
{
if ( CAknEnv::AppWithShutterRunning() )
{
iEditorFlags |= ERunAppShutterAtExit;
}
delete iLaunchOperation;
iLaunchOperation = NULL;
delete iSendOperation;
iSendOperation = NULL;
delete iInsertOperation;
iInsertOperation = NULL;
delete iChangeSlideOperation;
iChangeSlideOperation = NULL;
delete iVCardOperation;
iVCardOperation = NULL;
if ( IsMessageEmpty() )
{
DeleteCurrentEntryL();
}
else if ( ( Document()->Modified() ||
Document()->PrevSaveType() < EClosingSave ) &&
CanSaveMessageL() )
{
// Needs saving
if ( IsForeground() )
{
TInt resId = Document()->Saved() ? R_QTN_UNI_WAIT_SAVING_MESSAGE :
R_QTN_UNI_WAIT_SAVING_MESSAGE_NEW;
// Cannot trap call below.
DoSaveL( EClosingSave );
iEditorFlags |= EEditorClosing;
ShowWaitNoteL( resId );
}
else
{
TInt err(KErrNone);
TRAP( err, DoSaveL( EClosingSave ) );
}
BeginActiveWait( iSaveOperation );
if ( iEditorFlags & ERunAppShutterAtExit )
{
RunAppShutter();
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::ExitAndSaveL
// ---------------------------------------------------------
//
void CUniEditorAppUi::ExitAndSaveL()
{
if ( iEditorFlags & EEditorClosing )
{
Exit( EAknSoftkeyClose );
return;
}
if ( CAknEnv::AppWithShutterRunning() )
{
iEditorFlags |= ERunAppShutterAtExit;
}
if ( iEditorFlags & ELaunchSuccessful &&
Document()->MediaAvailable() )
{
DoMsgSaveExitL();
}
Exit();
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoBackSaveL
// Back button implementation
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoBackSaveL()
{
if ( IsMessageEmpty() )
{
if ( iMtm->Entry().Entry().Visible() )
{
ShowInformationNoteL( R_UNIEDITOR_INFO_DELETED, ETrue );
}
DeleteAndExitL();
}
else
{
TInt closeVal = ShowCloseQueryL();
if ( closeVal == EMsgCloseCancel )
{
return;
}
else if ( closeVal == EMsgCloseDelete )
{
ReleaseImage( ETrue );
DeleteAndExitL();
}
else // closeVal == EMsgCloseSave
{
// Message has data
if ( Document()->Modified() || Document()->PrevSaveType() < EClosingSave )
{
if ( CanSaveMessageL() )
{
TInt resId = Document()->Saved() ? R_QTN_UNI_WAIT_SAVING_MESSAGE :
R_QTN_UNI_WAIT_SAVING_MESSAGE_NEW;
DoSaveL( EClosingSave );
iEditorFlags |= EEditorClosing;
ShowWaitNoteL( resId );
}
else
{
if ( ShowConfirmationQueryL( R_UNIEDITOR_QUEST_CLOSE_OOD ) )
{
// Exit without saving.
Exit( EAknSoftkeyClose );
}
//else nothing.
}
}
else
{
// No changes -> just go away.
Exit( EAknSoftkeyClose );
}
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::CanSaveMessageL
// Checks whether there's enough diskspace to save the
// message.
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::CanSaveMessageL() const
{
TInt bytes = Document()->AddressSize() + Document()->SubjectSize();
if ( Document()->DataModel()->SmilType() == EMmsSmil )
{
bytes += Document()->DataModel()->ObjectList().SpaceNeededForSaveAll();
bytes += Document()->DataModel()->AttachmentList().SpaceNeededForSaveAll();
bytes += iSmilModel->SmilComposeSize();
}
return !( MsvUiServiceUtilities::DiskSpaceBelowCriticalLevelL( Document()->Session(),
bytes ) );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoSaveL
// Saves message to OUTBOX.
// Message should be unlocked before coming here.
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoSaveL( TUniSaveType aSaveType )
{
if ( iSaveOperation &&
iSaveOperation->IsActive() )
{
// To avoid starting save operation when there is already one running.
return;
}
if ( !CanSaveMessageL() )
{
User::Leave( KErrDiskFull );
}
delete iSaveOperation;
iSaveOperation = NULL;
iSaveOperation = CUniEditorSaveOperation::NewL(
*this,
*Document(),
*iHeader,
*iView,
FsSession() );
iSaveOperation->Save( aSaveType );
ActivateInputBlockerL( iSaveOperation );
}
// ---------------------------------------------------------
// CUniEditorAppUi::VerifyAddressesL
//
// Walks thru addresses in addresscontrol and counts errors.
// If unverified address is valid, marks it validated (verified now).
// Stops to first error.
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::VerifyAddressesL( TBool& aModified )
{
if ( TUniMsvEntry::IsMmsUpload( Document()->Entry() ) )
{
// Don't check the recipient in "Upload" case.
return ETrue;
}
iCoeEnv->SyncNotifyFocusObserversOfChangeInFocus();
aModified = EFalse;
TBool retVal = iHeader->VerifyAddressesL( aModified, AcceptEmailAddresses() );
if ( aModified )
{
Document()->SetHeaderModified( ETrue );
CheckHeaderForMessageTypeL();
SetAddressSize();
MsgLengthToNavipaneL();
}
if ( !retVal )
{
//We'll get here if there's illegal addresses
//when selecting send from not-first slide
for (TInt i = CUniEditorHeader::EHeaderAddressTo;
i <= CUniEditorHeader::EHeaderAddressBcc; i++ )
{
TBool jumpOut( EFalse );
if ( iHeader->AddressControl( static_cast<CUniEditorHeader::THeaderFields>( i ) ) )
{
// Search first invalid address
CMsgRecipientArray* recipients = iHeader->AddressControl( static_cast<CUniEditorHeader::THeaderFields>( i ) )->GetRecipientsL();
TInt addrCnt = recipients->Count();
for ( TInt k = 0; k < addrCnt ; k++ )
{
CMsgRecipientItem* addrItem = recipients->At(k);
if ( addrItem
&& !addrItem->IsValidated() )
{
iNextFocus = iHeader->AddressControlId(
static_cast<CUniEditorHeader::THeaderFields>( i ) );
if ( Document()->CurrentSlide() )
{
DoUserChangeSlideL( 0 );
}
else
{
DoSetFocusL();
}
TInt ret = iHeader->AddressControl( static_cast<CUniEditorHeader::THeaderFields> (i ) )
->HighlightUnvalidatedStringL();
if ( !ret )
{
// highlight succeeded
jumpOut = ETrue;
break;
}
// else - highlight failed. Should not occur...
}
}
// else - recipient OK. Continue searching
if ( jumpOut )
{
break;
}
}
// else - address control does not exist
}
}
// else - addresses OK
return retVal;
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserMoveOrSelectPageL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserMoveOrSelectPageL( TBool aMovePage )
{
// Create listbox
CAknSingleGraphicPopupMenuStyleListBox* listBox = new (ELeave) CAknSingleGraphicPopupMenuStyleListBox;
CleanupStack::PushL( listBox );
// Create popup
CAknPopupList* popup = CAknPopupList::NewL( listBox,
R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT,
AknPopupLayouts::EMenuGraphicWindow );
CleanupStack::PushL( popup );
// Construct listbox
listBox->ConstructL( popup, CEikListBox::ELeftDownInViewRect );
listBox->CreateScrollBarFrameL( ETrue );
listBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,
CEikScrollBarFrame::EAuto );
if( iSmilModel->SlideCount() > 6 )
{
listBox->CreateScrollBarFrameL( ETrue );
listBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,
CEikScrollBarFrame::EAuto );
}
TInt oldSlide = Document()->CurrentSlide();
// Set title
HBufC* title = NULL;
if ( aMovePage )
{
title = StringLoader::LoadLC( R_UNI_MOVE_PAGE_TITLE, oldSlide+1, iCoeEnv );
}
else
{
title = StringLoader::LoadLC( R_UNI_SELECT_PAGE_TITLE, iCoeEnv );
}
popup->SetTitleL( title->Des() );
CleanupStack::PopAndDestroy( title );
CAknIconArray* iconArray = RadioButtonArrayL();
listBox->ItemDrawer()->FormattedCellData()->SetIconArray( iconArray ); // FormattedCellData owns
listBox->HandleItemAdditionL();
CDesCArrayFlat* array = new ( ELeave ) CDesCArrayFlat( 5 );
CleanupStack::PushL( array );
for ( TInt i = 0; i < iSmilModel->SlideCount(); i++ )
{
HBufC* buf = StringLoader::LoadLC( R_UNIEDITOR_MOVE_PAGE, i + 1, iCoeEnv );
TBuf<20> itemString;
if( oldSlide == i )
{ // This one is selected
itemString.AppendNum( 1 );
}
else
{
itemString.AppendNum( 0 );
}
itemString.Append( _L("\t") );
itemString.Append( buf->Des() );
array->AppendL( itemString );
CleanupStack::PopAndDestroy( buf );
buf = NULL;
}
CTextListBoxModel* model = listBox->Model();
model->SetItemTextArray( array );
model->SetOwnershipType( ELbmOwnsItemArray );
CleanupStack::Pop( array ); // model owns it now
listBox->SetCurrentItemIndexAndDraw( oldSlide );
TInt result = popup->ExecuteLD();
if ( result )
{
// OK, user chose a new page
TInt newSlide = listBox->CurrentItemIndex();
if( oldSlide != newSlide )
{
if ( aMovePage )
{
iSmilModel->MoveSlideL( Document()->CurrentSlide(), newSlide );
}
//Set current slide to invalid in order
//to prevent false events coming to wrong slides
Document()->SetCurrentSlide( -1 );
iView->SetScrollParts( iSmilModel->SlideCount() );
iView->SetCurrentPart( newSlide );
DoUserChangeSlideL( newSlide );
if ( aMovePage )
{
Document()->SetBodyModified( ETrue );
}
}
}
CleanupStack::Pop(); // for popup
CleanupStack::PopAndDestroy( listBox );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserObjectsViewL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserObjectsViewL( TBool aFocusAttachments )
{
CUniObjectsModel& objectsViewModel =
static_cast<CUniObjectsModel&>( Document()->AttachmentModel() );
CAknInputBlock::NewLC();
if ( Document()->DataModel()->SmilType() == EMmsSmil &&
Document()->BodyModified() )
{
delete iSaveOperation;
iSaveOperation = NULL;
iSaveOperation = CUniEditorSaveOperation::NewL(
*this,
*Document(),
*iHeader,
*iView,
FsSession() );
// Save current slide text object as content needs to be up-to-date when
// it is opened from object's view.
CUniObject* textObject = iSmilModel->GetObject( Document()->CurrentSlide(), EUniRegionText );
if ( textObject )
{
iSaveOperation->SaveL( *textObject );
BeginActiveWait( iSaveOperation );
}
}
CMsgBaseControl* imageBase = iView->ControlById( EMsgComponentIdImage );
if ( imageBase )
{
//Close image file (share flag conflict)
CMsgImageControl* imageControl =
static_cast<CMsgImageControl*>( imageBase );
//Closes image, no matter if animation or not
imageControl->Stop();
//No need to reopen image file
}
iOriginalSlide = Document()->CurrentSlide();
TUniObjectsDialogExitCmd dlgRet = EUniObjectsViewBack;
// Flag is also used to judge whether toolbar update is done
iEditorFlags |= EDoNotUpdateTitlePane;
CUniObjectsViewDialog::TUniObjectsDialogType dialogType;
if ( Document()->DataModel()->SmilType() == EMmsSmil )
{
dialogType = CUniObjectsViewDialog::EEditor;
}
else
{
dialogType = CUniObjectsViewDialog::EForward;
}
TInt focusedItemIndex = -1;
if ( aFocusAttachments )
{
TInt objectCount = Document()->DataModel()->ObjectList().Count();
if ( objectCount == 0 )
{
focusedItemIndex = 1;
}
else
{
focusedItemIndex = objectCount;
}
}
if ( iFixedToolbar )
{
SetFixedToolbarDimmed();
}
CleanupStack::PushL( TCleanupItem( UpdateFixedToolbar, this ) );
SetKeyEventFlags(0);
CleanupStack::PushL( TCleanupItem( DisableSendKey, this ) );
CUniObjectsViewDialog::ObjectsViewL(
dialogType,
objectsViewModel,
iEikonEnv,
dlgRet,
*Document()->DataModel(),
focusedItemIndex );
CleanupStack::PopAndDestroy(2); //DisableSendKey,EnableFixedToolbar
iEditorFlags &= ~EDoNotUpdateTitlePane;
Document()->SetCurrentSlide( iOriginalSlide );
iOriginalSlide = -1;
// Check if msg type was changed
CheckBodyForMessageTypeL();
// Update navipane here instead of AddObjectL callback otherwise it
// gets drawn while in objectsview
UpdateIndicatorIconsL();
CheckLockedSmsWithAttaL();
CleanupStack::PopAndDestroy(); // CAknInputBlock
objectsViewModel.Reset();
MsgLengthToNavipaneL( ETrue );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserAddRecipientL
// Fetch an address from phonebook
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserAddRecipientL()
{
TBool invalid = EFalse;
// We remove this flag so that it can be shown after the adding operation
iEditorFlags &= ~EMaxRecipientShown;
if(iEditorFlags & EMsgEditInProgress)
{
return;
}
if ( iFixedToolbar )
{
SetFixedToolbarDimmed();
}
iEditorFlags |= (EMsgEditInProgress);
CleanupStack::PushL( TCleanupItem( UpdateFixedToolbar, this ) );
SetKeyEventFlags(0);
CleanupStack::PushL( TCleanupItem( DisableSendKey, this ) );
// add to current control or To control
TBool addressesAdded(EFalse);
TRAP_IGNORE( addressesAdded = iHeader->AddRecipientL( iView->FocusedControl(),
iView,
AcceptEmailAddresses(),
invalid ));
CleanupStack::PopAndDestroy(2);//DisableSendKey,UpdateFixedToolbar
iEditorFlags &= ~EMsgEditInProgress;
TInt focused = iHeader->FocusedAddressField( iView->FocusedControl() );
if ( addressesAdded )
{
Document()->SetHeaderModified( ETrue );
if ( Document()->CurrentSlide() )
{
// Addresses were (tried to be) added
// -> Change to first slide
iNextFocus = EMsgComponentIdTo;
DoUserChangeSlideL( 0 );
}
SetAddressSize();
MsgLengthToNavipaneL();
if ( focused == KErrNotFound ||
iEditorFlags & ELockedSmsWithAtta )
{
if ( focused != CUniBaseHeader::EHeaderAddressTo )
{
// Focus was not in address control -> Move it
iView->SetFocus( EMsgComponentIdTo );
}
// Set bodytext cursor location to start of the text
CMsgBodyControl* bodyCtrl = BodyCtrl();
if ( bodyCtrl )
{
bodyCtrl->SetCursorPosL( 0 );
}
focused = CUniBaseHeader::EHeaderAddressTo;
}
else
{
// Increase by one so it will be in the next field
switch( focused+1 )
{
case CUniBaseHeader::EHeaderAddressCc:
{
if( iHeader->AddressControl( CUniBaseHeader::EHeaderAddressCc ) )
{
iView->SetFocus( EMsgComponentIdCc );
break;
}
} // otherwise fall through
case CUniBaseHeader::EHeaderAddressBcc:
{
if( iHeader->AddressControl( CUniBaseHeader::EHeaderAddressBcc ) )
{
iView->SetFocus( EMsgComponentIdBcc );
break;
}
} // otherwise fall through
case CUniBaseHeader::EHeaderSubject:
{
if( iHeader->SubjectControl() )
{
iView->SetFocus( EMsgComponentIdSubject );
break;
}
} // otherwise fall through
default:
{
if ( Document()->DataModel()->SmilType() == EMmsSmil )
{
iView->SetFocus( EMsgComponentIdBody );
// Set bodytext cursor location to end of the text
CMsgBodyControl* bodyCtrl = BodyCtrl();
if ( bodyCtrl )
{
bodyCtrl->SetCursorPosL( bodyCtrl->Editor().TextLength() );
}
}
else
{
iView->SetFocus( EMsgComponentIdImage );
}
}
}
}
}
// Check max recipients anyway
CheckHeaderForMessageTypeL();
MsgLengthToNavipaneL();
CheckMaxRecipientsAndShowNoteL();
if( iEditorFlags & EMaxRecipientShown && addressesAdded )
{ // A note was shown so return the focus back to the original location
TInt returnFocusTo = EMsgComponentIdTo;
if( focused == CUniBaseHeader::EHeaderAddressCc )
{
returnFocusTo = EMsgComponentIdCc;
}
else if( focused == CUniBaseHeader::EHeaderAddressBcc )
{
returnFocusTo = EMsgComponentIdBcc;
}
iView->SetFocus( returnFocusTo );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserMessageInfoL
//
// Invokes message info from UI MTM.
// Message must be unlocked before coming here.
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserMessageInfoL()
{
CUniEditorDocument* doc = Document();
CUniMtmUi& uiMtm = doc->MtmUiL();
CAknInputBlock::NewLC();
iHeader->CopyHeadersToMtmL( doc->HeaderModified(),
ETrue );
// Lets put the current message type into TMsvEntry
TMsvEntry tEntry = doc->Entry();
TUniMessageCurrentType curType = EUniMessageCurrentTypeSms;
if( doc->UniState() == EUniMms )
{
curType = EUniMessageCurrentTypeMms;
CUniEditorPlugin* mmsPlugin = doc->MmsPlugin();
if ( mmsPlugin )
{
TUniSendingSettings settings;
mmsPlugin->GetSendingSettingsL( settings );
switch ( settings.iPriority )
{
case TUniSendingSettings::EUniPriorityHigh:
{
tEntry.SetPriority( EMsvHighPriority );
break;
}
case TUniSendingSettings::EUniPriorityLow:
{
tEntry.SetPriority( EMsvLowPriority );
break;
}
default:
{
tEntry.SetPriority( EMsvMediumPriority );
break;
}
}
}
}
TUniMsvEntry::SetCurrentMessageType( tEntry, curType );
doc->CurrentEntry().ChangeL( tEntry );
if ( !iMtm->Entry().HasStoreL() )
{
iMtm->SaveMessageL();
}
// Pack message size
TInt sizeInKilos = ( MessageSizeInBytes() + KBytesInKilo - 1 ) / KBytesInKilo;
TPckgBuf<TInt> param( sizeInKilos );
//These are not used! They just have to be there
CMsvEntrySelection* selection = new ( ELeave ) CMsvEntrySelection;
CleanupStack::PushL( selection );
CMsvSingleOpWatcher* watch = CMsvSingleOpWatcher::NewLC( *Document() );
CMsvOperation* op = uiMtm.InvokeAsyncFunctionL(
KMtmUiFunctionMessageInfo,
*selection,
watch->iStatus,
param );
CleanupStack::Pop(); // watch
Document()->AddSingleOperationL( op, watch );
CleanupStack::PopAndDestroy( 2 ); // selection, CAknInputBlock
MsgLengthToNavipaneL();
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserSendingOptionsL
//
// Invokes Sending Options from UI MTM.
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserSendingOptionsL()
{
TInt flags = 0;
TUniSendingSettings settings;
CUniEditorPlugin* plugin = SmsPlugin();
TBool currentlyLockedToSms = EFalse;
if( plugin )
{
// This should be available as if it's not -> sending options not available
plugin->GetSendingSettingsL( settings );
}
//TUniSendingSettings::TUniMessageType origMessageType = settings.iMessageType;
if( iMtm->MessageTypeLocking() == EUniMessageTypeLocked )
{
// Pre-locked to SMS (We never get here in permanent MMS)
flags |= EUniSettingsPermanentSms;
currentlyLockedToSms = ETrue;
}
else if( iMtm->MessageTypeSetting() == EUniMessageTypeSettingSms &&
settings.iMessageType != TUniSendingSettings::EUniMessageTypeAutomatic &&
settings.iMessageType != TUniSendingSettings::EUniMessageTypeMultimedia )
{
// msg type is temporarily locked to sms
currentlyLockedToSms = ETrue;
}
else
{
if( iMtm->MessageTypeSetting() == EUniMessageTypeSettingMms )
{
settings.iMessageType = TUniSendingSettings::EUniMessageTypeMultimedia;
}
else if( iMtm->MessageTypeSetting() == EUniMessageTypeSettingAutomatic )
{
settings.iMessageType = TUniSendingSettings::EUniMessageTypeAutomatic;
}
}
CUniEditorDocument* doc = Document();
if ( !( IsBodySmsCompatibleL( EFalse ) && iHeader->IsHeaderSmsL() ) )
{
flags |= EUniSettingsContentNeedsMms;
}
TUniSendingSettings::TUniCharSupport origCharSet = TUniSendingSettings::EUniCharSupportReduced;
settings.iCharSupport = TUniSendingSettings::EUniCharSupportReduced;
if ( doc->CharSetSupport() == EUniMessageCharSetFullLocked ||
doc->CharSetSupport() == EUniMessageCharSetReducedLocked )
{
flags |= EUniSettingsHideCharSet;
}
else if( doc->CharSetSupport() == EUniMessageCharSetFull )
{
settings.iCharSupport = TUniSendingSettings::EUniCharSupportFull;
origCharSet = TUniSendingSettings::EUniCharSupportFull;
}
if( !( doc->CSPBits() & RMobilePhone::KCspProtocolID ) )
{
flags |= EUniSettingsCSPBitsOn;
}
if ( iEditorFlags & EHideMessageTypeOption )
{
flags |= EUniSettingsHideMessageTypeOption;
}
TUniState oldState = doc->UniState();
CUniSendingSettingsDialog::TUniExitCode exitCode = CUniSendingSettingsDialog::EUniBack;
CUniSendingSettingsDialog* dlg = new ( ELeave ) CUniSendingSettingsDialog( flags, settings, exitCode, *iTitlePane );
CleanupStack::PushL( dlg );
dlg->ConstructL( R_UNI_SENDINGSETTINGS_DIALOG_MENUBAR );
// Flag is also used to judge whether toolbar update is done
iEditorFlags |= EDoNotUpdateTitlePane;
CleanupStack::Pop( dlg );
if ( iFixedToolbar )
{
SetFixedToolbarDimmed();
}
CleanupStack::PushL( TCleanupItem( UpdateFixedToolbar, this ) );
SetKeyEventFlags(0);
CleanupStack::PushL( TCleanupItem( DisableSendKey, this ) );
dlg->ExecuteLD( R_UNI_SENDINGSETTINGS_DIALOG );
CleanupStack::PopAndDestroy(2); //DisableSendKey,UpdateFixedToolbar
iEditorFlags &= ~EDoNotUpdateTitlePane;
// Now store the changed settings into sms plugin if it exists
// (there's no need to save them in mms plugin as user cannot change anything there)
if( plugin )
{
plugin->SetSendingSettingsL( settings );
}
TBool unhideConfigurableFields = EFalse;
if ( !( flags & EUniSettingsHideCharSet ) )
{
// Ok, it was possible to change the charset in the first place
if ( settings.iCharSupport != origCharSet )
{
// CharSet has changed -> create new converter
TUniMessageCharSetSupport charSetSupport = EUniMessageCharSetFull;
if ( settings.iCharSupport == TUniSendingSettings::EUniCharSupportReduced )
{
charSetSupport = EUniMessageCharSetReduced;
}
doc->CreateCharConverterL( charSetSupport );
if( iNLTFeatureSupport )
{
iSettingsChanged = ETrue;
//Turkish SMS-PREQ2265 specific
if(plugin)
{
//Update the new charset support selected by user.
//Reset uniCode mode flag to EFalse(Restarts encoding algorithm in smsPlugin for optimal length calculation)
plugin->SetEncodingSettings(EFalse, doc->AlternativeEncodingType(), charSetSupport);
}
}
}
}
// Now lets see the msg type changes
if( iMtm->MessageTypeLocking() == EUniMessageTypeLocked )
{
// First lets handle pre locked sms
// no operation here because the msg type does not change
// but just the bit in the message settings
}
else if( settings.iMessageType == TUniSendingSettings::EUniMessageTypeAutomatic )
{
// Message type is now automatic
iMtm->SetMessageTypeSetting( EUniMessageTypeSettingAutomatic );
if ( IsBodySmsCompatibleL() )
{
doc->SetBodyUniState( EUniSms );
}
else
{
doc->SetBodyUniState( EUniMms );
}
if ( iHeader->IsHeaderSmsL() )
{
doc->SetHeaderUniState( EUniSms );
}
else
{
doc->SetHeaderUniState( EUniMms );
}
if ( currentlyLockedToSms )
{
// Show the fields again
unhideConfigurableFields = ETrue;
}
}
else if ( settings.iMessageType == TUniSendingSettings::EUniMessageTypeMultimedia )
{
iMtm->SetMessageTypeSetting( EUniMessageTypeSettingMms );
if ( IsBodySmsCompatibleL() )
{
doc->SetBodyUniState( EUniSms );
}
else
{
doc->SetBodyUniState( EUniMms );
}
if ( currentlyLockedToSms )
{
// Show the fields again
unhideConfigurableFields = ETrue;
}
}
else
{
// Settings is one of the sms conversions (none, fax, pager)
if ( iMtm->MessageTypeSetting() != EUniMessageTypeSettingSms )
{
iMtm->SetMessageTypeSetting( EUniMessageTypeSettingSms );
// Also remove those additional headers that need to be removed
TInt removeHeaders( 0 );
if ( iHeader->AddressControl( CUniBaseHeader::EHeaderAddressCc ) )
{
removeHeaders |= EUniFeatureCc;
}
if ( iHeader->AddressControl( CUniBaseHeader::EHeaderAddressBcc ) )
{
removeHeaders |= EUniFeatureBcc;
}
if ( !(iEditorFlags & ESubjectOkInSms ) && iHeader->SubjectControl() )
{
removeHeaders |= EUniFeatureSubject;
}
iHeader->AddHeadersDeleteL( removeHeaders, EFalse );
}
// We can change this here because if it was not then SMS/Fax/Pager would not have been available in options
// This is needed here in case SMS soft and hard limits are different so we have to "hardcode" the type to SMS
doc->SetBodyUniState( EUniSms );
doc->SetHeaderUniState( EUniSms );
}
if ( unhideConfigurableFields )
{
// Read the current situation
TInt addHeaders = iHeader->AddHeadersConfigL();
// Add them to header
iHeader->AddHeadersAddL( addHeaders );
}
if ( oldState != doc->UniState() )
{
// If the state is not the same anymore, show popup
UpdateIndicatorIconsL();
ShowPopupNoteL( doc->UniState() == EUniMms ? ETrue : EFalse );
}
CheckLockedSmsWithAttaL();
UpdateToolbarL();
SetTitleL();
MsgLengthToNavipaneL();
// Removes or sets the max size according to the settings
SetOrRemoveMaxSizeInEdwin();
if ( exitCode != CUniSendingSettingsDialog::EUniBack )
{
CAknAppUi::ProcessCommandL( EAknCmdExit );
return;
}
UpdateMiddleSoftkeyL();
UpdateIndicatorIconsL();
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserInsertMediaL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserInsertMediaL()
{
RArray<TInt> disabledItems;
CleanupClosePushL( disabledItems );
if ( !( iSupportedFeatures & EUniFeatureCamcorder ) )
{
disabledItems.Append( EUniCmdInsertMediaNewVideo );
disabledItems.Append( EUniCmdInsertMediaNewImage );
}
TInt selectedIndex( 0 );
CAknListQueryDialog* dlg = new ( ELeave ) CAknListQueryDialog( &selectedIndex );
dlg->PrepareLC( R_UNIEDITOR_INSERT_QUERY );
CEikFormattedCellListBox* listbox = dlg->ListControl()->Listbox();
CDesCArray* itemArray = static_cast<CDesCArray*>( listbox->Model()->ItemTextArray() );
if ( disabledItems.Count() > 0 )
{
for ( TInt currentItem = 0; currentItem < disabledItems.Count(); currentItem++ )
{
itemArray->Delete( disabledItems[ currentItem ] );
listbox->HandleItemRemovalL();
}
}
if ( dlg->RunLD() )
{
for ( TInt currentItem = disabledItems.Count() - 1; currentItem >= 0 ; currentItem-- )
{
if ( selectedIndex >= disabledItems[ currentItem ] )
{
selectedIndex++;
}
}
switch ( selectedIndex )
{
case EUniCmdInsertMediaImage:
{
DoUserInsertImageL( MsgAttachmentUtils::EImage );
break;
}
case EUniCmdInsertMediaNewImage:
{
DoUserInsertImageL( MsgAttachmentUtils::ENewImage );
break;
}
case EUniCmdInsertMediaVideo:
{
DoUserInsertVideoL( MsgAttachmentUtils::EVideo );
break;
}
case EUniCmdInsertMediaNewVideo:
{
DoUserInsertVideoL( MsgAttachmentUtils::ENewVideo );
break;
}
case EUniCmdInsertMediaAudio:
{
DoUserInsertAudioL( MsgAttachmentUtils::EAudio );
break;
}
case EUniCmdInsertMediaNewAudio:
{
DoUserInsertAudioL( MsgAttachmentUtils::ENewAudio );
break;
}
case EUniCmdInsertMediavCard:
{
DoUserInsertVCardL();
break;
}
case EUniCmdInsertMediaSlide:
{
DoUserInsertSlideL();
break;
}
case EUniCmdInsertMediaNote:
{
DoUserInsertTextL( EMemoText );
break;
}
case EUniCmdInsertMediaTextAtta:
{
DoUserInsertOtherFileL( ETextFile );
break;
}
case EUniCmdInsertMediaTemplate:
{
DoUserInsertTextL( ETemplateText );
break;
}
// case EUniCmdInsertMediaSVG:
// {
// DoUserInsertSvgL();
// break;
// }
case EUniCmdInsertMediaOtherFile:
{
DoUserInsertOtherFileL( EOtherFile );
break;
}
default:
{
__ASSERT_DEBUG( EFalse, Panic( EUniUnsupportedCommand ) );
break;
}
}
}
CleanupStack::PopAndDestroy( &disabledItems );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoStartInsertL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoStartInsertL( TBool aAddSlide, TBool aAddAsAttachment )
{
if ( aAddSlide &&
iSmilModel->MaxSlideCountReached() )
{
ShowConfirmableInfoL( R_UNIEDITOR_INFO_MAX_SLIDES_ALL );
iEditorFlags &= ~EMsgEditInProgress;
}
else
{
if ( !iInsertOperation )
{
iInsertOperation = CUniEditorInsertOperation::NewL(
*this,
*Document(),
*iHeader,
*iSlideLoader,
*iView,
FsSession() );
}
if ( aAddSlide )
{
iEditorFlags |= EInsertAddsSlide;
}
else
{
iEditorFlags &= ~EInsertAddsSlide;
}
ShowWaitNoteL( R_QTN_UNI_WAIT_INSERTING );
iInsertOperation->Insert(
iInsertingMedia,
aAddSlide,
aAddAsAttachment );
ActivateInputBlockerL( iInsertOperation );
iInsertingMedia = NULL;
}
// Enable the toolbar since inputblockers will take care now
if( iFixedToolbar )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, EFalse, ETrue );
}
}
// ---------------------------------------------------------
// CreateMediaInfoForInsertL
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::CreateMediaInfoForInsertL( TMsgMediaType aMediaType,
const TDesC& aFileName )
{
RFile file = Document()->DataModel()->MediaResolver().FileHandleL( aFileName );
CleanupClosePushL( file );
delete iInsertingMedia;
iInsertingMedia = NULL;
iInsertingMedia = Document()->DataModel()->MediaResolver().CreateMediaInfoL( file );
Document()->DataModel()->MediaResolver().ParseInfoDetailsL( iInsertingMedia, file );
TMmsConformance conformance =
Document()->DataModel()->MmsConformance().MediaConformance( *iInsertingMedia );
CleanupStack::PopAndDestroy( &file );
TInt errResId = KUniInvalidResourceId;
TInt confStatus = conformance.iConfStatus;
// Supported type check
if ( confStatus & EMmsConfNokNotSupported ||
( Document()->CreationMode() == EMmsCreationModeRestricted &&
confStatus & EMmsConfNokFreeModeOnly ) )
{
errResId = R_UNIEDITOR_INFO_UNSUPPORTED_OBJECT;
if( Document()->CreationModeUserChangeable() &&
!Document()->CreationMode() )
{
errResId = R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECT;
}
}
else if ( confStatus & EMmsConfNokDRM )
{
// DRM check
errResId = R_UNIEDITOR_INFO_SEND_FORBID_1;
}
else if ( aMediaType != EMsgMediaUnknown &&
iInsertingMedia->MediaType() != aMediaType )
{
// Keep this after DRM check!
errResId = R_UNIEDITOR_INFO_UNSUPPORTED_OBJECT;
if( Document()->CreationModeUserChangeable() &&
!Document()->CreationMode() )
{
errResId = R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECT;
}
}
else if ( !conformance.iCanAdapt &&
( confStatus & EMmsConfNokTooBig ||
TUint( MessageSizeInBytes() + iInsertingMedia->FileSize() )
> Document()->MaxMessageSize() ) )
{
// File is too big and it cannot be adapted (e.g. scaled down)
errResId = R_UNIEDITOR_INFO_OBJECT_TOO_BIG;
}
if ( errResId != KUniInvalidResourceId )
{
delete iInsertingMedia;
iInsertingMedia = NULL;
ShowInformationNoteL( errResId, EFalse );
return EFalse;
}
if ( MsvUiServiceUtilities::DiskSpaceBelowCriticalLevelL( Document()->Session(),
iInsertingMedia->FileSize() ) )
{
delete iInsertingMedia;
iInsertingMedia = NULL;
ShowConfirmableInfoL( R_UNIEDITOR_NOT_ENOUGH_MEMORY );
return EFalse;
}
return ETrue;
}
// ---------------------------------------------------------
// CUniEditorAppUi::SuperDistributionCheckForInsertL
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::SuperDistributionCheckForInsertL()
{
// SuperDistribution check & query
if ( iSupportedFeatures & EUniFeatureDrmFull &&
iInsertingMedia->Protection() & EFileProtSuperDistributable )
{
if ( !ShowConfirmationQueryL( R_UNIEDITOR_QUEST_SEND_WO_RIGHTS ) )
{
delete iInsertingMedia;
iInsertingMedia = NULL;
return EFalse;
}
}
return ETrue;
}
// ---------------------------------------------------------
// CUniEditorAppUi::CheckMediaInfoForInsertL
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::CheckMediaInfoForInsertL()
{
__ASSERT_DEBUG( iInsertingMedia, Panic( EUniNullPointer ) );
TMmsConformance conformance =
Document()->DataModel()->MmsConformance().MediaConformance( *iInsertingMedia );
TInt errResId = KUniInvalidResourceId;
TInt confStatus = conformance.iConfStatus;
// In "free" mode user can insert images that are larger by dimensions than allowed by conformance
if ( Document()->CreationMode() != EMmsCreationModeRestricted )
{
//Mask "Corrupted" away in free & guided mode.
confStatus &= ~EMmsConfNokCorrupt;
// If user answers yes to Guided mode confirmation query he/she moves to free mode
if ( ( confStatus & ( EMmsConfNokFreeModeOnly | EMmsConfNokScalingNeeded ) ) &&
!( confStatus & ~( EMmsConfNokFreeModeOnly | EMmsConfNokScalingNeeded ) ) )
{
if ( iInsertingMedia->Protection() & EFileProtSuperDistributable )
{
// SuperDistribution not checked here
// Mask "FreeModeOnly" and "ScalingNeeded" away in free mode
confStatus &= ~EMmsConfNokFreeModeOnly;
confStatus &= ~EMmsConfNokScalingNeeded;
}
else if ( ShowGuidedModeConfirmationQueryL( R_UNIEDITOR_QUEST_GUIDED_OBJ ) )
{
// Guided query accepted.
// Mask "FreeModeOnly" and "ScalingNeeded" away in free mode
confStatus &= ~EMmsConfNokFreeModeOnly;
confStatus &= ~EMmsConfNokScalingNeeded;
}
else
{
// Guided query not accepted. Stop insertion.
delete iInsertingMedia;
iInsertingMedia = NULL;
return EFalse;
}
}
}
if ( confStatus & EMmsConfNokTooBig ||
TUint( MessageSizeInBytes() + iInsertingMedia->FileSize() )
> Document()->MaxMessageSize() )
{
// Size check
errResId = R_UNIEDITOR_INFO_OBJECT_TOO_BIG;
}
else if ( confStatus != EMmsConfOk )
{
// Sanity check
errResId = R_UNIEDITOR_INFO_UNSUPPORTED_OBJECT;
if( Document()->CreationModeUserChangeable() &&
!Document()->CreationMode() )
{
errResId = R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECT;
}
}
if ( errResId != KUniInvalidResourceId )
{
delete iInsertingMedia;
iInsertingMedia = NULL;
ShowInformationNoteL( errResId, EFalse );
return EFalse;
}
return ETrue;
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserInsertSlideL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserInsertSlideL()
{
__ASSERT_DEBUG( Document()->DataModel()->SmilType() == EMmsSmil, Panic( EUniIllegalSmilType ) );
if ( TUint( MessageSizeInBytes() + KEmptySlideSize ) > Document()->MaxMessageSize() )
{
ShowConfirmableInfoL( R_UNIEDITOR_INFO_OBJECT_TOO_BIG );
}
else if ( iSmilModel->MaxSlideCountReached() )
{
ShowConfirmableInfoL( R_UNIEDITOR_INFO_MAX_SLIDES_ALL );
}
else
{
TInt index = Document()->CurrentSlide() + 1;
iSmilModel->AddSlideL( index );
Document()->SetBodyModified( ETrue );
DoUserChangeSlideL( index );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserRemoveSlideL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserRemoveSlideL()
{
__ASSERT_DEBUG( Document()->DataModel()->SmilType() == EMmsSmil, Panic( EUniIllegalSmilType ) );
if ( ShowConfirmationQueryL( R_UNIEDITOR_QUEST_REMOVE_PAGE ) )
{
DoRemoveSlideL();
}
Document()->SetBodyModified( ETrue );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoRemoveSlideL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoRemoveSlideL()
{
TInt currSlide = Document()->CurrentSlide();
TMsgControlId focusedControl( EMsgComponentIdNull );
if( Document()->DataModel()->SmilType() == EMmsSmil &&
( currSlide == 0 || currSlide == 1 ) )
{
if ( Document()->DataModel()->SmilType() == EMmsSmil )
{
CMsgAddressControl* to = iHeader->AddressControl( CUniEditorHeader::EHeaderAddressTo );
CMsgAddressControl* cc = iHeader->AddressControl( CUniEditorHeader::EHeaderAddressCc );
CMsgAddressControl* bcc = iHeader->AddressControl( CUniEditorHeader::EHeaderAddressBcc );
if( to && to->GetRecipientsL()->Count() == 0 )
{
focusedControl = EMsgComponentIdTo;
}
else if( cc && cc->GetRecipientsL()->Count() == 0 )
{
focusedControl = EMsgComponentIdCc;
}
else if( bcc && bcc->GetRecipientsL()->Count() == 0 )
{
focusedControl = EMsgComponentIdBcc;
}
else if( iSupportedFeatures & EUniFeatureSubject &&
SubjectCtrl() &&
SubjectCtrl()->TextContent().DocumentLength() == 0 )
{
focusedControl = EMsgComponentIdSubject;
}
}
}
TInt objCount = iSmilModel->SlideObjectCount( currSlide );
ReleaseImage( ETrue );
for ( TInt i = 0; i < objCount; i++ )
{
iSmilModel->RemoveObjectByIndexL( currSlide, 0 );
}
iSmilModel->RemoveSlide( currSlide );
TInt nextSlide = currSlide;
if ( nextSlide )
{
nextSlide--;
}
//Set current slide to invalid in order
//to prevent false events coming to wrong slides
Document()->SetCurrentSlide( -1 );
iView->SetScrollParts( iSmilModel->SlideCount() );
iView->SetCurrentPart( nextSlide );
iNextFocus = focusedControl;
DoUserChangeSlideL( nextSlide );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserChangeSlideL
//
// If change is made from first slide containing address fields into
// some other slide and address control is currently focused set
// the current input mode into all address fields. This enables
// correct input mode to be used if focus is set to different
// address field when returning to first slide and also if
// message is closed from different slide.
// After input mode is set operation is created if necessary and
// activated.
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserChangeSlideL( TInt aSlideNum )
{
__ASSERT_DEBUG( Document()->DataModel()->SmilType() == EMmsSmil, Panic( EUniIllegalSmilType ) );
CMsgBaseControl* ctrl = iView->FocusedControl(); // ctrl can be NULL.
if ( ctrl &&
Document()->CurrentSlide() == 0 &&
iHeader->IsAddressControl( ctrl->ControlId() ) )
{
SetInputModeToAddressFields( static_cast<CMsgAddressControl*>( ctrl )->Editor().AknEditorCurrentInputMode() );
}
if ( !iChangeSlideOperation )
{
iChangeSlideOperation = CUniEditorChangeSlideOperation::NewL(
*this,
*Document(),
*iHeader,
*iSlideLoader,
*iView,
FsSession() );
}
iChangeSlideOperation->ChangeSlide( aSlideNum );
iNextSlide = aSlideNum;
iScreenClearer = CAknLocalScreenClearer::NewLC( EFalse );
CleanupStack::Pop();
iScreenClearer->SetExtent( iScreenClearer->Position(), ClientRect().Size() );
ShowWaitNoteL( R_QTN_UNI_WAIT_SLIDE_CHANGE );
ActivateInputBlockerL( iChangeSlideOperation );
BeginActiveWait( iChangeSlideOperation );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoSetFocusL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoSetFocusL()
{
// 1. to To: control, if empty and exists
// 2. if not empty, to Subject: control, if empty and exists
// 3. otherwise to body
TMsgControlId focusedControl( EMsgComponentIdTo );
if ( iNextFocus != EMsgComponentIdNull )
{
// iNextFocus is set when changing slide
focusedControl = iNextFocus;
iNextFocus = EMsgComponentIdNull;
}
else
{
// To first empty field. Cc and Bcc are not supported here
CMsgAddressControl* to = ToCtrl();
if ( Document()->DataModel()->SmilType() == EMmsSmil &&
( !to ||
to->GetRecipientsL()->Count() > 0 ) )
{
// No To-control or there are recipients
// -> focus to end of bodytext or to Subject field if empty
focusedControl = EMsgComponentIdBody;
if ( iSupportedFeatures & EUniFeatureSubject )
{
CMsgExpandableControl* subj = SubjectCtrl();
if ( subj &&
subj->TextContent().DocumentLength() == 0 )
{
focusedControl = EMsgComponentIdSubject;
}
}
if ( !BodyCtrl() )
{
focusedControl = EMsgComponentIdTo;
}
if ( focusedControl == EMsgComponentIdBody )
{
BodyCtrl()->SetCursorPosL( BodyCtrlEditor()->TextLength() );
}
}
}
iView->SetFocus( focusedControl );
}
// ---------------------------------------------------------
// CUniEditorAppUi::SetTitleL
// ---------------------------------------------------------
//
void CUniEditorAppUi::SetTitleL()
{
// If titlepane exists -> set the right title
HBufC* titleString = Document()->UniState() == EUniMms ? iTitleMms :
iTitleSms;
iTitlePane->SetTextL( titleString->Des(), ETrue );
CGulIcon* image = Document()->UniState() == EUniMms? iIconMms :
iIconSms;
// Create duplicates of the icon to be used
CFbsBitmap* bitmap = new( ELeave ) CFbsBitmap();
CleanupStack::PushL( bitmap );
CFbsBitmap* bitmapMask = new( ELeave ) CFbsBitmap();
CleanupStack::PushL( bitmapMask );
User::LeaveIfError( bitmap->Duplicate( image->Bitmap()->Handle() ) );
User::LeaveIfError( bitmapMask->Duplicate( image->Mask()->Handle() ) );
iTitlePane->SetSmallPicture( bitmap, bitmapMask, ETrue );
if(!iFinalizeLaunchL)
iTitlePane->DrawNow();
CleanupStack::Pop( 2, bitmap );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserInsertImageL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserInsertImageL( MsgAttachmentUtils::TMsgAttachmentFetchType aFetchType )
{
__ASSERT_DEBUG( Document()->DataModel()->SmilType() == EMmsSmil, Panic( EUniIllegalSmilType ) );
if( iFixedToolbar )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, ETrue, EFalse );
}
iInsertingType = EMsgMediaImage;
TBool fetchFile( ETrue );
TBool enabletoolbarext = ETrue;
while ( fetchFile )
{
fetchFile = EFalse;
iEditorFlags |= EMsgEditInProgress;
TBool stat= EFalse;
TRAPD(Err,stat = FetchFileL( aFetchType ));
if (Err == KErrNone && stat)
{
if ( SuperDistributionCheckForInsertL() )
{
// CheckMediaInfoForInsertL() done in CUniEditorInsertOperation
TBool addSlide = EFalse;
if ( ObjectsAvailable() &
( EUniImageFlag | EUniVideoFlag | EUniSvgFlag ) )
{
addSlide = ETrue;
}
DoStartInsertL( addSlide, EFalse );
enabletoolbarext = EFalse;
}
else
{
fetchFile = ETrue;
}
}
else if(Err == KLeaveExit)
{
User::Leave( Err );
}
else
{
iEditorFlags &= ~EMsgEditInProgress;
}
}
if(enabletoolbarext)
{
//Enable the insert toolbar
if( iFixedToolbar )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, EFalse, ETrue );
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserInsertVideoL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserInsertVideoL( MsgAttachmentUtils::TMsgAttachmentFetchType aFetchType )
{
__ASSERT_DEBUG( Document()->DataModel()->SmilType() == EMmsSmil, Panic( EUniIllegalSmilType ) );
if( iFixedToolbar )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, ETrue, EFalse );
}
iInsertingType = EMsgMediaVideo;
TBool fetchFile( ETrue );
TBool enabletoolbarext = ETrue;
while ( fetchFile )
{
fetchFile = EFalse;
iEditorFlags |= EMsgEditInProgress;
TBool stat= EFalse;
TRAPD(Err,stat = FetchFileL( aFetchType ));
if (Err == KErrNone && stat)
{
if ( SuperDistributionCheckForInsertL() )
{
if ( CheckMediaInfoForInsertL() )
{
TBool addSlide = EFalse;
if ( ObjectsAvailable() &
( EUniAudioFlag | EUniImageFlag | EUniVideoFlag | EUniSvgFlag ) )
{
addSlide = ETrue;
}
DoStartInsertL( addSlide, EFalse );
enabletoolbarext = EFalse;
}
else
{
iEditorFlags &= ~EMsgEditInProgress;
}
}
else
{
fetchFile = ETrue;
}
}
else if(Err == KLeaveExit)
{
User::Leave( Err );
}
else
{
iEditorFlags &= ~EMsgEditInProgress;
}
}
if(enabletoolbarext)
{
//Enable the insert toolbar
if( iFixedToolbar )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, EFalse, ETrue );
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserInsertAudioL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserInsertAudioL( MsgAttachmentUtils::TMsgAttachmentFetchType aFetchType )
{
__ASSERT_DEBUG( Document()->DataModel()->SmilType() == EMmsSmil, Panic( EUniIllegalSmilType ) );
if( iFixedToolbar )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, ETrue, EFalse );
}
iInsertingType = EMsgMediaAudio;
TBool fetchFile( ETrue );
TBool enabletoolbarext = ETrue;
while ( fetchFile )
{
fetchFile = EFalse;
iEditorFlags |= EMsgEditInProgress;
TBool stat= EFalse;
TRAPD(Err,stat = FetchFileL( aFetchType ));
if (Err == KErrNone && stat)
{
if ( SuperDistributionCheckForInsertL() )
{
if ( CheckMediaInfoForInsertL() )
{
TBool addSlide = EFalse;
if ( ObjectsAvailable() &
( EUniAudioFlag | EUniVideoFlag | EUniSvgFlag ) )
{
addSlide = ETrue;
}
DoStartInsertL( addSlide, EFalse );
enabletoolbarext = EFalse ;
}
else
{
iEditorFlags &= ~EMsgEditInProgress;
}
}
else
{
fetchFile = ETrue;
}
}
else if(Err == KLeaveExit)
{
User::Leave( Err );
}
else
{
iEditorFlags &= ~EMsgEditInProgress;
}
}
if(enabletoolbarext)
{
//Enable the insert toolbar
if( iFixedToolbar )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, EFalse, ETrue );
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserInsertTextL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserInsertTextL( TUniEditorInsertTextType aType )
{
__ASSERT_DEBUG( Document()->DataModel()->SmilType() == EMmsSmil, Panic( EUniIllegalSmilType ) );
TInt err( KErrNone );
TInt errResId = KUniInvalidResourceId;
TInt sizeLimit( Document()->MaxMessageSize() - MessageSizeInBytes() );
if( iFixedToolbar )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, ETrue, EFalse );
}
if ( aType == ETemplateText )
{
InsertTemplateL();
}
else
{
err = InsertTextMemoL( sizeLimit );
}
if( iFixedToolbar )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, EFalse, EFalse );
}
if ( err == KErrOverflow)
{
errResId = R_UNIEDITOR_INFO_OBJECT_TOO_BIG;
ShowConfirmableInfoL( errResId );
}
else
{
UpdateSmilTextAttaL();
Document()->SetBodyModified( ETrue );
CheckBodyForMessageTypeL();
MsgLengthToNavipaneL();
CheckMaxSmsSizeAndShowNoteL();
SetOrRemoveMaxSizeInEdwin();
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserInsertOtherFileL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserInsertOtherFileL( TUniEditorInsertOtherType aType )
{
TBool addAttachment( EFalse );
if( iFixedToolbar )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, ETrue, EFalse );
}
TBool enabletoolbarext = ETrue;
if ( aType == ETextFile )
{
iInsertingType = EMsgMediaText;
TBool stat= EFalse;
TRAPD(Err,stat = FetchFileL( MsgAttachmentUtils::ENote ));
if (Err == KErrNone && stat)
{
addAttachment = ETrue;
}
}
else
{
TFileName* fileName = new( ELeave ) TFileName;
CleanupStack::PushL( fileName );
if ( MsgAttachmentUtils::FetchAnyFileL( *fileName, *iEikonEnv ) )
{
Document()->DataModel()->MediaResolver().SetCharacterSetRecognition( ETrue );
TRAPD( error, CreateMediaInfoForInsertL( EMsgMediaUnknown, *fileName ) );
Document()->DataModel()->MediaResolver().SetCharacterSetRecognition( EFalse );
User::LeaveIfError( error );
addAttachment = ETrue;
}
CleanupStack::PopAndDestroy( fileName );
}
if ( addAttachment && iInsertingMedia )
{
iInsertingType = iInsertingMedia->MediaType();
if ( SuperDistributionCheckForInsertL() )
{
// CheckMediaInfoForInsertL() for images done in CUniEditorInsertOperation
if ( iInsertingType == EMsgMediaImage
|| CheckMediaInfoForInsertL() )
{
TBool addSlide( EFalse );
TBool addAsAttachment( ETrue );
if ( iInsertingType != EMsgMediaText &&
iInsertingType != EMsgMediaXhtml &&
iSmilModel->IsSupportedMediaType( iInsertingType ) )
{
addAsAttachment = EFalse;
if ( ( ( iInsertingType == EMsgMediaImage ||
iInsertingType == EMsgMediaVideo ||
iInsertingType == EMsgMediaAnimation ||
iInsertingType == EMsgMediaSvg ) &&
( ObjectsAvailable() & ( EUniImageFlag | EUniVideoFlag | EUniSvgFlag ) ) )||
( iInsertingType == EMsgMediaAudio &&
( ObjectsAvailable() & ( EUniAudioFlag | EUniVideoFlag | EUniSvgFlag ) ) ) )
{
addSlide = ETrue;
}
}
DoStartInsertL( addSlide, addAsAttachment );
enabletoolbarext = EFalse ;
}
}
}
if(enabletoolbarext)
{
if( iFixedToolbar )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, EFalse, ETrue );
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserInsertVCardL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserInsertVCardL()
{
if ( !iVCardOperation )
{
iVCardOperation = CUniEditorVCardOperation::NewL( *this,
*Document(),
FsSession() );
}
if ( iFixedToolbar )
{
iFixedToolbar->HideItem( EUniCmdFixedToolbarSend, ETrue, ETrue );
iFixedToolbar->HideItem( EUniCmdFixedToolbarAddRecipient, ETrue, ETrue );
iFixedToolbar->HideItem( EUniCmdFixedToolbarInsert, ETrue, ETrue );
}
iEditorFlags |= EToolbarHidden;
iVCardOperation->Start();
ActivateInputBlockerL( iVCardOperation );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserInsertSvgL
// ---------------------------------------------------------
//
//void CUniEditorAppUi::DoUserInsertSvgL()
// {
// __ASSERT_DEBUG( Document()->DataModel()->SmilType() == EMmsSmil, Panic( EUniIllegalSmilType ) );
//
// if( iFixedToolbar )
// {
// iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, ETrue, EFalse );
// }
// iInsertingType = EMsgMediaSvg;
//
// TBool fetchFile( ETrue );
// TBool enabletoolbarext = ETrue;
// while ( fetchFile )
// {
// fetchFile = EFalse;
// TBool stat= EFalse;
// TRAPD(Err,stat = FetchFileL( MsgAttachmentUtils::ESVG ));
// if (Err == KErrNone && stat)
// {
// if ( SuperDistributionCheckForInsertL() )
// {
// if ( CheckMediaInfoForInsertL() )
// {
// TBool addSlide = EFalse;
// if ( ObjectsAvailable() &
// ( EUniAudioFlag | EUniVideoFlag | EUniImageFlag | EUniSvgFlag ) )
// {
// addSlide = ETrue;
// }
//
// DoStartInsertL( addSlide, EFalse );
// enabletoolbarext = EFalse;
// }
// }
// else
// {
// fetchFile = ETrue;
// }
// }
// }
// if(enabletoolbarext)
// {
// //Enable the insert toolbar
// if( iFixedToolbar )
// {
// iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, EFalse, ETrue );
// }
// }
// }
// ---------------------------------------------------------
// CUniEditorAppUi::InitNaviPaneL
// Draws navipane.
// ---------------------------------------------------------
//
void CUniEditorAppUi::InitNaviPaneL()
{
UNILOGGER_WRITE( "-> CUniEditorAppUi::InitNaviPaneL" );
UpdateIndicatorIconsL();
TInt charsLeft = 0;
TInt msgsParts = 0;
CalculateSMSMsgLen(charsLeft,msgsParts);
iPrevSmsLength = charsLeft;
MsgLengthToNavipaneL( EFalse );
UNILOGGER_WRITE( "<- CUniEditorAppUi::InitNaviPaneL" );
}
// ---------------------------------------------------------
// CUniEditorAppUi::UpdateIndicatorIconsL
//
// ---------------------------------------------------------
//
void CUniEditorAppUi::UpdateIndicatorIconsL()
{
UNILOGGER_WRITE( "-> CUniEditorAppUi::UpdateIndicatorIconsL" );
TInt priorityHigh;
TInt priorityLow;
if( Document()->UniState() == EUniSms )
{
UNILOGGER_WRITE( "-> CUniEditorAppUi::UpdateIndicatorIconsL SMS" );
// If dealing with SMS -> disable them
priorityHigh = EAknIndicatorStateOff;
priorityLow = EAknIndicatorStateOff;
}
else
{
TUniSendingSettings settings;
CUniEditorPlugin* plugin = MmsPlugin();
if ( plugin )
{
plugin->GetSendingSettingsL( settings );
}
if ( settings.iPriority == TUniSendingSettings::EUniPriorityLow )
{
priorityHigh = EAknIndicatorStateOff;
priorityLow = EAknIndicatorStateOn;
}
else if ( settings.iPriority == TUniSendingSettings::EUniPriorityHigh )
{
priorityHigh = EAknIndicatorStateOn;
priorityLow = EAknIndicatorStateOff;
}
else
{
priorityHigh = EAknIndicatorStateOff;
priorityLow = EAknIndicatorStateOff;
}
}
if ( iSupportedFeatures & EUniFeaturePriority)
{
UNILOGGER_WRITE( "-> CUniEditorAppUi::UpdateIndicatorIconsL priority" );
MAknEditingStateIndicator* editIndi = iAvkonEnv->EditingStateIndicator();
CAknIndicatorContainer* naviIndi =
static_cast<CAknIndicatorContainer*>( iNaviDecorator->DecoratedControl() );
// Update the Edwin indicator pane
if ( editIndi )
{
CAknIndicatorContainer* indiContainer = editIndi->IndicatorContainer();
if ( indiContainer )
{
indiContainer->SetIndicatorState( TUid::Uid(EAknNaviPaneEditorIndicatorMcePriorityHigh),
priorityHigh );
indiContainer->SetIndicatorState( TUid::Uid(EAknNaviPaneEditorIndicatorMcePriorityLow),
priorityLow );
}
}
// Update the navi indicator pane
if ( naviIndi )
{
naviIndi->SetIndicatorState( TUid::Uid(EAknNaviPaneEditorIndicatorMcePriorityHigh),
priorityHigh );
naviIndi->SetIndicatorState( TUid::Uid(EAknNaviPaneEditorIndicatorMcePriorityLow),
priorityLow );
}
}
UNILOGGER_WRITE( "<- CUniEditorAppUi::UpdateIndicatorIconsL" );
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowInformationNoteL
// ---------------------------------------------------------
//
void CUniEditorAppUi::ShowInformationNoteL( TInt aResourceID, TBool aWaiting )
{
HBufC* prompt = NULL;
switch ( aResourceID )
{
case R_UNIEDITOR_INFO_OBJECT_TOO_BIG:
case R_UNIEDITOR_INFO_OBJECT_SEND_AS_TOO_BIG:
{
// These are not anymore information notes
ShowConfirmableInfoL( aResourceID );
return;
}
default:
{
prompt = StringLoader::LoadLC( aResourceID, iCoeEnv );
break;
}
}
CAknInformationNote* note = new ( ELeave ) CAknInformationNote( aWaiting );
note->ExecuteLD( *prompt );
CleanupStack::PopAndDestroy( prompt );
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowErrorNoteL
// ---------------------------------------------------------
//
void CUniEditorAppUi::ShowErrorNoteL( TInt aResourceID, TBool aWaiting )
{
HBufC* prompt = StringLoader::LoadLC( aResourceID, iCoeEnv );
CAknErrorNote* note = new ( ELeave ) CAknErrorNote( aWaiting );
note->ExecuteLD( *prompt );
CleanupStack::PopAndDestroy( prompt );
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowConfirmationQueryL
// ---------------------------------------------------------
//
TInt CUniEditorAppUi::ShowConfirmationQueryL( TInt aResourceID )
{
HBufC* prompt = StringLoader::LoadLC( aResourceID, iCoeEnv );
TInt retVal = ShowConfirmationQueryL( *prompt );
CleanupStack::PopAndDestroy( prompt );
return retVal;
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowConfirmationQueryL
// ---------------------------------------------------------
TInt CUniEditorAppUi::ShowConfirmationQueryL( const TDesC& aText ) const
{
CAknQueryDialog* dlg = CAknQueryDialog::NewL();
return dlg->ExecuteLD( R_UNIEDITOR_CONFIRMATION_QUERY, aText );
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowConfirmationNoQuestionQueryL
// ---------------------------------------------------------
TInt CUniEditorAppUi::ShowConfirmationNoQuestionQueryL( const TDesC& aText ) const
{
// Utilize OK and CANCEL softkeys in confirmation query. Required when
// the query does not include a question.
CAknQueryDialog* dlg = CAknQueryDialog::NewL();
return dlg->ExecuteLD( R_UNIEDITOR_CONFIRMATION_NO_QUESTION_QUERY, aText );
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowConfirmableInfoL
// ---------------------------------------------------------
//
TInt CUniEditorAppUi::ShowConfirmableInfoL( TInt aResourceID )
{
HBufC* prompt = NULL;
switch ( aResourceID )
{
case R_UNIEDITOR_INFO_OBJECT_TOO_BIG:
case R_UNIEDITOR_INFO_OBJECT_SEND_AS_TOO_BIG:
{
TInt maxInKilos = ( Document()->MaxMessageSize() + KBytesInKilo - 1 ) / KBytesInKilo;
prompt = StringLoader::LoadLC( aResourceID, maxInKilos, iCoeEnv );
break;
}
case R_UNIEDITOR_INFO_MAX_SLIDES_ALL:
case R_UNIEDITOR_INFO_MAX_SLIDES_SOME:
{
prompt = StringLoader::LoadLC( aResourceID, Document()->DataModel()->SmilModel().MaxSlideCount(), iCoeEnv );
break;
}
default:
{
prompt = StringLoader::LoadLC( aResourceID, iCoeEnv );
break;
}
}
TInt retVal = KErrNone;
switch ( aResourceID )
{
case R_UNIEDITOR_ERROR_RMODE_CANNOT_OPEN:
retVal = ShowConfirmableInfoErrorL( *prompt );
break;
default:
retVal = ShowConfirmableInfoL( *prompt );
}
CleanupStack::PopAndDestroy( prompt );
return retVal;
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowConfirmableInfoL
// ---------------------------------------------------------
//
TInt CUniEditorAppUi::ShowConfirmableInfoL( const TDesC& aText ) const
{
CAknQueryDialog* dlg = CAknQueryDialog::NewL();
return dlg->ExecuteLD( R_UNIEDITOR_CONFIRMABLE_INFO, aText );
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowConfirmableInfoErrorL
// ---------------------------------------------------------
//
TInt CUniEditorAppUi::ShowConfirmableInfoErrorL( const TDesC& aText ) const
{
CAknQueryDialog* dlg = CAknQueryDialog::NewL();
return dlg->ExecuteLD( R_UNIEDITOR_CONFIRMABLE_INFO_ERROR, aText );
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowGuidedModeConfirmationQueryL
// ---------------------------------------------------------
//
TInt CUniEditorAppUi::ShowGuidedModeConfirmationQueryL( TInt aResourceID )
{
TInt retVal = EFalse;
if ( iEditorFlags & EShowGuidedConf )
{
TInt waitResId( KErrNotFound );
if ( iWaitDialog )
{
// Remove wait note for the confirmation query duration.
waitResId = iWaitResId;
RemoveWaitNote();
}
retVal = ShowConfirmationQueryL( aResourceID );
if ( retVal )
{
iEditorFlags &= ~EShowGuidedConf;
}
if ( waitResId != KErrNotFound )
{
// Set the wait not again visible after confirmation query is shown
// if it was visible before.
ShowWaitNoteL( waitResId );
}
}
else
{
retVal = ( Document()->CreationMode() != EMmsCreationModeRestricted );
}
return retVal;
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowWaitNoteL
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::ShowWaitNoteL( TInt aResourceId )
{
TInt waitNoteResource = R_UNIEDITOR_WAIT_NOTE;
TBool waitNoteDelayOff = EFalse;
if ( aResourceId == R_QTN_MSG_WAIT_SENDING_MMS )
{
waitNoteResource = R_UNIEDITOR_WAIT_NOTE_MMS_ICON;
}
else if ( aResourceId == R_QTN_MSG_WAIT_SENDING_SMS )
{
waitNoteResource = R_UNIEDITOR_WAIT_NOTE_SMS_ICON;
}
HBufC* string = NULL;
switch ( aResourceId )
{
case R_QTN_MSG_WAIT_SENDING_MMS:
case R_QTN_MSG_WAIT_SENDING_SMS:
case R_QTN_WAIT_MSG_SAVED_OUTBOX:
case R_QTN_UNI_WAIT_SAVING_MESSAGE_NEW:
{
waitNoteDelayOff = ETrue;
}
case R_QTN_UNI_WAIT_OPENING_EDITOR:
case R_QTN_UNI_WAIT_SAVING_MESSAGE:
case R_QTN_UNI_WAIT_INSERTING:
{
string = StringLoader::LoadLC( aResourceId, iCoeEnv );
break;
}
case R_QTN_UNI_WAIT_SLIDE_CHANGE:
{
CArrayFixFlat<TInt>* array = new ( ELeave ) CArrayFixFlat<TInt>( 2 );
CleanupStack::PushL( array );
array->AppendL( iNextSlide + 1 );
array->AppendL( iSmilModel->SlideCount() );
string = StringLoader::LoadL( R_QTN_UNI_WAIT_SLIDE_CHANGE,
*array,
iCoeEnv );
CleanupStack::PopAndDestroy( array );
CleanupStack::PushL( string );
break;
}
default:
{
break;
}
}
iWaitDialog = new( ELeave ) CAknWaitDialog( reinterpret_cast<CEikDialog**>( &iWaitDialog ),
waitNoteDelayOff );
// Coverty Fix, Forward Null, http://ousrv057/cov.cgi?cid=35691
if(string)
{
iWaitDialog->SetTextL( *string );
CleanupStack::PopAndDestroy( string );
}
iWaitDialog->SetCallback( this );
iWaitResId = aResourceId;
iWaitDialog->PrepareLC( waitNoteResource );
return iWaitDialog->RunLD();
}
// ---------------------------------------------------------
// CUniEditorAppUi::DialogDismissedL
//
// This is a bit tricky. DialogDismissedL is called when wait dialog
// is really dismissed from the screen. Wait dialog is not neccessary
// dismmissed at once the ProcessFinishedL function is called. This
// is because of some minimum delayes etc. tied to the visibility of
// wait dialog. But this more complex than that as wait dialog can be dismissed
// by end key or escape key from the screen before the operation has really been
// completed or cancelled. This needs to be taken into account here.
// ---------------------------------------------------------
//
void CUniEditorAppUi::DialogDismissedL( TInt dismissed )
{
if ( dismissed == EAknSoftkeyDone )
{
switch ( iWaitResId )
{
case R_QTN_MSG_WAIT_SENDING_MMS:
case R_QTN_MSG_WAIT_SENDING_SMS:
case R_QTN_WAIT_MSG_SAVED_OUTBOX:
{
DoSendComplete2ndPhase();
break;
}
case R_QTN_UNI_WAIT_SAVING_MESSAGE_NEW:
case R_QTN_UNI_WAIT_SAVING_MESSAGE:
{
DoSavingComplete2ndPhase();
break;
}
case R_QTN_UNI_WAIT_OPENING_EDITOR:
case R_QTN_UNI_WAIT_INSERTING:
{
break;
}
case R_QTN_UNI_WAIT_SLIDE_CHANGE:
{
break;
}
default:
{
break;
}
}
}
else if ( dismissed == EEikBidCancel )
{
iWaitDialog = NULL;
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::RemoveWaitNote
// ---------------------------------------------------------
//
void CUniEditorAppUi::RemoveWaitNote()
{
delete iWaitDialog;
iWaitDialog = NULL;
iWaitResId = -1;
}
// ---------------------------------------------------------
// CUniEditorAppUi::SetAddressSize
// ---------------------------------------------------------
//
void CUniEditorAppUi::SetAddressSize()
{
if ( !iView )
{
return;
}
TInt tempBytes( 0 );
TInt entryCnt( 0 );
TInt sizeInBytes( 0 );
for ( TInt i = CUniEditorHeader::EHeaderAddressTo;
i <= CUniEditorHeader::EHeaderAddressBcc;
i++ )
{
if ( iHeader->AddressControl( static_cast<CUniEditorHeader::THeaderFields> (i) ) )
{
iHeader->AddressControl(
static_cast<CUniEditorHeader::THeaderFields> (i) )->GetSizeOfAddresses( entryCnt,
tempBytes );
sizeInBytes += tempBytes;
}
}
Document()->SetAddressSize( sizeInBytes );
}
// ---------------------------------------------------------
// CUniEditorAppUi::SetSubjectSize
// ---------------------------------------------------------
//
void CUniEditorAppUi::SetSubjectSize()
{
if ( !iView )
{
return;
}
CMsgExpandableControl* subj = iHeader->SubjectControl();
if ( subj )
{
TPtrC subject = subj->TextContent().Read( 0, subj->TextContent().DocumentLength() );
Document()->SetSubjectSize( CUniDataUtils::UTF8Size( subject ) );
}
else
{
Document()->SetSubjectSize( 0 );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::RemoveObjectL
//
// Intended to be called from Objectsview. Updates screen
// when object removed in Objectsview. Objectsview has already
// delete atta from msgstore if needed.
// ---------------------------------------------------------
//
void CUniEditorAppUi::RemoveObjectL( TUniRegion aRegion,
TUniLayout aLayout )
{
if ( iOriginalSlide != -1 &&
Document()->CurrentSlide() != iOriginalSlide )
{
//nothing to do if the modified slide is not
//visible
return;
}
TBool removeCtrlFocused( EFalse );
CMsgBaseControl* ctrl = NULL;
TInt ctrlType = EMsgComponentIdNull;
switch ( aRegion )
{
case EUniRegionImage:
{
ctrl = iView->RemoveControlL( EMsgComponentIdImage );
if( !ctrl )
{ // Also video clip is located in image region so if no image -> check video control
ctrl = iView->RemoveControlL( EMsgComponentIdVideo );
}
if ( !ctrl )
{ // Also SVG presentation is located in image region so if no image -> check SVG control
ctrl = iView->RemoveControlL( EMsgComponentIdSvg );
}
if( ctrl )
{
removeCtrlFocused = ctrl->IsFocused();
ctrlType = ctrl->ControlId();
}
delete ctrl;
break;
}
case EUniRegionAudio:
{
ctrl = iView->RemoveControlL( EMsgComponentIdAudio );
if( ctrl )
{
removeCtrlFocused = ctrl->IsFocused();
ctrlType = ctrl->ControlId();
}
delete ctrl;
break;
}
case EUniRegionText:
{
// Clear control content
ctrl = BodyCtrl();
if ( ctrl )
{
ctrl->Reset();
ctrlType = ctrl->ControlId();
}
// Move control position if needed. Move focus & cursor position
CMsgImageControl* imgCtrl = ImageCtrl();
if ( imgCtrl && ( aLayout == EUniTextFirst ) )
{
// Move text control after the image. Cursor loc in text should be ok.
CMsgBaseControl* bodyCtrl = iView->RemoveControlL( EMsgComponentIdBody );
iView->AddControlL( bodyCtrl, EMsgComponentIdBody, EMsgAppendControl, EMsgBody );
}
break;
}
case EUniRegionUnresolved:
default:
{
// Should never be here!
__ASSERT_DEBUG( EFalse, Panic( EUniIllegalComponentType ) );
break;
}
}
if ( ( aRegion == EUniRegionImage ||
aRegion == EUniRegionAudio ) )
{
// Change focus to the beginning that scroll bar is updated
// and text editor area removes extra lines
if ( ToCtrl() )
{
iView->SetFocus( EMsgComponentIdTo );
}
else if ( iView->ControlById( EMsgComponentIdAudio ) )
{
//Audio is always first
iView->SetFocus( EMsgComponentIdAudio );
}
else if ( iSmilModel->Layout() == EUniImageFirst &&
ImageCtrl() )
{
// should not be need to update focus anymore
iView->SetFocus( EMsgComponentIdImage );
}
else
{
// should not be need to update focus anymore
iView->SetFocus( EMsgComponentIdBody );
}
CMsgBaseControl* focusedControl = iView->FocusedControl();
if ( focusedControl )
{
if ( removeCtrlFocused &&
focusedControl->ControlId() != EMsgComponentIdImage &&
ctrlType == EMsgComponentIdAudio &&
iSmilModel->Layout() == EUniImageFirst &&
ImageCtrl() )
{
iView->SetFocus( EMsgComponentIdImage );
}
else if ( focusedControl->ControlId() != EMsgComponentIdBody )
{
iView->SetFocus( EMsgComponentIdBody );
}
if ( ctrlType == EMsgComponentIdAudio &&
focusedControl->ControlId() == EMsgComponentIdImage )
{
// Set focus here so that imagecontrol will draw navipane if focused.
iView->FocusedControl()->SetFocus( ETrue, EDrawNow );
}
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserChangeOrderL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserChangeOrderL( TUniLayout aLayout )
{
// Both image and video are located in image region so there's only need to check it
CUniObject* img = iSmilModel->GetObject( Document()->CurrentSlide(), EUniRegionImage );
if ( img )
{
CAknLocalScreenClearer::NewLC( EFalse );
ChangeOrderL( aLayout );
CleanupStack::PopAndDestroy(); //clearer
}
iSmilModel->SetLayoutL( aLayout );
Document()->SetBodyModified( ETrue );
if ( !img )
{
TInt noteId = ( aLayout == EUniTextFirst ) ? R_UNIEDITOR_CONF_TEXTS_FIRST :
R_UNIEDITOR_CONF_TEXTS_SECOND;
ShowInformationNoteL( noteId, EFalse );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::ChangeOrderL
//
// Intended to be called from Objectsview. Updates screen
// when object order changed. SmilModel should already
// contain correct layout. Also called by AppUi
// ---------------------------------------------------------
//
void CUniEditorAppUi::ChangeOrderL( TUniLayout aLayout )
{
TInt focusedId = EMsgComponentIdNull;
if ( iView && iView->FocusedControl() )
{
focusedId = iView->FocusedControl()->ControlId();
}
TInt index = EMsgAppendControl;
// Coverty fix: Forward NULL, http://ousrv057/cov.cgi?cid=35695
if(iView)
{
CMsgBaseControl* ctrl = iView->RemoveControlL( EMsgComponentIdBody ); // Does not leave
if ( ctrl )
{
switch( aLayout )
{
case EUniImageFirst:
{
index = EMsgAppendControl;
break;
}
case EUniTextFirst:
{
if ( iView->ControlById ( EMsgComponentIdAudio ) )
{
index = EMsgFirstControl + 1;
}
else
{
index = EMsgFirstControl;
}
break;
}
case EUniUndefinedLayout:
default:
{
__ASSERT_DEBUG( EFalse, Panic( EUniIllegalLayout ) );
break;
}
}
iView->AddControlL( ctrl, EMsgComponentIdBody, index, EMsgBody );
}
}
if ( !( iHeader->IsAddressControl( focusedId ) ||
focusedId == EMsgComponentIdSubject ||
focusedId == EMsgComponentIdAttachment ) &&
iEditorFlags & ELaunchSuccessful )
{
SetFocusToBodyBeginningL();
}
//else -> keep focus as is
}
// ---------------------------------------------------------
// CUniEditorAppUi::ReleaseImage
//
// If there is image control, sets image lock according
// to parameter. Otherwise does nothing.
// ---------------------------------------------------------
//
void CUniEditorAppUi::ReleaseImage( TBool aRelease )
{
CMsgImageControl* ctrl = ImageCtrl();
if ( ctrl && aRelease )
{
ctrl->SetImageFileClosed();
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::MessageSizeInBytes
// ---------------------------------------------------------
//
TInt CUniEditorAppUi::MessageSizeInBytes()
{
TBool useEstimate = EFalse;
if ( Document()->DataModel()->SmilType() == EMmsSmil &&
( Document()->BodyModified() ||
iEditorFlags & EUseEstimatedSmilSize ) )
{
useEstimate = ETrue;
iEditorFlags |= EUseEstimatedSmilSize;
}
TInt size = Document()->MessageSize( useEstimate );
CEikRichTextEditor* bodyEditor = BodyCtrlEditor();
if ( bodyEditor )
{
TInt limit = ( TUint( size ) >= Document()->MaxMessageSize() ) ?
BodyCtrl()->TextContent().DocumentLength() :
KMaxTInt;
bodyEditor->SetTextLimit( limit );
}
return size;
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoSelectionKeyL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoSelectionKeyL()
{
CMsgBaseControl* ctrl = iView->FocusedControl();
if ( ctrl )
{
switch ( ctrl->ControlId() )
{
case EMsgComponentIdTo:
case EMsgComponentIdCc:
case EMsgComponentIdBcc:
{
if ( TUniMsvEntry::IsMmsUpload( Document()->Entry() ) )
{
break;
}
// Check is there any recipients in address ctrl
TBool modified = EFalse;
if ( iHeader->HasRecipients() )
{
// Recipients found. Verify addresses.
if ( !VerifyAddressesL( modified ) )
{
// Illegal address found.
modified = ETrue;
}
}
if ( !modified )//else
{
// Nothing changed on the UI. Open PhoneBook.
DoUserAddRecipientL();
}
break;
}
case EMsgComponentIdAttachment:
{
DoUserObjectsViewL( ETrue );
break;
}
case EMsgComponentIdImage:
{
if ( Document()->DataModel()->SmilType() == E3GPPSmil )
{
// focus is on "no-edit" SMIL icon
PlayPresentationL();
break;
}
if( Document()->DataModel()->SmilType() == ETemplateSmil )
{
break;
}
// Otherwise fallthrough
}
case EMsgComponentIdVideo:
case EMsgComponentIdAudio:
case EMsgComponentIdSvg:
{
PlayFocusedItemL();
break;
}
case EMsgComponentIdBody:
{
MenuBar()->SetMenuTitleResourceId( R_UNIEDITOR_CONTEXT_MENUBAR );
MenuBar()->SetMenuType(CEikMenuBar::EMenuContext);
TRAPD( err, MenuBar()->TryDisplayMenuBarL() );
MenuBar()->SetMenuTitleResourceId( R_UNIEDITOR_MENUBAR );
MenuBar()->SetMenuType(CEikMenuBar::EMenuOptions);
User::LeaveIfError( err );
break;
}
case EMsgComponentIdSubject:
default:
{
break;
}
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::SetErrorResource
//
// This is a function where error id priorities
// can be defined.
// ---------------------------------------------------------
//
void CUniEditorAppUi::SetErrorResource( TInt& aStoreId, TInt aNewId )
{
if ( ErrorPriority( aNewId ) >= ErrorPriority( aStoreId ) )
{
if ( ( aStoreId == R_UNIEDITOR_INFO_UNSUPPORTED_OBJECT ||
aStoreId == R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECT ) &&
( aNewId == R_UNIEDITOR_INFO_UNSUPPORTED_OBJECT ||
aNewId == R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECT ||
aNewId == R_UNIEDITOR_INFO_UNSUPPORTED_OBJECTS ||
aNewId == R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECTS ) )
{
// Set plural
aStoreId = R_UNIEDITOR_INFO_UNSUPPORTED_OBJECTS;
if ( Document()->CreationModeUserChangeable() &&
!Document()->CreationMode() )
{
aStoreId = R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECTS;
}
}
else if ( aStoreId == R_UNIEDITOR_QUEST_GUIDED_OBJ &&
( aNewId == R_UNIEDITOR_QUEST_GUIDED_OBJ ||
aNewId == R_UNIEDITOR_QUEST_GUIDED_OBJS ) )
{
// Set plural
aStoreId = R_UNIEDITOR_QUEST_GUIDED_OBJS;
}
else if ( aStoreId == R_UNIEDITOR_QUEST_GUIDED_INC_OBJ &&
( aNewId == R_UNIEDITOR_QUEST_GUIDED_INC_OBJ ||
aNewId == R_UNIEDITOR_QUEST_GUIDED_INC_OBJS ) )
{
// Set plural
aStoreId = R_UNIEDITOR_QUEST_GUIDED_INC_OBJS;
}
else if ( aStoreId != -1 &&
aStoreId != aNewId )
{
aStoreId = aNewId;
}
else
{
aStoreId = aNewId;
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::ErrorPriority
//
// This is a function where error id priorities
// can be defined.
// ---------------------------------------------------------
//
TInt CUniEditorAppUi::ErrorPriority( TInt aErrorId )
{
TInt priority = 0;
switch ( aErrorId )
{
case R_UNIEDITOR_INFO_SEND_FORBID_1:
{
priority++; // Fallthrough
}
case R_UNIEDITOR_INFO_OBJECT_TOO_BIG:
case R_UNIEDITOR_INFO_OBJECT_SEND_AS_TOO_BIG:
{
priority++; // Fallthrough
}
case R_UNIEDITOR_INFO_MAX_SLIDES_SOME:
case R_UNIEDITOR_INFO_MAX_SLIDES_ALL:
{
priority++; // Fallthrough
}
case R_UNIEDITOR_QUEST_GUIDED_PRESENTATION:
case R_UNIEDITOR_ERROR_CANNOT_OPEN:
case R_UNIEDITOR_ERROR_RMODE_CANNOT_OPEN:
{
priority++; // Fallthrough
}
case R_UNIEDITOR_QUEST_GUIDED_OBJ:
case R_UNIEDITOR_QUEST_GUIDED_OBJS:
{
priority++; // Fallthrough
}
case R_UNIEDITOR_QUEST_GUIDED_INC_OBJ:
case R_UNIEDITOR_QUEST_GUIDED_INC_OBJS:
{
priority++; // Fallthrough
}
case R_UNIEDITOR_INFO_SCALING_FAILED:
case R_UNIEDITOR_INFO_RMODE_SCALING_FAILED:
{
priority++; // Fallthrough
}
case R_UNIEDITOR_INFO_UNSUPPORTED_OBJECT:
case R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECT:
case R_UNIEDITOR_INFO_UNSUPPORTED_OBJECTS:
case R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECTS:
case R_UNIEDITOR_INFO_SOME_NOT_SUPPORTED:
case R_UNIEDITOR_INFO_RMODE_SOME_NOT_SUPPORTED:
{
priority++;
break;
}
default:
{
break;
}
}
return priority;
}
// ---------------------------------------------------------
// CUniEditorAppUi::IsPhoneOfflineL
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::IsPhoneOfflineL() const
{
if ( iSupportedFeatures & EUniFeatureOffline )
{
return MsvUiServiceUtilitiesInternal::IsPhoneOfflineL();
}
else
{
return EFalse;
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::LaunchHelpL
// ---------------------------------------------------------
//
void CUniEditorAppUi::LaunchHelpL()
{
// activate Help application
if ( iSupportedFeatures & EUniFeatureHelp )
{
CArrayFix<TCoeHelpContext>* helpContext = AppHelpContextL();
HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), helpContext );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::HelpContextL
// ---------------------------------------------------------
//
CArrayFix<TCoeHelpContext>* CUniEditorAppUi::HelpContextL() const
{
CArrayFix<TCoeHelpContext>* array = new( ELeave ) CArrayFixFlat<TCoeHelpContext>( 1 );
CleanupStack::PushL( array );
array->AppendL(TCoeHelpContext(KUniEditorAppId, KUNIFIED_HLP_EDITOR()));
CleanupStack::Pop( array );
return array;
}
// ---------------------------------------------------------
// CUniEditorAppUi::PlayPresentationL
// ---------------------------------------------------------
//
void CUniEditorAppUi::PlayPresentationL()
{
RFile smilFile = Document()->DataModel()->SmilList().GetSmilFileByIndexL( 0 );
if ( !iParser )
{
iParser = CMDXMLParser::NewL( this );
}
iParser->ParseFile( smilFile );
// Continues in ParseFileCompleteL
ActivateInputBlockerL( iParser );
}
// ---------------------------------------------------------
// CUniEditorAppUi::ParseFileCompleteL
// ---------------------------------------------------------
//
void CUniEditorAppUi::ParseFileCompleteL()
{
// Detach the dom from parser
if ( iDom )
{
delete iDom;
iDom = NULL;
}
iDom = iParser->DetachXMLDoc();
// Delete inputBlocker
DeactivateInputBlocker();
// Start playing the presentation
DoCompletePlayPresentationL();
}
// ---------------------------------------------------------
// CUniEditorAppUi::PlayPresentationL
//
// First go through every object in the presentation to find out
// whether audio should be enabled. After this launch SMIL player.
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoCompletePlayPresentationL()
{
TBool audio = EFalse;
CUniObjectList& objects = Document()->DataModel()->ObjectList();
TInt count = objects.Count();
while ( count-- )
{
CUniObject* object = objects.GetByIndex( count );
TMsgMediaType media = object->MediaType();
if ( media == EMsgMediaAudio )
{
audio = ETrue;
break;
}
else if ( media == EMsgMediaVideo )
{
CMsgVideoInfo* info = static_cast<CMsgVideoInfo*>( object->MediaInfo() );
if ( !info ||
info->IsAudio() )
{
audio = ETrue;
break;
}
}
}
CSmilPlayerDialog* smilPlayer = CSmilPlayerDialog::NewL( iDom,
&objects,
KNullDesC(),
ETrue,
audio );
if ( iFixedToolbar )
{
iFixedToolbar->SetToolbarVisibility(EFalse, EFalse);
}
iEditorFlags |= EToolbarHidden;
CleanupStack::PushL( TCleanupItem( EnableFixedToolbar, this ) );
SetKeyEventFlags(0);
CleanupStack::PushL( TCleanupItem( DisableSendKey, this ) );
smilPlayer->ExecuteLD();
CleanupStack::PopAndDestroy(2);// DisableSendKey,EnableFixedToolbar
if ( iFixedToolbar )
{
iFixedToolbar->SetToolbarVisibility(ETrue, EFalse);
}
// re-calculate all pos and dimensions of layout's widgets, after
// status pane is set back to usual and fixed-toolbar is made visible.
HandleResourceChangeL(KEikDynamicLayoutVariantSwitch);
}
// ---------------------------------------------------------
// CUniEditorAppUi::RemoveTemplateL
//
// First confirms the operation from user. After user has
// confirmed the operation remove all the objects and SMILs
// from the message. Enable toolbar and set modified flag on.
// Then replace the presentation icon with body text control and add
// single slide is no slides exists. Finally check the message type and
// update statuspane according to current message type.
// ---------------------------------------------------------
//
void CUniEditorAppUi::RemoveTemplateL()
{
if ( ShowConfirmationQueryL( R_UNIEDITOR_QUEST_REMOVE_TEMPLATE ) )
{
CUniObjectList& objectList = Document()->DataModel()->ObjectList();
objectList.RemoveAllObjectsL();
CMsvStore* editStore = Document()->Mtm().Entry().EditStoreL();
CleanupStack::PushL( editStore );
Document()->DataModel()->SmilList().RemoveSmilL( *editStore );
editStore->CommitL();
CleanupStack::PopAndDestroy( editStore );
Document()->DataModel()->SetSmilType( EMmsSmil );
UpdateToolbarL();
Document()->SetBodyModified( ETrue );
// Delete icon
iView->DeleteControlL( EMsgComponentIdImage ); // Does not leave
// Add body
CMsgBodyControl* bodyC = CMsgBodyControl::NewL(iView);
CleanupStack::PushL( bodyC );
iView->AddControlL( bodyC, EMsgComponentIdBody, EMsgAppendControl, EMsgBody );
CleanupStack::Pop( bodyC );
iView->SetFocus( EMsgComponentIdBody );
if ( !iSmilModel->SlideCount() )
{
iSmilModel->AddSlideL();
}
CheckBodyForMessageTypeL();
InitNaviPaneL();
SetTitleL();
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::SetFocusToBodyBeginningL
// ---------------------------------------------------------
//
void CUniEditorAppUi::SetFocusToBodyBeginningL()
{
if ( ToCtrl() )
{
// Set focus always first to "To" in order to
// make "To" field visible
iView->SetFocus( EMsgComponentIdTo );
}
if ( BodyCtrl() )
{
BodyCtrl()->SetCursorPosL( 0 );
}
TBool focusId = EMsgComponentIdBody;
if ( iView->ControlById( EMsgComponentIdAudio ) )
{
//Audio is always first
focusId = EMsgComponentIdAudio;
}
// When this is called from DoUserChangerOrderL the new layout is not
// yet updated in SmilModel -> that's why the if's below seem to be mixed
else if ( iSmilModel->Layout() == EUniTextFirst &&
iView->ControlById( EMsgComponentIdImage ) )
{
focusId = EMsgComponentIdImage;
}
else if ( iSmilModel->Layout() == EUniTextFirst &&
iView->ControlById( EMsgComponentIdVideo ) )
{
focusId = EMsgComponentIdVideo;
}
//else -> EMsgComponentIdBody
iView->SetFocus( focusId );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoInsertCompleteL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoInsertCompleteL( TUniEditorOperationEvent aEvent )
{
// focus and cursor positions handling
TBool insertedAsAttachment = EFalse;
if ( aEvent == EUniEditorOperationComplete )
{
if ( iInsertOperation->IsAddedAsAttachment() )
{
Document()->SetHeaderModified( ETrue );
insertedAsAttachment = ETrue;
}
else
{
SetFocusToBodyBeginningL();
switch ( iInsertingType )
{
case EMsgMediaImage:
{
// Set focus always first to the image control...
iView->SetFocus( EMsgComponentIdImage );
break;
}
case EMsgMediaAudio:
{
// Set focus always first to the audio control
iView->SetFocus( EMsgComponentIdAudio );
break;
}
case EMsgMediaVideo:
{
// Set focus always first to the audio control
iView->SetFocus( EMsgComponentIdVideo );
break;
}
case EMsgMediaSvg:
{
// Set focus always first to the audio control
iView->SetFocus( EMsgComponentIdSvg );
break;
}
default:
{
// nothing to do
break;
}
}
}
iInsertingType = EMsgMediaUnknown;
}
TUniState oldState = Document()->UniState();
DoInsertComplete2ndPhaseL();
// Lit up display backlight in case it has gone off due to a long operation
User::ResetInactivityTime();
if( insertedAsAttachment &&
( oldState == Document()->UniState() ||
!iPopupNote ) )
{
// The message type did not change or change popup note is not shown
// so show the attachment added note
ShowInformationNoteL( R_UNIEDITOR_QTN_UNIFIED_ATTACHMENT_ADDED, EFalse );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoInsertComplete2ndPhaseL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoInsertComplete2ndPhaseL()
{
RemoveWaitNote();
delete iScreenClearer;
iScreenClearer = NULL;
CheckBodyForMessageTypeL();
SetTitleL();
InitNaviPaneL();
ShowInsertErrorsL();
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowInsertErrorsL
// ---------------------------------------------------------
//
void CUniEditorAppUi::ShowInsertErrorsL()
{
TInt errRes( KErrNotFound );
CArrayFixFlat<TInt>* errors = iInsertOperation->GetErrors();
for ( TInt i = 0; i < errors->Count(); i++ )
{
switch ( errors->At( i ) )
{
case EUniProcessImgOutOfMemory:
case EUniProcessImgOutOfDisk:
case EUniProcessImgNotFound:
case EUniProcessImgNonConformant:
case EUniProcessImgScalingFailed:
case EUniProcessImgCompressFailed:
case EUniProcessImgCouldNotScale:
{
if( Document()->CreationModeUserChangeable() &&
Document()->CreationMode() == EMmsCreationModeRestricted )
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_RMODE_SCALING_FAILED );
}
else
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_SCALING_FAILED );
}
break;
}
case EUniInsertTooBig:
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_OBJECT_TOO_BIG );
break;
}
case EUniProcessImgUserAbort:
case EUniInsertUserGuidedAbort:
{
return;
}
case EUniInsertNotSupported:
case EUniInsertSlideChangeFailed:
{
if( Document()->CreationModeUserChangeable() &&
Document()->CreationMode() == EMmsCreationModeRestricted )
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_RMODE_UNSUPPORTED_OBJECT );
}
else
{
SetErrorResource( errRes, R_UNIEDITOR_INFO_UNSUPPORTED_OBJECT );
}
break;
}
default:
{
break;
}
}
}
if ( errRes != KErrNotFound )
{
ShowInformationNoteL( errRes, EFalse );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::EditorOperationEvent
//
// This is marked as non-leaving function since this is leaving with
// KLeaveExit only (also Exit() is not leaving even if it is leaving).
// ---------------------------------------------------------
//
void CUniEditorAppUi::EditorOperationEvent( TUniEditorOperationType aOperation,
TUniEditorOperationEvent aEvent )
{
if ( iEditorFlags & EEditorExiting )
{
// Do not handle any event if we are exiting from editor.
return;
}
if ( aEvent == EUniEditorOperationComplete ||
aEvent == EUniEditorOperationError ||
aEvent == EUniEditorOperationCancel )
{
DeactivateInputBlocker();
iEditorFlags &= ~EMsgEditInProgress;
if ( aEvent == EUniEditorOperationCancel &&
aOperation != EUniEditorOperationSend )
{
// Operation by operation should be considered what is proper action
// in Cancel situation. Send operation handles the removing of wait note
// correctly. When this is done with all operations operation checking
// can be removed.
EndActiveWait();
RemoveWaitNote();
delete iScreenClearer;
iScreenClearer = NULL;
}
}
TRAPD( error, DoEditorOperationEventL( aOperation, aEvent ) );
if ( error != KErrNone )
{
// Handle operation handling error.
if ( error == KLeaveExit )
{
// Leaving with KLeaveExit does not make function leavable. See Exit()
User::Leave( error );
}
else
{
iEikonEnv->HandleError( error );
if ( aOperation == EUniEditorOperationLaunch )
{
Exit( EAknSoftkeyClose );
}
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoEditorOperationEventL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoEditorOperationEventL( TUniEditorOperationType aOperation,
TUniEditorOperationEvent aEvent )
{
switch ( aOperation )
{
case EUniEditorOperationChangeSlide:
{
DoChangeSlideCompleteL();
break;
}
case EUniEditorOperationInsert:
{
if ( aEvent == EUniEditorOperationProcessing )
{
if ( iEditorFlags & EInsertAddsSlide )
{
iScreenClearer = CAknLocalScreenClearer::NewLC( EFalse );
CleanupStack::Pop();
}
}
else
{
DoInsertCompleteL( aEvent );
}
break;
}
case EUniEditorOperationLaunch:
{
if ( aEvent == EUniEditorOperationComplete )
{
DoLaunchCompleteL();
}
else
{
DoDelayedExit( 0 );
iEditorFlags |= EEditorClosing;
}
break;
}
case EUniEditorOperationSave:
{
DoSaveCompleteL();
break;
}
case EUniEditorOperationSend:
{
DoSendCompleteL();
break;
}
case EUniEditorOperationVCard:
{
DoVCardCompleteL();
break;
}
case EUniEditorOperationPreview:
{
// Expecting 'processing' but in case of error, other states are aacceptable, too.
RemoveWaitNote();
break;
}
default:
{
// nothing to do
break;
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::EditorOperationQuery
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::EditorOperationQuery( TUniEditorOperationType aOperation,
TUniEditorOperationQuery aQuery )
{
TBool ret( EFalse );
TRAP_IGNORE( ret = DoEditorOperationQueryL( aOperation, aQuery ) );
return ret;
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoEditorOperationQueryL
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::DoEditorOperationQueryL( TUniEditorOperationType /*aOperation*/,
TUniEditorOperationQuery aQuery )
{
switch ( aQuery )
{
case EMEOQueryGuidedInsertLarge:
{
return ShowGuidedModeConfirmationQueryL( R_UNIEDITOR_QUEST_INSERT_LARGE );
}
case EMEOQueryGuidedObject:
{
return ShowGuidedModeConfirmationQueryL( R_UNIEDITOR_QUEST_GUIDED_OBJ );
}
default:
{
break;
}
}
return ETrue;
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoChangeSlideCompleteL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoChangeSlideCompleteL()
{
EndActiveWait();
RemoveWaitNote();
if ( iChangeSlideOperation->GetErrors()->Count() )
{
delete iScreenClearer;
iScreenClearer = NULL;
ExitAndSaveL();
}
else
{
DoSetFocusL();
delete iScreenClearer;
iScreenClearer = NULL;
CheckBodyForMessageTypeL();
SetTitleL();
InitNaviPaneL();
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoLaunchCompleteL
//
// First removes wait note from the screen. After this launch
// relating note processing is done and if lanch should be aborted
// immediatelly performs delayed exit (i.e. starts idle timer
// to call Exit() function on it's callback). Rest of the launching
// related processing is done at the FinalizeLaunch function.
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoLaunchCompleteL()
{
// Does no harm to call this even if no wait note is set.
RemoveWaitNote();
TBool shutDown( EFalse );
ShowLaunchNotesL( shutDown );
if ( shutDown )
{
// Avoid direct Exit(). It causes actually leaving with -1003.
// If non-conformant object is sent from sendui and user is not
// willing to allow free moded Exit() was called previously and
// caused CMmsEditorLaunchOperation to leave, because this function
// is called inside RunL()
// give time to show notes
DoDelayedExit( KDelayedExitShort );
iEditorFlags |= EEditorClosing;
}
else
{
FinalizeLaunchL();
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoDelayedExit
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoDelayedExit( TInt aDelayTime )
{
iIdle->Cancel();
iIdle->Start( aDelayTime,
aDelayTime,
TCallBack( DelayedExitL, this ));
}
// ---------------------------------------------------------
// CUniEditorAppUi::DelayedExit
// ---------------------------------------------------------
//
TInt CUniEditorAppUi::DelayedExitL( TAny* aThis )
{
UNILOGGER_WRITE( "-> CUniEditorAppUi::DelayedExitL" );
CUniEditorAppUi* editor = static_cast<CUniEditorAppUi*>( aThis );
editor->ExitAndSaveL();
UNILOGGER_WRITE( "<- CUniEditorAppUi::DelayedExitL" );
return KErrNone;
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoSaveCompleteL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoSaveCompleteL()
{
UNILOGGER_WRITE( "-> CUniEditorAppUi::DoSaveCompleteL" );
if ( iWaitDialog )
{
// Processing continued at DialogDismissedL when wait note
// has dismissed itself.
iWaitDialog->ProcessFinishedL();
}
else
{
DoSavingComplete2ndPhase();
}
UNILOGGER_WRITE( "<- CUniEditorAppUi::DoSaveCompleteL" );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoSavingComplete2ndPhase
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoSavingComplete2ndPhase()
{
//TODO: Update prev save type!
CMDXMLDocument* dom = iSaveOperation->DetachDom();
if ( dom )
{
Document()->DataModel()->SetDom( dom );
}
EndActiveWait();
if ( iEditorFlags & EEditorClosing )
{
if ( Document()->UniState() == EUniMms )
{
CUniEditorPlugin* mmsPlugin = Document()->MmsPlugin();
TRAP_IGNORE(mmsPlugin->ConvertToL( Document()->Mtm().Entry().EntryId()));
}
else if ( Document()->UniState() == EUniSms )
{
CUniEditorPlugin* smsPlugin = Document()->SmsPlugin();
TRAP_IGNORE(smsPlugin->ConvertToL( Document()->Mtm().Entry().EntryId()));
}
DoDelayedExit( 0 );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoSendCompleteL
//
// Sending operation completed. If wait note is still available
// (i.e. it is not cancelled from the screen by some external event)
// we call ProcessFinishedL so that prosessing is finished. Otherwise
// we have to complete the operation by ourself.
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoSendCompleteL()
{
UNILOGGER_WRITE( "-> CUniEditorAppUi::DoSendCompleteL" );
if ( iWaitDialog )
{
// Processing continued at DialogDismissedL when wait note
// has dismissed itself.
iWaitDialog->ProcessFinishedL();
}
else
{
DoSendComplete2ndPhase();
}
UNILOGGER_WRITE( "<- CUniEditorAppUi::DoSendCompleteL" );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoSendComplete2ndPhase
//
// Performs the real send operation completing code.
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoSendComplete2ndPhase()
{
UNILOGGER_WRITE( "-> CUniEditorAppUi::DoSendComplete2ndPhase" );
// Get errors from send operation
CArrayFixFlat<TInt>* errors = iSendOperation->GetErrors();
if ( errors->Count() > 0 )
{
iEikonEnv->HandleError( errors->At( 0 ) );
iEditorFlags &= ~EEditorClosing;
return;
}
DoDelayedExit( 0 );
UNILOGGER_WRITE( "<- CUniEditorAppUi::DoSendComplete2ndPhase" );
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoVCardCompleteL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoVCardCompleteL()
{
if ( iFixedToolbar )
{
iFixedToolbar->HideItem( EUniCmdFixedToolbarSend, EFalse, ETrue );
iFixedToolbar->HideItem( EUniCmdFixedToolbarAddRecipient, EFalse, ETrue );
iFixedToolbar->HideItem( EUniCmdFixedToolbarInsert, EFalse, ETrue );
}
iEditorFlags &= ~EToolbarHidden;
TInt addedVCardCount = iVCardOperation->AddedVCardCount();
TBool oldState = Document()->UniState();
// Update navipane and type of message
CheckBodyForMessageTypeL();
MsgLengthToNavipaneL();
if (AknLayoutUtils::PenEnabled() )
{
iPeninputServer.UpdateAppInfo( KNullDesC, EAppIndicatorMsg );
}
if ( addedVCardCount > 0 )
{
Document()->SetHeaderModified( ETrue );
}
if ( !( oldState != Document()->UniState() && iPopupNote ) )
{
// Popup note is not shown, so we can show error or attachment(s)
// added note. When popup note is not shown, it doesn't matter
// whether message type was changed or not.
CArrayFixFlat<TInt>* errors = iVCardOperation->GetErrors();
if ( errors->Count() )
{
for ( TInt i = 0; i < errors->Count(); i++ )
{
if ( errors->At( i ) == EUniInsertTooBig )
{
// Tell user that one or more vCards could not be inserted.
addedVCardCount > 0 ?
ShowInformationNoteL( R_UNIEDITOR_INFO_OBJECT_SEND_AS_TOO_BIG, EFalse ) :
ShowInformationNoteL( R_UNIEDITOR_INFO_OBJECT_TOO_BIG, EFalse );
break;
}
}
}
else if ( addedVCardCount > 0 )
{
// Show attachment(s) added note if no errors.
addedVCardCount == 1 ?
ShowInformationNoteL( R_UNIEDITOR_QTN_UNIFIED_ATTACHMENT_ADDED, EFalse ) :
ShowInformationNoteL( R_UNIEDITOR_QTN_UNIFIED_ATTACHMENTS_ADDED, EFalse );
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::BeginActiveWait
// ---------------------------------------------------------
//
void CUniEditorAppUi::BeginActiveWait( CUniEditorOperation* aOperation )
{
if( iWait.IsStarted() )
{
// If there is data in recipient and body text fields,
// presentation is created and read key is pressed in smil editor,
// smil editor dialog is dismissed and change slide operation starts
// in NewTemplateL() ( any kind error code is not supplied).
// After that Exit comes to editor HandleCommandL, which would cause start of
// save operation. Change slide operation must be terminated first.
if ( iActiveOperation )
{
iActiveOperation->Cancel();
}
return;
}
iActiveOperation = aOperation;
iWait.Start();
}
// ---------------------------------------------------------
// CUniEditorAppUi::EndActiveWait
// ---------------------------------------------------------
//
void CUniEditorAppUi::EndActiveWait()
{
if( !iWait.IsStarted() )
{
return;
}
iWait.AsyncStop();
iActiveOperation = NULL;
}
// ---------------------------------------------------------
// CUniEditorAppUi::ObjectsAvailable
// ---------------------------------------------------------
//
TUint32 CUniEditorAppUi::ObjectsAvailable()
{
TUint32 objects = EUniNoneFlag;
if ( BodyCtrl() && BodyCtrl()->TextContent().DocumentLength() )
{
// This flag is not currently used for anything.
objects |= EUniTextFlag;
}
if ( iView->ControlById( EMsgComponentIdAudio ) )
{
objects |= EUniAudioFlag;
}
if ( iView->ControlById( EMsgComponentIdImage ) )
{
objects |= EUniImageFlag;
}
if ( iView->ControlById( EMsgComponentIdVideo ) )
{
objects |= EUniVideoFlag;
}
if ( iView->ControlById( EMsgComponentIdSvg ) )
{
objects |= EUniSvgFlag;
}
return objects;
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserAddHeadersL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserAddHeadersL()
{
if ( !iHeader )
{
return;
}
TInt headersVariation = iHeader->AddHeadersVariation();
TInt headersConfig = 0;
// Check which fields are visible:
// TInt headersConfig = iHeader->AddHeadersConfigL();
if ( iHeader->SubjectControl() )
{
headersConfig |= EUniFeatureSubject;
}
if ( iHeader->AddressControl( CUniBaseHeader::EHeaderAddressCc ) )
{
headersConfig |= EUniFeatureCc;
}
if ( iHeader->AddressControl( CUniBaseHeader::EHeaderAddressBcc ) )
{
headersConfig |= EUniFeatureBcc;
}
if ( IsHardcodedSms() && Document()->EmailOverSmsSupported() )
{
// Locked SMS and EmailOverSms -> enable only subject field
if ( headersVariation & EUniFeatureSubjectConfigurable )
{
headersVariation = EUniFeatureSubject;
headersVariation |= EUniFeatureSubjectConfigurable;
}
else
{
// Should not happen as add headers command should be invisible at this case.
headersVariation = EUniFeatureSubject;
}
}
// Contains indexes of additional header flags in
// headersIn array; KErrNotFound if not visible in the UI
// index: 0 = CC, 1 = BCC, 3 = subject
CArrayFixFlat<TInt>* indexes = new( ELeave ) CArrayFixFlat<TInt>( 3 );
CleanupStack::PushL( indexes );
CListBoxView::CSelectionIndexArray* headersOut =
new( ELeave ) CArrayFixFlat<TInt>( 3 );
CleanupStack::PushL( headersOut );
CListBoxView::CSelectionIndexArray* headersIn =
new( ELeave ) CArrayFixFlat<TInt>( 3 );
CleanupStack::PushL( headersIn );
CUniEditorAddHeaderDialog* dlg = new( ELeave ) CUniEditorAddHeaderDialog( headersOut );
// Pushes the dialog into stack
dlg->PrepareLC( R_UNIEDITOR_ADD_HEADERS_LIST_QUERY );
// Order matters. See Pop below
CDesCArrayFlat* headerStringsIn = new( ELeave ) CDesCArrayFlat( 3 );
CleanupStack::PushL( headerStringsIn );
TInt index( 0 );
for ( TInt i = 0; i < 3; i++ )
{
TInt flag( EUniFeatureCc );
TInt resource( R_UNIEDITOR_QTN_MSG_HEADERS_CC );
if ( i == 1 )
{
flag = EUniFeatureBcc;
resource = R_UNIEDITOR_QTN_MSG_HEADERS_BCC;
}
else if ( i == 2 )
{
flag = EUniFeatureSubjectConfigurable;
resource = R_UNIEDITOR_QTN_MSG_HEADERS_SUBJECT;
}
if ( headersVariation & flag )
{
HBufC* fieldTemp = StringLoader::LoadLC( resource, iCoeEnv );
// We need to add the "1\"
HBufC* fieldBuf = HBufC::NewMaxLC( fieldTemp->Des().Length() + 2 );
TPtr field = fieldBuf->Des();
field.Copy( KItemStart );
field.Append( fieldTemp->Des() );
// FieldBuf will be owned by headersIn
headerStringsIn->AppendL( field );
CleanupStack::PopAndDestroy( 2, fieldTemp ); // + fieldBuf
if ( flag == EUniFeatureSubjectConfigurable )
{
flag = EUniFeatureSubject;
}
if ( headersConfig & flag )
{
// Mark it selected
dlg->ListBox()->View()->SelectItemL( index );
headersIn->AppendL( ETrue );
}
else
{
headersIn->AppendL( EFalse );
}
indexes->AppendL( index );
index++;
}
else
{
indexes->AppendL( KErrNotFound );
}
}
dlg->SetItemTextArray( headerStringsIn );
dlg->SetOwnershipType( ELbmOwnsItemArray );
CleanupStack::Pop( headerStringsIn );
if ( dlg->RunLD() )
{
TInt newSelectionHeaders( 0 );
TInt removeHeaders( 0 );
TInt removeHeadersWithWarning( 0 );
TInt addHeaders( 0 );
TInt countItems( headersOut->Count() );
// Check if the out selection is the same as in selection
TBool theSame = ETrue;
index = 0;
for ( TInt i = 0; i < 3; i++ )
{
if ( indexes->At( i ) != KErrNotFound )
{
// i was one of the choices available in the dialog
if ( headersIn->At( index ) )
{
// It was originally selected
if ( countItems < 1 )
{
theSame = EFalse;
}
TBool foundIt = EFalse;
for ( TInt j = 0; j < countItems; j++ )
{
// Lets see the current selection
if ( headersOut->At( j ) == index )
{
// It's selected after the dialog
foundIt = ETrue;
}
}
if ( !foundIt )
{
// Originally it was selected so it's not the same selection anymore
theSame = EFalse;
}
}
else
{
// It was originally not selected
TBool foundIt = EFalse;
for ( TInt j = 0; j < countItems; j++ )
{
// Lets see the current selection
if ( headersOut->At( j ) == index )
{
// It's selected after the dialog
foundIt = ETrue;
}
}
if ( foundIt )
{
// Originally it was not selected so it's not the same selection anymore
theSame = EFalse;
}
}
index++;
}
}
CleanupStack::PopAndDestroy( headersIn );
if ( theSame )
{
// no changes were done so don't proceed with this..
// we return here so that we don't save incorrect configuration
// it might happen for example if we have opened reply to all and there are
// unselected fields used in the replied message
CleanupStack::PopAndDestroy( 2, indexes ); // + headersOut
return;
}
// Indicates selected fields
CArrayFixFlat<TInt>* indexesOut = new( ELeave ) CArrayFixFlat<TInt>( 3 );
CleanupStack::PushL( indexesOut );
indexesOut->AppendL( EFalse );
indexesOut->AppendL( EFalse );
indexesOut->AppendL( EFalse );
for ( TInt i = 0; i < countItems; i++ )
{
TInt selected = headersOut->At(i);
for ( TInt j = 0; j < 3; j++ )
{
if ( indexes->At( j ) == selected )
{
indexesOut->At( j ) = ETrue;
break;
}
}
}
AddHeadersCollectStatisticsL( *indexesOut,
headersVariation,
newSelectionHeaders,
removeHeaders,
removeHeadersWithWarning,
addHeaders );
CleanupStack::PopAndDestroy( indexesOut );
TInt countRemove = AddHeadersCount( removeHeadersWithWarning );
TInt res ( 0 );
if ( countRemove > 1 )
{
res = R_UNIEDITOR_QTN_MSG_QRY_HEADERS_REMOVE;
}
else if ( countRemove == 1 )
{
res = R_UNIEDITOR_QTN_MSG_QRY_HEADER_REMOVE;
}
if ( res )
{
// Confirmation specified for header removing
if ( ShowConfirmationQueryL( res ) )
{
// Remove all headers
iHeader->AddHeadersDeleteL( removeHeaders, ETrue );
Document()->SetHeaderModified( ETrue );
SetAddressSize();
SetSubjectSize();
}
else
{
// Remove empty headers
removeHeaders &= ( ~removeHeadersWithWarning );
if ( removeHeaders )
{
// Still something left to delete
iHeader->AddHeadersDeleteL( removeHeaders, ETrue );
}
// But keep the ones that have some content
newSelectionHeaders |= removeHeadersWithWarning;
}
}
else if ( removeHeaders )
{
// Remove one or more headers but none of the removed do not contain any data
iHeader->AddHeadersDeleteL( removeHeaders, EFalse );
}
iHeader->SaveAddHeadersConfigL( newSelectionHeaders );
// Add new headers
if ( addHeaders )
{
iHeader->AddHeadersAddL(addHeaders);
}
// Change focus
if ( addHeaders || removeHeaders )
{
iNextFocus = EMsgComponentIdNull;
// Add headers override removing
if ( addHeaders )
{
if ( addHeaders & EUniFeatureCc )
{
iNextFocus = EMsgComponentIdCc;
}
else if ( addHeaders & EUniFeatureBcc )
{
iNextFocus = EMsgComponentIdBcc;
}
else if ( addHeaders & EUniFeatureSubject )
{
iNextFocus = EMsgComponentIdSubject;
}
}
else
{
CUniEditorHeader::THeaderFields start( CUniEditorHeader::EHeaderAddressBcc );
if ( removeHeaders & EUniFeatureSubject )
{
start = CUniEditorHeader::EHeaderAddressBcc;
}
else if ( removeHeaders & EUniFeatureBcc )
{
start = CUniEditorHeader::EHeaderAddressCc;
}
else if ( removeHeaders & EUniFeatureCc )
{
start = CUniEditorHeader::EHeaderAddressTo;
}
// Search for the first existing header
for ( TInt i = start; i >= CUniEditorHeader::EHeaderAddressTo; i-- )
{
if ( iHeader->AddressControl( static_cast<CUniBaseHeader::THeaderFields> ( i ) ) )
{
iNextFocus = iHeader->AddressControlId(
static_cast<CUniBaseHeader::THeaderFields> ( i ) );
break;
}
}
}
if ( ToCtrl() )
{
DoSetFocusL();
}
else
{
DoUserChangeSlideL( 0 );
}
CheckHeaderForMessageTypeL();
// Also iSmsSubjectLength needs updating..
CheckBodyForMessageTypeL();
MsgLengthToNavipaneL();
}
}
else
{
CleanupStack::PopAndDestroy( headersIn );
}
CleanupStack::PopAndDestroy( 2, indexes ); // + headersOut
}
// ---------------------------------------------------------
// CUniEditorAppUi::AddHeadersRemovedWithDataFlags
// ---------------------------------------------------------
//
void CUniEditorAppUi::AddHeadersCollectStatisticsL( CArrayFix<TInt>& aIndexesOut,
TInt aVariation,
TInt& aNewSelectionFlags,
TInt& aRemoveFlags,
TInt& aRemoveWarningFlags,
TInt& aAddFlags ) const
{
// now we know selected ones
for ( TInt i = 0; i < 3; i++ ) // maximum three three
{
if (i == 0 || i == 1 )
{
CMsgAddressControl* control = NULL;
TInt flag = EUniFeatureCc;
if ( i == 0 )
{
control = iHeader->AddressControl(
static_cast<CUniBaseHeader::THeaderFields>
(CUniBaseHeader::EHeaderAddressCc) );
}
else if ( i == 1 )
{
flag = EUniFeatureBcc;
control = iHeader->AddressControl(
static_cast<CUniBaseHeader::THeaderFields>
(CUniBaseHeader::EHeaderAddressBcc) );
}
if ( !aIndexesOut[i] )
{
if ( control )
{
aRemoveFlags |= flag;
CMsgRecipientArray* recipients = control->GetRecipientsL();
if ( recipients
&& recipients->Count() )
{
aRemoveWarningFlags |= flag;
}
// else - control, no recipients, no selection => remove
}
// else - no control, no selection => status quo
}
else
{
aNewSelectionFlags |= flag;
if ( !control )
{
// no control, selection
aAddFlags |= flag;
}
// else - control and selection => status quo
}
}
else if ( i== 2 )
{
if( aVariation & EUniFeatureSubject && aVariation & EUniFeatureSubjectConfigurable )
{ // OK, subject field supported and configured
CMsgExpandableControl* subject = iHeader->SubjectControl();
if ( !aIndexesOut[i] )
{
if ( subject )
{
aRemoveFlags |= EUniFeatureSubject;
if ( subject->TextContent().DocumentLength() )
{
aRemoveWarningFlags |= EUniFeatureSubject;
}
// else - control, no subject text, no selection => remove
}
// else - no control, no selection => status quo
}
else
{
aNewSelectionFlags |= EUniFeatureSubject;
if ( !subject )
{
// no control, selection
aAddFlags |= EUniFeatureSubject;
}
// else - control and selection => status quo
}
}
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::AddHeadersCount
// ---------------------------------------------------------
//
TInt CUniEditorAppUi::AddHeadersCount( TInt aFlag ) const
{
TInt count( 0 );
if ( aFlag & EUniFeatureCc )
{
count++;
}
if ( aFlag & EUniFeatureBcc )
{
count++;
}
if ( aFlag & EUniFeatureSubject )
{
count++;
}
return count;
}
// ---------------------------------------------------------
// CUniEditorAppUi::SetCursorPositionsForInsertL
// ---------------------------------------------------------
//
void CUniEditorAppUi::SetCursorPositionsForInsertL()
{
// Set body control cursor position, so that scrolling after
// insert goes ok.
if ( BodyCtrl() )
{
TInt cursorPos = iSmilModel->Layout() == EUniImageFirst ? 0 :
BodyCtrlEditor()->TextLength();
BodyCtrl()->SetCursorPosL( cursorPos );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUserRemoveMediaL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUserRemoveMediaL( TMsgControlId aMediaControlId,
TUniRegion aRegion )
{
__ASSERT_DEBUG( Document()->DataModel()->SmilType() == EMmsSmil, Panic( EUniIllegalSmilType ) );
CMsgBaseControl* ctrl = iView->ControlById( aMediaControlId );
CUniObject* obj = iSmilModel->GetObject( Document()->CurrentSlide(), aRegion );
__ASSERT_DEBUG( ( ctrl && obj ), Panic( EUniNullPointer ) );
__ASSERT_DEBUG( Document()->DataModel()->SmilType() == EMmsSmil, Panic( EUniIllegalSmilType ) );
TUint32 objects = ObjectsAvailable();
TParsePtrC fileN( obj->MediaInfo()->FullFilePath() );
HBufC* queryText = StringLoader::LoadLC( R_UNIEDITOR_QUEST_REMOVE_COMMON, fileN.NameAndExt() );
if ( ShowConfirmationQueryL( *queryText ) )
{
iSmilModel->RemoveObjectL( Document()->CurrentSlide(), obj );
Document()->SetBodyModified( ETrue );
TBool removeCtrlFocused = ctrl->IsFocused();
// Delete icon
iView->DeleteControlL( ctrl->ControlId() );
MsgLengthToNavipaneL();
// Change focus to the beginning that scroll bar is updated
// and text editor area removes extra lines
if ( ToCtrl() )
{
iView->SetFocus( EMsgComponentIdTo );
}
else if ( iView->ControlById( EMsgComponentIdAudio ) )
{
//Audio is always first
iView->SetFocus( EMsgComponentIdAudio );
}
else if ( iSmilModel->Layout() == EUniImageFirst &&
ImageCtrl() )
{
// should not be need to update focus anymore
iView->SetFocus( EMsgComponentIdImage );
}
else
{
// should not be need to update focus anymore
iView->SetFocus( EMsgComponentIdBody );
}
// Put focus back to right place
CMsgBaseControl* focusedControl = iView->FocusedControl();
if ( focusedControl )
{
if ( removeCtrlFocused &&
focusedControl->ControlId() != EMsgComponentIdImage &&
iSmilModel->Layout() == EUniImageFirst &&
ImageCtrl() )
{
iView->SetFocus( EMsgComponentIdImage );
}
else if ( removeCtrlFocused &&
aMediaControlId == EMsgComponentIdAudio &&
iSmilModel->Layout() == EUniImageFirst &&
ImageCtrl() )
{
iView->SetFocus( EMsgComponentIdImage );
}
else if ( focusedControl->ControlId() != EMsgComponentIdBody )
{
CMsgBodyControl* bodyCtrl = BodyCtrl();
if ( bodyCtrl &&
aRegion == EUniRegionImage &&
( objects & EUniVideoFlag | removeCtrlFocused ) )
{
if ( iSmilModel->Layout() == EUniImageFirst )
{
// If video was removed, always place the cursor in the end
bodyCtrl->SetCursorPosL( 0 );
}
else
{
// If video was removed, always place the cursor in the end
bodyCtrl->SetCursorPosL( bodyCtrl->Editor().TextLength() );
}
}
// Needs to be done after cursor setting to ensure that view is
// showing the correct position.
iView->SetFocus( EMsgComponentIdBody );
}
if ( focusedControl->ControlId() == EMsgComponentIdImage )
{
// Set focus here so that imagecontrol will draw navipane if focused.
iView->FocusedControl()->SetFocus( ETrue, EDrawNow );
}
}
}
CleanupStack::PopAndDestroy( queryText );
if(!ObjectsAvailable() && Document()->CurrentSlide())
{
DoRemoveSlideL();
Document()->SetBodyModified( ETrue );
}
CheckBodyForMessageTypeL();
MsgLengthToNavipaneL();
}
// ---------------------------------------------------------
// CUniEditorAppUi::RemoveCurrentTextObjectL
// ---------------------------------------------------------
//
void CUniEditorAppUi::RemoveCurrentTextObjectL()
{
__ASSERT_DEBUG( Document()->DataModel()->SmilType() == EMmsSmil, Panic( EUniIllegalSmilType ) );
if ( ShowConfirmationQueryL( R_UNIEDITOR_QUEST_REMOVE_TEXT ) )
{
if ( BodyCtrl() ||
BodyCtrl()->TextContent().DocumentLength() )
{
BodyCtrl()->Reset();
Document()->SetBodyModified( ETrue );
UpdateSmilTextAttaL();
}
if((Document()->UniState() == EUniMms) &&(!ObjectsAvailable() && Document()->CurrentSlide()))
{
DoRemoveSlideL();
Document()->SetBodyModified( ETrue );
}
CheckBodyForMessageTypeL();
MsgLengthToNavipaneL();
SetOrRemoveMaxSizeInEdwin();
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::MsgAsyncControlStateChanged
// ---------------------------------------------------------
//
void CUniEditorAppUi::MsgAsyncControlStateChanged( CMsgBaseControl& /*aControl*/,
TMsgAsyncControlState /*aNewState*/,
TMsgAsyncControlState /*aOldState*/ )
{
// OK to leave this empty, needed only in Viewer side
}
// ---------------------------------------------------------
// CUniEditorAppUi::MsgAsyncControlResourceChanged
// ---------------------------------------------------------
//
void CUniEditorAppUi::MsgAsyncControlResourceChanged( CMsgBaseControl& aControl, TInt aType )
{
if ( aType == KEikDynamicLayoutVariantSwitch )
{
if ( aControl.ControlType() == EMsgImageControl )
{
CMsgImageControl& imageControl = static_cast<CMsgImageControl&>( aControl );
if ( imageControl.IconBitmapId() == EMbmUniutilsQgn_graf_mms_unedit ||
imageControl.IconBitmapId() == EMbmUniutilsQgn_graf_mms_edit )
{
// 3GPP icons layout setting needs to be handled by ourself
TAknLayoutRect iconLayout;
iconLayout.LayoutRect( MsgEditorCommons::MsgDataPane(),
AknLayoutScalable_Apps::msg_data_pane_g4().LayoutLine() );
TRAP_IGNORE( imageControl.SetIconSizeL( iconLayout.Rect().Size() ) );
}
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::HandleResourceChangeL
// ---------------------------------------------------------
//
void CUniEditorAppUi::HandleResourceChangeL( TInt aType )
{
// Base class call must be first
CMsgEditorAppUi::HandleResourceChangeL(aType);
if ( iHeader )
{
iHeader->HandleResourceChange( aType );
}
if ( aType == KEikDynamicLayoutVariantSwitch && IsLaunched() )
{
// Resize the title icon
CreateFixedToolbarL( EFalse );
if( !( iEditorFlags & EDoNotUpdateTitlePane ) )
{
UpdateToolbarL();
SetTitleIconsSizeL();
// Redraw it again
SetTitleL();
}
}
else if ( aType == KAknsMessageSkinChange )
{
TParse fileParse;
fileParse.Set( KUniUtilsMBMFileName, &KDC_APP_BITMAP_DIR, NULL );
delete iIconSms;
iIconSms = NULL;
iIconSms = AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(),
KAknsIIDQgnPropMceSmsTitle,
fileParse.FullName(),
EMbmUniutilsQgn_prop_mce_sms_title,
EMbmUniutilsQgn_prop_mce_sms_title_mask );
delete iIconMms;
iIconMms = NULL;
iIconMms = AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(),
KAknsIIDQgnPropMceMmsTitle,
fileParse.FullName(),
EMbmUniutilsQgn_prop_mce_mms_title,
EMbmUniutilsQgn_prop_mce_mms_title_mask );
SetTitleIconsSizeL();
if ( IsLaunched() && !( iEditorFlags & EDoNotUpdateTitlePane ) )
{
SetTitleL();
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::IsBodySmsCompatibleL
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::IsBodySmsCompatibleL( TBool aInAutoMode /*= ETrue*/ )
{
CUniEditorDocument* doc = Document();
CUniDataModel* model = doc->DataModel();
if ( Document()->DataModel()->SmilType() != EMmsSmil )
{ // There's 3GPP presentation or something else..
return EFalse;
}
// This sets iSmsLength and possible unicode character mode
CheckSmsSizeAndUnicodeL();
if( model->ObjectList().Count() == 0 &&
model->AttachmentList().Count() == 1 &&
iSmilModel->SlideCount() == 1 &&
iSmsSubjectLength == 0)
{
CUniObject* obj = model->AttachmentList().GetByIndex( 0 );
if ( obj &&
obj->MimeType().Length() > 0 &&
( obj->MimeType().CompareF( KMsgMimeVCard ) == 0 ||
#if defined (__I_CAL_SUPPORT) && defined (RD_MESSAGING_ICAL_IMPORT)
obj->MimeType().CompareF( KMsgMimeICal ) == 0 ||
#endif
obj->MimeType().CompareF( KMsgMimeVCal ) == 0 ) )
{
// There's only either VCard, VCal or ICal if it is supported.
iSmsBodyLength = obj->Size();
TInt maxParts = doc->MaxSmsParts();
if( !aInAutoMode )
{ // Checking if the message fits in "absolute maximum"
maxParts = doc->AbsoluteMaxSmsParts();
}
TInt lengthOne( 0 );
TInt lengthMany( 0 );
doc->SmsCharacterLimits( lengthOne, lengthMany );
return (iSmsBodyLength > lengthMany * maxParts )? EFalse : ETrue;
}
}
if( model->ObjectList().Count() > 1 ||
model->AttachmentList().Count() > 0 ||
iSmilModel->SlideCount() > 1 )
{ // If more than 1 object or an attachment or a slide -> MMS
return EFalse;
}
// OK, there's just one object
if( model->ObjectList().Count() == 1 &&
model->ObjectList().GetByIndex(0)->MediaType() != EMsgMediaText )
{ // Just one object and it's not text -> MMS
return EFalse;
}
// Lets check the length of the body
if( !(iEditorFlags & ESubjectOkInSms ) && iSmsSubjectLength > 0 )
{
return EFalse;
}
TInt lengthOne( 0 );
TInt lengthMany( 0 );
doc->SmsCharacterLimits( lengthOne, lengthMany );
TInt maxLen = lengthOne;
TInt maxParts = doc->MaxSmsParts();
if( !aInAutoMode )
{ // Checking if the message fits in "absolute maximum"
maxParts = doc->AbsoluteMaxSmsParts();
}
if( maxParts > 1 )
{
maxLen = maxParts*lengthMany;
}
if ( doc->AbsoluteMaxSmsCharacters() > 0 )
{
maxLen = doc->AbsoluteMaxSmsCharacters();
}
TInt emailAddrLen = iHeader->LongestEmailAddress();
if( emailAddrLen )
{
emailAddrLen++; // one extra char needed by separator char
}
if( iSmsBodyLength + iSmsSubjectLength + emailAddrLen <= maxLen )
{
//Korean Req: 415-5434
//get the size limit in bytes
TInt warnCharLength = doc->SmsSizeWarningBytes();
if( warnCharLength > 0 )
{
//convert the size limit w.r.t characters based on encoding type
if ( doc->UnicodeCharacterMode() )
{
warnCharLength = warnCharLength / 2 ;
}
else
{
warnCharLength = (warnCharLength * 8) / 7;
}
if( iSmsBodyLength + iSmsSubjectLength + emailAddrLen > warnCharLength )
{
//show "limit exceed" note if not shown already
if( !( iEditorFlags & ESmsSizeWarningNoteShown ) )
{
//set the bit to indicate limit exceeded and note shown
iEditorFlags |= ESmsSizeWarningNoteShown;
if( iPopupNote )
{
iPopupNote->SetTextL( iPopupSmsSizeAboveLimitBuffer->Des() );
iPopupNote->ShowInfoPopupNote();
}
}
}
else
{
//show "back to below limit" note if not shown already(only in case of size transiton from above limit to below limit)
if( iEditorFlags & ESmsSizeWarningNoteShown )
{
//reset the bit to indicate size is below limit and note for transition is showed
iEditorFlags &= ~ESmsSizeWarningNoteShown;
if( iPopupNote )
{
iPopupNote->SetTextL( iPopupSmsSizeBelowLimitBuffer->Des() );
iPopupNote->ShowInfoPopupNote();
}
}
}
}
return ETrue;
}
// text (body + possible subject) is too long -> body is not sms compatible
return EFalse;
}
// ---------------------------------------------------------
// CUniEditorAppUi::CheckSmsSizeAndUnicodeL
// ---------------------------------------------------------
//
void CUniEditorAppUi::CheckSmsSizeAndUnicodeL()
{
UNILOGGER_WRITE_TIMESTAMP("CUniEditorAppUi::CheckSmsSizeAndUnicodeL Start <<<---- ");
CUniEditorDocument* doc = Document();
if( iNLTFeatureSupport )
{
//Turkish SMS-PREQ2265 specific
TInt numOfPDUs = 0, numOfRemainingChars = 0, subjectLength = 0;
TBool unicodeMode = EFalse;
TSmsEncoding alternativeEncodingType;
CUniEditorPlugin* plugin = NULL;
plugin = SmsPlugin();
if ( plugin )
{
HBufC* editorTxt = NULL;
if ( BodyCtrlEditor() )
{
editorTxt = BodyCtrlEditor()->GetTextInHBufL();
}
//Concatenate subject buffer and body buffer before calculating PDU info.
if ( SubjectCtrlEditor() )
{
HBufC* subjectTxt = SubjectCtrlEditor()->GetTextInHBufL();
if( subjectTxt )
{
if( editorTxt )
{
CleanupStack::PushL( subjectTxt );
//If both, body text and suject text is present
//Reallocate editor text to include subject buffer and additional chars for subject
TInt reallocLength;
reallocLength = editorTxt->Length() + subjectTxt->Length() + KUniEdExtraLenCausedBySubject;
editorTxt = editorTxt->ReAllocL(reallocLength);
//Modify the editor text to insert subject buffer and additional chars at the begining
//Buffer Format is:: "(subject...)body..."
TPtr editorBuffPtr = editorTxt->Des();
subjectLength = 0;
editorBuffPtr.Insert(subjectLength, _L("("));
subjectLength += 1;
editorBuffPtr.Insert(subjectLength, *subjectTxt);
subjectLength += subjectTxt->Length();
editorBuffPtr.Insert(subjectLength, _L(")"));
subjectLength += 1;
//total subject length is actual subject + extra chars '(' and ')'
CleanupStack::PopAndDestroy( subjectTxt );
}
else
{
//if only subject text is present
//Modify subject buffer directly
//Reallocate subject text to include subject buffer and additional chars for subject
subjectLength = subjectTxt->Length() + KUniEdExtraLenCausedBySubject;
subjectTxt = subjectTxt->ReAllocL(subjectLength);
//Modify the editor text to insert additional chars at the begining and end
//Buffer Format is:: "(subject...)"
TPtr subjectBuffPtr = subjectTxt->Des();
subjectBuffPtr.Insert(0, _L("("));
//total subject length is actual subject + extra chars '(' and ')'
subjectBuffPtr.Insert(subjectLength - 1, _L(")"));
//Use subject buffer as editor buffer
editorTxt = subjectTxt;
}
}
}
if ( editorTxt )
{
TPtr inputBuff = editorTxt->Des();
TInt buffLength = editorTxt->Length();
TInt prevBuffLength = 0;
//replace enter char(enter will be downgraded anyways) with space, before calculating PDU info.
//This char will be later replaced with line feed or paragraph separator
TBuf<KSmsEdPDUInfoCalcReplaceCharacterCount> replaceChars;
replaceChars.Zero();
replaceChars.Append( KSmsEnterCharacter );
replaceChars.Append( KSmsDownwardsArrowLeft );
AknTextUtils::ReplaceCharacters(
inputBuff,
replaceChars,
KSmsEdUnicodeLFSupportedByBasicPhones );
if( iPrevBuffer )
{
prevBuffLength = iPrevBuffer->Length();
if(( prevBuffLength == buffLength )&&(!iSettingsChanged) )
{
UNILOGGER_WRITE_TIMESTAMP("CUniEditorAppUi::CheckSmsSizeAndUnicodeL Compare Start <<<---- ");
if( iPrevBuffer->Compare(*editorTxt) == 0 )
{
UNILOGGER_WRITE_TIMESTAMP("CUniEditorAppUi::CheckSmsSizeAndUnicodeL Compare TRUE End ---->>> ");
/* Identical buffer, previously calculated values are good enough
* Hence do nothing.
*/
delete iPrevBuffer;
iPrevBuffer = editorTxt;
return;
}
UNILOGGER_WRITE_TIMESTAMP("CUniEditorAppUi::CheckSmsSizeAndUnicodeL Compare FALSE End ---->>> ");
}
}
//This char will be later replaced with line feed or paragraph separator
if( buffLength <= prevBuffLength )
{
//Reset the settings back, in case if any unicode/turkish chars were entered and erased
//or if entry type is T9 method(multiple key presses to get different chars)
plugin->SetEncodingSettings(EFalse, doc->AlternativeEncodingType(), doc->CharSetSupport());
}
//Call the plugin SMS adaptation API to get PDU Info
TRAPD( err, plugin->GetNumPDUsL( inputBuff, numOfRemainingChars, numOfPDUs, unicodeMode, alternativeEncodingType) );
if ( err == KErrOverflow )
{
iSmsBodyLength = buffLength;
delete iPrevBuffer;
iPrevBuffer = editorTxt;
return;
}
else if ( err != KErrNone )
{
User::Leave(err);
}
//save current buffer
delete iPrevBuffer;
iPrevBuffer = editorTxt;
iSettingsChanged = EFalse;
}
else
{
//Reset the settings back, in case if any unicode chars were entered and erased
plugin->SetEncodingSettings(EFalse, doc->AlternativeEncodingType(), doc->CharSetSupport());
// Bodytext is zero -> check input language
delete iPrevBuffer;
iPrevBuffer = NULL;
TInt inputLang = iAvkonEnv->SettingCache().InputLanguage();
switch ( inputLang )
{
case ELangArabic:
case ELangHebrew:
case ELangThai:
case ELangVietnamese:
case ELangFarsi:
case ELangHindi:
case ELangUrdu:
case ELangRussian:
case ELangBulgarian:
case ELangUkrainian:
case ELangTaiwanChinese:
case ELangHongKongChinese:
case ELangPrcChinese:
case ELangJapanese:
{
// If the InputLanguage is one of above,
// we must check the current input mode too
if ( BodyCtrlEditor() )
{
if ( BodyCtrlEditor()->AknEditorCurrentInputMode() ==
EAknEditorHalfWidthTextInputMode )
{
//Unicode Not required. Characters are within western text set.
unicodeMode = EFalse;
}
else
{
//Unicode Mode
unicodeMode = ETrue;
}
}
break;
}
default:
{
break;
}
}
}
}
TInt lengthOne = 0;
TInt lengthMany = 0;
doc->SetUnicodeCharacterMode( unicodeMode );
doc->SmsCharacterLimits( lengthOne, lengthMany );
if(numOfPDUs == 0)
{
//Empty buffer, need to calculate correct values of "num of PDUs" and "remaining characters" on our own.
numOfPDUs = 1;
numOfRemainingChars = lengthOne;
}
iNumOfPDUs = numOfPDUs;
iCharsLeft = numOfRemainingChars;
if(iNumOfPDUs == 1)
{
iSmsBodyLength = lengthOne - iCharsLeft - subjectLength;
}
else
{
iSmsBodyLength = lengthMany*iNumOfPDUs - iCharsLeft - subjectLength;
}
iSmsSubjectLength = subjectLength;
}
else
{
TInt extendedChars = 0;
TInt extendedBodyChars = 0;
TInt extendedSubjectChars = 0;
TBool westernText = ETrue;
CCnvCharacterSetConverter* conv = doc->CharConverter();
if ( conv )
{
for( TInt index = 0; index < KUniEdNumberOfEditors; index++ )
{
HBufC* editorTxt = NULL;
extendedChars = 0;
if ( index == 0 )
{
if ( BodyCtrlEditor() )
{
editorTxt = BodyCtrlEditor()->GetTextInHBufL();
}
}
else
{
if ( SubjectCtrlEditor() )
{
editorTxt = SubjectCtrlEditor()->GetTextInHBufL();
}
}
if ( editorTxt )
{
CleanupStack::PushL( editorTxt );
TPtr string = editorTxt->Des();
TUint uChar;
TBuf8<KUnicodeCheckChars> notUsed;
TPtrC remainderOfInputString( string );
for ( TInt i = 0; i < remainderOfInputString.Length(); i++ )
{
uChar = TUint( remainderOfInputString[i] );
switch ( uChar )
{
case KUniEdLeftSquareBracket:
case KUniEdReverseSolidus:
case KUniEdRightSquareBracket:
case KUniEdCircumflexAccent:
case KUniEdLeftCurlyBracket:
case KUniEdVerticalLine:
case KUniEdRightCurlyBracket:
case KUniEdTilde:
case KUniEdEuroSymbol:
{
extendedChars++;
break;
}
default:
{
break;
}
}
}
// This is needed in case there's KSmsDownwardsArrowLeft in the end and no other unicode chars
TBool unicodeWasInUse = EFalse;
while ( remainderOfInputString.Length() )
{
TInt numberOfUnconvertibleCharacters = 0;
const TInt returnValue = conv->ConvertFromUnicode( notUsed,
remainderOfInputString,
numberOfUnconvertibleCharacters );
if ( numberOfUnconvertibleCharacters > 0 )
{
for ( TInt i = 0;
i < remainderOfInputString.Length() && numberOfUnconvertibleCharacters > 0;
i++ )
{
uChar = TUint(remainderOfInputString[i]);
if ( uChar == KSmsDownwardsArrowLeft )
{
// these will be converted to paragraph separators later
numberOfUnconvertibleCharacters--;
if ( doc->UnicodeCharacterMode() )
{
unicodeWasInUse = ETrue;
}
}
}
}
if ( returnValue < 0 ||
numberOfUnconvertibleCharacters > 0 ||
( unicodeWasInUse &&
numberOfUnconvertibleCharacters == 0 ) )
{
// if there was an error in trying to do the conversion, or if there was an
// unconvertible character (e.g. a Chinese character)
westernText = EFalse;
break;
}
remainderOfInputString.Set( remainderOfInputString.Right( returnValue ) );
}
if ( index == 0 )
{
extendedBodyChars = extendedChars;
}
else
{
extendedSubjectChars = extendedChars;
}
CleanupStack::PopAndDestroy( editorTxt );
}
else if ( index == 0 )
{
// Bodytext is zero -> check input language
TInt inputLang = iAvkonEnv->SettingCache().InputLanguage();
switch ( inputLang )
{
case ELangArabic:
case ELangHebrew:
case ELangThai:
case ELangVietnamese:
case ELangFarsi:
case ELangHindi:
case ELangUrdu:
case ELangRussian:
case ELangBulgarian:
case ELangUkrainian:
case ELangTaiwanChinese:
case ELangHongKongChinese:
case ELangPrcChinese:
case ELangJapanese:
{
// If the InputLanguage is one of above,
// we must check the current input mode too
if ( BodyCtrlEditor() )
{
if ( BodyCtrlEditor()->AknEditorCurrentInputMode() ==
EAknEditorHalfWidthTextInputMode )
{
westernText = ETrue;
}
else
{
westernText = EFalse;
}
}
break;
}
default:
{
break;
}
}
}
}
// Now we have westernText and extendedChars set
}
if ( westernText )
{
// Might not infact change the unicode character mode
// if maximum SMS character limit is set that forces
// the mode to be always unicode.
doc->SetUnicodeCharacterMode( EFalse );
}
else
{
// Unicode mode
doc->SetUnicodeCharacterMode( ETrue );
// We need unicode so discard extended chars
extendedBodyChars = 0;
extendedSubjectChars = 0;
}
static_cast<CUniSmsPlugin*>( SmsPlugin() )->SetUnicodeMode( doc->UnicodeCharacterMode() );
if ( BodyCtrlEditor() )
{
iSmsBodyLength = BodyCtrlEditor()->TextLength() + extendedBodyChars;
}
else
{
iSmsBodyLength = 0;
}
iSmsSubjectLength = 0;
if( SubjectCtrlEditor() &&
SubjectCtrlEditor()->TextLength() )
{
// EmailOverSms is supported if when end up here
iSmsSubjectLength = SubjectCtrlEditor()->TextLength()
+ extendedSubjectChars
+ KUniEdExtraLenCausedBySubject; // the extra because of '(' and ')'
}
}
UNILOGGER_WRITE_TIMESTAMP("CUniEditorAppUi::CheckSmsSizeAndUnicodeL End ---->>> ");
}
// ---------------------------------------------------------
// CUniEditorAppUi::CheckHeaderForMessageTypeL
// ---------------------------------------------------------
//
void CUniEditorAppUi::CheckHeaderForMessageTypeL()
{
CUniEditorDocument* doc = Document();
if( iMtm->MessageTypeSetting() != EUniMessageTypeSettingAutomatic )
{ // We are in locked mode so refresh email addr length and return
iHeader->RefreshLongestEmailAddressL();
return;
}
// We are in automatic mode so lets check everything
TUniState oldState = doc->UniState();
if( iHeader->IsHeaderSmsL() )
{ // Set current header state as sms
doc->SetHeaderUniState( EUniSms );
}
else
{ // Set current header state as mms
doc->SetHeaderUniState( EUniMms );
}
if( oldState != doc->UniState() )
{ // If the state is not the same anymore, update title and show popup
SetTitleL();
UpdateIndicatorIconsL();
ShowPopupNoteL( doc->UniState()==EUniMms?ETrue:EFalse );
UpdateToolbarL();
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::CheckBodyForMessageTypeL
// ---------------------------------------------------------
//
void CUniEditorAppUi::CheckBodyForMessageTypeL()
{
CUniEditorDocument* doc = Document();
TUniMessageTypeSetting setting = iMtm->MessageTypeSetting();
if( IsHardcodedSms() )
{ // Just update iSmsLength and possible unicode mode
CheckSmsSizeAndUnicodeL();
return;
}
if( setting == EUniMessageTypeSettingMms )
{ // We are in locked mode so just leave
UpdateToolbarL();
return;
}
TUniState oldState = doc->UniState();
if( IsBodySmsCompatibleL() )
{ // Set current body state as sms
doc->SetBodyUniState( EUniSms );
}
else
{ // Set current body state as mms
doc->SetBodyUniState( EUniMms );
}
if( oldState != doc->UniState() )
{ // If the state is not the same anymore, update title and show popup
SetTitleL();
UpdateIndicatorIconsL();
ShowPopupNoteL( doc->UniState()==EUniMms?ETrue:EFalse );
UpdateToolbarL();
if( iNLTFeatureSupport )
{
//Turkish SMS-PREQ2265 specific
if(doc->UniState() == EUniSms)
{
//If the new state is SMS, Reset the SMS Settings and update the message length info
if(doc->SmsPlugin())
{
doc->SmsPlugin()->SetEncodingSettings(EFalse, doc->AlternativeEncodingType(), doc->CharSetSupport());
}
//Force to recalculate the SMS PDU info
CheckSmsSizeAndUnicodeL();
MsgLengthToNavipaneL( );
}
}
}
}
// ----------------------------------------------------
// CUniEditorAppUi::CreateMmsNaviSizeStringL
//
// Rounds always up
// 0.00000 -> 0
// 0.00001 -> 0.1
// ..
// 0.10000 -> 0.1
// 0.10001 -> 0.2
// ..
// 9.89999 -> 9.9
// 9.90000 -> 9.9
// 9.90001 -> 10
//
// ----------------------------------------------------
//
void CUniEditorAppUi::CreateMmsNaviSizeStringL( const TInt aSizeInBytes,
TDes& aSize,
TInt& aInteger,
TInt& aFragment )
{
aSize.Zero();
// Integer part
aInteger = aSizeInBytes / KBytesInKilo;
// Up rounded fragment part -> can be 10:
aFragment = ( ( aSizeInBytes % KBytesInKilo ) * 10 + KBytesInKilo - 1) / KBytesInKilo;
if ( aFragment >= 10 )
{
aInteger++;
aFragment = 0;
}
if ( aInteger >= KOneDigitLimit )
{
// Show msg size without one digit accuracy
if ( aFragment )
{
aInteger++;
aFragment = 0;
}
MsgAttachmentUtils::FileSizeToStringL( aSize, aInteger * KBytesInKilo, ETrue );
}
else if ( aInteger != 0 || aFragment != 0 )
{
// There is some content and size is between 0 - 10 kB
TLocale loc;
TBuf<1> sep;
sep.Append( loc.DecimalSeparator() );
StringLoader::Format( aSize, *iMmsLengthFormatBuffer, 0, aInteger );
HBufC* temp = aSize.AllocLC();
StringLoader::Format( aSize, *temp, 2, aFragment );
CleanupStack::PopAndDestroy();
temp = aSize.AllocLC();
StringLoader::Format( aSize, *temp, 1, sep );
CleanupStack::PopAndDestroy();
temp = NULL;
}
else
{
// Empty msg
MsgAttachmentUtils::FileSizeToStringL( aSize, 0, ETrue );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoToolbarInsertOtherL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoToolbarInsertOtherL()
{
RArray<TInt> disabledItems;
CleanupClosePushL( disabledItems );
TInt toolbarResourceId( KErrNotFound );
if ( AknLayoutUtils::PenEnabled() )
{
toolbarResourceId = R_UNIEDITOR_INSERT_OTHER_QUERY;
// if ( Document()->CreationMode() == EMmsCreationModeRestricted )
// {
// disabledItems.Append( EUniCmdToolbarOtherFetchSVG );
// }
}
TInt selectedIndex( 0 );
CAknListQueryDialog* dlg = new ( ELeave ) CAknListQueryDialog( &selectedIndex );
dlg->PrepareLC( toolbarResourceId );
CEikFormattedCellListBox* listbox = dlg->ListControl()->Listbox();
CDesCArray* itemArray = static_cast<CDesCArray*>( listbox->Model()->ItemTextArray() );
if ( disabledItems.Count() > 0 )
{
for ( TInt currentItem = 0; currentItem < disabledItems.Count(); currentItem++ )
{
itemArray->Delete( disabledItems[ currentItem ] );
listbox->HandleItemRemovalL();
}
}
if ( dlg->RunLD() )
{
for ( TInt currentItem = disabledItems.Count() - 1; currentItem >= 0 ; currentItem-- )
{
if ( selectedIndex >= disabledItems[ currentItem ] )
{
selectedIndex++;
}
}
switch ( selectedIndex )
{
// case EUniCmdToolbarOtherFetchSVG:
// {
// DoUserInsertSvgL();
// break;
// }
case EUniCmdToolbarOtherFetchTextAtta:
{
DoUserInsertOtherFileL( ETextFile );
break;
}
case EUniCmdToolbarOtherFetchOtherFiles:
{
DoUserInsertOtherFileL( EOtherFile );
break;
}
default:
{
__ASSERT_DEBUG( EFalse, Panic( EUniUnsupportedCommand ) );
break;
}
}
}
CleanupStack::PopAndDestroy( &disabledItems );
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowListQueryL
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::ShowListQueryL( TInt aResourceID, TInt& aSelectedIndex ) const
{
CAknListQueryDialog* dlg = new ( ELeave ) CAknListQueryDialog( &aSelectedIndex );
dlg->PrepareLC( aResourceID );
return dlg->RunLD();
}
// ---------------------------------------------------------
// CUniEditorAppUi::HidePopupNote
// ---------------------------------------------------------
//
void CUniEditorAppUi::HidePopupNote()
{
if( iPopupNote )
{
iPopupNote->HideInfoPopupNote();
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::ShowPopupNoteL
// ---------------------------------------------------------
//
void CUniEditorAppUi::ShowPopupNoteL( TBool aMms )
{
if( iPopupNote )
{
iPopupNote->SetTextL( aMms? iPopupChangedMmsBuffer->Des():
iPopupChangedSmsBuffer->Des() );
iPopupNote->ShowInfoPopupNote();
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::PlayFocusedItemL
// ---------------------------------------------------------
//
void CUniEditorAppUi::PlayFocusedItemL()
{
if ( Document()->DataModel()->SmilType() == E3GPPSmil ||
Document()->DataModel()->SmilType() == ETemplateSmil )
{
// There's presentation focused -> play it
PlayPresentationL();
return;
}
CMsgBaseControl* ctrl = iView->FocusedControl();
TUniRegion region = EUniRegionImage;
if ( ctrl )
{
switch ( ctrl->ControlId() )
{
case EMsgComponentIdAudio:
{
region = EUniRegionAudio;
}
case EMsgComponentIdImage:
case EMsgComponentIdVideo:
case EMsgComponentIdSvg:
{
CUniObject* obj = iSmilModel->GetObject( Document()->CurrentSlide(), region );
// Coverty fix, Null pointer return , http://ousrv057/cov.cgi?cid=37100
if(obj)
{
if( obj->Corrupted() )
{ // Object is corrupt -> just show note
ShowInformationNoteL( R_UNIEDITOR_CANNOT_OPEN_CORRUPT, EFalse );
}
else
{
RFile file = CUniDataUtils::GetAttachmentFileL( Document()->DataModel()->Mtm(), obj->AttachmentId() );
CleanupClosePushL( file );
TDataType dataType( obj->MimeType() );
if ( !iDocHandler )
{
iDocHandler = CDocumentHandler::NewL( iEikonEnv->Process() );
iDocHandler->SetExitObserver( this );
}
if ( obj->DrmInfo() )
{
obj->DrmInfo()->ReleaseRights();
}
// Since Activating input blockers will block the command CEIkCmdEXit. So used the flag
//ActivateInputBlockerL( NULL );
iEditorFlags |= EMsgEditInProgress;
TRAPD(ret,iDocHandler->OpenFileEmbeddedL( file, dataType ));
CleanupStack::PopAndDestroy( &file );
if(ret != KErrNone)
{
iEditorFlags &= ~EMsgEditInProgress;
// DeactivateInputBlocker();
}
}
}
break;
}
default:
{
break;
}
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::CheckMaxSmsSizeAndShowNoteL
// ---------------------------------------------------------
//
void CUniEditorAppUi::CheckMaxSmsSizeAndShowNoteL( TBool aSendCheck /*= EFalse*/ )
{
CUniEditorDocument* doc = Document();
if( !aSendCheck )
{
if( !IsHardcodedSms() )
{ // Just return
iEditorFlags &= ~EMaxSmsSizeNoteShown;
return;
}
}
else
{
if( Document()->UniState() != EUniSms )
{ // UniState is MMS -> just return
iEditorFlags &= ~EMaxSmsSizeNoteShown;
return;
}
}
TInt lengthOne( 0 );
TInt lengthMany( 0 );
doc->SmsCharacterLimits( lengthOne, lengthMany );
TInt maxLen = lengthOne;
if( doc->AbsoluteMaxSmsParts() > 1 )
{
maxLen = doc->AbsoluteMaxSmsParts()*lengthMany;
}
if ( doc->AbsoluteMaxSmsCharacters() > 0 )
{
maxLen = doc->AbsoluteMaxSmsCharacters();
}
TInt totalLen = iSmsBodyLength + iSmsSubjectLength;
if( doc->EmailOverSmsSupported() )
{
// This length is needed by recipient and subject separator chars
TInt separatorLen = 0;
TInt emailAddrLen = iHeader->LongestEmailAddress();
if( emailAddrLen )
{
separatorLen++; // one extra char needed by separator char
}
totalLen += emailAddrLen + separatorLen;
}
if( totalLen <= maxLen-1 )
{ // Length is under the max size -> just return
iEditorFlags &= ~EMaxSmsSizeNoteShown;
return;
}
if( !aSendCheck && iEditorFlags & EMaxSmsSizeNoteShown )
{ // The note has been shown -> just return
return;
}
iEditorFlags |= EMaxSmsSizeNoteShown;
if( totalLen == maxLen )
{
if( aSendCheck )
{ // SMS is max length so it can still be sent
iEditorFlags &= ~EMaxSmsSizeNoteShown;
return;
}
else
{
if( iEditorFlags & EShowSmsSizeNoteNextTime )
{
// Show "Cannot add text"
ShowConfirmableInfoL( R_UNIEDITOR_SMS_LENGTH_EXCEEDED );
// We remove this flag already now
iEditorFlags &= ~EShowSmsSizeNoteNextTime;
}
else
{
// Show the note next time
iEditorFlags |= EShowSmsSizeNoteNextTime;
// Remove this as it's not shown already
iEditorFlags &= ~EMaxSmsSizeNoteShown;
}
}
}
else if( totalLen == maxLen+1 )
{ // Show "Cannot send. Remove 1"
ShowConfirmableInfoL( R_UNIEDITOR_SMS_LENGTH_EXCEEDED_1 );
}
else
{ // Show "Cannot send. Remove N"
if( doc->UnicodeCharacterMode() )
{
ShowConfirmableInfoL( R_UNIEDITOR_SMS_LENGTH_EXCEEDED_MANY_UNICODE );
}
else
{
TInt howMany = totalLen - maxLen;
HBufC* warningString =
StringLoader::LoadLC( R_UNIEDITOR_SMS_LENGTH_EXCEEDED_MANY, howMany, iCoeEnv );
ShowConfirmableInfoL( *warningString );
CleanupStack::PopAndDestroy( warningString );
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::SetOrRemoveMaxSizeInEdwin
// ---------------------------------------------------------
//
void CUniEditorAppUi::SetOrRemoveMaxSizeInEdwin()
{
CUniEditorDocument* doc = Document();
if( !IsHardcodedSms() )
{
// No max limit so set the max TInt
if( BodyCtrlEditor() )
{
BodyCtrlEditor()->SetTextLimit( KMaxTInt );
}
return;
}
// OK, message type is SMS
TInt lengthOne( 0 );
TInt lengthMany( 0 );
doc->SmsCharacterLimits( lengthOne, lengthMany );
TInt maxLen = lengthOne;
if( doc->AbsoluteMaxSmsParts() > 1 )
{
maxLen = doc->AbsoluteMaxSmsParts()*lengthMany;
}
if ( doc->AbsoluteMaxSmsCharacters() > 0 )
{
maxLen = doc->AbsoluteMaxSmsCharacters();
}
CEikEdwin* bodyEd = BodyCtrlEditor();
CEikEdwin* subjEd = SubjectCtrlEditor();
if( !bodyEd )
{
// There's no body editor available -> just return
return;
}
// This length is needed by recipient and subject separator chars
TInt separatorLen = 0;
TInt emailAddrLen = iHeader->LongestEmailAddress();
if( emailAddrLen )
{
separatorLen++; // one extra char needed by separator char
}
// Max subject length is maxLen decreased by longest email address and body length
TInt maxSubjectLen = maxLen - emailAddrLen - iSmsBodyLength - separatorLen;
if( maxSubjectLen > KUniEdMaxSubjectLen )
{
maxSubjectLen = KUniEdMaxSubjectLen;
}
// Max body length is maxLen decreased by longest email address and subject length
TInt maxBodyLen = maxLen - emailAddrLen - iSmsSubjectLength - separatorLen;
if( bodyEd->TextLength() > maxBodyLen )
{
// If there's already too long body field -> increase the limit to avoid panic in edwin
maxBodyLen = bodyEd->TextLength();
}
bodyEd->SetTextLimit( maxBodyLen );
if( subjEd )
{
if( subjEd->TextLength() > maxSubjectLen )
{
// If there's already too long subject field -> increase the limit to avoid panic in edwin
maxSubjectLen = subjEd->TextLength();
}
subjEd->SetTextLimit( maxSubjectLen );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::CheckMaxRecipientsAndShowNoteL
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::CheckMaxRecipientsAndShowNoteL( TBool aSendCheck /*= EFalse*/ )
{
TInt maxRecipients = 0;
CUniEditorDocument* doc = Document();
TUniState state = doc->UniState();
if( IsHardcodedSms() )
{
maxRecipients = doc->MaxSmsRecipients();
}
else
{
maxRecipients = doc->MaxMmsRecipients();
}
TInt recipientCount = 0;
CMsgAddressControl* addrCntrl = ToCtrl();
if( addrCntrl )
{
recipientCount = addrCntrl->GetRecipientsL()->Count();
}
if( state == EUniMms ) // If the current state is mms,
{ // add also possible CC and BCC recipients
addrCntrl = iView->ControlById( EMsgComponentIdCc )?
static_cast<CMsgAddressControl*>(iView->ControlById( EMsgComponentIdCc ) ):NULL;
if( addrCntrl )
{
recipientCount += addrCntrl->GetRecipientsL()->Count();
}
addrCntrl = iView->ControlById( EMsgComponentIdBcc )?
static_cast<CMsgAddressControl*>(iView->ControlById( EMsgComponentIdBcc ) ):NULL;
if( addrCntrl )
{
recipientCount += addrCntrl->GetRecipientsL()->Count();
}
}
if( recipientCount <= maxRecipients )
{ // ok number of recipients
iEditorFlags &= ~EMaxRecipientShown;
return ETrue;
}
/* This is to be removed from UI spec (max recipients reached
if( !aSendCheck )
{
if( iEditorFlags & EMaxRecipientShown )
{ // Note is already shown
return EFalse;
}
if( recipientCount == maxRecipients )
{
ShowConfirmableInfoL( R_UNIEDITOR_MAX_RECIPIENTS_REACHED );
iEditorFlags |= EMaxRecipientShown;
return EFalse;
}
}
if( recipientCount == maxRecipients )
{ // This time aSendCheck is certainly ETrue so no note is needed
return ETrue;
}*/
if( iEditorFlags & EMaxRecipientShown && !aSendCheck )
{ // Note is already shown and this is not send check
return EFalse;
}
iEditorFlags |= EMaxRecipientShown;
TInt waitRes( KErrNotFound );
if ( iWaitDialog )
{
waitRes = iWaitResId;
RemoveWaitNote();
}
if( recipientCount == maxRecipients + 1 )
{
ShowConfirmableInfoL( R_UNIEDITOR_MAX_RECIPIENTS_EXCEEDED_1 );
}
else
{
HBufC* warningString =
StringLoader::LoadLC( R_UNIEDITOR_MAX_RECIPIENTS_EXCEEDED_MANY,
recipientCount - maxRecipients,
iCoeEnv );
ShowConfirmableInfoL( *warningString );
CleanupStack::PopAndDestroy( warningString );
}
if ( waitRes != KErrNotFound )
{
ShowWaitNoteL( waitRes );
}
return EFalse;
}
// ---------------------------------------------------------
// CUniEditorAppUi::UpdateMiddleSoftkeyL
// ---------------------------------------------------------
//
void CUniEditorAppUi::UpdateMiddleSoftkeyL()
{
/* This is just a placeholder so far */
TInt resId = 0;
CMsgBaseControl* ctrl = iView->FocusedControl();
if ( ctrl )
{
switch ( ctrl->ControlId() )
{
case EMsgComponentIdTo:
case EMsgComponentIdCc:
case EMsgComponentIdBcc:
{
if ( TUniMsvEntry::IsMmsUpload( Document()->Entry() ) )
{
break;
}
resId = R_UNI_MSK_BUTTON_ADD;
}
break;
case EMsgComponentIdAttachment:
{
resId = R_UNI_MSK_BUTTON_OBJECTS;
break;
}
case EMsgComponentIdImage:
if ( Document()->DataModel()->SmilType() == E3GPPSmil )
{ // focus is on "no-edit" SMIL icon
resId = R_UNI_MSK_BUTTON_PLAY_PRES;
}
else
{ // ordinary image
resId = R_UNI_MSK_BUTTON_VIEW_IMAGE;
}
break;
case EMsgComponentIdVideo:
{
resId = R_UNI_MSK_BUTTON_PLAY_VIDEO;
break;
}
case EMsgComponentIdAudio:
{
resId = R_UNI_MSK_BUTTON_PLAY_AUDIO;
break;
}
case EMsgComponentIdSvg:
{
resId = R_UNI_MSK_BUTTON_PLAY_SVG;
break;
}
case EMsgComponentIdBody:
{
resId = R_UNI_MSK_BUTTON_CONTEXT_MENU;
MenuBar()->SetContextMenuTitleResourceId( R_UNIEDITOR_CONTEXT_MENUBAR );
break;
}
case EMsgComponentIdSubject:
default:
break;
}
}
if ( resId != iMskResId )
{
const TInt KMskPosition = 3;
CEikButtonGroupContainer* cba = Cba();
if( resId != 0 )
{
cba->SetCommandL( KMskPosition, resId );
}
else
{ // nullify the command
cba->SetCommandL( KMskPosition, 0, KNullDesC() );
}
cba->DrawNow();
iMskResId = resId;
}
return;
}
// ---------------------------------------------------------
// CUniEditorAppUi::SetInputModeToAddressFields
// ---------------------------------------------------------
//
void CUniEditorAppUi::SetInputModeToAddressFields( TInt aInputMode )
{
for (TInt i = CUniEditorHeader::EHeaderAddressTo;
i <= CUniEditorHeader::EHeaderAddressBcc; i++ )
{
if ( iHeader &&
iHeader->AddressControl( static_cast<CUniEditorHeader::THeaderFields> (i) ) )
{
iHeader->AddressControl(
static_cast<CUniEditorHeader::THeaderFields> (i) )
->Editor().SetAknEditorCurrentInputMode( aInputMode );
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoEditMmsPriorityL
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoEditMmsPriorityL()
{
TUniSendingSettings settings;
CUniEditorPlugin* plugin = MmsPlugin();
if( plugin )
{
plugin->GetSendingSettingsL( settings );
}
TInt currentlySelected = 0;
switch( settings.iPriority )
{
case TUniSendingSettings::EUniPriorityNormal:
currentlySelected = 1;
break;
case TUniSendingSettings::EUniPriorityLow:
currentlySelected = 2;
break;
default:
break;
}
// Create listbox
CAknSingleGraphicPopupMenuStyleListBox* listBox = new (ELeave) CAknSingleGraphicPopupMenuStyleListBox;
CleanupStack::PushL( listBox );
// Create popup
CAknPopupList* popup = CAknPopupList::NewL(
listBox,
R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT,
AknPopupLayouts::EMenuGraphicWindow );
CleanupStack::PushL( popup );
// Construct listbox
listBox->ConstructL( popup, CEikListBox::ELeftDownInViewRect );
listBox->CreateScrollBarFrameL( ETrue );
listBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,
CEikScrollBarFrame::EAuto );
// Set title
HBufC* title = StringLoader::LoadLC( R_UNIEDITOR_PRIORITY_TITLE, iCoeEnv );
popup->SetTitleL( title->Des() );
CleanupStack::PopAndDestroy( title );
CAknIconArray* iconArray = RadioButtonArrayL();
listBox->ItemDrawer()->FormattedCellData()->SetIconArray( iconArray ); // FormattedCellData owns
listBox->HandleItemAdditionL();
TResourceReader reader;
iEikonEnv->CreateResourceReaderLC( reader, R_UNI_PRIORITY_LIST );
CDesCArrayFlat* items = new ( ELeave ) CDesCArrayFlat( KSettingsGranularity );
CleanupStack::PushL( items );
// Get the labels from resources
const TInt count = reader.ReadInt16();
for ( TInt loop = 0; loop < count; loop++ )
{
HBufC* label = reader.ReadHBufCL();
CleanupStack::PushL( label );
TPtr pLabel = label->Des();
AknTextUtils::DisplayTextLanguageSpecificNumberConversion( pLabel );
TBuf<20> itemString;
if( currentlySelected == loop )
{ // This one is selected
itemString.AppendNum( 1 );
}
else
{
itemString.AppendNum( 0 );
}
itemString.Append( _L("\t") );
itemString.Append( pLabel );
items->AppendL( itemString );
CleanupStack::PopAndDestroy( label );
label = NULL;
}
CTextListBoxModel* model = listBox->Model();
model->SetItemTextArray( items );
model->SetOwnershipType( ELbmOwnsItemArray );
CleanupStack::Pop( items ); // model owns it now
CleanupStack::PopAndDestroy(); // reader
listBox->SetCurrentItemIndexAndDraw( currentlySelected );
TInt result = popup->ExecuteLD();
if( result )
{
// OK, user chose the priority bit
switch( listBox->CurrentItemIndex() )
{
case 0:
{
settings.iPriority = TUniSendingSettings::EUniPriorityHigh;
break;
}
case 1:
{
settings.iPriority = TUniSendingSettings::EUniPriorityNormal;
break;
}
default:
{
settings.iPriority = TUniSendingSettings::EUniPriorityLow;
break;
}
}
if( plugin )
{
plugin->SetSendingSettingsL( settings );
}
UpdateIndicatorIconsL();
}
CleanupStack::Pop(); // for popup
CleanupStack::PopAndDestroy( listBox );
}
// ---------------------------------------------------------
// CUniEditorAppUi::RadioButtonArrayL
// ---------------------------------------------------------
//
CAknIconArray* CUniEditorAppUi::RadioButtonArrayL()
{
TFileName* fileName = new( ELeave ) TFileName;
CleanupStack::PushL( fileName );
fileName->Copy( KAvkonBitmapFile );
CAknIconArray* iconArray = new (ELeave) CAknIconArray( 2 );
CleanupStack::PushL( iconArray );
CFbsBitmap* bitmap = NULL;
CFbsBitmap* mask = NULL;
CGulIcon* icon = NULL;
TAknsItemID skinId = KAknsIIDQgnPropRadiobuttOff;
TInt bitmapId = EMbmAvkonQgn_prop_radiobutt_off;
AknsUtils::CreateIconL( AknsUtils::SkinInstance(),
skinId,
bitmap,
mask,
*fileName,
bitmapId,
bitmapId+1 );
CleanupStack::PushL( bitmap );
CleanupStack::PushL( mask );
icon = CGulIcon::NewL( bitmap, mask );
CleanupStack::Pop( 2, bitmap );
CleanupStack::PushL( icon );
iconArray->AppendL( icon );
CleanupStack::Pop(); // icon
skinId = KAknsIIDQgnPropRadiobuttOn;
bitmapId = EMbmAvkonQgn_prop_radiobutt_on;
AknsUtils::CreateIconL( AknsUtils::SkinInstance(),
skinId,
bitmap,
mask,
*fileName,
bitmapId,
bitmapId+1 );
CleanupStack::PushL( bitmap );
CleanupStack::PushL( mask );
icon = CGulIcon::NewL( bitmap, mask );
CleanupStack::Pop( 2 );
CleanupStack::PushL( icon );
iconArray->AppendL( icon );
CleanupStack::Pop(); // icon
CleanupStack::Pop( iconArray );
CleanupStack::PopAndDestroy( fileName );
return iconArray;
}
// ---------------------------------------------------------
// CUniEditorAppUi::ConfirmSmsSendInMultiplePartsL
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::ConfirmSmsSendInMultiplePartsL()
{
// If it's variated off -> return ETrue
if( !( iEditorFlags & EShowSmsSentInManyParts ) )
{
return ETrue;
}
CUniEditorDocument* doc = Document();
TInt lengthOne( 0 );
TInt lengthMany( 0 );
doc->SmsCharacterLimits( lengthOne, lengthMany );
TInt totalLen = iSmsBodyLength + iSmsSubjectLength;
if ( doc->EmailOverSmsSupported() )
{
// This length is needed by recipient and subject separator chars
TInt separatorLen = 0;
TInt emailAddrLen = iHeader->LongestEmailAddress();
if( emailAddrLen )
{
separatorLen++; // one extra char needed by separator char
}
totalLen += emailAddrLen + separatorLen;
}
if( totalLen <= lengthOne )
{ // All fits in one message -> return ETrue
return ETrue;
}
TInt messages = totalLen/lengthMany;
if( totalLen%lengthMany )
{ // If remainder is not zero -> add one
messages++;
}
HBufC* qry = StringLoader::LoadLC( R_UNIEDITOR_SMS_SEND_MULTIPLE_PARTS, messages );
if( ShowConfirmationNoQuestionQueryL( *qry ) )
{
CleanupStack::PopAndDestroy( qry );
return ETrue;
}
CleanupStack::PopAndDestroy( qry );
return EFalse;
}
// ---------------------------------------------------------
// CUniEditorAppUi::SetTitleIconsSizeL
//
// Sets the correct size from LAF for title MMS & SMS title icons
// ---------------------------------------------------------
//
void CUniEditorAppUi::SetTitleIconsSizeL()
{
SetTitleIconSizeL( iIconSms->Bitmap() );
SetTitleIconSizeL( iIconMms->Bitmap() );
}
// ---------------------------------------------------------
// CUniEditorAppUi::AcceptEmailAddresses
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::AcceptEmailAddresses()
{
TBool retVal = ETrue;
if( IsHardcodedSms() && !Document()->EmailOverSmsSupported() )
{ // We are in locked SMS mode and no email over sms -> accept only numbers
retVal = EFalse;
}
return retVal;
}
// ---------------------------------------------------------
// CUniEditorAppUi::IsHardcodedSms
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::IsHardcodedSms()
{
TBool hardSms = EFalse;
if( iMtm->MessageTypeLocking() == EUniMessageTypeLocked )
{ // the message type is pre-locked
if( iMtm->MessageTypeSetting() == EUniMessageTypeSettingSms )
{ // to sms
hardSms = ETrue;
}
}
else if( iMtm->MessageTypeSetting() == EUniMessageTypeSettingSms )
{ // message is not pre-locked, but manually locked to sms
hardSms = ETrue;
}
return hardSms;
}
// ---------------------------------------------------------
// CUniEditorAppUi::ResolveLaunchFocusedControlL
//
// Resolves the control id of control that should be focused after
// launch. Normal case is that first existing and empty control from To, Subject,
// body text control and image control is focused in this order.
//
// Exeptions to this is:
//
// Reply -> Body text field always focused.
// Locked SMS with vCard/vCal -> To address field always focused.
// ---------------------------------------------------------
//
TMsgControlId CUniEditorAppUi::ResolveLaunchFocusedControlL()
{
TMsgControlId result = EMsgComponentIdNull;
if ( Document()->MessageType() == EUniReply )
{
result = EMsgComponentIdBody;
}
else if ( iEditorFlags & ELockedSmsWithAtta )
{
result = EMsgComponentIdTo;
}
else
{
CMsgAddressControl* toControl = ToCtrl();
if ( toControl &&
toControl->GetRecipientsL()->Count() == 0 )
{
result = EMsgComponentIdTo;
}
else
{
if ( iSupportedFeatures & EUniFeatureSubject )
{
CMsgExpandableControl* subj = SubjectCtrl();
if ( subj &&
subj->TextContent().DocumentLength() == 0 )
{
result = EMsgComponentIdSubject;
}
}
if ( result == EMsgComponentIdNull )
{
if ( BodyCtrl() )
{
result = EMsgComponentIdBody;
}
else if ( ImageCtrl() )
{
result = EMsgComponentIdImage;
}
}
}
}
return result;
}
// ---------------------------------------------------------
// CUniEditorAppUi::SetMessageTypeLockingL
// ---------------------------------------------------------
//
void CUniEditorAppUi::SetMessageTypeLockingL()
{
if ( SmsPlugin() && !MmsPlugin() )
{
// Sms found, no mms
iMtm->SetMessageTypeSetting( EUniMessageTypeSettingSms );
iMtm->SetMessageTypeLocking( EUniMessageTypeLocked );
}
else if ( !SmsPlugin() && MmsPlugin() )
{
// Mms found, no sms
iMtm->SetMessageTypeSetting( EUniMessageTypeSettingMms );
iMtm->SetMessageTypeLocking( EUniMessageTypeLocked );
}
else
{
// If we are here, both sms and mms exist
if ( TUniMsvEntry::IsMmsUpload( Document()->Entry() ) )
{
// If opening upload message -> lock is as mms
iMtm->SetMessageTypeSetting( EUniMessageTypeSettingMms );
iMtm->SetMessageTypeLocking( EUniMessageTypeLocked );
}
else
{
if ( iMtm->MessageTypeLocking() == EUniMessageTypeLockingNotSet )
{
// It's not yet set -> check the settings of SMS conversion
iMtm->SetMessageTypeLocking( EUniMessageTypeNotLocked );
TUniSendingSettings settings;
SmsPlugin()->GetSendingSettingsL( settings );
if ( settings.iMessageType == TUniSendingSettings::EUniMessageTypeFax ||
settings.iMessageType == TUniSendingSettings::EUniMessageTypePaging )
{
// It's temporary locked to sms sub type (fax or pager)
iMtm->SetMessageTypeSetting( EUniMessageTypeSettingSms );
}
else
{
// Otherwise set it to automatic
iMtm->SetMessageTypeSetting( EUniMessageTypeSettingAutomatic );
}
}
}
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::ActivateInputBlockerL
// ---------------------------------------------------------
//
void CUniEditorAppUi::ActivateInputBlockerL( CActive* aActiveObjectToCancel )
{
delete iInputBlocker;
iInputBlocker = NULL;
iInputBlocker = CAknInputBlock::NewLC();
CleanupStack::Pop( iInputBlocker );
if ( aActiveObjectToCancel )
{
iInputBlocker->SetCancelActive( aActiveObjectToCancel );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DeactivateInputBlocker
// ---------------------------------------------------------
//
void CUniEditorAppUi::DeactivateInputBlocker()
{
if ( iInputBlocker )
{
iInputBlocker->SetCancelActive( NULL );
delete iInputBlocker;
iInputBlocker = NULL;
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::UpdateToolbarL
// ---------------------------------------------------------
//
void CUniEditorAppUi::UpdateToolbarL()
{
if ( iFixedToolbar && !iFixedToolbar->IsDimmed() )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarSend, EFalse, EFalse );
if ( TUniMsvEntry::IsMmsUpload( Document()->Entry() ) )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarAddRecipient, ETrue, EFalse );
}
else
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarAddRecipient, EFalse, EFalse );
}
if ( IsHardcodedSms() ||
( Document()->UniState() == EUniMms &&
Document()->DataModel()->SmilType() != EMmsSmil ) )
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, ETrue, EFalse );
}
else
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, EFalse, EFalse );
}
iFixedToolbar->DrawNow();
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::CheckLockedSmsWithAttaL
//
// Checks whether message is on locked SMS state with single
// vCard or vCal attachment. In this state text is not allowed
// to be entered into message. First performs state detection.
// If we are on locked SMS with attachment state focus is
// moved away from subject or body control. Then both subject and
// body text controls are removed. If we are not in locked SMS
// with attachment state subject and body text ccontrol are added
// if appropriate (i.e. they have been removed due to locked SMS
// with attachment state and has not yet been added).
// ---------------------------------------------------------
//
void CUniEditorAppUi::CheckLockedSmsWithAttaL()
{
CUniDataModel* model = Document()->DataModel();
TBool lockedSmsWithAtta( EFalse );
if ( IsHardcodedSms() &&
model->AttachmentList().Count() == 1 )
{
CUniObject* obj = model->AttachmentList().GetByIndex( 0 );
if ( obj &&
obj->MimeType().Length() > 0 &&
( obj->MimeType().CompareF( KMsgMimeVCard ) == 0 ||
#if defined (__I_CAL_SUPPORT) && defined (RD_MESSAGING_ICAL_IMPORT)
obj->MimeType().CompareF( KMsgMimeICal ) == 0 ||
#endif
obj->MimeType().CompareF( KMsgMimeVCal ) == 0 ) )
{
lockedSmsWithAtta = ETrue;
}
}
if ( lockedSmsWithAtta )
{
iEditorFlags |= ELockedSmsWithAtta;
CMsgBaseControl* focusedCtrl = iView->FocusedControl();
if ( focusedCtrl &&
( focusedCtrl->ControlId() == EMsgComponentIdSubject ||
focusedCtrl->ControlId() == EMsgComponentIdBody ) )
{
iView->SetFocus( EMsgComponentIdTo );
}
if ( iEditorFlags & ESubjectOkInSms &&
SubjectCtrl() )
{
iHeader->AddHeadersDeleteL( EUniFeatureSubject, EFalse );
}
if ( !iStoredBodyControl )
{
iStoredBodyControl = iView->RemoveControlL( EMsgComponentIdBody );
}
}
else
{
if ( iEditorFlags & ELockedSmsWithAtta )
{
if ( iEditorFlags & ESubjectOkInSms &&
!SubjectCtrl() )
{
// Determine if subject field is needed if subject is ok in SMS
// and there is no subject field.
TInt headersVariation = iHeader->AddHeadersVariation();
TInt headerConfig = iHeader->AddHeadersConfigL();
if ( !( headersVariation & EUniFeatureSubjectConfigurable ) ||
( headersVariation & EUniFeatureSubject &&
headerConfig & EUniFeatureSubject ) )
{
// Insert subject to SMS if it is always visible or selected
// and configured on.
iHeader->AddHeadersAddL( EUniFeatureSubject );
}
}
if ( iStoredBodyControl )
{
iView->AddControlL( iStoredBodyControl, EMsgComponentIdBody, EMsgFirstControl, EMsgBody );
iStoredBodyControl = NULL;
}
}
iEditorFlags &= ~ELockedSmsWithAtta;
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::SetFixedToolbarDimmed
// ---------------------------------------------------------
//
void CUniEditorAppUi::SetFixedToolbarDimmed()
{
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarSend, ETrue, ETrue );
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarAddRecipient, ETrue, ETrue );
iFixedToolbar->SetItemDimmed( EUniCmdFixedToolbarInsert, ETrue, ETrue );
}
// ---------------------------------------------------------
// CUniEditorAppUi::EnableFixedToolbar
// ---------------------------------------------------------
//
void CUniEditorAppUi::EnableFixedToolbar( TAny* aAny )
{
static_cast<CUniEditorAppUi*>( aAny )->DoEnableFixedToolbar();
}
// ---------------------------------------------------------
// CUniEditorAppUi::UpdateFixedToolbar
// ---------------------------------------------------------
//
void CUniEditorAppUi::UpdateFixedToolbar( TAny* aAny )
{
static_cast<CUniEditorAppUi*>( aAny )->DoUpdateFixedToolbar();
}
// ---------------------------------------------------------
// CUniEditorAppUi::DisableSendKey
// ---------------------------------------------------------
//
void CUniEditorAppUi::DisableSendKey(TAny* aAny)
{
static_cast<CUniEditorAppUi*>( aAny )->SetKeyEventFlags( EDisableSendKeyShort | EDisableSendKeyLong );
}
// CUniEditorAppUi::CreateFixedToolbarL
// ---------------------------------------------------------
//
void CUniEditorAppUi::CreateFixedToolbarL( TBool aSetDimmed )
{
#ifdef RD_SCALABLE_UI_V2
if ( AknLayoutUtils::PenEnabled() )
{
if ( !iFixedToolbar )
{
iFixedToolbar = CAknToolbar::NewL( R_UNIEDITOR_TOOLBAR );
iFixedToolbar->SetToolbarObserver( this );
if ( aSetDimmed )
{
SetFixedToolbarDimmed();
}
if ( !( iEditorFlags & EToolbarHidden ) )
{
iFixedToolbar->SetToolbarVisibility( ETrue, EFalse );
}
}
CEikAppUiFactory* appUiFactory = static_cast<CEikAppUiFactory*>( iEikonEnv->AppUiFactory() );
CAknToolbar* oldFixedToolbar = appUiFactory->CurrentFixedToolbar();
if ( oldFixedToolbar != iFixedToolbar )
{
oldFixedToolbar->HideItemsAndDrawOnlyBackground( ETrue );
appUiFactory->SetViewFixedToolbar( iFixedToolbar );
}
}
else
{
static_cast<CEikAppUiFactory*>( iEikonEnv->AppUiFactory() )->SetViewFixedToolbar( NULL );
delete iFixedToolbar;
iFixedToolbar = NULL;
}
#endif // RD_SCALABLE_UI_V2
}
// ---------------------------------------------------------
// CUniEditorAppUi::SetExtensionButtonDimmed
// ---------------------------------------------------------
//
void CUniEditorAppUi::SetExtensionButtonDimmed( CAknToolbarExtension* aExtension,
TInt aButtonId,
TBool aDimmed )
{
CAknButton* buttonControl = static_cast<CAknButton*>( aExtension->ControlOrNull( aButtonId ) );
if ( buttonControl &&
buttonControl->IsDimmed() != aDimmed )
{
buttonControl->SetDimmed( aDimmed );
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoEnableFixedToolbar
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoEnableFixedToolbar()
{
if ( iFixedToolbar )
{
iFixedToolbar->HideItemsAndDrawOnlyBackground( EFalse );
}
iEditorFlags &= ~EToolbarHidden;
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoUpdateFixedToolbar
// Update the Toolbar which was dimmed while launching
// the Dialog
// ---------------------------------------------------------
//
void CUniEditorAppUi::DoUpdateFixedToolbar()
{
TRAP_IGNORE(UpdateToolbarL());
}
// ---------------------------------------------------------
// CUniEditorAppUi::DoEnterKeyL
//
// Performs a special handling for enter key when certain control is
// focused. Enter key presses are mapped to selection key presses in
// thse controls.
// ---------------------------------------------------------
//
TBool CUniEditorAppUi::DoEnterKeyL()
{
TBool result( EFalse );
CMsgBaseControl* ctrl = iView->FocusedControl();
if ( ctrl )
{
switch ( ctrl->ControlId() )
{
case EMsgComponentIdAttachment:
case EMsgComponentIdImage:
case EMsgComponentIdVideo:
case EMsgComponentIdAudio:
case EMsgComponentIdSvg:
{
DoSelectionKeyL();
result = ETrue;
break;
}
default:
{
break;
}
}
}
return result;
}
// ---------------------------------------------------------
// CUniEditorAppUi::HandleNotifyInt
// ---------------------------------------------------------
//
void CUniEditorAppUi::HandleNotifyInt( TUint32 /*aId*/, TInt /*aNewValue*/ )
{
if( iNLTFeatureSupport )
{
//Turkish SMS-PREQ2265 specific
//Get the new lang id and corresponding alternative encoding if any
CUniEditorDocument *doc = Document();
TInt inputLang;
//Update the setting cache, so that new language id is returned correctly
iAvkonEnv->SettingCache().Update(KEikInputLanguageChange);
inputLang = iAvkonEnv->SettingCache().InputLanguage();
iSettingsChanged = ETrue;
TSmsEncoding alternateEncoding = doc->GetLanguageSpecificAltEncodingType(inputLang);
doc->SetAlternativeEncodingType(alternateEncoding);
//Reset unicode mode to False and set the corresponding language alternative encoding type accordingly
if(doc->SmsPlugin())
{
doc->SmsPlugin()->SetEncodingSettings(EFalse, alternateEncoding, doc->CharSetSupport());
}
}
//TODO :: Should add check size and show note???
TRAP_IGNORE(
{
CheckSmsSizeAndUnicodeL();
MsgLengthToNavipaneL();
} );
}
#ifdef RD_SCALABLE_UI_V2
// ---------------------------------------------------------
// CUniEditorAppUi::OnPeninputUiActivated
// ---------------------------------------------------------
//
void CUniEditorAppUi::OnPeninputUiActivated()
{
TRAP_IGNORE( SmsMsgLenToPenInputL() );
}
// ---------------------------------------------------------
// CUniEditorAppUi::OnPeninputUiDeactivated
// ---------------------------------------------------------
//
void CUniEditorAppUi::OnPeninputUiDeactivated()
{
if (AknLayoutUtils::PenEnabled() )
{
iPeninputServer.UpdateAppInfo( KNullDesC, EAppIndicatorMsg );
}
}
#else
// ---------------------------------------------------------
// CUniEditorAppUi::OnPeninputUiActivated
// ---------------------------------------------------------
//
void CUniEditorAppUi::OnPeninputUiActivated()
{
}
// ---------------------------------------------------------
// CUniEditorAppUi::OnPeninputUiDeactivated
// ---------------------------------------------------------
//
void CUniEditorAppUi::OnPeninputUiDeactivated()
{
}
#endif
// ---------------------------------------------------------
// CUniEditorAppUi::SmsMsgLenToPenInputL
// ---------------------------------------------------------
//
void CUniEditorAppUi::SmsMsgLenToPenInputL()
{
CMsgBaseControl* ctrl = iView->FocusedControl();
CUniEditorDocument* doc = Document();
if ( doc->UniState() == EUniSms && ctrl && iMsgLenToVKB)
{
if ( UpdateMsgLenToPenInput() )
{
MsgLengthToNavipaneL( ETrue );
}
}
else
{
if (AknLayoutUtils::PenEnabled() )
{
iPeninputServer.UpdateAppInfo( KNullDesC, EAppIndicatorMsg );
}
}
}
TBool CUniEditorAppUi::UpdateMsgLenToPenInput()
{
CMsgBaseControl* ctrl = iView->FocusedControl();
if ( ctrl->ControlId() == EMsgComponentIdBody ||
( ctrl->ControlId() == EMsgComponentIdSubject && iEditorFlags & ESubjectOkInSms ) )
{
return ETrue;
}
else
{
return EFalse;
}
}
// ---------------------------------------------------------
// CUniEditorAppUi::ExitWithoutSave
// Exits from the Unified Editor whne there is not sufficient memory to continue
// ---------------------------------------------------------
//
void CUniEditorAppUi::ExitWithoutSave()
{
DeactivateInputBlocker();
EndActiveWait();
RemoveWaitNote();
TRAP_IGNORE(ShowConfirmableInfoL( R_UNIEDITOR_NOT_ENOUGH_MEMORY));
Exit( EAknSoftkeyClose );
}
// ---------------------------------------------------------
// CUniEditorAppUi::HandleLongTapEventL
// Function for handling the long tap events
// ---------------------------------------------------------
//
void CUniEditorAppUi::HandleLongTapEventL(const TPoint& aPenEventLocation,
const TPoint& aPenEventScreenLocation )
{
CMsgBaseControl* ctrl = iView->FocusedControl(); // ctrl can be NULL.
if ( ctrl &&
( ctrl->ControlId() == EMsgComponentIdAudio ||
ctrl->ControlId() == EMsgComponentIdImage ||
ctrl->ControlId() == EMsgComponentIdVideo ||
ctrl->ControlId() == EMsgComponentIdSvg ) )
{
TRect rect = ctrl->Rect();
if ((!iTapConsumed)&&rect.Contains(aPenEventLocation))
{
if (iEmbeddedObjectStylusPopup)
{
delete iEmbeddedObjectStylusPopup;
iEmbeddedObjectStylusPopup = NULL;
}
iEmbeddedObjectStylusPopup = CAknStylusPopUpMenu::NewL(this,aPenEventLocation);
TResourceReader reader;
iCoeEnv->CreateResourceReaderLC(reader,R_UNIEDITOR_EMBEDDED_OBJECT_STYLUS_MENU );
iEmbeddedObjectStylusPopup->ConstructFromResourceL(reader);
CleanupStack::PopAndDestroy();
iEmbeddedObjectStylusPopup->SetPosition(aPenEventLocation);
iEmbeddedObjectStylusPopup->ShowMenu();
iTapConsumed = ETrue;
}
}
}
// End of file