src/screensaverindicatortext.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 31 Mar 2010 21:32:18 +0300
branchRCL_3
changeset 12 1c806ee746e7
parent 0 040fcad49f44
permissions -rw-r--r--
Revision: 201010 Kit: 201013

/*
* 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:   CScreensaverIndicatorText implementation.
*
*/



#include <AknLayoutFont.h>
#include <barsread.h>

#include "screensaverindicatortext.h"



// -----------------------------------------------------------------------------
// CScreensaverTextIndicator::Draw
// -----------------------------------------------------------------------------
//
void CScreensaverIndicatorText::Draw( CWindowGc& aGc ) const
    {
    if ( iFont )
        {
        aGc.UseFont( iFont );
        }
    aGc.SetPenColor( iTextColor );

    // Draw normal bidi text
    TBidiText* bidi= NULL;
    TRAPD( err, bidi = TBidiText::NewL( iText, 1 ) );
    if ( err == KErrNone )
        {
        bidi->WrapText( Width(), *iFont, NULL );
        if ( iTextRect.IsEmpty() )
            {
            bidi->DrawText( aGc, iTopLeft );
            }
        else
            {
            TPoint pt = iTextRect.iTl;
            pt.iY += iTextOffset;
            bidi->DrawText( aGc, pt );
            }
        delete bidi;
        }
    }

// -----------------------------------------------------------------------------
// CScreensaverTextIndicator::ConstructL
// -----------------------------------------------------------------------------
//
void CScreensaverIndicatorText::ConstructL( TResourceReader &aReader,
        TUint32 aBgColor, TUint aTextColor )
    {
    CScreensaverIndicator::ConstructL( aReader, aBgColor, aTextColor );

    iFont = AknLayoutUtils::FontFromId( aReader.ReadInt32() );
    if ( !iFont )
        {
        iFont = LatinPlain12();
        }

    }

// -----------------------------------------------------------------------------
// CScreensaverTextIndicator::SetupDrawingParameters
// -----------------------------------------------------------------------------
//
void CScreensaverIndicatorText::SetupDrawingParameters( const TPoint& aCorner,
        const TRect& aParentRect )
    {
    iVisible = EFalse;

    if ( iText.Length() <= 0 )
        {
        return;
        }

    TInt textWidth = ( iFont ? iFont->TextWidthInPixels(iText) + 1
            : iText.Length() * 11 ); // Should be enough for APAC too

    iRect = TRect( 0, 0, textWidth, aParentRect.Size().iHeight );

    iTopLeft.iX = aCorner.iX;

    if ( iAlignment == ESsAlignRight )
        {
        // Change topright to topleft.      
        iTopLeft.iX -= iRect.Size().iWidth;
        }

    iTopLeft.iY = aCorner.iY + ( aParentRect.Size().iHeight / 2 ) + ( ( aParentRect.Size().iHeight - iFont->HeightInPixels() ) / 2 ) + 2;

    // Make sure text rect is not used
    iTextRect.SetRect( 0, 0, 0, 0 );

    iVisible = ETrue;
    }

// -----------------------------------------------------------------------------
// CScreensaverTextIndicator::ConstructL
// -----------------------------------------------------------------------------
//
TBool CScreensaverIndicatorText::CheckVisibilityConditions() const
    {
    return ( iText.Length() > 0 ? ETrue : EFalse );
    }

// -----------------------------------------------------------------------------
// CScreensaverTextIndicator::ConstructL
// -----------------------------------------------------------------------------
//
void CScreensaverIndicatorText::Payload( TIndicatorPayload &aPayload ) const
    {
    aPayload.iType = EPayloadTypeText;
    aPayload.iText = iText;
    aPayload.iInteger = -1;
    aPayload.iIsDisplayed = Visible();
    aPayload.iIcon = NULL;
    }

// -----------------------------------------------------------------------------
// CScreensaverTextIndicator::ConstructL
// -----------------------------------------------------------------------------
//
void CScreensaverIndicatorText::SetPayload( const TIndicatorPayload& aPayload )
    {
    if ( aPayload.iType != EPayloadTypeText )
        {
        return;
        }

    if ( aPayload.iText.Length() > iText.MaxLength() )
        {
        return; // Don't panic.      
        }

    iText = aPayload.iText;
    }

// -----------------------------------------------------------------------------
// CScreensaverTextIndicator::SetTextLayout
// Sets text position and font
// -----------------------------------------------------------------------------
//
void CScreensaverIndicatorText::SetTextLayout( TAknLayoutText& aLayout, TInt aX )
    {
    // Font from layout
    iFont = aLayout.Font();
    // Layout MUST have a font
    ASSERT( iFont != NULL );

    // Vertical dimension of text rect from layout
    iTextRect = aLayout.TextRect();

    // Calculate text offset from rect top
    const CAknLayoutFont* layoutFont =
            CAknLayoutFont::AsCAknLayoutFontOrNull( iFont );

    if ( layoutFont )
        {
        iTextOffset = layoutFont->TextPaneTopToBaseline();
        }
    else
        {
        iTextOffset = iFont->AscentInPixels();
        }

    // X-pos from parameter
    iTextRect.iTl.iX = aX;

    // Initially set indicator rect (this may later be overridden by SetWidth())
    iRect = TRect( 0, 0, PreferredWidth(), aLayout.TextRect().Height() );

    // If right-aligned, the X-pos indicates right edge - switch to left
    if ( iAlignment == ESsAlignRight )
        {
        // Change topright to topleft.      
        iTextRect.iTl.iX -= Width(); // iRect.Size().iWidth;  
        }

    // Indicator width = text rect width
    iTextRect.SetWidth( Width() );
    }

// -----------------------------------------------------------------------------
// CScreensaverTextIndicator::PreferredWidth
// Gets preferred indicator width
// -----------------------------------------------------------------------------
//
TInt CScreensaverIndicatorText::PreferredWidth()
    {
    TInt textWidth = ( iFont ? iFont->TextWidthInPixels( iText ) + 1
            : iText.Length() * 11 ); // Should be enough for APAC too
    return textWidth;
    }

// -----------------------------------------------------------------------------
// CScreensaverTextIndicator::SetWidth
// Sets indicator width
// -----------------------------------------------------------------------------
//
void CScreensaverIndicatorText::SetWidth( TInt iWidth )
    {
    iRect.SetWidth( iWidth );
    }

// -----------------------------------------------------------------------------
// CScreensaverTextIndicator::SetXPos
// Sets indicator X-position (new layout)
// -----------------------------------------------------------------------------
//
void CScreensaverIndicatorText::SetXPos( TInt aX )
    {
    iTopLeft.iX = aX;
    if ( iAlignment == ESsAlignRight )
        {
        // Change topright to topleft.      
        iTopLeft.iX -= iRect.Size().iWidth;
        }
    }

// End of file