--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/akncombinedpane.cpp Sun Mar 14 13:10:48 2010 +0000
@@ -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