meetingrequest/mrgui/src/cesmrtrackingview.cpp
branchRCL_3
changeset 33 da5135c61bad
child 24 b5fbb9b25d57
--- /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
+
+