uifw/AvKon/src/akncombinedpane.cpp
branchRCL_3
changeset 4 8ca85d2f0db7
child 15 08e69e956a8c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/akncombinedpane.cpp	Fri Feb 19 23:04:46 2010 +0200
@@ -0,0 +1,294 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:  Status pane's combined subpane component.
+*
+*/
+
+#include <AknsDrawUtils.h>
+#include <AknIndicatorContainer.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <barsread.h>
+#include <eikspane.h>
+#include <avkon.hrh>
+#include <AknPriv.hrh>
+#include <AknSmallIndicator.h>
+#include <aknappui.h>
+#include <uikon/eikdefmacros.h>
+
+#include "akncombinedpane.h"
+#include "aknstatuspanedatasubscriber.h"
+
+// This is used to calculate the amount of pixels that the subpanes are
+// shifted to bottom and right when they are "pressed down". 
+const TInt KPressedDownDeltaDivider( 35 ); // 0.3 units
+
+// ======== MEMBER FUNCTIONS ========
+
+// ----------------------------------------------------------------------------
+// Two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CAknCombinedPane* CAknCombinedPane::NewL()
+    {
+    CAknCombinedPane* self = new ( ELeave ) CAknCombinedPane();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ----------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+//
+CAknCombinedPane::~CAknCombinedPane()
+    {
+    iSubPanes.Reset();
+
+    if ( iAvkonAppUi )
+        {
+        iAvkonAppUi->RemoveFromStack( this );
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// Returns number of controls inside this control.
+// ----------------------------------------------------------------------------
+//
+TInt CAknCombinedPane::CountComponentControls() const
+    {
+    return iSubPanes.Count();
+    }
+
+
+// ----------------------------------------------------------------------------
+// Returns a control determined by control index.
+// ----------------------------------------------------------------------------
+//
+CCoeControl* CAknCombinedPane::ComponentControl( TInt aIndex ) const
+    {
+    CCoeControl* control = NULL;
+
+    if ( iStatusPane && aIndex < iSubPanes.Count() )
+        {
+        TRAP_IGNORE( control = iStatusPane->ContainerControlL(
+            TUid::Uid( iSubPanes[aIndex].iUid ) ) );
+        }
+
+    return control;
+    }
+
+
+// ----------------------------------------------------------------------------
+// Handles a change to the control's resources.
+// ----------------------------------------------------------------------------
+//
+void CAknCombinedPane::HandleResourceChange( TInt aType )
+    {
+    CAknButton::HandleResourceChange( aType );
+
+    switch ( aType )
+        {
+        case KAknMessageFocusLost:      // fallthrough
+        case KEikMessageFadeAllWindows:
+            {
+            SetSubPanesPressedDown( EFalse );
+            DrawDeferred();
+            break;
+            }
+        
+        case KAknsMessageSkinChange:
+            {
+            DrawDeferred();
+            break;
+            }
+            
+        case KEikDynamicLayoutVariantSwitch:
+            {
+            SetSubPanesPressedDown( EFalse );
+            // Recalculate the pressed down delta pixels on layout change.
+            TAknWindowLineLayout unitValue(
+                AknLayoutScalable_Avkon::aid_value_unit2().LayoutLine() );
+            iPressedDownDelta = unitValue.iW / KPressedDownDeltaDivider;
+            DrawDeferred();
+            break;
+            }
+            
+        default:
+            {
+            break;
+            }
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// Resource constructor.
+// ----------------------------------------------------------------------------
+//
+void CAknCombinedPane::ConstructFromResourceL( TResourceReader& aReader )
+    {
+    aReader.ReadInt8(); // version
+
+    TInt count = aReader.ReadInt16(); // amount of subpanes
+
+    for ( TInt i = 0; i < count; ++i )
+        {
+        TSubPaneData subPane;
+
+        aReader.ReadInt8(); // version
+        subPane.iUid = aReader.ReadUint32(); // subpane UID
+        subPane.iPressedDown = EFalse; // Isn't specified in the resource.
+        aReader.ReadInt32(); // extension
+
+        iSubPanes.AppendL( subPane );
+        }
+
+    aReader.ReadInt32(); // extension
+
+    iStatusPane = CEikStatusPaneBase::Current();
+    }
+
+
+// ----------------------------------------------------------------------------
+// Handles pointer events inside the control.
+// ----------------------------------------------------------------------------
+//
+void CAknCombinedPane::HandlePointerEventL(
+    const TPointerEvent& aPointerEvent )
+    {
+    CAknButton::HandlePointerEventL( aPointerEvent );
+
+    switch ( aPointerEvent.iType )
+        {
+        case TPointerEvent::EButton1Down:
+            {
+            SetSubPanesPressedDown( ETrue );
+            iPointerDownInCombinedArea = ETrue;
+            break;
+            }
+            
+        case TPointerEvent::EButton1Up:
+            {
+            SetSubPanesPressedDown( EFalse );
+            
+            if ( iPointerDownInCombinedArea &&
+                 Rect().Contains( aPointerEvent.iPosition ) )
+                {
+                // Display the universal indicator popup.
+                CAknSmallIndicator* indicatorNotifier =
+                    CAknSmallIndicator::NewLC( TUid::Uid( 0 ) );
+                indicatorNotifier->HandleIndicatorTapL();
+                CleanupStack::PopAndDestroy( indicatorNotifier );
+                }
+            
+            iPointerDownInCombinedArea = EFalse;
+            break;
+            }
+            
+        case TPointerEvent::EDrag:
+            {
+            TRect combinedRect( Rect() );
+            if ( !combinedRect.Contains( aPointerEvent.iPosition ) )
+                {
+                SetSubPanesPressedDown( EFalse );
+                }
+            else if ( iPointerDownInCombinedArea &&
+                      combinedRect.Contains( aPointerEvent.iPosition ) )
+                {
+                SetSubPanesPressedDown( ETrue );
+                }
+            break;
+            }
+            
+        default:
+            {
+            break;
+            }
+        }
+
+    DrawDeferred();
+    }
+
+
+// ----------------------------------------------------------------------------
+// Default C++ constructor.
+// ----------------------------------------------------------------------------
+//
+CAknCombinedPane::CAknCombinedPane() : CAknButton( 0 ),
+                                       iStatusPane( NULL )
+    {
+    // Calculate the pressed down delta pixels from layout data,
+    // aid_value_unit2 is a 10ux10u rectangle.
+    TAknWindowLineLayout unitValue(
+        AknLayoutScalable_Avkon::aid_value_unit2().LayoutLine() );
+    // Move the control 0.3 units to right and down for the
+    // "pressed down" effect.
+    iPressedDownDelta = unitValue.iW / KPressedDownDeltaDivider;
+    }
+
+
+// ----------------------------------------------------------------------------
+// Second-phase constructor.
+// ----------------------------------------------------------------------------
+//
+void CAknCombinedPane::ConstructL()
+    {
+    CAknButton::ConstructL( NULL, NULL, NULL, NULL, KNullDesC, KNullDesC, 0 );
+
+    // Use the softkey frame graphics so that the bottom area appears
+    // consistent.
+    SetFrameAndCenterIds( KAknsIIDQgnFrSctrlSkButton,
+                          KAknsIIDQgnFrSctrlSkButtonCenter,
+                          KAknsIIDNone,
+                          KAknsIIDNone,
+                          KAknsIIDNone,
+                          KAknsIIDNone,
+                          KAknsIIDQgnFrSctrlSkButtonPressed,
+                          KAknsIIDQgnFrSctrlSkButtonCenterPressed,
+                          KAknsIIDNone,
+                          KAknsIIDNone );
+    
+    // Add to the control stack in order to receive the focus lost events. 
+    iAvkonAppUi->AddToStackL( this, 
+                              ECoeStackPriorityCba,
+                              ECoeStackFlagRefusesAllKeys |
+                              ECoeStackFlagRefusesFocus );
+    }
+
+
+// ----------------------------------------------------------------------------
+// Sets the pressed down state of the subpanes.
+// ----------------------------------------------------------------------------
+//
+void CAknCombinedPane::SetSubPanesPressedDown( TBool aPressedDown )
+    {
+    TInt delta = aPressedDown ? iPressedDownDelta : -iPressedDownDelta;
+
+    for ( TInt i = 0; i < iSubPanes.Count(); ++i )
+        {
+        if ( !COMPARE_BOOLS( iSubPanes[i].iPressedDown, aPressedDown ) )
+            {
+            CCoeControl* control = ComponentControl( i );
+            TRect controlRect( control->Rect() );
+            controlRect.Move( delta, delta );
+            control->SetRect( controlRect );
+            iSubPanes[i].iPressedDown = aPressedDown;
+            }
+        }
+    }
+
+// End of File