--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/uicomponents/src/fsmarqueeclet.cpp Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,412 @@
+/*
+* 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: A controlet class for doing marquee text scrolling.
+*
+*/
+
+
+#include "emailtrace.h"
+#include <alf/alfviewportlayout.h>
+#include <alf/alfevent.h>
+#include <alf/alfenv.h>
+#include <alf/alfcontrol.h>
+
+#include "fsmarqueeclet.h"
+
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+TFsMarqueeClet::TFsMarqueeClet(CAlfControl& aControl, CAlfViewportLayout& aViewport, TScrollDirection aDir, TScrollType aType)
+ : iViewport(aViewport),
+ iControl(aControl),
+ iDir(aDir),
+ iType(aType),
+ iTime(20),
+ iRepetitions(1),
+ iCycleDelay(1000)
+ {
+ FUNC_LOG;
+ iViewport.SetVirtualSize(TAlfRealPoint(1.0, 1.0), 0);
+ iViewport.SetViewportSize(TAlfRealPoint(1.0, 1.0), 0);
+ iViewport.SetViewportPos(TAlfRealPoint(0, 0), 0);
+ }
+
+
+// ---------------------------------------------------------------------------
+// Destructor. Cancels uppdate event.
+// ---------------------------------------------------------------------------
+//
+TFsMarqueeClet::~TFsMarqueeClet()
+ {
+ FUNC_LOG;
+ // Cancel any previous update events.
+ iControl.Env().CancelCustomCommands(this, ECustomEventScrollingFinished);
+ iControl.Env().CancelCustomCommands(this, ECustomEventScrollingPauseFinished);
+ iControl.Env().CancelCustomCommands(this, ECustomEventScrollingStartPauseFinished);
+ }
+
+// ---------------------------------------------------------------------------
+// Set the type of marquee.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::SetScrollType( const TScrollType aType )
+ {
+ FUNC_LOG;
+ iType = aType;
+ }
+
+
+// ---------------------------------------------------------------------------
+// The number of milliseconds to complete a full scroll cycle.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::SetScrollSpeed(TInt aTime)
+ {
+ FUNC_LOG;
+ iTime = aTime;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Sets the number of marquee's scroll cycles.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::SetScrollRepetitions( TInt aRepetitions )
+ {
+ FUNC_LOG;
+ iRepetitions = aRepetitions;
+ }
+
+
+// ---------------------------------------------------------------------------
+// The function sets time for a pause after each cycle.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::SetScrollCycleDelay ( TInt aCycleDelay )
+ {
+ FUNC_LOG;
+ iCycleDelay = aCycleDelay;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Change the direction that the text scrolls from.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::SetScrollDirection(TScrollDirection aDir)
+ {
+ FUNC_LOG;
+ iDir = aDir;
+ }
+
+
+// ---------------------------------------------------------------------------
+// The area that we want to scroll.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::SetScrollableArea(TSize& aScrollableArea)
+ {
+ FUNC_LOG;
+ iScrollableArea = aScrollableArea;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Begin scrolling with the specified speed, direction and type.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::StartScrolling()
+ {
+ FUNC_LOG;
+ iViewport.SetVirtualSize(iScrollableArea, 0);
+ iViewport.SetViewportSize(iViewport.Size().Target(), 0);
+ iViewport.SetViewportPos(TAlfRealPoint(0, 0), 0);
+
+ if ( iType == EScrollBounce )
+ {
+ iRepetitions *= 2;
+ }
+// if ( iRepetitions != 0 )
+// {
+// if ( iRepetitions > 0 )
+// {
+// --iRepetitions;
+// }
+
+ switch(iType)
+ {
+ case EScrollForth:
+ StartScrollingForth();
+ break;
+
+ case EScrollBounce:
+ StartScrollingBounce();
+ break;
+
+ case EScrollWrap:
+ StartScrollingLoop();
+ break;
+ }
+// }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Stop scrolling and reset the visual to its zero position.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::StopScrolling()
+ {
+ FUNC_LOG;
+
+ iViewport.SetVirtualSize(iViewport.Size().Target(), 0);
+ iViewport.SetViewportSize(iViewport.Size().Target(), 0);
+ iViewport.SetViewportPos(TAlfRealPoint(0, 0), 0);
+
+ // Cancel any previous update events.
+ CancelScrollingCommands();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Initiate scrolling once then stop.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::StartScrollingOnce()
+ {
+ FUNC_LOG;
+ TReal visualWidth = iViewport.Size().Target().iX;
+ TReal widthOffScreen = (iScrollableArea.iWidth-visualWidth);
+
+ // Reset the viewport to its start position, then set the end position with a timed value.
+ switch (iDir)
+ {
+ case EScrollFromLeft:
+ // Reset the viewport to its start position, then set the end position with a timed value.
+ iViewport.SetViewportPos(TAlfRealPoint(widthOffScreen, 0), 0);
+ iViewport.SetViewportPos(TAlfRealPoint(0, 0), iTime);
+ break;
+
+ case EScrollFromRight:
+ // Reset the viewport to its start position, then set the end position with a timed value.
+ iViewport.SetViewportPos(TAlfRealPoint(0, 0), 0);
+ iViewport.SetViewportPos(TAlfRealPoint(widthOffScreen, 0), iTime);
+ break;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Scroll continously forth. Generates update messages to retrigger itself forever.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::StartScrollingForth()
+ {
+ FUNC_LOG;
+ // Start scrolling in the given direction.
+ StartScrollingOnce();
+
+ // Cancel any previous update events.
+ CancelScrollingCommands();
+
+ // Schedule a update event for when the visual has finished scrolling.
+ TInt error = iControl.Env().Send(TAlfCustomEventCommand(ECustomEventScrollingFinished, this), iTime);
+ if (error != KErrNone)
+ {
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Scroll continuously in a loop. Generates update messages to retrigger itself forever.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::StartScrollingLoop()
+ {
+ FUNC_LOG;
+ TReal farRight = iScrollableArea.iWidth / 2;
+
+ // Reset the viewport to its start position, then set the end position with a timed value.
+ switch (iDir)
+ {
+ case EScrollFromLeft:
+ iViewport.SetViewportPos(TAlfRealPoint(farRight, 0), 0);
+ iViewport.SetViewportPos(TAlfRealPoint(0, 0), iTime);
+ break;
+
+ case EScrollFromRight:
+ iViewport.SetViewportPos(TAlfRealPoint(0, 0), 0);
+ iViewport.SetViewportPos(TAlfRealPoint(farRight, 0), iTime);
+ break;
+ }
+
+ // Cancel any previous update events.
+ CancelScrollingCommands();
+
+ // Schedule a update event for when the visual has finished scrolling.
+ TInt error = iControl.Env().Send(TAlfCustomEventCommand(ECustomEventScrollingFinished, this), iTime);
+ if (error != KErrNone)
+ {
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Scroll continuously in a bouncing pattern. Generates update messages to retrigger itself forever.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::StartScrollingBounce()
+ {
+ FUNC_LOG;
+ // Start scrolling in the given direction.
+ StartScrollingOnce();
+
+ // Flip direction for next time this is called.
+ switch (iDir)
+ {
+ case EScrollFromLeft:
+ iDir = EScrollFromRight;
+ break;
+
+ case EScrollFromRight:
+ iDir = EScrollFromLeft;
+ break;
+ }
+
+ // Cancel any previous update events.
+ CancelScrollingCommands();
+
+ // Schedule a update event for when the visual has finished scrolling.
+ TInt error = iControl.Env().Send(TAlfCustomEventCommand(ECustomEventScrollingFinished, this), iTime);
+ if (error != KErrNone)
+ {
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// The function cancels custom commands sent during scrolling process.
+// ---------------------------------------------------------------------------
+//
+void TFsMarqueeClet::CancelScrollingCommands()
+ {
+ FUNC_LOG;
+ // Cancel any previous update events.
+ iControl.Env().CancelCustomCommands(this, ECustomEventScrollingFinished);
+ iControl.Env().CancelCustomCommands(this, ECustomEventScrollingPauseFinished);
+ iControl.Env().CancelCustomCommands(this, ECustomEventScrollingStartPauseFinished);
+ }
+
+
+// ---------------------------------------------------------------------------
+// Handles the events sent through the AlfScheduler.
+// ---------------------------------------------------------------------------
+//
+TBool TFsMarqueeClet::OfferEventL(const TAlfEvent& aEvent)
+ {
+ FUNC_LOG;
+ TBool retVal (EFalse);
+
+ if ( !aEvent.IsCustomEvent() )
+ {
+ retVal = EFalse;
+ }
+ else if ( aEvent.CustomParameter() == ECustomEventScrollingFinished )
+ {
+ retVal = ETrue;
+ if ( iType == EScrollWrap )
+ {
+ if ( iRepetitions != 0 )
+ {
+ if ( iRepetitions > 0 )
+ {
+ --iRepetitions;
+ }
+ StartScrollingLoop();
+ }
+ }
+ else
+ {
+ //cancel previous commands
+ CancelScrollingCommands();
+ //trigger pause if needed
+ TInt error = iControl.Env().Send(TAlfCustomEventCommand(ECustomEventScrollingPauseFinished, this), iCycleDelay);
+ if (error != KErrNone)
+ {
+ }
+ }
+ }
+ else if ( aEvent.CustomParameter() == ECustomEventScrollingPauseFinished )
+ {
+ //trigger next cycle
+ if ( iRepetitions != 0 )
+ {
+ if ( iRepetitions > 0 )
+ {
+ --iRepetitions;
+ }
+
+ // Do the event update.
+ switch(iType)
+ {
+ case EScrollForth:
+ {
+ TReal visualWidth = iViewport.Size().Target().iX;
+ TReal widthOffScreen = (iScrollableArea.iWidth-visualWidth);
+
+ switch (iDir)
+ {
+ case EScrollFromLeft:
+ // Reset the viewport to its start position
+ iViewport.SetViewportPos(TAlfRealPoint(widthOffScreen, 0), 0);
+ break;
+
+ case EScrollFromRight:
+ // Reset the viewport to its start position
+ iViewport.SetViewportPos(TAlfRealPoint(0, 0), 0);
+ break;
+ }
+ //cancel previous commands
+ CancelScrollingCommands();
+ //trigger start pause
+ TInt error = iControl.Env().Send(TAlfCustomEventCommand(ECustomEventScrollingStartPauseFinished, this), iCycleDelay);
+ if (error != KErrNone)
+ {
+ }
+
+ break;
+ }
+ case EScrollBounce:
+ StartScrollingBounce();
+ break;
+
+ default:
+ // Should never get here.
+ ASSERT(EFalse);
+ break;
+ }
+ }
+ retVal = ETrue;
+ }
+ else if ( aEvent.CustomParameter() == ECustomEventScrollingStartPauseFinished )
+ {
+ StartScrollingForth();
+ }
+ return retVal;
+ }
+
+//EOF
+