src/screensaverctrlmovingtext.cpp
changeset 14 8a173132b0aa
parent 2 058b1fc1663a
--- a/src/screensaverctrlmovingtext.cpp	Mon Jan 18 20:19:52 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,587 +0,0 @@
-/*
-* Copyright (c) 2003 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:   Implementation of screensaver moving text display class.
-*
-*/
-
-
-
-#include <e32def.h>
-#include <eikdef.h>
-#include <AknUtils.h>
-#include <e32math.h>
-#include <aknlayoutscalable_avkon.cdl.h>
-#include <screensaver.rsg>
-
-#include "screensaverappui.h"
-#include "screensavershareddatai.h"
-#include "ScreensaverUtils.h"
-#include "screensaverutility.h"
-#include "screensaverctrlmovingtext.h"
-
-const TInt KInvertedColors = 1;
-
-//The color for text and background
-const TInt KInvertedBgColor = 215;
-const TInt KInvertedTextColor = 0;
-const TInt KInvertedTextBgColor = 215;
-
-const TInt KBgColor = 0;
-const TInt KTextColor = 215;
-const TInt KTextBgColor = 210;
-
-// the minimum top value
-const TInt KMinTop = 4;
-
-const TInt KRefreshRate = 60000000; // 60 sec
-//
-// Class CScreensaverCtrlMovingText
-//
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::NewL
-// -----------------------------------------------------------------------------
-//
-CScreensaverCtrlMovingText* CScreensaverCtrlMovingText::NewL( TDisplayObjectType aType )
-    {
-    CScreensaverCtrlMovingText* obj = new( ELeave ) CScreensaverCtrlMovingText( aType );
-    CleanupStack::PushL( obj );
-    obj->ConstructL();
-    CleanupStack::Pop();
-    return obj;
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::~CScreensaverCtrlMovingText
-// -----------------------------------------------------------------------------
-//
-CScreensaverCtrlMovingText::~CScreensaverCtrlMovingText()
-    {
-    iEikonEnv->RemoveFromStack( this );
-    
-    DeleteTimer( iBarRefreshTimer );
-    DeleteTimer( iCaptureScreenTimer );
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::HandleResourceChange
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::HandleResourceChange( TInt aType )
-    {
-    if ( aType == KEikDynamicLayoutVariantSwitch )//&& iType != EDisplayNone)
-        {
-        // Screen layout has changed - resize
-        SetRect( iCoeEnv->ScreenDevice()->SizeInPixels() );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::SizeChanged
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::SizeChanged()
-    {
-    GenerateDisplayAttributesForScreensaverBar();
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::Draw
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::Draw( const TRect& aRect ) const
-    {
-    if ( !Model().ScreenSaverIsOn() && !Model().ScreenSaverIsPreviewing() )
-        {
-        return;
-        }
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Draw, screensaver is on or previewing") );
-    // Graphics context to draw on.
-    CWindowGc& gc = SystemGc();
-
-    // Fix for error ESMG-74Y4PE - S60 3.2 wk26, Power Saver: 
-    // Flickering when power saver is deactivated.
-    // We now clear the screen with a black brush so the screensaver 
-    // background is changed to black. There will no longer be a white
-    // intermediate screen and this will reduce the "flicker" effect.
-    gc.SetBrushColor( KRgbBlack );
-
-    // Start with a clear screen
-    gc.Clear( aRect );
-    // If there is no plugin module, indicator view overrides plugin module or
-    // plugin drawing is suspended then the standard screensaver bar is shown,
-    // let's draw it.
-
-    DrawNew( gc, aRect );
-
-    // Activate power save display mode after draw, so that
-    // the image is already in screen buffer
-    ScreensaverUtility::FlushDrawBuffer(); 
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Draw, draw finished") );
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::SetMoving
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::SetMoving( TBool aMove )
-    {
-    iMoveBar = aMove;
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::StartTimer
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::StartTimer()
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::StartTimer start") );
-    StartCaptureScreenTimer();
-
-    StartBarRefreshTimer();
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::StartTimer finish") );
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::CancelTimer
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::CancelTimer()
-    {
-    DeleteTimer( iBarRefreshTimer );
-    DeleteTimer( iCaptureScreenTimer );
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::ClearScreen
-// Date & time saver
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::ClearScreen()
-    {
-    
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::Refresh
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::Refresh()
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Refresh start") );
-    // Currently only keylock indicator is updated, because
-    // thats the only indicator whose state may change while screensaver
-    // is displaying. Other indicators' state changing also dismisses
-    // screensaver. Once redisplaying, the indicators are updated anyway.
-    // Key lock indicator depends on status of key guard.
-    Array().SetDependencyStatus( ESsKeyLockInd, !Model().SharedDataInterface()->IsKeyguardOn() );
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Refresh move") );
-    // Don't move bar during this refresh
-    SetMoving( EFalse );
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Refresh DrawObject") );
-    // Cause a redraw
-    DrawObject();
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Refresh move") );
-    // Allow moving
-    SetMoving();
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Refresh finish") );
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::CScreensaverCtrlMovingText
-// Date & time saver
-// -----------------------------------------------------------------------------
-//
-CScreensaverCtrlMovingText::CScreensaverCtrlMovingText( TDisplayObjectType aType )
-    :iType( aType )
-    {
-    // No implementation required
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::ConstructL
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::ConstructL()
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::ConstructL start") );
-    
-    if ( iType == EDisplayText )
-        {
-        iPictoI = CAknPictographInterface::NewL( *this, *this );
-        }
-
-    iTop = KMinTop;
-    iRandSeed = RandomSeed();
-    iMoveBar = ETrue;
-
-    GetTextAndBgColor();
-    
-    CreateWindowL();
-
-    // Cannot do this earlier - it'll cause a SizeChanged()
-    SetRect( iCoeEnv->ScreenDevice()->SizeInPixels() );
-
-    iEikonEnv->EikAppUi()->AddToStackL(
-        this, ECoeStackPriorityEnvironmentFilter, ECoeStackFlagRefusesFocus );
-    ConstructAndConnectLCDL();
-    ActivateL();
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::DrawNew
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::DrawNew( CWindowGc& aGc, const TRect& /* aRect */) const
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::DrawNew start") );
-    // Draw bar background
-    iLayoutBar.DrawRect( aGc );
-
-    // Draw clock 
-    iLayoutClock.DrawRect( aGc );
-    iLayoutClockText.DrawText( aGc, iTextTime );
-
-    // Draw date / user text
-    iLayoutDate.DrawRect( aGc );
-
-    DrawText( aGc );
-
-    // Draw indicators
-    Array().Draw( aGc );
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::DrawPictoText
-// Draws text with pictographs
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::DrawPictoText( CWindowGc &aGc ) const
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::DrawPictoText start") );
-    // Draw text and possible pictographs
-    MAknPictographDrawer* pictoDrawer = iPictoI->Interface();
-    ASSERT( pictoDrawer );
-
-    if ( ( !pictoDrawer ) || ( !pictoDrawer->ContainsPictographs( iText ) ) )
-        {
-        // Just draw normally
-        iLayoutDateText.DrawText( aGc, iText );
-        return;
-        }
-
-    // Else draw normal text with pictographs
-    aGc.UseFont( iLayoutDateText.Font() );
-    aGc.SetPenColor( iLayoutDateText.Color() );
-
-    // Calculating the offset (unfortunately not public in TAknLayoutText)
-    // copied from AknUtils TAknLayoutText::LayoutText()
-    pictoDrawer->DrawText( aGc, *iLayoutDateText.Font(), iText,
-        iLayoutDateText.TextRect(), iLayoutDateText.Font()->AscentInPixels(), 
-        iLayoutDateText.Align() );
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::DrawText
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::DrawText( CWindowGc& aGc ) const
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::DrawText start") );
-    if ( iPictoI )
-        {
-        // Draw text and pictographs in the layout
-        DrawPictoText( aGc );
-        }
-    else
-        {
-        // Draw just text
-        iLayoutDateText.DrawText( aGc, iText );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::UpdateCurrentTimeL
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::UpdateCurrentTimeL()
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::UpdateCurrentTimeL start") );
-    // AVKON does not have proper format string for just time,
-    // load from own resources
-    FormatTextFromResourceL( iTextTime, R_SCREENSAVER_TIME_USUAL_WITHOUT_AMPM );
-
-    if ( iType == EDisplayTime )
-        {
-        FormatTextFromResourceL( iText, R_QTN_DATE_USUAL_WITH_ZERO );
-        }
-    else
-        {
-        Model().SharedDataInterface()->GetDisplayObjectText( iText );
-        }
-
-    SetAmPmIndicatorPayloadL();
-    // Convert numbers according to language
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::GenerateDisplayAttributesForScreensaverBar
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::GenerateDisplayAttributesForScreensaverBar( )
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::GenerateDisplayAttributesForScreensaverBar start") );
-    // Zero out power save area, it should then be set before power save
-    // mode can be activated (also by plugins)
-    iPowerSaveDisplayActiveArea.SetRect( 0, 0, 0, 0 );
-
-    // Cool! We got scalable layouts. Use them.
-    TAknWindowComponentLayout barLayoutComponent = 
-        AknLayoutScalable_Avkon::power_save_pane();
-    iLayoutBar.LayoutRect( Rect(), barLayoutComponent.LayoutLine() );
-
-    // Add bar height from layout to get total bar height
-    TInt barHeight = iLayoutBar.Rect().Height();
-
-    // Plain refresh, no move?
-    if ( iMoveBar )
-        {
-        // Get random values for bar position and color.
-        GetRandomTopValue( iLayoutBar.Rect().Height() );
-        }
-
-    // Create a rect with the new top to be used as layout rect
-    TRect fakeScreen( Rect() );
-    fakeScreen.iTl.iY = iTop;
-
-    // Layout components
-
-    // Bar itself
-    iLayoutBar.LayoutRect( fakeScreen, barLayoutComponent.LayoutLine() );
-    TRect barRect = iLayoutBar.Rect();
-
-    // Clock (area + text)
-    GetClockLayout( barRect );
-
-    // Date (area + text)
-    GetDateLayout( barRect );
-
-    // Indicators (area + text)
-    GetIndicatorAreaLayout( barRect );
-
-    // Update current time
-    TRAP_IGNORE( UpdateCurrentTimeL() );
-
-    // Since it is known for sure at this point that screensaver
-    // bar will be drawn the partial mode can activated for bar area
-    // if it is supported by display hardware.
-    const TScreensaverColorModel& colorModel = Model().GetColorModel();
-
-    if ( colorModel.iNumberOfPartialModes > 0 )
-        {
-        TRect psRect( iLayoutBar.Rect() );
-        SetPowerSaveDisplayActiveArea( psRect );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::GetRandomTopValue
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::GetRandomTopValue( TInt aBarHight )
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::GetRandomTopValue start") );
-    TInt range( iCoeEnv->ScreenDevice()->SizeInPixels().iHeight - aBarHight - 1 - 4 );
-    TInt rand = Math::Rand( iRandSeed );
-    rand %= range;
-    iTop = ( rand > 3 ) ? ( rand/4 ) * 4 : 4;
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::RandomValue
-// -----------------------------------------------------------------------------
-//
-TInt CScreensaverCtrlMovingText::RandomSeed()
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::RandomSeed start") );
-    TTime time;
-    time.HomeTime();
-    return time.DateTime().MicroSecond();
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::GetTextAndBgColor
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::GetTextAndBgColor()
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::GetTextAndBgColor start") );
-    if( Model().SharedDataInterface()->IsInvertedColors() == KInvertedColors )
-        {
-        iBgColor = KInvertedBgColor;
-        iTextColor = KInvertedTextColor;
-        iTextBgColor = KInvertedTextBgColor;
-        }
-    else
-        {
-        iBgColor = KBgColor;
-        iTextColor = KTextColor;
-        iTextBgColor = KTextBgColor;
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::FormatTextL
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::FormatTextL( TDes& aText, const TDesC& aFormat )
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::FormatTextL start") );
-    TTime curTime;
-    curTime.HomeTime();
-    // Since screensaver is updated on the minute, make sure it displays
-    // the time of the passing minute by adding a few seconds to the
-    // time at the moment of the update.
-    curTime += TTimeIntervalSeconds( 5 );
-    
-    TRAPD( err, curTime.FormatL( aText, aFormat ) );
-    if ( err != KErrNone )
-        {
-        // If time can't be displayed then display an empty text
-        aText = KNullDesC;
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::SetAmPmIndicatorPayload
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::SetAmPmIndicatorPayloadL()
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::SetAmPmIndicatorPayloadL start") );
-    _LIT(KAmPmFormat, "%*A");
-    TBuf<10> textAmPm;
-    FormatTextL( textAmPm, KAmPmFormat );
-    
-    TIndicatorPayload payload;
-    payload.iType = EPayloadTypeText;
-    payload.iText.Zero();
-    payload.iText.Append( textAmPm );
-    Array().SetIndicatorPayload( ESsAmPmInd, payload );
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::FormatTextFromResourceL
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::FormatTextFromResourceL( TDes &aText, TInt aResourceId )
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::FormatTextFromResourceL start") );
-    TBuf<30> timeFormat;
-    iCoeEnv->ReadResourceL( timeFormat, aResourceId );
-    FormatTextL( aText, timeFormat );
-    AknTextUtils::DisplayTextLanguageSpecificNumberConversion( aText );
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::GetClockLayout
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::GetClockLayout( const TRect& aRect )
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::GetClockLayout start") );
-    TAknWindowComponentLayout clockarea =
-        AknLayoutScalable_Avkon::aid_ps_clock_pane( 0 );
-    TAknWindowLineLayout clockline = clockarea.LayoutLine();
-    clockline.iC = iBgColor;
-    iLayoutClock.LayoutRect( aRect, clockarea.LayoutLine() );
-
-    TAknTextComponentLayout clocktext =
-        AknLayoutScalable_Avkon::power_save_t2( 0 );
-    clocktext.SetC( iTextColor );
-    iLayoutClockText.LayoutText( aRect, clocktext.LayoutLine() );
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::GetClockLayout
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::GetDateLayout( const TRect& aRect )
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::GetDateLayout start") );
-    TAknWindowComponentLayout datearea =
-        AknLayoutScalable_Avkon::power_save_pane_g1( 0 );
-    TAknWindowLineLayout dateline = datearea.LayoutLine();
-    dateline.iC = iTextBgColor;
-    iLayoutDate.LayoutRect( aRect, dateline );
-
-    TAknTextComponentLayout datetext =
-        AknLayoutScalable_Avkon::power_save_pane_t1( 0 );
-    TAknTextLineLayout datetextline = datetext.LayoutLine();
-    iLayoutDateText.LayoutText( aRect, datetextline );
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::GetClockLayout
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::GetIndicatorAreaLayout( const TRect& aRect )
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::GetIndicatorAreaLayout start") );
-    TAknWindowComponentLayout indicatorarea =
-        AknLayoutScalable_Avkon::aid_ps_indicator_pane( 0 );
-    TAknWindowLineLayout indicatorline = indicatorarea.LayoutLine();
-    indicatorline.iC = iBgColor;
-    TAknLayoutRect layoutIndicatorArea;
-    layoutIndicatorArea.LayoutRect( aRect, indicatorline );
-
-    // Indicator texts
-    TAknTextComponentLayout indtext =
-        AknLayoutScalable_Avkon::power_save_pane_t4( 0 );
-    TAknTextLineLayout indline = indtext.LayoutLine();
-    TAknLayoutText layoutIndicatorText;
-    layoutIndicatorText.LayoutText( aRect, indline );
-
-    // Indicator icons
-    TAknWindowComponentLayout inds =
-        AknLayoutScalable_Avkon::indicator_ps_pane( 0 );
-    TAknWindowLineLayout indsline = inds.LayoutLine();
-    TAknLayoutRect layoutInds;
-    layoutInds.LayoutRect( aRect, indsline );
-
-    // Tell indicator array where to draw (this should be moved to
-    // the array itself)
-    Array().Setup( layoutIndicatorArea, layoutIndicatorText, layoutInds );
-    }
-
-// -----------------------------------------------------------------------------
-// CScreensaverCtrlMovingText::StartBarRefreshTimer
-// -----------------------------------------------------------------------------
-//
-void CScreensaverCtrlMovingText::StartBarRefreshTimer()
-    {
-    SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::StartBarRefreshTimer start") );
-    DeleteTimer( iBarRefreshTimer );
-    
-    TRAP_IGNORE( iBarRefreshTimer = CPeriodic::NewL( CActive::EPriorityStandard ) );
-    
-    TInt initialRefreshRate = InitialRefreshRate();
-    
-    iBarRefreshTimer->Start( initialRefreshRate, KRefreshRate, TCallBack(
-        HandleRefreshTimerExpiry, this ) );
-    
-    SCRLOGGER_WRITEF( _L("SCR: BarRefreshTimer->Start(%d, %d, HandleRefreshTimerExpiry)"),
-        initialRefreshRate, KRefreshRate );
-    }
-
-// End of file.