skins/AknSkins/src/AknsFrameBackgroundControlContext.cpp
changeset 0 05e9090e2422
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/skins/AknSkins/src/AknsFrameBackgroundControlContext.cpp	Thu Dec 17 09:14:12 2009 +0200
@@ -0,0 +1,305 @@
+/*
+* Copyright (c) 2002-2008 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:  Context for frames.
+*
+*/
+
+
+// INCLUDE FILES
+#include "AknsCppPreface.h"
+
+#include <AknsFrameBackgroundControlContext.h>
+#include <AknsItemData.h>
+#include <AknsUtils.h>
+#include <AknsDrawUtils.h>
+
+#include "AknsBackgroundLayout.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAknsFrameBackgroundControlContext::CAknsFrameBackgroundControlContext
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAknsFrameBackgroundControlContext::CAknsFrameBackgroundControlContext() :
+    CAknsLayeredBackgroundControlContext(),
+    iInnerRect(0,0,1,1), iOuterRect(0,0,1,1), iSingleElementFrame( EFalse )
+    {
+    iFrameID = KAknsIIDNone;
+    iCenterID = KAknsIIDDefault;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsFrameBackgroundControlContext::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAknsFrameBackgroundControlContext::ConstructL(
+    const TAknsItemID& aFrameID, const TRect& aOuterRect,
+    const TRect& aInnerRect, const TBool aParentAbsolute )
+    {
+    CAknsLayeredBackgroundControlContext::ConstructL( TRect(0,0,1,1),
+        aParentAbsolute, KAknsIIDNone, EAknsFrameElementsN );
+
+    SetFrameRects( aOuterRect, aInnerRect );
+    SetFrame( aFrameID );
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsFrameBackgroundControlContext::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+AKNS_EXPORTED_METHOD(CAknsFrameBackgroundControlContext::NewL)
+EXPORT_C CAknsFrameBackgroundControlContext*
+    CAknsFrameBackgroundControlContext::NewL(
+    const TAknsItemID& aFrameID, const TRect& aOuterRect,
+    const TRect& aInnerRect, const TBool aParentAbsolute )
+    {
+    CAknsFrameBackgroundControlContext* self =
+        new( ELeave ) CAknsFrameBackgroundControlContext();
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aFrameID, aOuterRect, aInnerRect, aParentAbsolute );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsFrameBackgroundControlContext::~CAknsFrameBackgroundControlContext
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CAknsFrameBackgroundControlContext::~CAknsFrameBackgroundControlContext()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsFrameBackgroundControlContext::SetFrame
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknsFrameBackgroundControlContext::SetFrame(
+    const TAknsItemID& aFrameID )
+    {
+    iFrameID = aFrameID;
+    iCenterID = KAknsIIDDefault;
+
+    TInt i;
+
+    for( i=0; i<EAknsFrameElementsN; i++ )
+        {
+        SetLayerImage( i, KAknsIIDNone );
+        }
+
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    if( !skin )
+        {
+        return;
+        }
+
+    CAknsImageItemData* imgData = static_cast<CAknsImageItemData*>(
+        skin->GetCachedItemData( aFrameID, EAknsITImage ) );
+    if( !imgData )
+        {
+        return;
+        }
+
+    //lint --e{961} Valid logic
+    if( AknsUtils::IsDerivedType( EAknsITBitmap, imgData->Type() ) )
+        {
+        iSingleElementFrame = ETrue;
+
+        SetLayerImage( 0, aFrameID );
+        }
+    else if( AknsUtils::IsDerivedType( EAknsITImageTable, imgData->Type() ) )
+        {
+        iSingleElementFrame = EFalse;
+
+        CAknsImageTableItemData* itData =
+            static_cast<CAknsImageTableItemData*>(imgData);
+        if( itData->NumberOfImages()!=9 )
+            {
+            return;
+            }
+
+        SetLayerImage( 0, itData->ImageIID( EAknsFrameIndexCenter ) );
+        for( i=0; i<EAknsFrameElementsN-1; i++ )
+            {
+            SetLayerImage( i+1, itData->ImageIID( i ) );
+            }
+        }
+    // Since we can not leave, just tolerate the unsupported type
+
+    UpdateFrame();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsFrameBackgroundControlContext::SetFrameRects
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknsFrameBackgroundControlContext::SetFrameRects(
+    const TRect& aOuterRect,
+    const TRect& aInnerRect )
+    {
+    iOuterRect = aOuterRect;
+    iInnerRect = aInnerRect;
+
+    // Center
+    // Center layer rectangle handled by UpdateFrame
+
+    // Corners
+    SetLayerRect( EAknsFrameIndexTl+1,
+        TRect( aOuterRect.iTl, aInnerRect.iTl ) );
+    SetLayerRect( EAknsFrameIndexTr+1,
+        TRect( aInnerRect.iBr.iX, aOuterRect.iTl.iY,
+        aOuterRect.iBr.iX, aInnerRect.iTl.iY ) );
+    SetLayerRect( EAknsFrameIndexBl+1,
+        TRect( aOuterRect.iTl.iX, aInnerRect.iBr.iY,
+        aInnerRect.iTl.iX, aOuterRect.iBr.iY ) );
+    SetLayerRect( EAknsFrameIndexBr+1,
+        TRect( aInnerRect.iBr, aOuterRect.iBr ) );
+
+    // Sides
+    TRect sideRect( aInnerRect.iTl.iX, aOuterRect.iTl.iY,
+        aInnerRect.iBr.iX, aInnerRect.iTl.iY );
+    SetLayerRect( EAknsFrameIndexT+1, sideRect );
+    sideRect.SetRect( aInnerRect.iTl.iX, aInnerRect.iBr.iY,
+        aInnerRect.iBr.iX, aOuterRect.iBr.iY );
+    SetLayerRect( EAknsFrameIndexB+1, sideRect );
+    sideRect.SetRect( aOuterRect.iTl.iX, aInnerRect.iTl.iY,
+        aInnerRect.iTl.iX, aInnerRect.iBr.iY );
+    SetLayerRect( EAknsFrameIndexL+1, sideRect );
+    sideRect.SetRect( aInnerRect.iBr.iX, aInnerRect.iTl.iY,
+        aOuterRect.iBr.iX, aInnerRect.iBr.iY );
+    SetLayerRect( EAknsFrameIndexR+1, sideRect );
+
+    UpdateFrame();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsFrameBackgroundControlContext::SetCenter
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+AKNS_EXPORTED_METHOD(CAknsFrameBackgroundControlContext::SetCenter)
+EXPORT_C void CAknsFrameBackgroundControlContext::SetCenter(
+    const TAknsItemID& aID )
+    {
+    iCenterID = aID;
+    iLayout->iImageID = aID;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsFrameBackgroundControlContext::SetFramePartRect
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+AKNS_EXPORTED_METHOD(CAknsFrameBackgroundControlContext::SetFramePartRect)
+EXPORT_C void CAknsFrameBackgroundControlContext::SetFramePartRect(
+    const TRect& aRect,
+    const TAknsFrameElementIndex aFrameElement )
+    {
+    if( aFrameElement == EAknsFrameIndexCenter )
+        {
+        iInnerRect = aRect;
+        // Center layer rectangle handled by UpdateFrame
+        }
+    else
+        {
+        //lint --e{961} Valid logic
+        if( aFrameElement == EAknsFrameIndexTl )
+            {
+            iOuterRect.iTl = aRect.iTl;
+            }
+        else if( aFrameElement == EAknsFrameIndexBr )
+            {
+            iOuterRect.iBr = aRect.iBr;
+            }
+        // None of the other cases change outer rect
+
+        SetLayerRect( aFrameElement+1 , aRect );
+        }
+
+    UpdateFrame();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsFrameBackgroundControlContext::IsCompatibleWithType
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CAknsFrameBackgroundControlContext::IsCompatibleWithType(
+    const TAknsControlContextType aType ) const
+    {
+    switch( aType )
+        {
+        case EAknsControlContextTypeUnknown:
+        case EAknsControlContextTypeBasic:
+        case EAknsControlContextTypeLayered:
+        case EAknsControlContextTypeFrame:
+            return ETrue;
+
+        case EAknsControlContextTypeListBox:
+            break;
+        }
+
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsFrameBackgroundControlContext::UpdateContext
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CAknsFrameBackgroundControlContext::UpdateContext()
+    {
+    SetFrame( iFrameID );
+    if( (!iSingleElementFrame) && (iCenterID!=KAknsIIDDefault) )
+        {
+        SetCenter( iCenterID );
+        }
+
+    return 0;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsFrameBackgroundControlContext::UpdateFrame
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAknsFrameBackgroundControlContext::UpdateFrame()
+    {
+    if( iSingleElementFrame )
+        {
+        iLayout->iNext = NULL;
+        SetLayerRect( 0, iOuterRect );
+        }
+    else
+        {
+        iLayout->iNext = &(iLayoutArray[0]);
+        SetLayerRect( 0, iInnerRect );
+        }
+
+    MAknsSkinInstance* skininstance = AknsUtils::SkinInstance();
+    AknsDrawUtils::PrepareFrame( skininstance,
+        iOuterRect, iInnerRect,
+        iFrameID, iCenterID);
+    }
+
+//  End of File