diff -r 000000000000 -r f979ecb2b13e meetingui/meetingrequestviewers/src/CMRInfoPopup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingui/meetingrequestviewers/src/CMRInfoPopup.cpp Tue Feb 02 10:12:19 2010 +0200 @@ -0,0 +1,356 @@ +/* +* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description:Implementation for meeting request info popup +* +*/ + + + + +// INCLUDE FILES +#include "CMRInfoPopup.h" +#include "MRViewersPanic.h" +#include "MREntryConsultant.h" +#include "CMRStringFormatter.h" +#include +#include +#include //CCalEntry (Calendar entry API V2) +#include //caluser and attendee +#include +#include +#include + +// CONSTANTS +/// Unnamed namespace for local definitions +namespace { + +_LIT( KPanicMsg, "CMRInfoPopup" ); + +void Panic( TPanicCode aReason ) + { + User::Panic( KPanicMsg, aReason ); + } + +// Avkon takes milliseconds as a parameter, but timers use microseconds, +// therefore to must avoid overflow the maximum time is KMaxInt / 1000. +const TInt KMaxMilliseconds = KMaxTInt / 1000; +const TInt KBufferSize = 512; + +} // namespace + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMRInfoPopup::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CMRInfoPopup* CMRInfoPopup::NewL( + CEikonEnv* aEnv, + CMRMailboxUtils& aMBoxUtils, + const CCalEntry& aEntry, + TBool aViewMode ) + { + CMRInfoPopup* self = + new( ELeave ) CMRInfoPopup( aEnv, aMBoxUtils, aViewMode ); + + CleanupStack::PushL( self ); + self->ConstructL( aEntry ); + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CMRInfoPopup::CMRInfoPopup +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CMRInfoPopup::CMRInfoPopup( + CEikonEnv* aEnv, + CMRMailboxUtils& aMBoxUtils, + TBool aViewMode ) + : iEnv( aEnv ), + iMBoxUtils( aMBoxUtils ), + iViewMode( aViewMode ), + iIsValid( ETrue ), + iIsSent( EFalse ), + iRowIndex( 0 ) + { + } + +// ----------------------------------------------------------------------------- +// CMRInfoPopup::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CMRInfoPopup::ConstructL( const CCalEntry& aEntry ) + { + iBuffer.CreateL( KBufferSize ); + + iStringFormatter = CMRStringFormatter::NewL( *iEnv ); + + iNoteController = CAknInfoPopupNoteController::NewL(); + // no delay: + iNoteController->SetTimeDelayBeforeShow( 0 ); + // according to spec info popup is shown all the time in MR Viewers, + // when we give KMaxMilliseconds it will be shown for ~35 hours: + iNoteController->SetTimePopupInView( KMaxMilliseconds ); + + RefreshTextL( aEntry, 0 ); // row index 0 used at startup + } + +// Destructor +CMRInfoPopup::~CMRInfoPopup() + { + delete iStringFormatter; + delete iNoteController; + iBuffer.Close(); + } + +// ----------------------------------------------------------------------------- +// CMRInfoPopup::ShowInfoPopupL +// +// ----------------------------------------------------------------------------- +// +void CMRInfoPopup::ShowInfoPopupL() + { + iNoteController->ShowInfoPopupNote(); + } + +// ----------------------------------------------------------------------------- +// CMRInfoPopup::HideInfoPopup +// +// ----------------------------------------------------------------------------- +// +void CMRInfoPopup::HideInfoPopup() + { + iNoteController->HideInfoPopupNote(); + } + +// ----------------------------------------------------------------------------- +// CMRInfoPopup::SetMeetingValidity +// +// ----------------------------------------------------------------------------- +// +void CMRInfoPopup::SetMeetingValidity( TBool aIsValid ) + { + iIsValid = aIsValid; + } + +// ----------------------------------------------------------------------------- +// CMRInfoPopup::SetSendingStatus +// +// ----------------------------------------------------------------------------- +// +void CMRInfoPopup::SetSendingStatus( TBool aIsSent ) + { + iIsSent = aIsSent; + } + +// ----------------------------------------------------------------------------- +// CMRInfoPopup::RefreshTextL +// +// ----------------------------------------------------------------------------- +// +void CMRInfoPopup::RefreshTextL( const CCalEntry& aEntry, TInt aRowIndex ) + { + __ASSERT_DEBUG( aRowIndex == 0 || aRowIndex == 1, + Panic( EIllegalParamValue ) ); + + iRowIndex = aRowIndex; + // update data in iBuffer and in note controller, info popup may be + // currently visible or not + if ( iRowIndex == 0 ) + { + FillWithMeetingInfoL( aEntry ); + } + else + { + if ( iViewMode ) + { + FillWithViewerAttendeeInfoL( aEntry ); + } + else + { + FillWithEditorAttendeeInfoL( aEntry ); + } + } + iNoteController->SetTextL( TextL() ); + ShowInfoPopupL(); + } + +const TDesC& CMRInfoPopup::TextL() + { + return iBuffer; + } + +void CMRInfoPopup::FillWithMeetingInfoL( const CCalEntry& aEntry ) + { + iBuffer.Zero(); + if ( MREntryConsultant::IsRepeatingMeetingL( aEntry ) ) + { + StringLoader::Load( iBuffer, R_QTN_CALE_INFOPOPUP_RECURRING, iEnv ); + iBuffer.Append( EKeyLineFeed ); + } + + HBufC* timeString( NULL ); +// TODO: check day span this when UI spec is corrected +// if ( MREntryConsultant::SpansManyDaysL( aEntry.StartTimeL(), +// aEntry.EndTimeL() ) ) + timeString = iStringFormatter->WhenStringLC( aEntry.StartTimeL(), + aEntry.EndTimeL() ); + iBuffer.Append( *timeString ); + CleanupStack::PopAndDestroy( timeString ); + } + +void CMRInfoPopup::FillWithViewerAttendeeInfoL( const CCalEntry& aEntry ) + { + iBuffer.Zero(); + TInt resource( 0 ); + CCalAttendee* thisAtt = iMBoxUtils.ThisAttendeeL( aEntry ); + + if ( aEntry.StatusL() == CCalEntry::ECancelled ) + { + resource = R_QTN_CALE_STATUS_CANCELLED; + } + else if ( MREntryConsultant::IsEntryOutOfDateL( aEntry ) || + !iIsValid ) + { + resource = R_QTN_CALE_STATUS_OUT_OF_DATE; + } + else if ( thisAtt ) + { + switch ( thisAtt->StatusL() ) + { + case CCalAttendee::ENeedsAction: + { + resource = R_QTN_CALE_STATUS_PLEASE_RESPOND; + break; + } + case CCalAttendee::EAccepted: // fall through + case CCalAttendee::EConfirmed: + { + resource = R_QTN_CALE_STATUS_ACCEPTED; + break; + } + case CCalAttendee::ETentative: + { + resource = R_QTN_CALE_STATUS_TENTATIVE; + break; + } + case CCalAttendee::EDeclined: + { + resource = R_QTN_CALE_STATUS_DECLINED; + break; + } + default: + { + break; + } + } + } + if ( resource != 0 ) + { + StringLoader::Load( iBuffer, resource, iEnv ); + } + } + +void CMRInfoPopup::FillWithEditorAttendeeInfoL( const CCalEntry& aEntry ) + { + iBuffer.Zero(); + + if ( iIsSent ) + { + RPointerArray& attendees = aEntry.AttendeesL(); + TInt count( attendees.Count() ); + TInt countAccepted( 0 ); + TInt countTentative( 0 ); + TInt countDeclined( 0 ); + TInt countNeedsAction( 0 ); + for ( TInt i( 0 ); i < count; ++i ) + { + switch ( attendees[i]->StatusL() ) + { + case CCalAttendee::EAccepted: // fall through + case CCalAttendee::EConfirmed: + { + countAccepted++; + break; + } + case CCalAttendee::ETentative: + { + countTentative++; + break; + } + case CCalAttendee::EDeclined: + { + countDeclined++; + break; + } + case CCalAttendee::ENeedsAction: + { + countNeedsAction++; + break; + } + default: + { + break; + } + } + + } + if ( countAccepted > 0 ) + { + HBufC* accepts = StringLoader::LoadLC( + R_QTN_CALE_INFOPOPUP_ACCEPTED, countAccepted, iEnv ); + iBuffer.Append( *accepts ); + CleanupStack::PopAndDestroy( accepts ); + iBuffer.Append( EKeyLineFeed ); + } + if ( countDeclined > 0 ) + { + HBufC* declines = StringLoader::LoadLC( + R_QTN_CALE_INFOPOPUP_DECLINED, countDeclined, iEnv ); + iBuffer.Append( *declines ); + CleanupStack::PopAndDestroy( declines ); + iBuffer.Append( EKeyLineFeed ); + } + if ( countTentative > 0 ) + { + HBufC* tentatives = StringLoader::LoadLC( + R_QTN_CALE_INFOPOPUP_TENTATIVE, countTentative, iEnv ); + iBuffer.Append( *tentatives ); + CleanupStack::PopAndDestroy( tentatives ); + iBuffer.Append( EKeyLineFeed ); + } + if ( countNeedsAction > 0 ) + { + HBufC* noresponses = StringLoader::LoadLC( + R_QTN_CALE_INFOPOPUP_NO_RESPONSE, countNeedsAction, iEnv ); + iBuffer.Append( *noresponses ); + CleanupStack::PopAndDestroy( noresponses ); + iBuffer.Append( EKeyLineFeed ); + } + } + else + { + StringLoader::Load( iBuffer, R_QTN_CALE_INFOPOPUP_NOT_SENT, iEnv ); + } + } + + +// End of File +