--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/uicomponents/src/fscontrolbutton.cpp Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,724 @@
+/*
+* 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: Main class for Control Button component.
+*
+*/
+
+
+
+// <cmail> SF
+#include "emailtrace.h"
+#include <alf/alfevent.h>
+#include <alf/alfdecklayout.h>
+// </cmail>
+// Needed for pointer events.
+#include <alf/alfdisplay.h>
+#include <alf/alfroster.h>
+
+#include <AknUtils.h>
+
+#include "fscontrolbutton.h"
+#include "fscontrolbuttonmodel.h"
+#include "fscontrolbuttonvisualiser.h"
+#include "fscontrolbuttonobserver.h"
+#include "fsgenericpanic.h"
+#include "fstriggeredcomponent.h"
+#include "fstextstylemanager.h"
+#include "fslayoutmanager.h"
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CFsControlButton::CFsControlButton(
+ MFsControlButtonObserver& aParent,
+ CAlfDeckLayout& aParentLayout ) :
+ iParent( aParent ),
+ iParentLayout( aParentLayout )
+ {
+ FUNC_LOG;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Second phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::ConstructL(
+ CAlfEnv& aEnv,
+ TInt aId,
+ TFsControlButtonType aType,
+ TRect& aStartPoint,
+ CFsTextStyleManager* aTextStyleManager )
+ {
+ FUNC_LOG;
+ CAlfControl::ConstructL( aEnv );
+
+ iModel = CFsControlButtonModel::NewL(
+ aId, aType, aStartPoint, iParentLayout );
+
+ iVisualiser = CFsControlButtonVisualiser::NewL(
+ *this, iParentLayout, aTextStyleManager );
+ iVisualiser->InitializeL( *iModel );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CFsControlButton* CFsControlButton::NewL(
+ CAlfEnv& aEnv,
+ MFsControlButtonObserver& aParent,
+ TInt aId,
+ TFsControlButtonType aType,
+ TRect& aStartPoint,
+ CAlfDeckLayout& aParentLayout,
+ CFsTextStyleManager* aTextStyleManager )
+ {
+ FUNC_LOG;
+ CFsControlButton* self =
+ new( ELeave ) CFsControlButton( aParent, aParentLayout );
+ CleanupStack::PushL( self );
+ self->ConstructL(
+ aEnv, aId, aType, aStartPoint, aTextStyleManager );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CFsControlButton::~CFsControlButton()
+ {
+ FUNC_LOG;
+ delete iModel;
+ delete iVisualiser;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Sets first line of text in button.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetTextL(
+ const TDesC& aLabel,
+ TFsButtonContent aContent )
+ {
+ FUNC_LOG;
+ iModel->SetTextL( aLabel, aContent );
+ switch ( aContent )
+ {
+ case EFsButtonFirstLine:
+ iVisualiser->UpdateElementL( ECBElemLabelFirstLine );
+ break;
+ case EFsButtonSecondLine:
+ iVisualiser->UpdateElementL( ECBElemLabelSndLine );
+ break;
+ default:
+ User::Leave( KErrNotSupported );
+ break;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Sets visualiser for the button.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetVisualiserL(
+ CFsControlButtonVisualiser* aVisualiser )
+ {
+ FUNC_LOG;
+ __ASSERT_ALWAYS( aVisualiser, User::Leave( KErrArgument ) );
+
+ CFsControlButtonVisualiser* newVisualiser( aVisualiser );
+ CleanupStack::PushL( newVisualiser );
+
+ newVisualiser->SetParentControlL( this );
+ newVisualiser->SetParentLayoutL( &iParentLayout );
+ newVisualiser->InitializeL( *iModel );
+
+ CleanupStack::Pop( newVisualiser );
+
+ delete iVisualiser;
+ iVisualiser = newVisualiser;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves button's visualiser.
+// ---------------------------------------------------------------------------
+//
+CFsControlButtonVisualiser* CFsControlButton::Visualiser()
+ {
+ FUNC_LOG;
+ return iVisualiser;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Set the layout position index on controlbar.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetParentIndex( TInt aLayoutPos )
+ {
+ FUNC_LOG;
+ iModel->SetParentIndex( aLayoutPos );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves id of the button.
+// ---------------------------------------------------------------------------
+//
+TInt CFsControlButton::Id() const
+ {
+ FUNC_LOG;
+ return iModel->Id();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Sets icon A or B. Panics if button's type is incorrect.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetIconL(
+ CAlfTexture& aIcon,
+ TFsControlButtonElem aWhich )
+ {
+ FUNC_LOG;
+ iModel->SetIconL( aIcon, aWhich );
+ iVisualiser->UpdateElementL( aWhich );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Sets width of the button.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetWidth( TInt aWidth )
+ {
+ FUNC_LOG;
+ iModel->SetAutoSizeMode( MFsControlButtonInterface::EFsManual );
+ iModel->SetWidth( aWidth );
+ iVisualiser->Refresh();
+ }
+
+// <cmail> Platform layout changes
+// ---------------------------------------------------------------------------
+// Sets size of the button.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetSize( const TSize& aSize )
+ {
+ FUNC_LOG;
+ iModel->SetAutoSizeMode( MFsControlButtonInterface::EFsManual );
+ iModel->SetSize( aSize );
+ iVisualiser->Refresh();
+ }
+// </cmail> Platform layout changes
+
+// ---------------------------------------------------------------------------
+// Set auto size mode for button.
+// Defines how the buttons size is changed.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetAutoSizeMode( TFsAutoSizeMode aAutoSizeMode )
+ {
+ FUNC_LOG;
+ TBool refresh( aAutoSizeMode != iModel->AutoSizeMode() );
+ iModel->SetAutoSizeMode( aAutoSizeMode );
+ if ( refresh )
+ {
+ iVisualiser->Refresh();
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Sets focus to control button.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetFocus( TBool aState )
+ {
+ FUNC_LOG;
+ iModel->SetFocus( aState );
+ iVisualiser->Refresh();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Refresh the button's position.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::RefreshButtonPosition( TSize& aParentSize )
+ {
+ FUNC_LOG;
+ iModel->RefreshButtonPosition( aParentSize );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Checks if button has focus.
+// ---------------------------------------------------------------------------
+//
+TBool CFsControlButton::IsFocused() const
+ {
+ FUNC_LOG;
+ return iModel->IsFocused();
+ }
+
+// <cmail> Platform layout changes
+// ---------------------------------------------------------------------------
+// Sets position of the button (top left point).
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetPos( const TPoint& aTlPoint )
+ {
+ FUNC_LOG;
+ iModel->SetPos( aTlPoint );
+ iModel->SetAutoSizeMode( MFsControlButtonInterface::EFsManual );
+
+ // Refresh buttons position to apply mirroring to it.
+ TSize parent( iParentLayout.Size().Target().AsSize() );
+ iModel->RefreshButtonPosition( parent );
+
+ iVisualiser->Refresh();
+ }
+// </cmail> Platform layout changes
+
+
+// ---------------------------------------------------------------------------
+// Retrieves position of button.
+// ---------------------------------------------------------------------------
+//
+const TAlfTimedPoint CFsControlButton::Pos() const
+ {
+ FUNC_LOG;
+ return iVisualiser->Layout()->Pos();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves size of button.
+// ---------------------------------------------------------------------------
+//
+const TAlfTimedPoint CFsControlButton::Size() const
+ {
+ FUNC_LOG;
+ return iVisualiser->Layout()->Size();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Sets component to button which will be triggered when button
+// is pressed.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetTriggeredComponent(
+ MFsTriggeredComponent& aComponent )
+ {
+ FUNC_LOG;
+ iTriggeredComponent = &aComponent;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Clears triggered component. No more events to triggered
+// component are sent.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::ClearTriggeredComponent()
+ {
+ FUNC_LOG;
+ iTriggeredComponent = NULL;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Sets alignment of element.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetElemAlignL(
+ TFsControlButtonElem aButtonElem,
+ TAlfAlignHorizontal aHAlign,
+ TAlfAlignVertical aVAlign )
+ {
+ FUNC_LOG;
+ iVisualiser->SetElemAlignL( aButtonElem, aHAlign, aVAlign );
+ iVisualiser->Refresh();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Sets dimm state of the button.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetDimmed( TBool aDimmed )
+ {
+ FUNC_LOG;
+ if ( aDimmed != IsDimmed() )
+ {
+ iModel->SetDimmed( aDimmed );
+ iVisualiser->Refresh();
+
+ iParent.HandleButtonEvent(
+ MFsControlButtonObserver::EEventButtonDimmStateChanged,
+ iModel->Id() );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Checks dimm state of the button.
+// ---------------------------------------------------------------------------
+//
+TBool CFsControlButton::IsDimmed() const
+ {
+ FUNC_LOG;
+ return iModel->IsDimmed();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Shows (enables) button.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::ShowButtonL()
+ {
+ FUNC_LOG;
+ if ( !iVisualiser->IsVisible() )
+ {
+ iVisualiser->ShowL();
+
+ iParent.HandleButtonEvent(
+ MFsControlButtonObserver::EEventButtonVisibilityChanged,
+ iModel->Id() );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Hides (disables) button.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::HideButton()
+ {
+ FUNC_LOG;
+ if ( iVisualiser->IsVisible() )
+ {
+ iVisualiser->Hide();
+
+ iParent.HandleButtonEvent(
+ MFsControlButtonObserver::EEventButtonVisibilityChanged,
+ iModel->Id() );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Checks if button is visible or hidden.
+// ---------------------------------------------------------------------------
+//
+TBool CFsControlButton::IsVisible() const
+ {
+ FUNC_LOG;
+ return iVisualiser->IsVisible();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Sets button's background image.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetBackgroundImageL( CAlfImageBrush* aImage )
+ {
+ FUNC_LOG;
+ iVisualiser->SetBackgroundImageL( aImage );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Sets button's background color.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetBackgroundColor( const TRgb& aColor )
+ {
+ FUNC_LOG;
+ iModel->SetTextColor( aColor, CFsControlButtonModel::EButtonBackground );
+ iVisualiser->SetBackgroundColor( aColor );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Clears button's background color. Button is transparent.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::ClearBackgroundColor()
+ {
+ FUNC_LOG;
+ iVisualiser->ClearBackgroundColor();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Clears button's background image.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::ClearBackgroundImage()
+ {
+ FUNC_LOG;
+ iVisualiser->ClearBackgroundImage();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves text from control button.
+// ---------------------------------------------------------------------------
+//
+TPtrC CFsControlButton::Text( TFsButtonContent aContent ) const
+ {
+ FUNC_LOG;
+ return iModel->Text( aContent );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Set new height for the button text.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetTextHeight( const TInt aTextHeight )
+ {
+ FUNC_LOG;
+ iVisualiser->SetTextHeight( aTextHeight );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Change the current font.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetTextFontL( const TFontSpec& aFontSpec )
+ {
+ FUNC_LOG;
+ iVisualiser->SetTextFontL( aFontSpec );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Set button's text color when it's not focused or dimmed.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetNormalTextColor( const TRgb& aColor )
+ {
+ FUNC_LOG;
+ iModel->SetTextColor( aColor, CFsControlButtonModel::EButtonNormal );
+ iVisualiser->Refresh();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Set button's text color when it's focused.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetFocusedTextColor( const TRgb& aColor )
+ {
+ FUNC_LOG;
+ iModel->SetTextColor( aColor, CFsControlButtonModel::EButtonFocused );
+ iVisualiser->Refresh();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Set button's text color when it's dimmed.
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::SetDimmedTextColor( const TRgb& aColor )
+ {
+ FUNC_LOG;
+ iModel->SetTextColor( aColor, CFsControlButtonModel::EButtonDimmed );
+ iVisualiser->Refresh();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves control button type.
+// ---------------------------------------------------------------------------
+//
+TFsControlButtonType CFsControlButton::ControlButtonType() const
+ {
+ FUNC_LOG;
+ return iModel->Type();
+ }
+
+ // <cmail> Touch
+// ---------------------------------------------------------------------------
+// Returns this as CAlfControl
+// ---------------------------------------------------------------------------
+//
+CAlfControl* CFsControlButton::AsAlfControl()
+ {
+ return this;
+ }
+ // </cmail>
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::MakeFocusVisible( TBool aShow )
+ {
+ FUNC_LOG;
+ iVisualiser->MakeFocusVisible( aShow );
+ }
+
+// ---------------------------------------------------------------------------
+// From class CHuiControl/CAlfControl.
+// Called when an input event is being offered to the control.
+// ---------------------------------------------------------------------------
+//
+TBool CFsControlButton::OfferEventL( const TAlfEvent& aEvent )
+ {
+ FUNC_LOG;
+ TBool result( EFalse );
+
+ // no key handling when not shown or dimmed.
+ if ( !IsVisible() || IsDimmed() )
+ {
+ return result;
+ }
+
+ if ( aEvent.IsKeyEvent() )
+ {
+ switch ( aEvent.Code() )
+ {
+ case EEventKeyDown:
+ {
+ if ( aEvent.KeyEvent().iScanCode == EStdKeyDevice3 )
+ {
+ iParent.HandleButtonEvent(
+ MFsControlButtonObserver::EEventButtonPressed,
+ -1 );
+ result = ETrue;
+ }
+ break;
+ }
+
+ case EEventKey:
+ {
+ if ( aEvent.KeyEvent().iScanCode == EStdKeyDevice3 )
+ {
+ iParent.HandleButtonEvent(
+ MFsControlButtonObserver::EEventButton,
+ iModel->Id() );
+ result = ETrue;
+
+ if ( iTriggeredComponent )
+ {
+ iTriggeredComponent->OpenComponent();
+ }
+ }
+ break;
+ }
+
+ case EEventKeyUp:
+ {
+ if ( aEvent.KeyEvent().iScanCode == EStdKeyDevice3 )
+ {
+ iParent.HandleButtonEvent(
+ MFsControlButtonObserver::EEventButtonReleased,
+ -1 );
+ result = ETrue;
+ }
+ break;
+ }
+
+ default:
+ {
+ // event not consumed - result still got value EFalse
+ break;
+ }
+ }
+ }
+ else if ( aEvent.IsPointerEvent() )
+ {
+ const TPointerEvent& pointerEvent( aEvent.PointerEvent() );
+ switch (pointerEvent.iType)
+ {
+ case TPointerEvent::EButton1Down:
+ {
+ if( HitTest( aEvent.PointerEvent().iParentPosition ) )
+ {
+ iTouchPressed = ETrue;
+ GrabPointerEvents( ETrue );
+ result = iParent.HandleButtonEvent(
+ MFsControlButtonObserver::EEventButtonTouchPressed,
+ iModel->Id() );
+ }
+ break;
+ }
+ case TPointerEvent::EButton1Up:
+ {
+ if( iTouchPressed )
+ {
+ GrabPointerEvents( EFalse );
+
+ TInt buttonId( KErrNotFound );
+ if( HitTest( aEvent.PointerEvent().iParentPosition ) )
+ {
+ buttonId = iModel->Id();
+ }
+ result = iParent.HandleButtonEvent(
+ MFsControlButtonObserver::EEventButtonTouchReleased,
+ buttonId );
+ iTouchPressed = EFalse;
+ }
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CFsControlButton::GrabPointerEvents( TBool aGrab )
+ {
+ CAlfDisplay* display = Display();
+ if( display )
+ {
+ if ( aGrab )
+ {
+ display->Roster().AddPointerEventObserver(
+ EAlfPointerEventReportUnhandled, *this );
+ }
+ else
+ {
+ display->Roster().RemovePointerEventObserver(
+ EAlfPointerEventReportUnhandled, *this );
+ }
+ }
+ }