--- /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 <meetingrequestviewersuires.rsg>
+#include <CMRMailboxUtils.h>
+#include <calentry.h> //CCalEntry (Calendar entry API V2)
+#include <caluser.h> //caluser and attendee
+#include <AknInfoPopupNoteController.h>
+#include <stringloader.h>
+#include <eikenv.h>
+
+// 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<CCalAttendee>& 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
+