emailuis/emailui/src/cmailcustomstatuspaneindicators.cpp
changeset 0 8466d47a6819
child 16 4ce476e64c59
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/src/cmailcustomstatuspaneindicators.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,508 @@
+/*
+* Copyright (c) 2008 - 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:  Window which draws priority and followup flags on navi
+* pane area. Real navi pane is not used because there was problems to
+* show editor indicator in custom navi pane. 
+*
+*/
+
+// SYSTEM INCLUDES
+#include <AknUtils.h>
+#include <aknnavide.h> // CAknNavigationDecorator
+#include <eikspane.h>  // CEikStatusPane
+
+#include <aknlayoutscalable_apps.cdl.h>
+
+// INTERNAL INCLUDES
+#include "cmailcustomstatuspaneindicators.h"
+#include "ncsconstants.h"	// TMsgPriority
+#include "FreestyleEmailUiLayoutHandler.h"
+#include "FreestyleEmailUiTextureManager.h"
+#include "FreestyleEmailUiAppui.h"
+#include "freestyleemailui.mbg"
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::CCustomStatuspaneIndicators
+// ---------------------------------------------------------------------------
+//
+CCustomStatuspaneIndicators* CCustomStatuspaneIndicators::NewL( CEikStatusPane* aStatusPane )
+    {
+    CCustomStatuspaneIndicators* self = new (ELeave) CCustomStatuspaneIndicators;
+    CleanupStack::PushL( self );
+    self->ConstructL( aStatusPane );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::CCustomStatuspaneIndicators
+// ---------------------------------------------------------------------------
+//
+CCustomStatuspaneIndicators::CCustomStatuspaneIndicators()
+{
+}
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::~CCustomStatuspaneIndicators
+// ---------------------------------------------------------------------------
+//
+CCustomStatuspaneIndicators::~CCustomStatuspaneIndicators()
+{
+    delete iPriorityIconLow;
+    delete iPriorityIconHigh;
+    delete iBitmapFollowUp;
+    delete iBitmapFollowUpMask;
+    delete iBitmapFollowUpComplete;
+    delete iBitmapFollowUpCompleteMask;
+    delete iFollowUpIcon;
+}
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CCustomStatuspaneIndicators::ConstructL( CEikStatusPane* aStatusPane )
+{
+	iStatusPane = aStatusPane;
+
+	// We use normal window instead of navigation decorator because
+	// Editor indicator cannot be shown with custom navi pane.
+	// This transparent window is drawn on top of navi pane.
+	CreateWindowL();
+	SetNonFocusing();
+	
+	// Read icon graphics
+	ConstructControlsL();
+	DoSetRectL();
+	
+    Window().SetTransparencyAlphaChannel();
+	Window().SetOrdinalPosition( 0 );
+	ActivateL();
+	
+	HideStatusPaneIndicators();
+    }
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::MinimumSize
+// ---------------------------------------------------------------------------
+//
+
+TSize CCustomStatuspaneIndicators::MinimumSize()
+    {
+    return TSize( Rect().Width(), Rect().Height() );
+    }
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::CountComponentControls
+// ---------------------------------------------------------------------------
+//
+TInt CCustomStatuspaneIndicators::CountComponentControls() const
+    {
+    TInt count( 0 );
+    if ( iPriorityIconLow )
+        {
+        ++count;
+        }
+    if ( iPriorityIconHigh )
+        {
+        ++count;
+        }
+    if ( iFollowUpIcon )
+        {
+        ++count;
+        }
+    return count;
+    }
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::ComponentControl
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CCustomStatuspaneIndicators::ComponentControl( TInt aIndex ) const
+    {
+    switch ( aIndex )
+        {
+        case 0:
+   			return iPriorityIconLow;
+        case 1:
+        	return iPriorityIconHigh;
+        case 2:
+            return iFollowUpIcon;
+        default:
+            return NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::SizeChanged
+// ---------------------------------------------------------------------------
+//
+void CCustomStatuspaneIndicators::SizeChanged()
+	{
+	TRect rect = Rect();
+	
+    // icon area
+    TAknLayoutRect naviPane;
+    naviPane.LayoutRect( rect,
+            AknLayoutScalable_Apps::navi_pane_mv_g2( 3 ) );
+    TRect naviPaneRect( naviPane.Rect() );
+    
+    // icon size
+	CFreestyleEmailUiAppUi* fsAppUi =
+	            static_cast<CFreestyleEmailUiAppUi*>( ControlEnv()->AppUi() );
+    TSize iconSize = fsAppUi->LayoutHandler()->statusPaneIconSize();
+	
+    // calculate margins
+    TInt marginX( Abs( naviPaneRect.Width() - iconSize.iWidth ) / 2 );
+    TInt marginY( Abs( naviPaneRect.Height() - iconSize.iHeight ) / 2 );
+
+    // adjust for scroll arrows
+    if ( CheckScrollButtonState() )
+        {
+        TAknLayoutRect leftScrollPane;
+        leftScrollPane.LayoutRect( rect,
+                AknLayoutScalable_Apps::navi_pane_g2( 5 ) );
+        
+        marginX -= leftScrollPane.Rect().Width();
+        }
+        
+	if( iPriorityIconLow )
+		{
+		AknLayoutUtils::SAknLayoutRect layout;
+		layout.iC=ELayoutEmpty;
+		layout.iL=naviPaneRect.iTl.iX + marginX;   // X
+		layout.iT=naviPaneRect.iTl.iY + marginY;   // Y
+		layout.iR=ELayoutEmpty; 			       // r-border
+		layout.iB=ELayoutEmpty; 			       // y-border
+		layout.iW=iconSize.iWidth;   			   // Width
+		layout.iH=iconSize.iHeight; 			   // Height
+    
+		AknLayoutUtils::LayoutImage( iPriorityIconLow, rect, layout );
+		}
+	if( iPriorityIconHigh )
+		{
+		AknLayoutUtils::SAknLayoutRect layout;
+		layout.iC=ELayoutEmpty;
+		layout.iL=naviPaneRect.iTl.iX + marginX;
+		layout.iT=naviPaneRect.iTl.iY + marginY;
+		layout.iR=ELayoutEmpty;
+		layout.iB=ELayoutEmpty;
+		layout.iW=iconSize.iWidth;
+		layout.iH=iconSize.iHeight;
+    
+		AknLayoutUtils::LayoutImage( iPriorityIconHigh, rect, layout );
+		}
+	if( iFollowUpIcon )
+		{
+		AknLayoutUtils::SAknLayoutRect layout;
+		layout.iC=ELayoutEmpty;
+		layout.iL=iconSize.iWidth + naviPaneRect.iTl.iX + marginX;
+		layout.iT=naviPaneRect.iTl.iY + marginY;
+		layout.iR=ELayoutEmpty;
+		layout.iB=ELayoutEmpty;
+		layout.iW=iconSize.iWidth;
+		layout.iH=iconSize.iHeight;
+    
+		AknLayoutUtils::LayoutImage( iFollowUpIcon, rect, layout );
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::HandleResourceChange
+// ---------------------------------------------------------------------------
+//
+void CCustomStatuspaneIndicators::HandleResourceChange( TInt aType )
+    {
+    CCoeControl::HandleResourceChange( aType );
+    
+    switch ( aType )
+        {
+        case KAknsMessageSkinChange:
+        case KEikMessageColorSchemeChange:
+            {
+            TRAP_IGNORE(ConstructControlsL());
+            }
+        case KEikDynamicLayoutVariantSwitch:
+        case KAknLocalZoomLayoutSwitch:
+            {
+            // Get new navipane rect
+            TRAP_IGNORE( DoSetRectL() );
+            SizeChanged();
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    }
+	
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::SetPriorityFlag
+// ---------------------------------------------------------------------------
+//
+void CCustomStatuspaneIndicators::SetPriorityFlag( TMsgPriority aFlagType )
+	{
+    if ( iPriorityIconHigh && iPriorityIconLow )
+    	{
+    	switch ( aFlagType )
+    		{
+    		case EMsgPriorityLow:
+    			{
+    			iPriorityIconLow->MakeVisible( ETrue );
+    			iPriorityIconHigh->MakeVisible( EFalse );
+    			break;
+    			}
+    		case EMsgPriorityHigh:
+    			{
+    			iPriorityIconLow->MakeVisible( EFalse );
+    			iPriorityIconHigh->MakeVisible( ETrue );
+    			break;
+    			}
+    		default: // EMsgPriorityNormal
+    			{
+    			// Normal priority -> icons not visible
+    			iPriorityIconLow->MakeVisible( EFalse );
+    			iPriorityIconHigh->MakeVisible( EFalse );
+    			}
+    		}
+    	DrawNow();
+    	}
+	}
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::SetFollowUpFlag
+// ---------------------------------------------------------------------------
+//
+void CCustomStatuspaneIndicators::SetFollowUpFlag( CCustomStatuspaneIndicators::TFollowUpFlagType aFlag )
+	{
+	CFreestyleEmailUiAppUi* fsAppUi =
+	            static_cast<CFreestyleEmailUiAppUi*>( ControlEnv()->AppUi() );
+    TSize iconSize = fsAppUi->LayoutHandler()->statusPaneIconSize();
+
+    if ( iFollowUpIcon )
+    	{
+    	switch (aFlag)
+    	    {
+    	    case EFollowUp:
+                {
+                AknIconUtils::SetSize( iBitmapFollowUp, iconSize, EAspectRatioPreserved  );
+                iFollowUpIcon->SetPicture(iBitmapFollowUp, iBitmapFollowUpMask);
+                iFollowUpIcon->SetBrushStyle( CWindowGc::ENullBrush );
+                iFollowUpIcon->SetSize( iconSize );
+                }
+                break;
+            case EFollowUpComplete:
+                {
+                AknIconUtils::SetSize( iBitmapFollowUpComplete, iconSize, EAspectRatioPreserved  );
+                iFollowUpIcon->SetPicture(iBitmapFollowUpComplete, iBitmapFollowUpCompleteMask);
+                iFollowUpIcon->SetBrushStyle( CWindowGc::ENullBrush );
+                iFollowUpIcon->SetSize( iconSize );
+                }
+                break;
+            case EFollowUpNone:
+                {
+                
+                }
+                break;
+    	    }
+    	iFollowUpIcon->MakeVisible( aFlag != EFollowUpNone );
+    	DrawDeferred();
+    	}
+	}
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::HideStatusPaneIndicatorsL
+// ---------------------------------------------------------------------------
+//
+void CCustomStatuspaneIndicators::HideStatusPaneIndicators()
+	{
+	MakeVisible( EFalse );
+    SetPriorityFlag( EMsgPriorityNormal );
+    SetFollowUpFlag( EFollowUpNone );
+    DrawNow();
+	}
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::ShowStatusPaneIndicatorsL
+// ---------------------------------------------------------------------------
+//
+void CCustomStatuspaneIndicators::ShowStatusPaneIndicators()
+	{
+	MakeVisible( ETrue );
+    TRAP_IGNORE( DoSetRectL() );
+    SetPriorityFlag( EMsgPriorityNormal );
+    SetFollowUpFlag( EFollowUpNone );
+    DrawNow();
+	}
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::CheckScrollButtonState
+// ---------------------------------------------------------------------------
+//
+TBool CCustomStatuspaneIndicators::CheckScrollButtonState()
+	{
+	CAknNavigationControlContainer* NaviPane = NULL;
+	TRAP_IGNORE( NaviPane =	(CAknNavigationControlContainer*)
+			iStatusPane->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+	CAknNavigationDecorator* NaviDecorator = NaviPane->Top();
+	if ( NaviDecorator )
+		{
+		return NaviDecorator->ScrollButtonVisible();
+		}
+	return EFalse;
+	}
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::DoSetRectL
+// ---------------------------------------------------------------------------
+//
+void CCustomStatuspaneIndicators::DoSetRectL()
+    {
+    TRect rect = iStatusPane->PaneRectL( TUid::Uid( EEikStatusPaneUidNavi ) );
+    
+    // adjust for scroll arrows (to avoid overlapping the scrolling arrows)
+    if ( CheckScrollButtonState() )
+        {
+        TAknLayoutRect leftScrollPane;
+        leftScrollPane.LayoutRect( rect,
+                AknLayoutScalable_Apps::navi_pane_g2( 5 ) );
+        
+        rect.iTl.iX += leftScrollPane.Rect().Width();
+
+        TAknLayoutRect rightScrollPane;
+        rightScrollPane.LayoutRect( rect,
+                AknLayoutScalable_Apps::navi_pane_g3( 5 ) );
+        
+        rect.iBr.iX -= rightScrollPane.Rect().Width();
+        }
+    SetRect( rect );
+    }
+
+// ---------------------------------------------------------------------------
+// CCustomStatuspaneIndicators::ConstructControlsL
+// ---------------------------------------------------------------------------
+//
+void CCustomStatuspaneIndicators::ConstructControlsL()
+	{
+	CCustomStatuspaneIndicators::TFollowUpFlagType followUpFlagType = CCustomStatuspaneIndicators::EFollowUpNone;
+	TMsgPriority priorityIconType = EMsgPriorityNormal;
+	if (iPriorityIconLow && iPriorityIconLow->IsVisible())
+	    {
+	    priorityIconType = EMsgPriorityLow;
+	    }
+	else if (iPriorityIconHigh && iPriorityIconHigh->IsVisible())
+	    {
+	    priorityIconType = EMsgPriorityHigh;
+	    }
+	
+	if (iFollowUpIcon)
+	    {
+	    if (iFollowUpIcon->Bitmap() == iBitmapFollowUp)
+	        {
+	        followUpFlagType = CCustomStatuspaneIndicators::EFollowUp;
+	        }
+	    else if (iFollowUpIcon->Bitmap() == iBitmapFollowUpComplete)
+	        {
+	        followUpFlagType = CCustomStatuspaneIndicators::EFollowUpComplete;
+	        }
+	    }
+	
+	delete iPriorityIconLow;
+	iPriorityIconLow = NULL;
+	delete iPriorityIconHigh;
+	iPriorityIconHigh = NULL;
+    delete iFollowUpIcon;
+    iFollowUpIcon = NULL;
+    iBitmapPriorityLow = NULL;
+    iBitmapMaskPriorityLow = NULL;
+    iBitmapPriorityHigh = NULL;
+    iBitmapMaskPriorityHigh = NULL;
+    delete iBitmapFollowUp;
+    iBitmapFollowUp = NULL;
+    delete iBitmapFollowUpMask;
+    iBitmapFollowUpMask = NULL;
+    delete iBitmapFollowUpComplete;
+    iBitmapFollowUpComplete = NULL;
+    delete iBitmapFollowUpCompleteMask;
+    iBitmapFollowUpCompleteMask = NULL;
+
+    CFreestyleEmailUiAppUi* fsAppUi =
+			static_cast<CFreestyleEmailUiAppUi*>( ControlEnv()->AppUi() );
+    fsAppUi->FsTextureManager()->ProvideBitmapL(
+    		EComposerTexturePriorityLow,
+    		iBitmapPriorityLow,
+    		iBitmapMaskPriorityLow );
+    fsAppUi->FsTextureManager()->ProvideBitmapL(
+    		EComposerTexturePriorityHigh,
+    		iBitmapPriorityHigh,
+    		iBitmapMaskPriorityHigh );
+    fsAppUi->FsTextureManager()->ProvideBitmapL(
+    		EFollowUpFlag,
+    		iBitmapFollowUp,
+    		iBitmapFollowUpMask );
+    fsAppUi->FsTextureManager()->ProvideBitmapL(
+            EFollowUpFlagComplete,
+            iBitmapFollowUpComplete,
+            iBitmapFollowUpCompleteMask );
+
+   	TSize iconSize = fsAppUi->LayoutHandler()->statusPaneIconSize();
+
+  	if ( iBitmapPriorityLow && iBitmapMaskPriorityLow )
+        {
+        iPriorityIconLow = new (ELeave) CEikImage;
+        iPriorityIconLow->SetPictureOwnedExternally( EFalse );
+        AknIconUtils::SetSize( iBitmapPriorityLow, iconSize, EAspectRatioPreserved  );
+        iPriorityIconLow->SetPicture( iBitmapPriorityLow,
+									  iBitmapMaskPriorityLow );
+        iPriorityIconLow->SetBrushStyle( CWindowGc::ENullBrush );
+        iPriorityIconLow->SetSize( iconSize );
+        iPriorityIconLow->SetContainerWindowL( *this );
+        iPriorityIconLow->MakeVisible(priorityIconType == EMsgPriorityLow);
+        }
+    if ( iBitmapPriorityHigh && iBitmapMaskPriorityHigh )
+        {
+        iPriorityIconHigh = new (ELeave) CEikImage;
+        iPriorityIconHigh->SetPictureOwnedExternally( EFalse );
+        AknIconUtils::SetSize( iBitmapPriorityHigh, iconSize, EAspectRatioPreserved  );
+        iPriorityIconHigh->SetPicture( iBitmapPriorityHigh,
+        		                       iBitmapMaskPriorityHigh );
+        iPriorityIconHigh->SetBrushStyle( CWindowGc::ENullBrush );
+        iPriorityIconHigh->SetSize( iconSize );
+        iPriorityIconHigh->SetContainerWindowL( *this );
+        iPriorityIconHigh->MakeVisible(priorityIconType == EMsgPriorityHigh);
+        }
+    if ( iBitmapFollowUp && iBitmapFollowUpMask && iBitmapFollowUpComplete && iBitmapFollowUpCompleteMask )
+    	{
+        iFollowUpIcon = new (ELeave) CEikImage;
+        iFollowUpIcon->SetPictureOwnedExternally( ETrue );
+        if (followUpFlagType == CCustomStatuspaneIndicators::EFollowUp)
+            {
+            AknIconUtils::SetSize( iBitmapFollowUp, iconSize, EAspectRatioNotPreserved );
+            iFollowUpIcon->SetPicture( iBitmapFollowUp,
+                                       iBitmapFollowUpMask );
+            }
+        else if (followUpFlagType == CCustomStatuspaneIndicators::EFollowUpComplete)
+            {
+            AknIconUtils::SetSize( iBitmapFollowUpComplete, iconSize, EAspectRatioNotPreserved );
+            iFollowUpIcon->SetPicture( iBitmapFollowUpComplete,
+                                       iBitmapFollowUpCompleteMask );
+            }
+        iFollowUpIcon->SetBrushStyle( CWindowGc::ENullBrush );
+        iFollowUpIcon->SetSize( iconSize );
+        iFollowUpIcon->SetContainerWindowL( *this );
+        iFollowUpIcon->MakeVisible(followUpFlagType != CCustomStatuspaneIndicators::EFollowUpNone);
+    	}
+    DrawDeferred();
+	}