uifw/ganes/src/HgMarquee.cpp
changeset 47 2f0c06423c72
parent 46 0e1e0022bd03
child 53 3c67ea82fafc
--- a/uifw/ganes/src/HgMarquee.cpp	Thu Jul 29 14:21:56 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,471 +0,0 @@
-/*
-* Copyright (c) 2004 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:       Text scrolling functionality.
-*
-*/
-
-
-// INCLUDE FILES
-#include "HgMarquee.h"
-#include <biditext.h>
-#include <AknBidiTextUtils.h>
-#include <AknUtils.h>
-#include <AknLayout2ScalableDef.h>
-#include "HgConstants.h"
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::CAknMarqueeControl
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CHgMarquee::CHgMarquee(const TInt aLoops, const TInt aScrollAmount, 
-                                       const TInt aScrollDelay) : 
-    iDelta(0),
-    iDelay(aScrollDelay),
-    iSpeed(aScrollAmount),
-    iInterval(KHgMarqueeInterval),
-    iLoops(0),
-    iMaxLoops(aLoops),
-    iLastCharacter(EFalse)
-    {
-    iFlags.Set( EFlagIsBeginningOfLoop );
-    iFlags.Set( EFlagUseVisualToLogicalConversion );
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::ConstructL()
-    {
-    iPeriodicTimer = CPeriodic::NewL(CActive::EPriorityIdle);
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::NewLC
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CHgMarquee* CHgMarquee::NewLC(const TInt aLoops, 
-                                                       const TInt aScrollAmount,
-                                                       const TInt aScrollDelay)
-    {
-    CHgMarquee* self = new( ELeave )CHgMarquee(aLoops, aScrollAmount, aScrollDelay);
-    
-    CleanupStack::PushL( self );
-    self->ConstructL();
-
-    return self;
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CHgMarquee* CHgMarquee::NewL(const TInt aLoops, 
-                                                      const TInt aScrollAmount,
-                                                      const TInt aScrollDelay)
-    {
-    CHgMarquee* self = CHgMarquee::NewLC(aLoops, aScrollAmount, aScrollDelay);
-    CleanupStack::Pop( self );
-
-    return self;
-    }
-    
-// Destructor
-CHgMarquee::~CHgMarquee()
-    {
-    if (iPeriodicTimer)
-        {
-        iPeriodicTimer->Cancel();
-        delete iPeriodicTimer;
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::SetRedrawCallBack
-// 
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::SetRedrawCallBack(TCallBack& aCallBack)
-    {
-    iCallBack = aCallBack;
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::DrawText
-// 
-// -----------------------------------------------------------------------------
-//
-TBool CHgMarquee::DrawText(
-    CWindowGc& aGc,
-    const TRect& aRect,
-    const TAknTextComponentLayout& aTextLayout,
-    const TDesC& aText,
-    const TRgb& aColor )
-    {
-    // In this function, TAknLayoutText::DrawText performs logical-to-visual
-    // conversion for the given text.
-    if ( iLoops < iMaxLoops && aText.Length() < KAknSensibleLength ) // Has every loop been executed
-        {
-        TAknLayoutText textLayout;
-        textLayout.LayoutText( aRect, aTextLayout );
-
-        TRect marqueeRect( textLayout.TextRect() );
-        TInt textWidth = textLayout.Font()->TextWidthInPixels( aText );
-        if ( textWidth <= marqueeRect.Width() )
-            {
-            iLoops = iMaxLoops;
-            return ETrue;
-            }
-    
-        if ( TBidiText::TextDirectionality( aText ) == TBidiText::ELeftToRight )
-            iFlags.Set( EFlagIsWestern );
-        else
-            iFlags.Clear( EFlagIsWestern );
-
-        aGc.SetClippingRect( marqueeRect );
-        
-        if ( iFlags.IsSet( EFlagIsBeginningOfLoop ) &&
-            !iFlags.IsSet( EFlagIsWaitingForCallBack ) )
-            {
-            Stop();     // Just in case
-            textLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor );
-            iFlags.Clear( EFlagIsBeginningOfLoop );
-            Start();
-            }
-        else if ( iDelta == 0 ) // we are still drawing non-scrolling text (2 line lists need this)
-            {
-            textLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor );
-            }
-        else if ( iFlags.IsSet( EFlagIsWestern ) ) // Scrolls from right to left.
-            {
-            DrawWestern(
-                    aGc, 
-                    aRect, 
-                    marqueeRect, 
-                    aTextLayout, 
-                    textLayout, 
-                    aText, 
-                    textWidth, 
-                    aColor);
-            }
-        else    // Non-western, scrolls from left to right.
-            {
-            DrawNonWestern(
-                    aGc, 
-                    aRect, 
-                    marqueeRect, 
-                    aTextLayout, 
-                    textLayout, 
-                    aText, 
-                    textWidth, 
-                    aColor);
-            }
-
-        aGc.CancelClippingRect();
-        // Time to let the parent know if all loops aren't executed yet.
-        return EFalse;
-        }
-    else    // No more loops to be executed -> draw text in the default position.
-        {
-        Stop();         // No need to generate events any longer.
-        return ETrue;   // Indicate the parent that marquee has stopped,  
-        }               // parent is then able to for example truncate the text.
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::DrawWestern
-// Starts scrolling the text.
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::DrawWestern( CWindowGc& aGc,
-                         const TRect& aRect,
-                         const TRect& aMarqueeRect,
-                         const TAknTextComponentLayout& aTextLayout,
-                         TAknLayoutText aLayout,
-                         const TDesC& aText,
-                         TInt aTextWidth,
-                         const TRgb& aColor )
-    {
-    TRect rect = aRect;
-    rect.SetWidth( aRect.Width() + ( aTextWidth - aMarqueeRect.Width() ) );
-    rect.Move(-iDelta, 0);
-
-    // ESRY-7M5A33
-    // Due to text rolling region is not actual parent region, 
-    // textLayout.TextRect() is incorrect. Introduce a temparory layout to recalculate.   
-    TAknTextLineLayout  tmpTextLineLayout = aTextLayout;
-    tmpTextLineLayout.iW = aTextWidth;
-    aLayout.LayoutText( rect, tmpTextLineLayout );
-        
-    aLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor );
-
-    if ( iFlags.IsSet( EFlagIsWaitingForCallBack ) )
-        {
-        // do nothing
-        }
-    // Sliding behaviour: When the last character is visible, scrolling stops
-    // and starts from the beginning after a short delay.
-    else if ( aLayout.TextRect().iBr.iX >= aMarqueeRect.iBr.iX )
-        {
-        iFlags.Clear( EFlagIsBeginningOfLoop );
-        if ( !iPeriodicTimer->IsActive() )
-            Start();
-        }
-    else    // Last character has appeared, so let's make it reappear from the other 
-        {   // side after a delay
-        iFlags.Set( EFlagIsBeginningOfLoop );
-        iFlags.Set( EFlagIsWaitingForCallBack );
-        iLastCharacter = ETrue;
-        Stop();    // Cancel all outstanding requests.
-        ++iLoops;
-        Start();
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::DrawNonWestern
-// Starts scrolling the text.
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::DrawNonWestern( CWindowGc& aGc,
-                         const TRect& aRect,
-                         const TRect& aMarqueeRect,
-                         const TAknTextComponentLayout& aTextLayout,
-                         TAknLayoutText aLayout,
-                         const TDesC& aText,
-                         TInt aTextWidth,
-                         const TRgb& aColor )
-    {
-    TRect rect = aRect;
-    // Prepare rect to be scrolled from l -> r
-    rect.iTl.iX = rect.iTl.iX - ( aTextWidth - aMarqueeRect.Width() );
-    rect.Move(iDelta, 0);
-
-    // note refer to case western               
-    TAknTextLineLayout  tmpTextLineLayout = aTextLayout;
-    tmpTextLineLayout.iW = aTextWidth;
-    aLayout.LayoutText( rect, tmpTextLineLayout );
-    
-    aLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor );
-
-    if ( iFlags.IsSet( EFlagIsWaitingForCallBack ) )
-        {
-        // do nothing
-        }
-    else if ( aLayout.TextRect().iTl.iX < aMarqueeRect.iTl.iX ) 
-        {
-        iFlags.Clear( EFlagIsBeginningOfLoop );
-        if ( !iPeriodicTimer->IsActive() )
-            Start();
-        }
-    else    // Last character has appeared
-        {
-        iFlags.Set( EFlagIsBeginningOfLoop );
-        iFlags.Set( EFlagIsWaitingForCallBack );
-        iLastCharacter = ETrue;
-        Stop();    // Cancel all outstanding requests.
-        ++iLoops;
-        Start();
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::Start
-// Starts scrolling the text.
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::Start()
-    {
-    if ( iFlags.IsSet( EFlagIsOn ) ) 
-        {
-        if ( !iPeriodicTimer->IsActive() )  // start timer if not already started
-            {
-            iPeriodicTimer->Start( TTimeIntervalMicroSeconds32( iDelay ),
-                                   TTimeIntervalMicroSeconds32( iInterval ), 
-                                   TCallBack( CHgMarquee::ScrollEvent, this ) );
-            }
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::Stop
-// Stops scrolling the text.
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::Stop()
-    {
-    //Stop the timer if it is active
-    if ( iPeriodicTimer->IsActive() )
-        {
-        iPeriodicTimer->Cancel();
-        }
-    if ( !iFlags.IsSet(EFlagIsWaitingForCallBack) )
-        {
-        iDelta = 0;            // reset scroll position
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::Reset
-// Resets the animation data.
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::Reset()
-    {
-    iDelta = 0;            // reset scroll position
-    iLoops = 0;
-    iLastCharacter = EFalse;
-    Stop();
-    iFlags.Set( EFlagIsBeginningOfLoop );
-    iFlags.Clear( EFlagIsWaitingForCallBack );
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::IsMarqueeOn
-// Returns marquee status
-// Two versions to discard compiler warnings
-// -----------------------------------------------------------------------------
-//
-#ifdef __WINS__
-const TBool CHgMarquee::IsMarqueeOn()
-    {
-    return iFlags.IsSet( EFlagIsOn );
-    }
-#else
-TBool CHgMarquee::IsMarqueeOn()
-    {
-    return iFlags.IsSet( EFlagIsOn );
-    }
-#endif // __WINS__
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::SetSpeedInPixels
-// sets scrolling speed in pixels
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::SetSpeedInPixels(TInt aSpeed)
-    {
-    if ( aSpeed <= 0 )
-        aSpeed = KHgMarqueeSpeed;
-    iSpeed = aSpeed;
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::SetDelay
-// Sets delay between loops
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::SetDelay(TInt aDelay)
-    {
-    if ( aDelay < 0 )
-        aDelay = KHgMarqueeDelay;
-    iDelay = aDelay;
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::SetInterval
-// Sets scrolling interval
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::SetInterval(TInt aInterval)
-    {
-    iInterval = aInterval;
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::SetLoops
-// Sets the amount of maximum loops to be executed.
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::SetLoops(TInt aLoops)
-    {
-    if ( aLoops < 0 )
-        aLoops = KHgMarqueeLoops;
-    iMaxLoops = aLoops;
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::DoScroll
-// advances text position and instructs parent control to do a redraw
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::DoScroll()
-    {
-    if ( !iFlags.IsSet( EFlagIsWaitingForCallBack ) )
-        {
-        iDelta += iSpeed;            // advance text
-        }
-  
-    iFlags.Clear( EFlagIsWaitingForCallBack );
-    
-    if ( !iCallBack.CallBack() )   // stop timer if callback returns false
-        {
-        iPeriodicTimer->Cancel();
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::ScrollEvent
-// This static function is called by the periodic timer
-// -----------------------------------------------------------------------------
-//
-TInt CHgMarquee::ScrollEvent(TAny * aPtr)
-    {
-    ( ( CHgMarquee* ) aPtr )->DoScroll();
-    return TRUE; // run again
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::EnableMarquee
-// Enables/disables marquee feature.
-// -----------------------------------------------------------------------------
-//
-void CHgMarquee::EnableMarquee(TBool aEnable)
-    {
-    if ( aEnable )
-        {
-        iFlags.Set( EFlagIsOn );
-        }
-    else
-        {
-        iFlags.Clear( EFlagIsOn );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CAknMarqueeControl::UseLogicalToVisualConversion
-// -----------------------------------------------------------------------------
-//
-
-void CHgMarquee::UseLogicalToVisualConversion(
-    TBool aUseConversion )
-    {
-    if ( aUseConversion )
-        {
-        iFlags.Set( EFlagUseVisualToLogicalConversion );
-        }
-    else
-        {
-        iFlags.Clear( EFlagUseVisualToLogicalConversion );
-        }
-    }
-
-//  End of File