src/screensaverindicatoricon.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:46:04 +0200
changeset 0 040fcad49f44
permissions -rw-r--r--
Revision: 200949 Kit: 200951

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



#include <AknsUtils.h>
#include <barsread.h>

#include "screensaverindicatoricon.h"

//
// CScreensaverIconIndicator
//

// -----------------------------------------------------------------------------
// CScreensaverIconIndicator::~CScreensaverIconIndicator
// -----------------------------------------------------------------------------
//
CScreensaverIndicatorIcon::~CScreensaverIndicatorIcon()
    {
    delete iIcon;
    }

// -----------------------------------------------------------------------------
// CScreensaverIconIndicator::Draw
// -----------------------------------------------------------------------------
//
void CScreensaverIndicatorIcon::Draw(CWindowGc& aGc) const
    {
    aGc.SetPenColor(iTextColor);
    aGc.SetBrushColor(iBgColor);
    if (Visible() && iIcon)
        {
        if (!iIcon->Mask())
            {
            aGc.BitBlt(iTopLeft, iIcon->Bitmap(), iRect);
            }
        else
            {
            aGc.BitBltMasked(iTopLeft, iIcon->Bitmap(), iRect, iIcon->Mask(),
                    ETrue);
            }
        }
    }

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

    // Icon & mask ids
    TInt id = aReader.ReadInt32();
    TInt maskid = aReader.ReadInt32();

    // Icon & mask skin identifiers
    TInt skinid = aReader.ReadInt32();
    TInt skinmaskid = aReader.ReadInt32();

    iIcon = CGulIcon::NewL();

    CFbsBitmap* bmp= NULL;
    CFbsBitmap* mask= NULL;

    // Load skinned bitmap
    AknsUtils::CreateColorIconLC(AknsUtils::SkinInstance(),
            MakeSkinItemId(skinid),
            KAknsIIDNone, // Lie so that we get default color, not skin color
            0, // No color group
            bmp, mask, AknIconUtils::AvkonIconFileName(), id, maskid,
            iTextColor);

    CleanupStack::Pop(2);

    // Save the icon
    iIcon->SetBitmap(bmp);
    iIcon->SetMask(mask);

    // Set initial size for SVG graphics, this is later altered
    // as the layout is known
    // Set desired size for SVG graphics (height from LAF, width 3 x height)
    TAknLayoutRect screenLayout;
    screenLayout.LayoutRect(TRect(0, 0, 0, 0), AknLayout::screen() );
    TRect screenRect = screenLayout.Rect();
    TAknLayoutRect powerSavePaneLayout;
    powerSavePaneLayout.LayoutRect(screenRect,
            AknLayout::Power_save_pane_descendants_Line_1() );
    TRect powerSavePaneRect = powerSavePaneLayout.Rect();
    TAknLayoutRect rect;
    rect.LayoutRect(powerSavePaneRect,
            AknLayout::Power_save_pane_descendants_Line_3() );
    TInt height = rect.Rect().Height();
    TSize iconSize(3 * height, height);
    AknIconUtils::SetSize(iIcon->Bitmap(), iconSize);
    }

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

    if (!iIcon)
        {
        return;
        }

    TSize size = iIcon->Bitmap()->SizeInPixels();
    iTopLeft.iX = aCorner.iX;
    if (iAlignment == ESsAlignRight)
        {
        // Change topright to topleft.      
        iTopLeft.iX -= size.iWidth;
        }
    // Center bitmap in y direction.
    iTopLeft.iY = aCorner.iY + (aParentRect.Size().iHeight / 2) - (size.iHeight / 2) - 2;

    iRect = TRect(0, 0, size.iWidth, size.iHeight);

    iVisible = ETrue;
    }

// -----------------------------------------------------------------------------
// CScreensaverIconIndicator::CheckVisibilityConditions
// -----------------------------------------------------------------------------
//
TBool CScreensaverIndicatorIcon::CheckVisibilityConditions() const
    {
    return (iIcon == 0 ? EFalse : ETrue);
    }

// -----------------------------------------------------------------------------
// CScreensaverIconIndicator::Payload
// -----------------------------------------------------------------------------
//
void CScreensaverIndicatorIcon::Payload(TIndicatorPayload& aPayload) const
    {
    aPayload.iType = EPayloadTypeIcon;
    aPayload.iInteger = -1;
    aPayload.iText = KNullDesC;
    aPayload.iIsDisplayed = Visible();
    aPayload.iIcon = iIcon;
    }

// -----------------------------------------------------------------------------
// CScreensaverIconIndicator::SetPayload
// -----------------------------------------------------------------------------
//
void CScreensaverIndicatorIcon::SetPayload(const TIndicatorPayload& /*aPayload*/)
    {
    // Nothing to set, payload is icon and it is created from resources.    
    }

// -----------------------------------------------------------------------------
// CScreensaverIconIndicator::SetIconLayout
// -----------------------------------------------------------------------------
//
void CScreensaverIndicatorIcon::SetIconLayout(TAknLayoutRect& aLayout, TInt aX)
    {
    if (!iIcon)
        {
        ASSERT(iIcon);
        return;
        }

    // Resize icon according to layout
    TInt height = aLayout.Rect().Height();
    TSize iconSize(KMaxTInt, height);
    AknIconUtils::SetSize(iIcon->Bitmap(), iconSize,
            EAspectRatioPreservedAndUnusedSpaceRemoved);

    // Set vertical icon position according to layout (this overrides
    // what's already there. Also set correct width in iRect
    iTopLeft.iY = aLayout.Rect().iTl.iY;
    iTopLeft.iX = aX;
    TSize size = iIcon->Bitmap()->SizeInPixels();
    iRect = TRect(0, 0, size.iWidth, size.iHeight);

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

#ifdef SS_LAYOUTTRACE
    SCRLOGGER_WRITEF(_L("SCR: Icon indicator (%d):"), iId);
    SCRLOGGER_WRITEF(_L("SCR:   Rect: (%d,%d,%d,%d)"),
            iRect.iTl.iX,
            iRect.iTl.iY,
            iRect.iBr.iX,
            iRect.iBr.iY);
    SCRLOGGER_WRITEF(_L("SCR:   Size: (%d,%d)"), size.iWidth, size.iHeight);
    SCRLOGGER_WRITEF(_L("SCR:   Pos:  (%d,%d)"), iTopLeft.iX, iTopLeft.iY);
#endif
    }


// End of file