--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrgui/src/cesmrtrackingview.cpp Wed Mar 31 21:08:33 2010 +0300
@@ -0,0 +1,614 @@
+/*
+* Copyright (c) 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: ESMR Tracking view UI Container class
+*
+*/
+
+// <cmail> custom sw help files not avilable in Cmail
+//#include <fscale.hlp.hrh> //for custom_sw helps
+//#include <fsmr.hlp.hrh> //for custom_sw helps
+// </cmail>
+#include "cesmrtrackingview.h"
+#include "mesmrmeetingrequestentry.h"
+#include "esmrinternaluid.h"
+#include "cesmrtitlepane.h"
+#include "cesmrfield.h"
+#include "mesmrcalentry.h"
+#include "nmrlayoutmanager.h"
+#include "cesmrtrackingviewdialog.h"
+
+#include <eiklabel.h>
+#include <avkon.hrh>
+#include <magnentryui.h>
+#include <stringloader.h>
+#include <gulcolor.h>
+#include <eikimage.h>
+#include <esmrgui.rsg>
+#include <akniconutils.h>
+#include <eikenv.h>
+#include <aknsconstants.h>
+#include <aknutils.h>
+#include <aknsdrawutils.h>
+#include <aknsbasicbackgroundcontrolcontext.h>
+#include <hlplch.h>
+#include <akniconarray.h>
+#include <eikclbd.h>
+#include <calentry.h>
+#include <caluser.h>
+#include <gulicon.h>
+
+#include "emailtrace.h"
+
+
+namespace{
+// The string format of item in listbox.
+_LIT(KListItemFormat, "%d\t%S");
+
+static const TInt KIconArrayCount( 4 );
+static const TInt KListboxItemGranularity( 3 );
+static const TInt KMaxItemStringLen (128);
+}
+// <cmail> Removed profiling. </cmail>
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::CESMRTrackingView()
+// ---------------------------------------------------------------------------
+//
+CESMRTrackingView::CESMRTrackingView( MESMRCalEntry& aEntry,
+ const TInt &aReqAttendee,
+ const TInt &aOptAttendee) :
+ iEntry(aEntry),iReqAttendeeCount(aReqAttendee),iOptAttendeeCount(aOptAttendee)
+ {
+ FUNC_LOG;
+ // Do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::NewL()
+// ---------------------------------------------------------------------------
+//
+CESMRTrackingView* CESMRTrackingView::NewL(
+ MESMRCalEntry& aEntry,
+ const TRect& aRect,
+ const TInt &aReqAttendee,
+ const TInt &aOptAttendee)
+ {
+ FUNC_LOG;
+ CESMRTrackingView* self = new (ELeave) CESMRTrackingView( aEntry ,aReqAttendee , aOptAttendee );
+ CleanupStack::PushL( self );
+ self->ConstructL( aRect );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::ConstructL( const TRect& aRect )
+ {
+ FUNC_LOG;
+ iBgContext = CAknsBasicBackgroundControlContext::NewL(
+ KAknsIIDQsnBgAreaMain, aRect, ETrue);
+
+ iTitle = CESMRTitlePane::NewL();
+ // Default title text is set here.
+
+ HBufC* title ;
+ switch (iEntry.Type())
+ {
+ case MESMRCalEntry::EESMRCalEntryTodo:
+ {
+ title = StringLoader::LoadLC ( R_QTN_CALENDAR_TITLE_NEW_TODO );
+ break;
+ }
+ case MESMRCalEntry::EESMRCalEntryMemo:
+ {
+ title = StringLoader::LoadLC ( R_QTN_CALENDAR_TITLE_NEW_MEMO );
+ break;
+ }
+ case MESMRCalEntry::EESMRCalEntryAnniversary:
+ {
+ title = StringLoader::LoadLC(R_QTN_CALENDAR_TITLE_NEW_ANNIVERSARY);
+ break;
+ }
+ case MESMRCalEntry::EESMRCalEntryMeetingRequest: // Fall through
+ case MESMRCalEntry::EESMRCalEntryMeeting: // Fall through
+ case MESMRCalEntry::EESMRCalEntryReminder: // Fall through
+ default:
+ {
+ title = StringLoader::LoadLC( R_QTN_MEET_REQ_TITLE );
+ break;
+ }
+ }
+
+ iTitle->SetTextL( *title );
+ CleanupStack::PopAndDestroy( title );
+
+ iESMRStatic.ConnectL();
+ iMenuHandler = &iESMRStatic.ContactMenuHandlerL();
+
+ SetRect( aRect );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::~CESMRTrackingView()
+// ---------------------------------------------------------------------------
+//
+CESMRTrackingView::~CESMRTrackingView()
+ {
+ FUNC_LOG;
+ if ( iMenuHandler )
+ {
+ iMenuHandler->Reset();
+ }
+ iESMRStatic.Close();
+ delete iTitle;
+ iList->Reset();
+ delete iList;
+ delete iBgContext;
+ delete iAddress;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::ExternalizeL()
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::ExternalizeL( TBool /*aForceValidation*/ )
+ {
+ FUNC_LOG;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::InternalizeL()
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::InternalizeL()
+ {
+ FUNC_LOG;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::LaunchViewerHelpL
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::LaunchViewerHelpL()
+ {
+ FUNC_LOG;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::LaunchHelpL
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::LaunchHelpL( const TDesC& aContext )
+ {
+ FUNC_LOG;
+ TUid uid = { KUidCalendarApplication };
+ CArrayFix<TCoeHelpContext>* cntx =
+ new (ELeave) CArrayFixFlat<TCoeHelpContext>(1);
+ CleanupStack::PushL(cntx);
+ cntx->AppendL( TCoeHelpContext( uid, aContext ) );
+ CleanupStack::Pop(cntx);
+ HlpLauncher::LaunchHelpApplicationL( iCoeEnv->WsSession(), cntx );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::SetContainerWindowL
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::SetContainerWindowL(const CCoeControl& aContainer)
+ {
+ FUNC_LOG;
+ CCoeControl::SetContainerWindowL( aContainer );
+ iTitle->SetContainerWindowL( *this );
+ /**
+ * Somehow if list is constructed before this SetContainerWindowL is called,
+ * all redraws throws KERN-EXEC 3 (the CCoeControl's iWin variable is NULL)
+ */
+
+ CreateTrackingListL();
+ InitTrackingListL();
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::CreateTrackingList
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::CreateTrackingListL()
+ {
+ iList = new(ELeave) CAknSingleGraphicStyleListBox();
+ iList->ConstructL(this);
+ iList->SetContainerWindowL(*this);
+ iList->SetBackground( this );
+ iList->CreateScrollBarFrameL(ETrue);
+ iList->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOn, CEikScrollBarFrame::EAuto );
+ iList->SetListBoxObserver(this);
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::InitTrackingList
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::InitTrackingListL()
+ {
+ RPointerArray<CCalAttendee> attendees = iEntry.Entry().AttendeesL();
+
+ // Init the array of item string and send ownership to listbox
+ iItemArray = new (ELeave) CDesCArrayFlat( KListboxItemGranularity );
+ iList->Model()->SetItemTextArray( iItemArray );
+ iList->Model()->SetOwnershipType( ELbmOwnsItemArray );
+
+ InitStatusIconArrayL();
+
+ TBuf16<KMaxItemStringLen> itemString;
+
+ if(iReqAttendeeCount > 0)
+ {
+ // Add the "Required" item
+ TBuf<10> textRequired(_L("Required"));
+ itemString.Format( KListItemFormat, ENoneIcon, &textRequired);
+ static_cast<CDesCArray*>(iItemArray)->AppendL( itemString );
+
+ // Add required attendees
+ for(TInt i = 0; i < iReqAttendeeCount; i++)
+ {
+ TPtrC text;
+ text.Set(attendees[i]->CommonName());
+ HBufC* name = text.AllocL();
+ itemString.Format( KListItemFormat, EAcceptIcon, name);
+ static_cast<CDesCArray*>(iItemArray)->AppendL( itemString );
+ }
+
+ iIndexOfOptLabel = iReqAttendeeCount + 1;
+ }
+
+ if(iOptAttendeeCount > 0)
+ {
+ // Add the "Optional" item
+ TBuf<10> textOptioal(_L("Optional"));
+ itemString.Format( KListItemFormat, ENoneIcon, &textOptioal);
+ static_cast<CDesCArray*>(iItemArray)->AppendL( itemString );
+
+ // Add Optional attendees
+ for(TInt i = iReqAttendeeCount; i < iReqAttendeeCount + iOptAttendeeCount; i++)
+ {
+ TPtrC text;
+ text.Set(attendees[i]->CommonName());
+ HBufC* name = text.AllocL();
+ itemString.Format( KListItemFormat, EAcceptIcon, name);
+ static_cast<CDesCArray*>(iItemArray)->AppendL( itemString );
+ }
+ }
+
+ iList->HandleItemAdditionL();
+
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::InitStatusIconArray
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::InitStatusIconArrayL()
+ {
+ // Set icon array for listbox
+ CArrayPtr<CGulIcon>* iconArray = new (ELeave) CAknIconArray( KIconArrayCount );
+ CleanupStack::PushL( iconArray );
+
+ // Init status Icons
+ CGulIcon* acceptIcon = InitStatusIconL(NMRBitmapManager::EMRBitmapTrackingAccept);
+ CGulIcon* rejectIcon = InitStatusIconL(NMRBitmapManager::EMRBitmapTrackingReject);
+ CGulIcon* tentativeIcon = InitStatusIconL(NMRBitmapManager::EMRBitmapTrackingTentative);
+ CGulIcon* noneIcon = InitStatusIconL(NMRBitmapManager::EMRBitmapTrackingNone);
+
+ // Append status icons
+ iconArray->AppendL( acceptIcon );
+ iconArray->AppendL( rejectIcon );
+ iconArray->AppendL( tentativeIcon );
+ iconArray->AppendL( noneIcon );
+
+ // set icons array to list
+ iList->ItemDrawer()->ColumnData()->SetIconArray( iconArray );
+ CleanupStack::Pop( iconArray );
+
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::InitStatusIcon
+// ---------------------------------------------------------------------------
+//
+CGulIcon* CESMRTrackingView::InitStatusIconL(NMRBitmapManager::TMRBitmapId aStatus)
+ {
+ CFbsBitmap* bitMap( NULL );
+ CFbsBitmap* bitMapMask( NULL );
+ TSize sz(0,0);
+ User::LeaveIfError(
+ NMRBitmapManager::GetSkinBasedBitmap(
+ aStatus,
+ bitMap, bitMapMask, sz ) );
+ CGulIcon* icon = CGulIcon::NewL(bitMap, bitMapMask);
+ return icon;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::CountComponentControls
+// ---------------------------------------------------------------------------
+//
+TInt CESMRTrackingView::CountComponentControls() const
+ {
+ FUNC_LOG;
+ TInt count( 0 );
+
+ if ( iTitle )
+ ++count;
+
+ if ( iList )
+ ++count;
+
+ return count;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::ComponentControl()
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CESMRTrackingView::ComponentControl( TInt aInd ) const
+ {
+ FUNC_LOG;
+ switch ( aInd )
+ {
+ case 0:
+ {
+ return iTitle;
+ }
+ case 1:
+ {
+ return iList;
+ }
+ default:
+ {
+ return NULL;
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::SizeChanged()
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::SizeChanged()
+ {
+ FUNC_LOG;
+
+ TRect rect( Rect() );
+ if ( iTitle )
+ {
+ TAknWindowComponentLayout titleLayout =
+ NMRLayoutManager::GetWindowComponentLayout( NMRLayoutManager::EMRLayoutCtrlBar );
+ AknLayoutUtils::LayoutControl( iTitle, rect, titleLayout );
+ }
+ if ( iList )
+ {
+ TAknWindowComponentLayout listLayout =
+ NMRLayoutManager::GetWindowComponentLayout( NMRLayoutManager::EMRLayoutContentArea );
+ AknLayoutUtils::LayoutControl( iList, rect, listLayout );
+ }
+ if( iBgContext )
+ {
+ iBgContext->SetRect( rect );
+ if ( &Window() )
+ {
+ iBgContext->SetParentPos( PositionRelativeToScreen() );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::MinimumSize()
+// Gets the main pane size needed by CEikDialog to layout itself correctly
+// ---------------------------------------------------------------------------
+//
+TSize CESMRTrackingView::MinimumSize()
+ {
+ FUNC_LOG;
+ TRect rect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, rect );
+ return rect.Size();
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::OfferKeyEventL
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CESMRTrackingView::OfferKeyEventL(
+ const TKeyEvent &aKeyEvent,
+ TEventCode aType)
+ {
+ FUNC_LOG;
+ TKeyResponse response( EKeyWasNotConsumed );
+ if ( iList )
+ {
+ response = iList->OfferKeyEventL( aKeyEvent, aType );
+ iList->DrawDeferred();
+ }
+ return response;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::Draw
+// This Draw is called when background for title pane (iTitle) is drawn
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::Draw( const TRect& aRect ) const
+ {
+ FUNC_LOG;
+ CWindowGc& gc = SystemGc();
+
+ // Draw the background for iTitle using the current skin
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+ AknsDrawUtils::Background( skin, cc, this, gc, aRect );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::Draw
+// This draw method draws the dialog area
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::Draw(
+ CWindowGc& aGc,
+ const CCoeControl& aControl,
+ const TRect& /*aRect*/) const
+ {
+ FUNC_LOG;
+ // Draw the background for aControl using the current skin
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+ AknsDrawUtils::Background( skin, cc, &aControl, aGc, aControl.Rect() );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::GetTextDrawer
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::GetTextDrawer(
+ CCoeTextDrawerBase*& /*aText*/,
+ const CCoeControl* /*aControl*/) const
+ {
+ // Do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::SetTitleL()
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::SetTitleL( const TDesC& aTitle )
+ {
+ FUNC_LOG;
+ iTitle->SetTextL( aTitle );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::FontSizeSettingsChanged()
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::FontSizeSettingsChanged()
+ {
+ FUNC_LOG;
+// iList->HandleFontChange();
+ SizeChanged();
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::HandleResourceChange()
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::HandleResourceChange( TInt aType )
+ {
+ FUNC_LOG;
+ CCoeControl::HandleResourceChange( aType );
+ TInt error = KErrNone;
+
+ switch ( aType )
+ {
+ case KEikDynamicLayoutVariantSwitch:
+ case KAknLocalZoomLayoutSwitch:
+ {
+ SizeChanged();
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ if ( error != KErrNone )
+ {
+ iCoeEnv->HandleError( error );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingView::MopSupplyObject()
+// ---------------------------------------------------------------------------
+//
+TTypeUid::Ptr CESMRTrackingView::MopSupplyObject( TTypeUid aId )
+ {
+ if ( iBgContext )
+ {
+ return MAknsControlContext::SupplyMopObject( aId, iBgContext );
+ }
+ return CCoeControl::MopSupplyObject( aId );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingViewDialog::HandleListBoxEventL
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType)
+ {
+ if( EEventItemClicked == aEventType )
+ {
+ TInt currentFocusingIndex = aListBox->CurrentItemIndex();
+ // Make sure the focus item is not the req/opt
+ if(currentFocusingIndex != 0 && currentFocusingIndex != iIndexOfOptLabel)
+ {
+ // Tap on the focused item
+ if(currentFocusingIndex == iFocusedItemIndex)
+ {
+ iParentDialog->HandleListEventL();
+ }
+ // Focus changed
+ else
+ {
+ TInt attendeeIndex = currentFocusingIndex;
+
+ if(currentFocusingIndex > 0 && currentFocusingIndex < iIndexOfOptLabel)
+ attendeeIndex--;
+ if(currentFocusingIndex > iIndexOfOptLabel)
+ attendeeIndex -= 2;
+
+ RPointerArray<CCalAttendee> attendees = iEntry.Entry().AttendeesL();
+ iAddress = attendees[attendeeIndex]->Address().AllocL();
+
+ iMenuHandler->SetValueL(*iAddress, CESMRContactMenuHandler::EValueTypeEmail);
+ }
+ }
+ else
+ {
+ iMenuHandler->Reset();
+ }
+ // Record the focused item index
+ iFocusedItemIndex = currentFocusingIndex;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRTrackingViewDialog::HandleListBoxEventL
+// ---------------------------------------------------------------------------
+//
+void CESMRTrackingView::SetParentDialog(CCoeControl* aParentDialog)
+ {
+ iParentDialog = (CESMRTrackingViewDialog*)aParentDialog;
+ }
+
+// EOF
+
+