diff -r 5f0182e07bfb -r 5456b4e8b3a8 idlehomescreen/xmluirendering/uiengine/src/xnfocuscontrol.cpp --- /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 +#include +#include + +// 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 +