diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mrguicommon/src/cesmrconfirmationquery.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrguicommon/src/cesmrconfirmationquery.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -0,0 +1,337 @@ +/* +* Copyright (c) 2002-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: Class is responsible of showing confirmation queries +* +*/ + +// INCLUDE FILES +#include "emailtrace.h" +#include "cesmrconfirmationquery.h" + +// +#include "esmrdef.h" +// +#include +#include +#include +#include +#include +#include +#include +#include //line wrapping and mirroring +#include //xml layout data for applications +#include //xml layout data of avkon components +#include "esmrhelper.h"//locateresourcefile + +// Unnamed namespace for local definitions +namespace { + +#ifdef _DEBUG + +// Definition for panic text +_LIT( KESMRConfirmationQueryPanicTxt, "ESMRConfirmationQueryPanic" ); + +/** Panic code enumaration */ +enum TESMRConfirmationQueryPanic + { + EESMRInvalidIdentifier = 0 // Invalid identifier + }; + +void Panic( TESMRConfirmationQueryPanic aPanic ) + { + User::Panic( KESMRConfirmationQueryPanicTxt, aPanic ); + } + +#endif + +_LIT(KResourceFileName,"esmrgui.rsc"); + +const TInt KVariantIndex(2); //a LAF variant value required for pop up window +const TInt KRequiredLinesPlus(2); //minimum lines needed for aknbiditextutils API array set up +const TInt KActualLine(0); //minimum lines needed for aknbiditextutils API array set up +const TInt KDummyLineForcedByAPI(1); //minimum lines needed for aknbiditextutils API array set up +} // namespace + +// ======== MEMBER FUNCTIONS ======== + +// ----------------------------------------------------------------------------- +// CESMRConfirmationQuery::CESMRConfirmationQuery +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CESMRConfirmationQuery::CESMRConfirmationQuery( + TESMRConfirmationQueryType aType) : + iType(aType) + { + FUNC_LOG; + //do nothing + } + +// ----------------------------------------------------------------------------- +// CESMRConfirmationQuery::~CESMRConfirmationQuery +// ----------------------------------------------------------------------------- +// +CESMRConfirmationQuery::~CESMRConfirmationQuery() + { + FUNC_LOG; + iEnv->DeleteResourceFile(iResourceOffset); + } + +// ----------------------------------------------------------------------------- +// CESMRConfirmationQuery::ConstructL +// ----------------------------------------------------------------------------- +// +void CESMRConfirmationQuery::ConstructL() + { + FUNC_LOG; + TFileName filename; + + //cache the Eikon pointer, as Static() is slow + iEnv = CEikonEnv::Static(); // codescanner::eikonenvstatic + + ESMRHelper::LocateResourceFile( + KResourceFileName, + KDC_RESOURCE_FILES_DIR, + filename, + &iEnv->FsSession() ); + + //for localization + BaflUtils::NearestLanguageFile(iEnv->FsSession(),filename); + iResourceOffset = iEnv->AddResourceFileL(filename); + } + +// ----------------------------------------------------------------------------- +// CESMRConfirmationQuery::ExecuteLD +// ----------------------------------------------------------------------------- +// +TBool CESMRConfirmationQuery::ExecuteLD() + { + FUNC_LOG; + HBufC* noteText = NULL; + switch ( iType ) + { + case EESMRDeleteMR: + { + noteText = + iEnv->AllocReadResourceAsDes16LC( + R_QTN_MEET_REQ_DELETE_QUERY); + break; + } + case EESMRSendCancellationInfoToParticipants: + { + noteText = + iEnv->AllocReadResourceAsDes16LC( + R_QTN_MEET_REQ_SEND_CANCELLATION_QUERY); + break; + } + case EESMRRemoveAppointment: + { + noteText = + iEnv->AllocReadResourceAsDes16LC( + R_QTN_MEET_REQ_REMOVE_APPOINTMENT_QUERY); + break; + } + case EESMRSaveChanges: + { + noteText = + iEnv->AllocReadResourceAsDes16LC( + R_QTN_FORM_QUEST_SAVE_CHANGES); + break; + } + case EESMRDeleteEntry: + { + noteText = + iEnv->AllocReadResourceAsDes16LC( + R_QTN_CALENDAR_OPT_DELETE_ENTRY); + break; + } + case EESMRSendDecline: + { + noteText = + iEnv->AllocReadResourceAsDes16LC( + R_QTN_MEET_REQ_DECLINE_QUERY ); + } + break; + case EESMRSaveAnnivChangedStartDay: + { + noteText = + iEnv->AllocReadResourceAsDes16LC( + R_QTN_MEET_REQ_QUEST_CHANGE_START_DAY ); + } + break; + case EESMRAttachments: + { + noteText = + iEnv->AllocReadResourceAsDes16LC( + R_QTN_MEET_REQ_NOTE_ATTACHMENTS ); + } + break; + case EESMRSaveMeetingChangedStartDay: + { + noteText = + iEnv->AllocReadResourceAsDes16LC( + R_QTN_MEET_REQ_QUEST_CHANGE_START_DAY ); + } + break; + case EESMRAssignUpdatedLocation: + { + noteText = + iEnv->AllocReadResourceAsDes16LC( + R_QTN_MEET_REQ_ASSIGN_UPDATED_LOCATION ); + } + break; + case EESMRAttachmentsNotSupported: + { + noteText = + iEnv->AllocReadResourceAsDes16LC( + R_QTN_MEET_REQ_NOTE_ATTACHMENTS_NOT_SUPPORTED ); + } + break; + default: + { + #ifdef _DEBUG + // Invalid identifier --> panic + Panic( EESMRInvalidIdentifier ); + #endif + } + break; + } + + TBool response(EFalse); + if ( noteText ) + { + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + if( dlg->ExecuteLD(R_MR_CONFIRMATION_QUERY, *noteText) ) + { + response = ETrue; + } + CleanupStack::PopAndDestroy(noteText); + } + + delete this; + return response; + } + +// ----------------------------------------------------------------------------- +// CESMRConfirmationQuery::ExecuteL +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CESMRConfirmationQuery::ExecuteL( TESMRConfirmationQueryType aType) + { + FUNC_LOG; + CESMRConfirmationQuery* query = new (ELeave) CESMRConfirmationQuery(aType); + CleanupStack::PushL( query ); + query->ConstructL( ); + TBool ret = query->ExecuteLD(); + CleanupStack::Pop( query ); + return ret; + } + +// ----------------------------------------------------------------------------- +// CESMRConfirmationQuery::ExecuteL +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CESMRConfirmationQuery::ExecuteL( const TDesC& aLocation ) + { + FUNC_LOG; + CESMRConfirmationQuery* query = new (ELeave) CESMRConfirmationQuery(EESMRDeleteMR); + CleanupStack::PushL( query ); + query->ConstructL( ); + + HBufC* location = NULL; + + if ( aLocation.Length() > 0 ) + { + location = query->TruncateTextToLAFNoteL( aLocation ); + CleanupDeletePushL( location ); + } + else + { + // Allocate dummy buffer for query. + location = aLocation.AllocLC(); + } + + HBufC* noteText = StringLoader::LoadLC( R_MEET_REQ_REPLACE_PREVIOUS_LOCATION, *location ); + + TBool response = EFalse; + + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + if( dlg->ExecuteLD( R_MR_CONFIRMATION_QUERY, *noteText) ) + { + response = ETrue; + } + + CleanupStack::PopAndDestroy( noteText ); + CleanupStack::PopAndDestroy( location ); + CleanupStack::Pop( query ); + return response; + } + +// ----------------------------------------------------------------------------- +// CESMRConfirmationQuery::TruncateTextToLAFNoteL +// ----------------------------------------------------------------------------- +// +HBufC* CESMRConfirmationQuery::TruncateTextToLAFNoteL( const TDesC& aLocation ) + { + FUNC_LOG; + //wrap long string into array of individual lines + CArrayFixFlat* textLines = new(ELeave)CArrayFixFlat( KRequiredLinesPlus ); + CleanupStack::PushL( textLines ); + + //layout stuff to fetch list font and list line width + TAknLayoutText fontType; + + TSize main_pane_Size; + AknLayoutUtils::LayoutMetricsSize( AknLayoutUtils::EMainPane, main_pane_Size ); + TRect main_pane( main_pane_Size ); + + fontType.LayoutText( main_pane, AknLayoutScalable_Avkon::popup_note_window_t4( KVariantIndex ).LayoutLine() ); + + TInt lineWidth = fontType.TextRect().Width(); + + //extra bidi space for the two lines. second line is not actually used in the query but is required by the API + HBufC* locationText = HBufC::NewLC( aLocation.Length() + KAknBidiExtraSpacePerLine + KAknBidiExtraSpacePerLine); + TPtr locationTextPtr = locationText->Des(); + locationTextPtr.Append(aLocation); + + // First wrap, then do formatting. + CArrayFixFlat* lineWidths = new( ELeave )CArrayFixFlat( KRequiredLinesPlus ); + CleanupStack::PushL( lineWidths ); + lineWidths->InsertL( KActualLine, lineWidth ); + lineWidths->InsertL( KDummyLineForcedByAPI, lineWidth ); + + TBool useEllipsis(ETrue); + + // measure, wrap and truncate location item. + AknBidiTextUtils::ConvertToVisualAndWrapToArrayL( + locationTextPtr, + *lineWidths, + *fontType.Font(), + *textLines, + useEllipsis ); + + //place result to new created target buffer + HBufC* target = HBufC::NewL( textLines->At(KActualLine).Length() ); + target->Des().Append(textLines->At( KActualLine )); + + CleanupStack::PopAndDestroy( lineWidths ); + CleanupStack::PopAndDestroy( locationText ); + CleanupStack::PopAndDestroy( textLines ); + delete this; + return target; + } + +// End of File +