diff -r 2f259fa3e83a -r 8ca85d2f0db7 uifw/EikStd/coctlsrc/eikcba.cpp --- a/uifw/EikStd/coctlsrc/eikcba.cpp Tue Feb 02 01:00:49 2010 +0200 +++ b/uifw/EikStd/coctlsrc/eikcba.cpp Fri Feb 19 23:04:46 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2009 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" @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include // LayoutUtils #include #include @@ -268,7 +270,6 @@ iCbaRect = TRect( 0,0,0,0 ); iIfSkinChanged = EFalse; iIfMskIconSet = EFalse; - iSemiBgID = KAknsIIDNone; if ( iOwner.Flags().IsSet( ECbaSingleClickEnabled ) ) { @@ -731,16 +732,85 @@ void DrawSemiTransparencyL(CWindowGc& aGc, const TRect& aRect) { - //Temporary inner rectangal value - TRect innerRect = aRect; - innerRect.Shrink( 5, 5 ); - if ( iSemiBgID != KAknsIIDNone ) - { - AknsDrawUtils::DrawFrame( AknsUtils::SkinInstance(), - aGc, aRect, innerRect, iSemiBgID, iSemiBgCenterID ); - } + aGc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + aGc.SetBrushColor( TRgb(128, 128, 128, 64) ); + aGc.Clear(); + + TAknsItemID SemiButtonID = KAknsIIDQgnHomeButtonWidget; + TAknsItemID SemiButtonCenterID = KAknsIIDQgnHomeButtonWidgetCenter; + TAknsItemID SemiButtonPressedID = KAknsIIDQgnHomeButtonWidget; + TAknsItemID SemiButtonPressedCenterID = KAknsIIDQsnFrHomeCenterPressed; + + CEikCbaButton* button1 = static_cast + (iOwner.Control(KControlArrayCBAButton1Posn)); + CEikCbaButton* button2 = static_cast + (iOwner.Control(KControlArrayCBAButton2Posn)); + + if (IsMskEnabledLayoutActive()) + { + TRect innerRect = iMiddleFrameOuterRect; + innerRect.Shrink(4, 4); + + CEikCbaButton* buttonMSK = static_cast + (iOwner.Control(KControlArrayCBAButtonMSKPosn)); + + if (buttonMSK && buttonMSK->PressedDown()) + { + AknsDrawUtils::DrawFrame(AknsUtils::SkinInstance(), aGc, + iMiddleFrameOuterRect, + innerRect,//iMiddleFrameInnerRect, + SemiButtonPressedID, + SemiButtonPressedCenterID); + } + else + { + AknsDrawUtils::DrawFrame(AknsUtils::SkinInstance(), aGc, + iMiddleFrameOuterRect, + innerRect,//iMiddleFrameInnerRect, + SemiButtonID, + SemiButtonCenterID); + } + } + + TRect innerRect = iLeftFrameOuterRect; + innerRect.Shrink(4, 4); + + if (button1 && button1->PressedDown()) + { + AknsDrawUtils::DrawFrame(AknsUtils::SkinInstance(), aGc, + iLeftFrameOuterRect, + innerRect,//iLeftFrameInnerRect, + SemiButtonPressedID, + SemiButtonPressedCenterID); + } + else + { + AknsDrawUtils::DrawFrame(AknsUtils::SkinInstance(), aGc, + iLeftFrameOuterRect, + innerRect,//iLeftFrameInnerRect, + SemiButtonID, + SemiButtonCenterID); + } + + innerRect = iRightFrameOuterRect; + innerRect.Shrink(4, 4); + if (button2 && button2->PressedDown()) + { + AknsDrawUtils::DrawFrame(AknsUtils::SkinInstance(), aGc, + iRightFrameOuterRect, + innerRect,//iRightFrameInnerRect, + SemiButtonPressedID, + SemiButtonPressedCenterID); + } + else + { + AknsDrawUtils::DrawFrame(AknsUtils::SkinInstance(), aGc, + iRightFrameOuterRect, + innerRect,//iRightFrameInnerRect, + SemiButtonID, + SemiButtonCenterID); + } } - public: CEikCba& iOwner; @@ -796,11 +866,6 @@ */ TRect iUpdateFrameOuterRect; - /* - * Frame and center theme ID, using for semi-transparent - */ - TAknsItemID iSemiBgID; - TAknsItemID iSemiBgCenterID; /** * Inner rect used in UpdateSoftkeyFrameL method. */ @@ -1195,12 +1260,6 @@ } iExtension = CEikCbaExtension::NewL( *this ); - //create bitmap for semi-transparent background - if ( iCbaFlags & EEikCbaFlagSemiTransparent && iExtension ) - { - iExtension->iSemiBgID = KAknsIIDQsnHomeBgWidget; - iExtension->iSemiBgCenterID = KAknsIIDQsnHomeBgWidgetCenter; - } // Skin background is not drawn by embedded CBA. if ( !iFlags.IsSet( ECbaEmbedded ) ) @@ -1333,6 +1392,17 @@ TResourceReader reader; iCoeEnv->CreateResourceReaderLC(reader, aResourceId); iCbaFlags = reader.ReadInt32(); // flags resource + + const TUid KActiveIdle2Uid = {0x102750F0}; + CEikApplication* app = CEikonEnv::Static()->EikAppUi()->Application(); + if ( app && app->AppDllUid() == KActiveIdle2Uid ) + { + //it's intereting that the transparent can't not be set after the CBA was created for a while. + //it just can be done in the CBA constructor, maybe some defect in Window server, but I'm not sure + //about that, in order to fix the defect I have hardcode the transparent flag for homescreen the only usercase. + //it should be fixed later. + iCbaFlags |= EEikCbaFlagSemiTransparent; + } // If using enhanced cba. if ( (iCbaFlags & EEikEnhancedButtonGroup) == EEikEnhancedButtonGroup ) @@ -2773,16 +2843,8 @@ // if ( statusPane && statusPane->IsVisible() && - AknStatuspaneUtils::ExtendedFlatLayoutActive() && - ( iBgIID == KAknsIIDQsnBgAreaControl || - iBgIID == KAknsIIDQsnBgAreaControlIdle || - iBgIID == KAknsIIDQsnBgAreaControlMp || - ( iBgIID == KAknsIIDWallpaper && - AknStatuspaneUtils::IdleLayoutActive() ) ) ) - { - TRect digitalClockRect( 0,0,0,0 ); - TRect indicatorRect( 0,0,0,0 ); - + AknStatuspaneUtils::ExtendedFlatLayoutActive() ) + { if ( iBgIID == KAknsIIDQsnBgAreaControlMp ) { if ( !iIsClockIndicBgIIDSet ) @@ -2803,35 +2865,65 @@ } } - TRAPD( err1, - indicatorRect = statusPane->PaneRectL( TUid::Uid( - EEikStatusPaneUidIndic ) ) ); - - TRAPD( err2, - digitalClockRect = statusPane->PaneRectL( TUid::Uid( - EEikStatusPaneUidDigitalClock ) ) ); - - if ( !err1 && !err2 ) - { - TPoint cbaPositionRelativeToScreen( PositionRelativeToScreen() ); - TRect cbaRectRelativeToScreen( cbaPositionRelativeToScreen, Size() ); - - if ( cbaRectRelativeToScreen.Intersects( indicatorRect ) ) + if ( statusPane->PaneCapabilities( + TUid::Uid( EEikStatusPaneUidCombined ) ).IsInCurrentLayout() ) + { + TRect combinedPaneRect( 0, 0, 0, 0 ); + TRAPD( err, + combinedPaneRect = + statusPane->PaneRectL( TUid::Uid( + EEikStatusPaneUidCombined ) ) ); + + if ( !err ) { - indicatorRect.Move( - -cbaPositionRelativeToScreen.iX, - -cbaPositionRelativeToScreen.iY ); - - region.SubRect( indicatorRect ); + TPoint cbaPositionRelativeToScreen( PositionRelativeToScreen() ); + TRect cbaRectRelativeToScreen( cbaPositionRelativeToScreen, Size() ); + + if ( cbaRectRelativeToScreen.Intersects( combinedPaneRect ) ) + { + combinedPaneRect.Move( + -cbaPositionRelativeToScreen.iX, + -cbaPositionRelativeToScreen.iY ); + + region.SubRect( combinedPaneRect ); + } } + } + else + { + TRect digitalClockRect( 0, 0, 0, 0 ); + TRect indicatorRect( 0, 0, 0, 0 ); + + TRAPD( err1, + indicatorRect = statusPane->PaneRectL( TUid::Uid( + EEikStatusPaneUidIndic ) ) ); + + TRAPD( err2, + digitalClockRect = statusPane->PaneRectL( TUid::Uid( + EEikStatusPaneUidDigitalClock ) ) ); - if ( cbaRectRelativeToScreen.Intersects( digitalClockRect ) ) + if ( !err1 && !err2 ) { - digitalClockRect.Move( - -cbaPositionRelativeToScreen.iX, - -cbaPositionRelativeToScreen.iY ); - - region.SubRect( digitalClockRect ); + TPoint cbaPositionRelativeToScreen( PositionRelativeToScreen() ); + TRect cbaRectRelativeToScreen( cbaPositionRelativeToScreen, Size() ); + + if ( cbaRectRelativeToScreen.Intersects( indicatorRect ) ) + { + indicatorRect.Move( + -cbaPositionRelativeToScreen.iX, + -cbaPositionRelativeToScreen.iY ); + + region.SubRect( indicatorRect ); + } + + if ( cbaRectRelativeToScreen.Intersects( digitalClockRect ) ) + { + digitalClockRect.Move( + -cbaPositionRelativeToScreen.iX, + -cbaPositionRelativeToScreen.iY ); + + region.SubRect( digitalClockRect ); + } } } } @@ -3179,22 +3271,6 @@ { iCbaFlags &= ~EEikCbaFlagTransparent; } - if ( iCbaFlags & EEikCbaFlagSemiTransparent ) - { - if ( iExtension ) - { - iExtension->iSemiBgID = KAknsIIDQsnHomeBgWidget; - iExtension->iSemiBgCenterID = KAknsIIDQsnHomeBgWidgetCenter; - } - } - else - { - if ( iExtension ) - { - iExtension->iSemiBgID = KAknsIIDNone; - iExtension->iSemiBgCenterID = KAknsIIDNone; - } - } UpdateFonts(); } @@ -3285,12 +3361,30 @@ TKeyResponse response(EKeyWasNotConsumed); + CEikCbaButton* button1 = + static_cast( + (*iControlArray)[KControlArrayCBAButton1Posn].iControl ); + CEikCbaButton* button2 = + static_cast( + (*iControlArray)[KControlArrayCBAButton2Posn].iControl ); + CEikCbaButton* buttonMSK = NULL; + if ( iMSKset && AknLayoutUtils::MSKEnabled() ) + { + buttonMSK = + static_cast( + (*iControlArray)[KControlArrayCBAButtonMSKPosn].iControl ); + } + // AknLaf - changed to use keys defined in AknKeys.h. // Left soft key will be returned also when MSK is enabled but not defined. if (aKeyEvent.iCode == EKeyCBA1) { if (KControlArrayCBAButton1Posn < iControlArray->Count()) { + if( button1->IsDimmed() ) + { + return EKeyWasConsumed; + } // Return immediately if the button is invisible if ( (*iControlArray)[KControlArrayCBAButton1Posn].iControl && !(*iControlArray)[KControlArrayCBAButton1Posn].iControl->IsVisible() && @@ -3322,6 +3416,10 @@ { if (KControlArrayCBAButton2Posn < iControlArray->Count()) { + if( button2->IsDimmed() ) + { + return EKeyWasConsumed; + } // Return immediately if the button is invisible. if ( (*iControlArray)[KControlArrayCBAButton2Posn].iControl && !(*iControlArray)[KControlArrayCBAButton2Posn].iControl->IsVisible() && @@ -3365,6 +3463,10 @@ && aKeyEvent.iCode == EKeyOK && !Window().IsFaded() ) { + if( buttonMSK->IsDimmed() ) + { + return EKeyWasConsumed; + } if (KControlArrayCBAButtonMSKPosn < iControlArray->Count()) { // Return immediately if the button is invisible. @@ -3577,6 +3679,11 @@ // If hits the left softkey. if ( button1Rect.Contains( aPointerEvent.iPosition ) && !button1Empty ) { + if( button1->IsDimmed() ) + { + CCoeControl::HandlePointerEventL( aPointerEvent ); + return; + } if ( button1->IsVisible() ) { if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) @@ -3636,6 +3743,11 @@ } else if ( button2Rect.Contains( aPointerEvent.iPosition ) && !button2Empty ) { + if( button2->IsDimmed() ) + { + CCoeControl::HandlePointerEventL( aPointerEvent ); + return; + } if ( button2->IsVisible() ) { if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) @@ -3697,6 +3809,11 @@ !buttonMSKEmpty && buttonMSKRect.Contains( aPointerEvent.iPosition ) ) { + if( buttonMSK->IsDimmed() ) + { + CCoeControl::HandlePointerEventL( aPointerEvent ); + return; + } if ( buttonMSK->IsVisible() ) { if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) @@ -4199,18 +4316,19 @@ { return; } + + if ( iCbaFlags & EEikCbaFlagSemiTransparent ) + { + CWindowGc &gc = SystemGc(); + + iExtension->DrawSemiTransparencyL( gc, Rect() ); + return; + } MAknsSkinInstance* skin = AknsUtils::SkinInstance(); const TRect rect( Rect() ); CWindowGc& gc = SystemGc(); - - TRgb rgb( TRgb::Color16MA( 0 ) ); - gc.SetDrawMode( CGraphicsContext::EDrawModeWriteAlpha ); - gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); - gc.SetBrushColor( rgb ); - gc.Clear(); - MAknsControlContext* cc = iMLBgContext; if ( iFlags.IsSet( ECbaEmbedded ) ) @@ -4443,13 +4561,6 @@ } } } - else if ( ( iCbaFlags & EEikCbaFlagSemiTransparent) && iExtension ) - { - if ( iExtension->iSemiBgID != KAknsIIDNone ) - { - iExtension->DrawSemiTransparencyL( gc, rect ); - } - } else { // No background since EEikCbaFlagTransparent is set. @@ -5021,7 +5132,7 @@ } if ( iExtension->iEnablePostingTransparency || - ( iCbaFlags & EEikCbaFlagTransparent ) || ( iCbaFlags & EEikCbaFlagSemiTransparent ) ) + ( iCbaFlags & EEikCbaFlagTransparent ) ) { textVariety = 6; // Outline font used } @@ -5113,7 +5224,7 @@ } TInt textMSKVariety = 3; - TInt graphicMSKVariety = 0; + TInt graphicMSKVariety = 1; if ( mskEnabledInApplication && mskEnabledInPlatform ) { @@ -5163,9 +5274,7 @@ MAknsSkinInstance* skin = AknsUtils::SkinInstance(); const TBool transparentSoftkeys = - iExtension->iEnablePostingTransparency || - ( iCbaFlags & EEikCbaFlagTransparent ) || - ( iCbaFlags & EEikCbaFlagSemiTransparent ); + iExtension->iEnablePostingTransparency || ( iCbaFlags & EEikCbaFlagTransparent ); TRgb leftColor; TRgb rightColor; TRgb MSKColor; @@ -6076,7 +6185,7 @@ TInt rightPaneTextVariety = 0; if ( iExtension->iEnablePostingTransparency || - ( iCbaFlags & EEikCbaFlagTransparent ) || ( iCbaFlags & EEikCbaFlagSemiTransparent ) ) + ( iCbaFlags & EEikCbaFlagTransparent ) ) { rightPaneTextVariety = 1; // Outline font used } @@ -7250,7 +7359,7 @@ TRect rect; qgn_graf_sk_msk.LayoutRect( rect, - AknLayoutScalable_Avkon::control_pane_g4( 0 ).LayoutLine() ); + AknLayoutScalable_Avkon::control_pane_g4( 1 ).LayoutLine() ); TSize iconSize( qgn_graf_sk_msk.Rect().Width(), qgn_graf_sk_msk.Rect().Height() );