src/screensaverindicatortext.cpp
changeset 0 040fcad49f44
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/screensaverindicatortext.cpp	Thu Dec 17 08:46:04 2009 +0200
@@ -0,0 +1,234 @@
+/*
+* 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