diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/AknMarqueeControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/AknMarqueeControl.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,755 @@ +/* +* 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 "AknMarqueeControl.h" +#include +#include +#include +#include + +// CONSTANTS +const TInt KAknMarqueeDelay = 1000000; // start scrolling after a delay of 1 second +const TInt KAknMarqueeInterval = 100000; // scroll 10 times in a second +const TInt KAknMarqueeSpeed = 7; // scroll 3 pixels at time +const TInt KAknMarqueeLoops = 1; +const TInt KAknSensibleLength = 80; +// it does not make any sense to marquee texts longer than this +// since it will take hours and drain battery. +const TInt KAknMaxMarqueeLength = 512; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::CAknMarqueeControl +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CAknMarqueeControl::CAknMarqueeControl(const TInt aLoops, const TInt aScrollAmount, + const TInt aScrollDelay) : + iDelta(0), + iDelay(aScrollDelay), + iSpeed(aScrollAmount), + iInterval(KAknMarqueeInterval), + iLoops(0), + iMaxLoops(aLoops), + iLastCharacter(EFalse) + { + iFlags.Set( EFlagIsBeginningOfLoop ); + iFlags.Set( EFlagUseVisualToLogicalConversion ); + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CAknMarqueeControl::ConstructL() + { + iPeriodicTimer = CPeriodic::NewL(CActive::EPriorityIdle); + ControlEnv()->AddForegroundObserverL(*this); + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknMarqueeControl* CAknMarqueeControl::NewLC(const TInt aLoops, + const TInt aScrollAmount, + const TInt aScrollDelay) + { + CAknMarqueeControl* self = new( ELeave )CAknMarqueeControl(aLoops, aScrollAmount, aScrollDelay); + + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CAknMarqueeControl* CAknMarqueeControl::NewL(const TInt aLoops, + const TInt aScrollAmount, + const TInt aScrollDelay) + { + CAknMarqueeControl* self = CAknMarqueeControl::NewLC(aLoops, aScrollAmount, aScrollDelay); + CleanupStack::Pop(); + + return self; + } + +// Destructor +CAknMarqueeControl::~CAknMarqueeControl() + { + if (iPeriodicTimer) + { + iPeriodicTimer->Cancel(); + delete iPeriodicTimer; + } + ControlEnv()->RemoveForegroundObserver(*this); + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::SetRedrawCallBack +// +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknMarqueeControl::SetRedrawCallBack(TCallBack& aCallBack) + { + iCallBack = aCallBack; + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::DrawText +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CAknMarqueeControl::DrawText( + CWindowGc& aGc, + const TRect& aMarqueeRect, + const TDesC& aText, + const TInt aBaselineOffset, + const CGraphicsContext::TTextAlign aAlign, + const CFont& aFont ) + { + if (iLoops < iMaxLoops || // Has every loop been executed? + iFlags.IsSet(EFlagIsWaitingForCallBack)) + { + TInt textWidth = aFont.TextWidthInPixels(aText); + + if (TBidiText::TextDirectionality(aText) == TBidiText::ELeftToRight) + iFlags.Set(EFlagIsWestern); + else + iFlags.Clear(EFlagIsWestern); + + // Does the text fit in the rect or is it wider + if ( textWidth > aMarqueeRect.Width() ) + { + // Logical-to-visual conversion. + + TInt maxTextLength = KAknSensibleLength; + + // Stack buffer is used with normal size texts or in OOM. + TBuf visualText; + + HBufC* buffer = NULL; + const TDesC* textToBeDrawn = &aText; + + if ( iFlags.IsSet(EFlagUseVisualToLogicalConversion) ) + { + // If given text is too large for the stack buffer, + // try to allocate a heap buffer. + if ( aText.Length() > maxTextLength) + { + TInt len( aText.Length() < KAknMaxMarqueeLength ? aText.Length() : KAknMaxMarqueeLength ); + buffer = HBufC::New( len + KAknBidiExtraSpacePerLine ); + if ( buffer ) + { + maxTextLength = len; + } + } + + if ( buffer ) + { + TPtr p( buffer->Des() ); + AknBidiTextUtils::ConvertToVisualAndClip( + aText.Left( maxTextLength ), + p, + aFont, + KMaxTInt, + KMaxTInt ); + textToBeDrawn = buffer; + } + else + { + AknBidiTextUtils::ConvertToVisualAndClip( + aText.Left( maxTextLength ), + visualText, + aFont, + KMaxTInt, + KMaxTInt ); + textToBeDrawn = &visualText; + } + } + + aGc.SetClippingRect(aMarqueeRect); + + if ( iFlags.IsSet(EFlagIsWestern) ) // Scrolls from right to left. + { + TRect rect = aMarqueeRect; + rect.SetWidth(textWidth); + if ( iFlags.IsSet(EFlagIsBeginningOfLoop) ) + { + if (iFlags.IsSet(EFlagIsWaitingForCallBack)) + { + rect.Move(-iDelta, 0); + } + Stop(); // Just in case + aGc.DrawText(*textToBeDrawn, rect, aBaselineOffset, aAlign, 0); + rect.Move(iDelta, 0); + iFlags.Clear(EFlagIsBeginningOfLoop); + Start(); + aGc.CancelClippingRect(); + if ( buffer ) + { + delete buffer; + } + return EFalse; // all drawn for first loop + } + rect.Move(-iDelta, 0); + + // Sliding behaviour: When the last character is visible, scrolling stops + // and starts from the beginning after a short delay. + if (rect.iBr.iX >= aMarqueeRect.iBr.iX || iFlags.IsSet(EFlagIsWaitingForCallBack)) + { + aGc.DrawText(*textToBeDrawn, rect, aBaselineOffset, aAlign, 0); + 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 + aGc.DrawText(*textToBeDrawn, rect, aBaselineOffset, aAlign, 0); + //Stop(); // Cancel all outstanding requests. + iPeriodicTimer->Cancel(); + iFlags.Set(EFlagIsBeginningOfLoop); + iFlags.Set(EFlagIsWaitingForCallBack); + iLastCharacter = ETrue; + iLoops++; + Start(); + } + } + else // Non-western, scrolls from left to right. + { + TRect rect = aMarqueeRect; + // Prepare rect to be scrolled from l -> r + rect.iTl.iX = rect.iTl.iX - (textWidth - rect.Width()); + + if ( iFlags.IsSet(EFlagIsBeginningOfLoop) ) + { + if (iFlags.IsSet(EFlagIsWaitingForCallBack)) + { + rect.Move(iDelta, 0); + } + Stop(); // Just in case + aGc.DrawText(*textToBeDrawn, rect, aBaselineOffset, aAlign, 0); + rect.Move(-iDelta, 0); + iFlags.Clear(EFlagIsBeginningOfLoop); + Start(); + aGc.CancelClippingRect(); + if ( buffer ) + { + delete buffer; + } + return EFalse; // all drawn for first loop + } + rect.Move(iDelta, 0); + + if (rect.iTl.iX < aMarqueeRect.iTl.iX || iFlags.IsSet(EFlagIsWaitingForCallBack)) + { + aGc.DrawText(*textToBeDrawn, rect, aBaselineOffset, aAlign, 0); + iFlags.Clear(EFlagIsBeginningOfLoop); + if ( !iPeriodicTimer->IsActive() ) + Start(); + } + else // Last character has appeared + { + aGc.DrawText(*textToBeDrawn, rect, aBaselineOffset, aAlign); + //Stop(); // Cancel all outstanding requests. + iPeriodicTimer->Cancel(); + iFlags.Set(EFlagIsBeginningOfLoop); + iFlags.Set(EFlagIsWaitingForCallBack); + iLastCharacter = ETrue; + iLoops++; + Start(); + } + } + + delete buffer; + aGc.CancelClippingRect(); + } + + // Time to let the parent know all loops aren't executed yet. + return EFalse; + } + else // No more loops to be executed -> draw text in the default position. + { + //aGc.DrawText(aText, aMarqueeRect, aBaselineOffset, aAlign, 0); + 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. + } + } + +EXPORT_C TBool CAknMarqueeControl::DrawText( + CWindowGc& aGc, + const TRect& aRect, + const TAknTextComponentLayout& aTextLayout, + const TDesC& aText, + const CFont* aFont) + { + RDebug::Print(_L("Warning: Deprecated method CAknMarqueeControl::DrawText( CWindowGc&, TRect&, TAknTextComponentLayout&, TDesC&, CFont* called" ) ); + RDebug::Print(_L("Call CAknMarqueeControl::DrawText(CWindowGc&,,,,, TRgb aColor ) instead") ); + return DrawText( aGc, aRect, aTextLayout, aText, aFont, KRgbBlack ); + } +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::DrawText +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CAknMarqueeControl::DrawText( + CWindowGc& aGc, + const TRect& aRect, + const TAknTextComponentLayout& aTextLayout, + const TDesC& aText, + const CFont* aFont, + TRgb aColor ) + { + // In this function, TAknLayoutText::DrawText performs logical-to-visual + // conversion for the given text. + if ( iLoops < iMaxLoops ) // Has every loop been executed? + { + TAknLayoutText textLayout; + + if ( aFont ) + { + textLayout.LayoutText( aRect, aTextLayout, aFont ); + } + else + { + textLayout.LayoutText( aRect, aTextLayout ); + } + + TRect marqueeRect( textLayout.TextRect() ); + TInt textWidth = textLayout.Font()->TextWidthInPixels( aText ); + + if ( TBidiText::TextDirectionality( aText ) == TBidiText::ELeftToRight ) + iFlags.Set( EFlagIsWestern ); + else + iFlags.Clear( EFlagIsWestern ); + + aGc.SetClippingRect( marqueeRect ); + + if ( iFlags.IsSet( EFlagIsWestern ) ) // Scrolls from right to left. + { + // Does the text fit in the rect or is it wider + if ( textWidth > marqueeRect.Width() ) + { + TRect rect = aRect; + rect.SetWidth( aRect.Width() + ( textWidth - marqueeRect.Width() ) ); + if ( iFlags.IsSet( EFlagIsBeginningOfLoop ) && + !iFlags.IsSet( EFlagIsWaitingForCallBack ) ) + { + Stop(); // Just in case + textLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor ); + iFlags.Clear( EFlagIsBeginningOfLoop ); + Start(); + aGc.CancelClippingRect(); + return EFalse; // all drawn for first loop + } + + if ( iDelta == 0 ) // we are still drawing non-scrolling text (2 line lists need this) + { + textLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor ); + aGc.CancelClippingRect(); + return EFalse; + } + + 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 = textWidth; + // ESLM-7SE7HE + // If left margin isn't given reasonable value, calculate it from other values in advance + if (IsParentRelative(tmpTextLineLayout.il)) + { + tmpTextLineLayout.il = rect.Width() - tmpTextLineLayout.ir - tmpTextLineLayout.iW; + } + if ( aFont ) + { + textLayout.LayoutText( rect, tmpTextLineLayout, aFont ); + } + else + { + textLayout.LayoutText( rect, tmpTextLineLayout ); + } + + if ( iFlags.IsSet( EFlagIsWaitingForCallBack ) ) + { + textLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor ); + aGc.CancelClippingRect(); + return EFalse; // all drawn for end delay + } + + // Sliding behaviour: When the last character is visible, scrolling stops + // and starts from the beginning after a short delay. + if ( textLayout.TextRect().iBr.iX >= marqueeRect.iBr.iX ) + { + textLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor ); + 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 + textLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor ); + iFlags.Set( EFlagIsBeginningOfLoop ); + iFlags.Set( EFlagIsWaitingForCallBack ); + iLastCharacter = ETrue; + Stop(); // Cancel all outstanding requests. + ++iLoops; + Start(); + } + } + } + else // Non-western, scrolls from left to right. + { + if ( textWidth > marqueeRect.Width() ) + { + TRect rect = aRect; + // Prepare rect to be scrolled from l -> r + rect.iTl.iX = rect.iTl.iX - ( textWidth - marqueeRect.Width() ); + + if ( iFlags.IsSet( EFlagIsBeginningOfLoop ) && + !iFlags.IsSet( EFlagIsWaitingForCallBack ) ) + { + Stop(); // Just in case + textLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor ); + iFlags.Clear( EFlagIsBeginningOfLoop ); + Start(); + aGc.CancelClippingRect(); + return EFalse; // all drawn for first loop + } + + if ( iDelta == 0 ) // we are still drawing non-scrolling text (2 line lists need this) + { + textLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor ); + aGc.CancelClippingRect(); + return EFalse; + } + + rect.Move(iDelta, 0); + + // note refer to case western + TAknTextLineLayout tmpTextLineLayout = aTextLayout; + tmpTextLineLayout.iW = textWidth; + // ESLM-7SE7HE + // If right margin isn't given reasonable value, calculate it from other values in advance + if (IsParentRelative(tmpTextLineLayout.ir)) + { + tmpTextLineLayout.ir = rect.Width() - tmpTextLineLayout.il - tmpTextLineLayout.iW; + } + if ( aFont ) + { + textLayout.LayoutText( rect, tmpTextLineLayout, aFont ); + } + else + { + textLayout.LayoutText( rect, tmpTextLineLayout ); + } + + if ( iFlags.IsSet( EFlagIsWaitingForCallBack ) ) + { + textLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor ); + aGc.CancelClippingRect(); + return EFalse; // all drawn for end delay + } + + if ( textLayout.TextRect().iTl.iX < marqueeRect.iTl.iX ) + { + textLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor ); + iFlags.Clear( EFlagIsBeginningOfLoop ); + if ( !iPeriodicTimer->IsActive() ) + Start(); + } + else // Last character has appeared + { + textLayout.DrawText( aGc, aText, iFlags.IsSet( EFlagUseVisualToLogicalConversion ), aColor ); + iFlags.Set( EFlagIsBeginningOfLoop ); + iFlags.Set( EFlagIsWaitingForCallBack ); + iLastCharacter = ETrue; + Stop(); // Cancel all outstanding requests. + ++iLoops; + Start(); + } + } + } + + aGc.CancelClippingRect(); + // Time to let the parent know all loops aren't executed yet. + return EFalse; + } + else // No more loops to be executed -> draw text in the default position. + { + //aGc.DrawText(aText, aMarqueeRect, aBaselineOffset, aAlign, 0); + 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::Draw +// Draws the text to the proper position. +// ----------------------------------------------------------------------------- +// +void CAknMarqueeControl::Draw(const TRect& /*aRect*/) const + { + /* nothing to do here really */ + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::Start +// Starts scrolling the text. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknMarqueeControl::Start() + { + if ( iFlags.IsSet( EFlagIsOn ) ) + { + if ( !iPeriodicTimer->IsActive() ) // start timer if not already started + { + iPeriodicTimer->Start( TTimeIntervalMicroSeconds32( iDelay ), + TTimeIntervalMicroSeconds32( iInterval ), + TCallBack( CAknMarqueeControl::ScrollEvent, this ) ); + } + } + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::Stop +// Stops scrolling the text. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknMarqueeControl::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. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknMarqueeControl::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__ +EXPORT_C const TBool CAknMarqueeControl::IsMarqueeOn() + { + return iFlags.IsSet( EFlagIsOn ); + } +#else +EXPORT_C TBool CAknMarqueeControl::IsMarqueeOn() + { + return iFlags.IsSet( EFlagIsOn ); + } +#endif // __WINS__ + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::SetSpeedInPixels +// sets scrolling speed in pixels +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknMarqueeControl::SetSpeedInPixels(TInt aSpeed) + { + if ( aSpeed <= 0 ) + aSpeed = KAknMarqueeSpeed; + iSpeed = aSpeed; + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::SetDelay +// Sets delay between loops +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknMarqueeControl::SetDelay(TInt aDelay) + { + if ( aDelay < 0 ) + aDelay = KAknMarqueeDelay; + iDelay = aDelay; + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::SetInterval +// Sets scrolling interval +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknMarqueeControl::SetInterval(TInt aInterval) + { + iInterval = aInterval; + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::SetLoops +// Sets the amount of maximum loops to be executed. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknMarqueeControl::SetLoops(TInt aLoops) + { + if ( aLoops < 0 ) + aLoops = KAknMarqueeLoops; + iMaxLoops = aLoops; + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::DoScroll +// advances text position and instructs parent control to do a redraw +// ----------------------------------------------------------------------------- +// +void CAknMarqueeControl::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 CAknMarqueeControl::ScrollEvent(TAny * aPtr) + { + ( ( CAknMarqueeControl* ) aPtr )->DoScroll(); + return TRUE; // run again + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::EnableMarquee +// Enables/disables marquee feature. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CAknMarqueeControl::EnableMarquee(TBool aEnable) + { + if ( aEnable ) + { + iFlags.Set( EFlagIsOn ); + } + else + { + iFlags.Clear( EFlagIsOn ); + } + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::HandleResourceChange +// Handle fade and unfade message for starts and stops scrolling the text. +// ----------------------------------------------------------------------------- +// +void CAknMarqueeControl::HandleResourceChange(TInt aType) + { + if( aType == KEikMessageUnfadeWindows ) + { + if ( ( !iFlags.IsSet( EFlagIsBeginningOfLoop ) + && !iFlags.IsSet( EFlagIsWaitingForCallBack ) ) + || iLastCharacter ) + { + iLastCharacter = EFalse; + Start(); + } + } + else if ( aType == KEikMessageFadeAllWindows ) + { + Stop(); + } + CCoeControl::HandleResourceChange( aType ); + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::HandleGainingForeground +// ----------------------------------------------------------------------------- +// +void CAknMarqueeControl::HandleGainingForeground() + { + // AJUA-7JCDRR, set marquee text to beginning. + if ( ( !iFlags.IsSet( EFlagIsBeginningOfLoop ) + && !iFlags.IsSet( EFlagIsWaitingForCallBack ) ) + || iLastCharacter ) + { + iLastCharacter = EFalse; + Start(); + } + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::HandleLosingForeground +// ----------------------------------------------------------------------------- +// +void CAknMarqueeControl::HandleLosingForeground() + { + // AJUA-7JCDRR, do not reset it, just then marquee can be resumed + Stop(); + } + +// ----------------------------------------------------------------------------- +// CAknMarqueeControl::UseLogicalToVisualConversion +// ----------------------------------------------------------------------------- +// + +EXPORT_C void CAknMarqueeControl::UseLogicalToVisualConversion( + TBool aUseConversion ) + { + if ( aUseConversion ) + { + iFlags.Set( EFlagUseVisualToLogicalConversion ); + } + else + { + iFlags.Clear( EFlagUseVisualToLogicalConversion ); + } + } + +// End of File