diff -r aecbbf00d063 -r d48ab3b357f1 uifw/AvKon/src/akncontext.cpp --- a/uifw/AvKon/src/akncontext.cpp Tue Aug 31 15:28:30 2010 +0300 +++ b/uifw/AvKon/src/akncontext.cpp Wed Sep 01 12:16:19 2010 +0100 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 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" @@ -11,7 +11,8 @@ * * Contributors: * -* Description: +* Description: Context pane control used to display the application icon +* in status pane. * */ @@ -58,7 +59,6 @@ public: CEikImage* iContextImage; CEikImage* iDefaultContextImage; - TInt iCurrentColorScheme; }; CAknContextPaneExtension::CAknContextPaneExtension() @@ -91,7 +91,20 @@ EXPORT_C void CAknContextPane::ConstructL() { CommonConstructL(); - TRAP_IGNORE(SetPictureToDefaultL()); // Trapped because of Java midlet issues + + // Perf optimization: We don't set the default picture if the context + // pane is not in current status pane layout. The picture will be created + // in SizeChanged() if a valid size is set for context pane, but at + // the moment context pane isn't used in any of the supported Avkon + // status pane layouts. + CEikStatusPaneBase* statusPane = CEikStatusPaneBase::Current(); + if ( statusPane && + statusPane->PaneCapabilities( + TUid::Uid( EEikStatusPaneUidContext ) ).IsInCurrentLayout() ) + { + // Trapped because of Java midlet issues. + TRAP_IGNORE( SetPictureToDefaultL() ); + } } @@ -306,8 +319,14 @@ EXPORT_C void CAknContextPane::SizeChanged() { - if (Rect() != TRect(0,0,0,0)) // Fix for Parent getting parent relative data. + if ( !Rect().IsEmpty() ) // Fix for Parent getting parent relative data. { + if ( !iExtension->iContextImage ) + { + // Create the default picture if it doesn't exist yet. + TRAP_IGNORE( SetPictureToDefaultL() ); + } + if (iExtension->iContextImage && iExtension->iContextImage->Bitmap()) { TAknLayoutRect layoutRect; @@ -362,8 +381,9 @@ EXPORT_C void CAknContextPane::HandleResourceChange( TInt aType ) { - if ( aType == KEikColorResourceChange || aType==KEikDynamicLayoutVariantSwitch ) + if ( aType==KEikDynamicLayoutVariantSwitch ) { + SizeChanged(); DrawDeferred(); } else if( aType == KAknsMessageSkinChange ) @@ -409,76 +429,63 @@ { CWindowGc& gc=SystemGc(); - // screen - TRect screenRect = iAvkonAppUi->ApplicationRect(); - - //TAknWindowLineLayout screenLayout = AknLayout::screen(); - //TRect screenRect = screenLayout.Rect(); - - - // app window - TAknWindowLineLayout applicationWindowLayout = - AknLayout::application_window(screenRect); - - TAknLayoutRect applicationWindowLayoutRect; - applicationWindowLayoutRect.LayoutRect(screenRect, applicationWindowLayout); - TRect applicationWindowRect = applicationWindowLayoutRect.Rect(); - - // statuspane - TAknWindowLineLayout statusPaneLayout = - AknLayout::status_pane(applicationWindowRect, 0); - - TAknLayoutRect statusPaneLayoutRect; - statusPaneLayoutRect.LayoutRect(applicationWindowRect, statusPaneLayout); - TRect statusPaneRect = statusPaneLayoutRect.Rect(); - - // context pane - TAknWindowLineLayout contextPaneLayout = - AknLayout::context_pane(statusPaneRect, 0); - - TAknLayoutRect contextPaneLayoutRect; - contextPaneLayoutRect.LayoutRect(statusPaneRect, contextPaneLayout); - TRect contextPaneRect = contextPaneLayoutRect.Rect(); - - TAknWindowLineLayout naviPaneGraphicsLayout = - AknLayout::Status_pane_elements_Line_1(); - - TAknWindowLineLayout naviWipeGraphicsLayout = - AknLayout::Status_pane_elements_Line_2(); - - TAknLayoutRect naviPaneGraphicsLayoutRect; - naviPaneGraphicsLayoutRect.LayoutRect(statusPaneRect, naviPaneGraphicsLayout); - TRect naviPaneGraphicsRect = naviPaneGraphicsLayoutRect.Rect(); - - TAknLayoutRect naviWipeGraphicsLayoutRect; - naviWipeGraphicsLayoutRect.LayoutRect(statusPaneRect, naviWipeGraphicsLayout); - TRect naviWipeGraphicsRect = naviWipeGraphicsLayoutRect.Rect(); - - TRect rect(Rect()); - - TRect barRect = contextPaneRect; - if (barRect.Intersects(naviPaneGraphicsRect)) - { - barRect.Intersection(naviPaneGraphicsRect); - - // calculate new origo, relative to context pane. - barRect.iTl.iX -= contextPaneRect.iTl.iX; - barRect.iTl.iY -= contextPaneRect.iTl.iY; - barRect.iBr.iX -= contextPaneRect.iTl.iX; - barRect.iBr.iY -= contextPaneRect.iTl.iY; - } - else - { - barRect = TRect(0,0,0,0); - } - - + TRect rect( Rect() ); MAknsSkinInstance* skin = AknsUtils::SkinInstance(); MAknsControlContext* cc = AknsDrawUtils::ControlContext(this); - // Solid or wipe comes from background - if( !AknsDrawUtils::Background( skin, cc, this, gc, rect ) ) + // Solid or wipe comes from background + if ( !AknsDrawUtils::Background( skin, cc, this, gc, rect ) ) { + // screen + TRect screenRect = iAvkonAppUi->ApplicationRect(); + + // app window + TAknWindowLineLayout applicationWindowLayout = + AknLayout::application_window(screenRect); + + TAknLayoutRect applicationWindowLayoutRect; + applicationWindowLayoutRect.LayoutRect(screenRect, applicationWindowLayout); + TRect applicationWindowRect = applicationWindowLayoutRect.Rect(); + + // statuspane + TAknWindowLineLayout statusPaneLayout = + AknLayout::status_pane(applicationWindowRect, 0); + + TAknLayoutRect statusPaneLayoutRect; + statusPaneLayoutRect.LayoutRect(applicationWindowRect, statusPaneLayout); + TRect statusPaneRect = statusPaneLayoutRect.Rect(); + + // context pane + TAknWindowLineLayout contextPaneLayout = + AknLayout::context_pane(statusPaneRect, 0); + + TAknLayoutRect contextPaneLayoutRect; + contextPaneLayoutRect.LayoutRect(statusPaneRect, contextPaneLayout); + TRect contextPaneRect = contextPaneLayoutRect.Rect(); + + TAknWindowLineLayout naviPaneGraphicsLayout = + AknLayout::Status_pane_elements_Line_1(); + + TAknLayoutRect naviPaneGraphicsLayoutRect; + naviPaneGraphicsLayoutRect.LayoutRect(statusPaneRect, naviPaneGraphicsLayout); + TRect naviPaneGraphicsRect = naviPaneGraphicsLayoutRect.Rect(); + + TRect barRect( contextPaneRect ); + if ( barRect.Intersects( naviPaneGraphicsRect ) ) + { + barRect.Intersection( naviPaneGraphicsRect ); + + // calculate new origo, relative to context pane. + barRect.iTl.iX -= contextPaneRect.iTl.iX; + barRect.iTl.iY -= contextPaneRect.iTl.iY; + barRect.iBr.iX -= contextPaneRect.iTl.iX; + barRect.iBr.iY -= contextPaneRect.iTl.iY; + } + else + { + barRect = TRect(0,0,0,0); + } + // Default drawing if skinning is not available gc.Clear(rect); gc.SetPenStyle(CGraphicsContext::ENullPen); @@ -533,7 +540,19 @@ } else { - TRAP_IGNORE(SetPictureToDefaultL()); // Trapped because of Java midlet issues + // Perf optimization: We don't set the default picture if the context + // pane is not in current status pane layout. The picture will be + // created in SizeChanged() if a valid size is set for context pane, + // but at the moment context pane isn't used in any of the supported + // Avkon status pane layouts. + CEikStatusPaneBase* statusPane = CEikStatusPaneBase::Current(); + if ( statusPane && + statusPane->PaneCapabilities( + TUid::Uid( EEikStatusPaneUidContext ) ).IsInCurrentLayout() ) + { + // Trapped because of Java midlet issues. + TRAP_IGNORE( SetPictureToDefaultL() ); + } } }