emailuis/uicomponents/src/fscontrolbarmodel.cpp
changeset 0 8466d47a6819
child 1 12c456ceeff2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/uicomponents/src/fscontrolbarmodel.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,547 @@
+/*
+* 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:  Model class for Control Bar component.
+*
+*/
+
+
+
+#include "emailtrace.h"
+#include <AknUtils.h>
+
+#include "fscontrolbarmodel.h"
+#include "fscontrolbutton.h"
+#include "fsgenericpanic.h"
+#include "fscontrolbuttonvisualiser.h"
+#include "fslayoutmanager.h"
+
+const TUint KDefaultSelectorSpeed = 1000;
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CFsControlBarModel::CFsControlBarModel() :
+    iSelectorTransitionTime( KDefaultSelectorSpeed ),
+    iWidthUseDefault( ETrue ),
+    iHeightUseDefault( ETrue )
+    {
+    FUNC_LOG;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Second phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CFsControlBarModel::ConstructL()
+    {
+    FUNC_LOG;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CFsControlBarModel* CFsControlBarModel::NewL()
+    {
+    FUNC_LOG;
+    CFsControlBarModel* self = CFsControlBarModel::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CFsControlBarModel* CFsControlBarModel::NewLC()
+    {
+    FUNC_LOG;
+    CFsControlBarModel* self = new (ELeave) CFsControlBarModel;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CFsControlBarModel::~CFsControlBarModel()
+    {
+    FUNC_LOG;
+    // <cmail> Touch
+    // Buttons are now alf controls and owned by alf environment, not deleted here
+    /*for( TInt i = 0; i < Count(); i++ )
+        {
+        delete iButtons[i];
+        }*/
+    // </cmail>
+
+    iButtons.Reset();
+    }
+
+
+// ---------------------------------------------------------------------------
+// Adds button object to collection.
+// ---------------------------------------------------------------------------
+//
+void CFsControlBarModel::AddButtonL( CFsControlButton& aButton )
+    {
+    FUNC_LOG;
+    iButtons.AppendL( &aButton );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves button from collection with specified index.
+// ---------------------------------------------------------------------------
+//
+CFsControlButton* CFsControlBarModel::ButtonByIndex( TInt aIndex )
+    {
+    FUNC_LOG;
+    CFsControlButton* result( NULL );
+
+    if ( aIndex >= 0 && aIndex < Count() )
+        {
+        result = iButtons[ aIndex ];
+        }
+
+    return result;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves button from collection with specified id.
+// Panics if id is incorrect.
+// ---------------------------------------------------------------------------
+//
+CFsControlButton* CFsControlBarModel::ButtonById( TInt aId )
+    {
+    FUNC_LOG;
+    CFsControlButton* button( NULL );
+    CFsControlButton* result( NULL );
+    TInt i( 0 );
+
+    if ( ECBFirstFocusableButton == aId )
+        {
+        while ( Count() > i && !result )
+            {
+            button = ButtonByIndex( i );
+            if ( button->IsVisible() && !button->IsDimmed() )
+                {
+                result = button;
+                }
+            ++i;
+            }
+        }
+    else
+        {
+        while ( Count() > i && !result )
+            {
+            button = ButtonByIndex( i );
+            if( button->Id() == aId )
+                {
+                result = button;
+                }
+            ++i;
+            }
+
+        // panic only when specified id passed by component user is searched
+        if ( !result )
+            {
+            FsGenericPanic( EFsControlButtonIncorrectButtonId );
+            }
+        }
+
+    return result;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves number of buttons in collection.
+// ---------------------------------------------------------------------------
+//
+TInt CFsControlBarModel::Count() const
+    {
+    FUNC_LOG;
+    return iButtons.Count();
+    }
+
+
+// ---------------------------------------------------------------------------
+// Removes button from collection using index.
+// Used function ButtonByIndex panics - see ButtonByIndex.
+// ---------------------------------------------------------------------------
+//
+void CFsControlBarModel::RemoveButtonByIndex( TInt aIndex )
+    {
+    FUNC_LOG;
+    delete ButtonByIndex( aIndex );
+    iButtons.Remove( aIndex );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Removes button from collection using id.
+// ---------------------------------------------------------------------------
+//
+TInt CFsControlBarModel::RemoveButtonById( TInt aId )
+    {
+    FUNC_LOG;
+    TInt retVal( KErrNotFound );
+    for ( TInt i( 0 ); Count() > i; i++ )
+        {
+        if( ButtonByIndex( i )->Id() == aId )
+            {
+            RemoveButtonByIndex( i );
+            retVal = KErrNone;
+            break;
+            }
+        }
+
+    if ( retVal )
+        {
+        FsGenericPanic( EFsControlButtonIncorrectButtonId );
+        }
+
+    return retVal;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Checks if button with specified id exists in collection.
+// ---------------------------------------------------------------------------
+//
+TBool CFsControlBarModel::ExistsButtonWithId( TInt aId )
+    {
+    FUNC_LOG;
+    TBool result( EFalse );
+
+    for( TInt i( 0 ); iButtons.Count() > i; i++ )
+        {
+        if( iButtons[i]->Id() == aId )
+            {
+            result = ETrue;
+            break;
+            }
+        }
+
+    return result;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves index of button with specified id.
+// ---------------------------------------------------------------------------
+//
+TInt CFsControlBarModel::IndexById( TInt aButtonId )
+    {
+    FUNC_LOG;
+    TInt result( -1 );
+    TInt i( 0 );
+
+    while ( -1 == result && Count() > i )
+        {
+        if( ButtonByIndex( i )->Id() == aButtonId )
+            {
+            result = i;
+            }
+        i++;
+        }
+
+    return result;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves next focusable button.
+// ---------------------------------------------------------------------------
+//
+CFsControlButton* CFsControlBarModel::NextButton( TInt aButtonId )
+    {
+    FUNC_LOG;
+    TInt index( -1 );
+    CFsControlButton* currentBtn( ButtonById( aButtonId ) );
+
+    // Find current button's id.
+    TInt buttonId( 0 );
+    while ( iButtons.Count() > buttonId )
+        {
+        if ( iButtons[buttonId] == currentBtn )
+            {
+            break;
+            }
+        buttonId++;
+        }
+
+    // Find the next button on right.
+    TInt curPos( currentBtn->Visualiser()->Pos().Target().iX );
+    TBool candidate( EFalse );
+    TInt next( 0 );
+    for ( TInt i( 0 ); iButtons.Count() > i; i++ )
+        {
+        if ( i == buttonId
+            || !iButtons[i]->IsVisible()
+            || iButtons[i]->IsDimmed() )
+            {
+            continue;
+            }
+        TInt btnPos( iButtons[i]->Visualiser()->Pos().Target().iX );
+        if ( btnPos >= curPos )
+            {
+            if ( btnPos == curPos )
+                {
+                if ( i < buttonId )
+                    {
+                    continue;
+                    }
+                }
+            if ( !candidate )
+                {
+                // This is the first proper candidate.
+                index = i;
+                next = btnPos;
+                candidate = ETrue;
+                }
+            else if ( btnPos <= next )
+                {
+                // This button is closer than previously found button.
+                index = i;
+                next = btnPos;
+                if ( btnPos == curPos )
+                    {
+                    break;
+                    }
+                }
+            }
+        }
+    return ButtonByIndex( index );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves previous focusable button.
+// ---------------------------------------------------------------------------
+//
+CFsControlButton* CFsControlBarModel::PrevButton( TInt aButtonId )
+    {
+    FUNC_LOG;
+    TInt index( -1 );
+    CFsControlButton* currentBtn( ButtonById( aButtonId ) );
+
+    // Find current button's id.
+    TInt buttonId( 0 );
+    while ( iButtons.Count() > buttonId )
+        {
+        if ( iButtons[buttonId] == currentBtn )
+            {
+            break;
+            }
+        buttonId++;
+        }
+
+    // Find the next button on left.
+    TInt curPos( currentBtn->Visualiser()->Pos().Target().iX );
+    TBool candidate( EFalse );
+    TInt next( 0 );
+    for ( TInt i( iButtons.Count() - 1 ); 0 <= i; i-- )
+        {
+        if ( i == buttonId
+            || !iButtons[i]->IsVisible()
+            || iButtons[i]->IsDimmed() )
+            {
+            continue;
+            }
+        TInt btnPos( iButtons[i]->Visualiser()->Pos().Target().iX );
+        if ( btnPos <= curPos )
+            {
+            if ( btnPos == curPos )
+                {
+                if ( i > buttonId )
+                    {
+                    continue;
+                    }
+                }
+            if ( !candidate )
+                {
+                // This is the first proper candidate.
+                index = i;
+                next = btnPos;
+                candidate = ETrue;
+                }
+            else if ( btnPos >= next )
+                {
+                // This button is closer than previously found button.
+                index = i;
+                next = btnPos;
+                if ( btnPos == curPos )
+                    {
+                    break;
+                    }
+                }
+            }
+        }
+
+    return ButtonByIndex( index );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Sets focus for control bar.
+// ---------------------------------------------------------------------------
+//
+void CFsControlBarModel::SetFocus( TBool aState )
+    {
+    FUNC_LOG;
+    iFocused = aState;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves focus state of control bar.
+// ---------------------------------------------------------------------------
+//
+TBool CFsControlBarModel::IsFocused() const
+    {
+    FUNC_LOG;
+    return iFocused;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Generates free id value for new button.
+// ---------------------------------------------------------------------------
+//
+TInt CFsControlBarModel::GenerateButtonId()
+    {
+    FUNC_LOG;
+    TInt result( 0 );
+
+    for ( TInt i( 0 ); Count() > i; i++ )
+        {
+        if ( result == ButtonByIndex( i )->Id() )
+            {
+            ++result;
+            }
+        }
+
+    return result;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves default bar background color.
+// ---------------------------------------------------------------------------
+//
+const TRgb& CFsControlBarModel::BarBgColor() const
+    {
+    FUNC_LOG;
+    return iBgColor;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Gets transition time for moving selector.
+// ---------------------------------------------------------------------------
+//
+TInt CFsControlBarModel::SelectorTransitionTime() const
+    {
+    FUNC_LOG;
+    return iSelectorTransitionTime;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Sets transition time for moving selector.
+// ---------------------------------------------------------------------------
+//
+void CFsControlBarModel::SetSelectorTransitionTime( TInt aTransitionTime )
+    {
+    FUNC_LOG;
+    iSelectorTransitionTime = aTransitionTime;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Refresh the buttons' positions.
+// ---------------------------------------------------------------------------
+//
+void CFsControlBarModel::UpdateButtonsPositions()
+    {
+    FUNC_LOG;
+    TSize parentSize( Size() );
+
+    for ( TInt i( 0 ); iButtons.Count() > i; i++ )
+        {
+        iButtons[i]->RefreshButtonPosition( parentSize );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// Sets width in pixels of controlbar and refreshes control.
+// ---------------------------------------------------------------------------
+//
+void CFsControlBarModel::SetWidth( TInt aWidth )
+    {
+    FUNC_LOG;
+    iSize.iWidth = aWidth;
+    iWidthUseDefault = EFalse;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Sets height in pixels of controlbar and refreshes control.
+// ---------------------------------------------------------------------------
+//
+void CFsControlBarModel::SetHeight( TInt aHeight )
+    {
+    FUNC_LOG;
+    iSize.iHeight = aHeight;
+    iHeightUseDefault = EFalse;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Retrieves controlbar's size in pixels.
+// ---------------------------------------------------------------------------
+//
+TSize CFsControlBarModel::Size() const
+    {
+    FUNC_LOG;
+    TRect layoutRect;
+
+    if ( iWidthUseDefault || iHeightUseDefault )
+        {
+        TRect parentRect;
+        AknLayoutUtils::LayoutMetricsRect(
+            AknLayoutUtils::EScreen, parentRect );
+
+        CFsLayoutManager::LayoutMetricsRect( parentRect,
+            CFsLayoutManager::EFsLmMainSpFsCtrlbarPane, layoutRect );
+        }
+
+    return TSize(
+        iWidthUseDefault ? layoutRect.Width() : iSize.iWidth,
+        iHeightUseDefault ? layoutRect.Height() : iSize.iHeight );
+    }
+