--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneuis/BubbleManager/Src/BMTouchPane.cpp Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,473 @@
+/*
+* Copyright (c) 2007 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: Container for touch controls.
+*
+*/
+
+
+#include <layoutmetadata.cdl.h>
+#include <barsread.h>
+
+#include "BMTouchPane.h"
+#include "BMPanic.h"
+#include "BMLayout4.h"
+#include "BMLayout6.h"
+#include "BMTouchPaneButton.h"
+
+// CONSTANTS
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// C++ default constructor
+// ---------------------------------------------------------------------------
+//
+CBubbleTouchPane::CBubbleTouchPane()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::ConstructL()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CBubbleTouchPane* CBubbleTouchPane::NewL()
+ {
+ CBubbleTouchPane* self = new(ELeave) CBubbleTouchPane;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CBubbleTouchPane::~CBubbleTouchPane()
+ {
+ iButtons.ResetAndDestroy();
+ iButtons.Close();
+
+ iButtonsToBeDeleted.ResetAndDestroy();
+ iButtonsToBeDeleted.Close();
+ delete iIdleProcessor;
+ }
+
+// ---------------------------------------------------------------------------
+// SizeChanged
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::SizeChanged( )
+ {
+ if ( !iButtons.Count() )
+ return;
+
+ // button index
+ // 1 2 OR 1 2 3 4
+ // 3 4
+ TInt i = 0;
+
+ TInt rows = 0;
+ TInt columns = 0;
+ BubbleLayout6::button_grp_row_column_count(0, rows, columns);
+ for ( TInt row = 0; row < rows; row++ )
+ {
+ for ( TInt col = 0; col < columns; col++ )
+ {
+ TAknLayoutRect buttonPane;
+ buttonPane.LayoutRect(
+ Rect(),
+ BubbleLayout6::cell_call6_button_pane(0, col, row) );
+
+ if ( i < iButtons.Count() && iButtons[i] )
+ {
+ // Button control layout according to background
+ AknLayoutUtils::LayoutControl(
+ iButtons[i],
+ buttonPane.Rect(),
+ BubbleLayout6::button_call6_background_graphics(0));
+
+ TAknLayoutText text;
+ text.LayoutText( buttonPane.Rect(),
+ BubbleLayout6::button_call6_function_text(0));
+
+ TAknLayoutRect icon;
+ icon.LayoutRect( buttonPane.Rect(),
+ BubbleLayout6::button_call6_function_graphics(0));
+
+ iButtons[i]->SetIconSize( icon.Rect().Size() );
+ iButtons[i++]->SetLayout( text, icon.Rect() );
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CountComponentControls
+// ---------------------------------------------------------------------------
+//
+TInt CBubbleTouchPane::CountComponentControls( ) const
+ {
+ return iButtons.Count();
+ }
+
+// ---------------------------------------------------------------------------
+// ComponentControl
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CBubbleTouchPane::ComponentControl( TInt aIndex ) const
+ {
+ return iButtons[ aIndex ];
+ }
+
+// ---------------------------------------------------------------------------
+// HandlePointerEventL
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::HandlePointerEventL
+ ( const TPointerEvent& aPointerEvent )
+ {
+ CCoeControl::HandlePointerEventL( aPointerEvent );
+ }
+
+// ---------------------------------------------------------------------------
+// HandleControlEventL
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::HandleControlEventL(
+ CCoeControl* aControl,
+ TCoeEvent aEventType)
+ {
+ if ( aEventType != EEventStateChanged )
+ {
+ return;
+ }
+
+ CBubbleTouchPaneButton* tappedButton = NULL;
+ for ( TInt i=0; i < iButtons.Count(); i++ )
+ {
+ if ( iButtons[i] == aControl )
+ {
+ tappedButton = iButtons[i];
+ break;
+ }
+ }
+ if ( tappedButton )
+ {
+ iDeleteButtonsAsync = ETrue;
+ CEikAppUi* appUi = CEikonEnv::Static()->EikAppUi();
+ appUi->HandleCommandL( tappedButton->CommandId( ETrue ) );
+ iDeleteButtonsAsync = EFalse;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// HandleResourceChange
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::HandleResourceChange( TInt aType )
+ {
+ for ( TInt i=0; i < iButtons.Count(); i++ )
+ {
+ iButtons[i]->HandleResourceChange( aType );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// SetUpdating
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::SetUpdating( TBool aUpdating )
+ {
+ iUpdating = aUpdating;
+ }
+
+// ---------------------------------------------------------------------------
+// IdleCallback
+// ---------------------------------------------------------------------------
+//
+TInt CBubbleTouchPane::IdleCallback( TAny* aThis )
+ {
+ CBubbleTouchPane* self =
+ static_cast<CBubbleTouchPane*>( aThis );
+ self->DoDeleteButtonsInIdle();
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// DoDeleteButtonsInIdle
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::DoDeleteButtonsInIdle()
+ {
+ iButtonsToBeDeleted.ResetAndDestroy();
+ }
+
+// ---------------------------------------------------------------------------
+// SetButtonSet
+// ---------------------------------------------------------------------------
+//
+TInt CBubbleTouchPane::SetButtonSet( TInt aResourceId )
+ {
+ TRAPD( err, SetButtonSetL( aResourceId ) );
+
+ return err;
+ }
+
+// ---------------------------------------------------------------------------
+// SetButtonSetL
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::SetButtonSetL( TInt aResourceId )
+ {
+ // reset touch pane
+ if ( iDeleteButtonsAsync )
+ {
+ // swap buttons to another array
+ for ( TInt i=0; i < iButtons.Count(); i++ )
+ {
+ iButtonsToBeDeleted.AppendL( iButtons[i] );
+ }
+
+ iButtons.Reset();
+ }
+ else
+ {
+ iButtons.ResetAndDestroy();
+ }
+
+ if ( iButtonsToBeDeleted.Count() )
+ {
+ if ( !iIdleProcessor )
+ {
+ iIdleProcessor = CIdle::NewL( CActive::EPriorityIdle );
+ }
+
+ if ( !iIdleProcessor->IsActive() )
+ {
+ TCallBack idleCallback( IdleCallback, this );
+ iIdleProcessor->Start( idleCallback );
+ }
+ }
+
+ iCurrentButtonSetId = 0;
+
+ // load new buttons
+ if ( aResourceId )
+ {
+ TResourceReader reader;
+ iCoeEnv->CreateResourceReaderLC( reader, aResourceId );
+ LoadButtonsFromResourceL( reader );
+ CleanupStack::PopAndDestroy();
+ iCurrentButtonSetId = aResourceId;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// LoadButtonsFromResourceL
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::LoadButtonsFromResourceL( TResourceReader& aReader )
+ {
+ __ASSERT_DEBUG( (iButtons.Count() == 0), Panic( EBMPanicTouchPane ) );
+
+ TInt flags = aReader.ReadInt16();
+
+ TInt buttonCount = aReader.ReadInt16();
+ for ( TInt i=0; i < buttonCount; i++ )
+ {
+ TInt buttonId( aReader.ReadInt32() );
+ TResourceReader buttonReader;
+ iCoeEnv->CreateResourceReaderLC( buttonReader, buttonId );
+
+ CBubbleTouchPaneButton* button = CBubbleTouchPaneButton::NewL(
+ iIconProvider, flags );
+ CleanupStack::PushL( button );
+ button->ConstructFromResouceL( buttonReader );
+
+ CleanupStack::Pop( button );
+ CleanupStack::PopAndDestroy(); // buttonReader
+
+ iButtons.Append( button );
+ }
+
+ for ( TInt i=0; i < iButtons.Count(); i++ )
+ {
+ CBubbleTouchPaneButton* button = iButtons[i];
+ button->SetContainerWindowL( *this );
+ button->SetObserver( this );
+ button->ActivateL();
+ }
+
+ SizeChanged();
+ if ( IsVisible() )
+ {
+ if ( iUpdating )
+ {
+ DrawDeferred();
+ }
+ else
+ {
+ DrawNow();
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// SetButtonState
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::SetButtonState( TInt aCommand )
+ {
+ for ( TInt i=0; i < iButtons.Count(); i++ )
+ {
+ TBool drawNow = ( IsVisible() && !iUpdating ) ? ETrue : EFalse;
+ iButtons[i]->SetState( aCommand, drawNow );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// SetButtonDimmed
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::SetButtonDimmed( TInt aCommand, TBool aDimmed )
+ {
+ TInt buttonCount = iButtons.Count();
+
+ for ( TInt i=0; i < buttonCount; i++ )
+ {
+ if ( iButtons[i]->CommandId() == aCommand )
+ {
+ iButtons[i]->SetDimmed( aDimmed );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// NumberOfButtonsInPane
+// ---------------------------------------------------------------------------
+//
+TInt CBubbleTouchPane::NumberOfButtonsInPane() const
+ {
+ return CountComponentControls();
+ }
+
+// ---------------------------------------------------------------------------
+// ButtonCommandId
+// ---------------------------------------------------------------------------
+//
+TInt CBubbleTouchPane::ButtonCommandId( TInt aButtonIndex ) const
+ {
+ return iButtons[ aButtonIndex ]->CommandId();
+ }
+
+// ---------------------------------------------------------------------------
+// ButtonHasState
+// ---------------------------------------------------------------------------
+//
+TBool CBubbleTouchPane::ButtonHasState( TInt aButtonIndex, TInt aCommand ) const
+ {
+ return iButtons[ aButtonIndex ]->HasState( aCommand );
+ }
+
+// ---------------------------------------------------------------------------
+// ReplaceButton
+// ---------------------------------------------------------------------------
+//
+TInt CBubbleTouchPane::ReplaceButton( TInt aButtonIndex, TInt aResourceId )
+ {
+ TInt err;
+
+ if ( 0 <= aButtonIndex && aButtonIndex < iButtons.Count() &&
+ aResourceId )
+ {
+ TRAP( err, ReplaceButtonL( aButtonIndex, aResourceId ) );
+ }
+ else
+ {
+ err = KErrGeneral;
+ }
+
+ return err;
+ }
+
+// ---------------------------------------------------------------------------
+// ReplaceButton
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::ReplaceButtonL( TInt aButtonIndex, TInt aResourceId )
+ {
+ TResourceReader reader;
+ iCoeEnv->CreateResourceReaderLC( reader, aResourceId );
+
+ CBubbleTouchPaneButton* button = CBubbleTouchPaneButton::NewL(
+ iIconProvider);
+ CleanupStack::PushL( button );
+ button->ConstructFromResouceL( reader );
+
+ CleanupStack::Pop( button );
+ CleanupStack::PopAndDestroy(); // reader
+
+ button->SetContainerWindowL( *this );
+ button->SetObserver( this );
+ button->ActivateL();
+
+ if ( !iDeleteButtonsAsync )
+ {
+ delete iButtons[ aButtonIndex ];
+ iButtons[ aButtonIndex ] = NULL;
+ }
+ else
+ {
+ iButtonsToBeDeleted.Append( iButtons[ aButtonIndex ] );
+ iButtons[ aButtonIndex ] = NULL;
+ if ( !iIdleProcessor )
+ {
+ iIdleProcessor = CIdle::NewL( CActive::EPriorityIdle );
+ }
+
+ if ( !iIdleProcessor->IsActive() )
+ {
+ TCallBack idleCallback( IdleCallback, this );
+ iIdleProcessor->Start( idleCallback );
+ }
+ }
+
+ iButtons[ aButtonIndex ] = button;
+
+ SizeChanged();
+ if ( IsVisible() )
+ {
+ DrawDeferred();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// SetIconProvider
+// ---------------------------------------------------------------------------
+//
+void CBubbleTouchPane::SetIconProvider(
+ MBubbleTouchPaneIconProvider* aIconProvider )
+ {
+ iIconProvider = aIconProvider;
+ }