diff -r 000000000000 -r 8466d47a6819 emailuis/emailui/src/cmailcustomstatuspaneindicators.cpp --- /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 +#include // CAknNavigationDecorator +#include // CEikStatusPane + +#include + +// 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( 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( 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( 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(); + }