emailuis/uicomponents/src/fscontrolbutton.cpp
changeset 0 8466d47a6819
child 1 12c456ceeff2
--- /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 );
+            }
+        }
+    }