idlehomescreen/xmluirendering/uiengine/src/xnfocuscontrol.cpp
branchRCL_3
changeset 83 5456b4e8b3a8
child 88 3321d3e205b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluirendering/uiengine/src/xnfocuscontrol.cpp	Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,217 @@
+/*
+* Copyright (c) 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:  Focus appearance drawer
+*
+*/
+
+// System includes
+#include <AknsDrawUtils.h>
+#include <AknsUtils.h>
+#include <AknsItemID.h>
+
+// User includes
+#include "xncontroladapter.h"
+#include "xnproperty.h"
+#include "xnappuiadapter.h"
+#include "xnuiengine.h"
+#include "xneditmode.h"
+#include "xnnode.h"
+#include "xninactivitymonitor.h"
+
+#include "xnfocuscontrol.h"
+
+// Constants
+const TInt KSkinGfxInnerRectShrink( 5 );
+
+// ============================ LOCAL FUNCTIONS ================================
+
+// ============================ MEMBER FUNCTIONS ===============================
+// -----------------------------------------------------------------------------
+// CXnFocusControl::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CXnFocusControl* CXnFocusControl::NewL( CXnAppUiAdapter& aAppUiAdapter )
+    {
+    CXnFocusControl* self = CXnFocusControl::NewLC( aAppUiAdapter );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnFocusControl::NewLC()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CXnFocusControl* CXnFocusControl::NewLC( CXnAppUiAdapter& aAppUiAdapter )
+    {
+    CXnFocusControl* self = new ( ELeave ) CXnFocusControl( aAppUiAdapter );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnFocusControl::~CXnFocusControl()
+// C++ default destructor.
+// -----------------------------------------------------------------------------
+//
+CXnFocusControl::~CXnFocusControl()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CXnFocusControl::CXnFocusControl()
+// C++ default constructor.
+// -----------------------------------------------------------------------------
+//
+CXnFocusControl::CXnFocusControl( CXnAppUiAdapter& aAppUiAdapter )
+    : iAppUiAdapter( aAppUiAdapter )
+    {    
+    }
+
+// -----------------------------------------------------------------------------
+// CXnFocusControl::ConstructL()
+// 2nd phase constructor
+// -----------------------------------------------------------------------------
+//
+void CXnFocusControl::ConstructL()
+    {   
+    }
+
+// -----------------------------------------------------------------------------
+// CXnFocusControl::MakeVisible()
+// 
+// -----------------------------------------------------------------------------
+//
+void CXnFocusControl::MakeVisible( TBool aVisible )
+    {
+    TRAP_IGNORE( DoMakeVisibleL( aVisible ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CXnFocusControl::DoMakeVisibleL()
+// 
+// -----------------------------------------------------------------------------
+//
+void CXnFocusControl::DoMakeVisibleL( TBool aVisible )
+    {
+    if ( aVisible != iVisible )
+        {
+        if ( !aVisible )
+            {
+            iVisible = aVisible;
+            
+            iRefused = EFalse;
+            
+            CXnNode* node( iAppUiAdapter.UiEngine().FocusedNode() ); 
+                                   
+            if ( node )
+                {
+                node->HideTooltipsL();
+                                    
+                CXnControlAdapter* control( node->Control() );
+                
+                if  ( control && control->RefusesFocusLoss() )
+                    {
+                    // Need to keep drawing focus appearance
+                    iRefused = ETrue;
+                    
+                    node->UnsetStateL( 
+                        XnPropertyNames::style::common::KPressedDown );
+                    }
+                else
+                    {
+                    node->UnsetStateL(  
+                        XnPropertyNames::style::common::KFocus );                    
+                    }
+                                
+                iAppUiAdapter.UiEngine().RenderUIL();                
+                }    
+            }
+        else
+            {
+            iRefused = EFalse;
+            
+            iVisible = aVisible;
+            }              
+        }        
+    }
+
+// -----------------------------------------------------------------------------
+// CXnFocusControl::IsVisible()
+// 
+// -----------------------------------------------------------------------------
+//
+TBool CXnFocusControl::IsVisible() const
+    {
+    return iVisible;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnFocusControl::Draw()
+// 
+// -----------------------------------------------------------------------------
+//
+void CXnFocusControl::Draw( const TRect& aRect, CWindowGc& aGc ) const
+    {
+    TInt state( iAppUiAdapter.UiEngine().EditMode()->EditState() );
+            
+    // Don't draw focus appearance when shooting dragging widget in edit mode
+    if ( state == CXnEditMode::EShootContent )
+        {
+        return;
+        }
+    
+    if ( IsVisible() || iRefused ) 
+        {                                       
+        CXnNode* node( iAppUiAdapter.UiEngine().FocusedNode() );
+        
+        if ( node )
+            {            
+            CXnProperty* prop( NULL );
+            
+            TRAP_IGNORE( prop = node->GetPropertyL( 
+                XnPropertyNames::common::KFocusAppearance ) );
+                                            
+            if ( prop && prop->StringValue() == XnPropertyNames::KNone )
+                {
+                // Current element refuses to draw focus appearance
+                return;
+                }
+            
+            TRect innerRect( aRect );            
+            
+            innerRect.Shrink( 
+                KSkinGfxInnerRectShrink, KSkinGfxInnerRectShrink );
+            
+            MAknsSkinInstance* skin( AknsUtils::SkinInstance() );
+                 
+            if ( node->IsStateSet( XnPropertyNames::style::common::KPressedDown ) )
+                {
+                AknsDrawUtils::DrawFrame( skin, aGc, aRect, innerRect,
+                    KAknsIIDQsnFrHomePressed, KAknsIIDDefault );                
+                }            
+            
+            if ( node->IsStateSet( XnPropertyNames::style::common::KFocus ) )
+                {
+                AknsDrawUtils::DrawFrame( skin, aGc, aRect, innerRect, 
+                    KAknsIIDQsnFrHome, KAknsIIDDefault );                
+                }            
+            }       
+        }
+    }
+
+// End of file
+