/*
* Copyright (c) 2002-2004 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:
* Node of layout tree, plugin interface
*
*/

#ifndef XNNODEPLUGINIF_H
#define XNNODEPLUGINIF_H

// System includes
#include <e32base.h>

// Forward declarations
class CXnType;
class CXnProperty;
class CXnNode;
class CXnViewNodeImpl;
class CXnComponentNodeImpl;
class TXnUiEnginePluginIf;
class CXnNodeAppIf;
class CXnControlAdapter;

namespace XnComponentInterface
    {
    class MXnComponentInterface;
    }

// Class declaration
/**
 * Node of layout tree, plugin interface
 *
 * @ingroup group_xnlayoutengine
 * @lib xn3layoutengine.lib
 * @since Series 60 3.1
 */
class CXnNodePluginIf : public CBase
    {
public:
    /**
     * C++ default constructor.
     */
    CXnNodePluginIf( CXnNode& aNode );

public:
    // New functions

    /**
     * Get the view node implementation
     *
     * @since Series 60 3.1
     * @return View node implementation
     */
    IMPORT_C CXnViewNodeImpl* ViewNodeImpl();

    /**
     * Get the component node implementation
     *
     * @since Series 60 3.1
     * @return Component node implementation
     */
    IMPORT_C CXnComponentNodeImpl* ComponentNodeImpl();

    /**
     * Get the UI engine
     *
     * @since Series 60 3.1
     * @return UI engine
     */
    IMPORT_C TXnUiEnginePluginIf* UiEngineL();

    /**
     * Set node's layout capability
     *
     * @since Series 60 3.1
     * @param aLayoutCapable Layout capability
     */
    IMPORT_C void SetLayoutCapable( const TBool aLayoutCapable );

    /**
     * Get node's layout capability
     *
     * @since Series 60 3.1
     * @return Layout capability
     */
    IMPORT_C TBool IsLayoutCapable() const;

    /**
     * Set the node's characted data
     *
     * @since Series 60 3.1
     * @param aData Character data
     */
    IMPORT_C void SetPCDataL( const TDesC8& aData );

    /**
     * Get the node's characted data
     *
     * @since Series 60 3.1
     * @return Character data
     */
    IMPORT_C const TDesC8& GetPCData() const;

    /**
     * Set a property.
     *
     * The list will assume ownership of the property.
     * If an equal property is already in the list, it will be
     * replaced with the new property and the old property will be destroyed.
     *
     * @since Series 60 3.1
     * @param aProperty Property to set.
     */
    IMPORT_C void SetPropertyL( CXnProperty* aProperty );

    /**
     * Set a property without notification being sent.
     *
     * @see SetPropertyL
     * @param aProperty Property to set.
     */
    IMPORT_C void SetPropertyWithoutNotificationL( CXnProperty* aProperty );

    /**
     * Gets a property.
     *
     * The list will retain ownership of the property,
     * the caller must not destroy the property. The returned pointer will
     * become invalid if the property is replaced in the list by a subsequent
     * SetL().
     *
     * @since Series 60 3.1
     * @param aProperty Property key
     * @return The property mapped to the key or NULL if not found.
     */
    IMPORT_C CXnProperty* GetPropertyL( CXnProperty& aProperty ) const;

    /**
     * Gets a property.
     *
     * The list will retain ownership of the property,
     * the caller must not destroy the property. The returned pointer will
     * become invalid if the property is replaced in the list by a subsequent
     * SetL().
     *
     * @since Series 60 3.1
     * @param aKey Name of the property
     * @return The property mapped to the key or NULL if not found.
     */
    IMPORT_C CXnProperty* GetPropertyL( const TDesC8& aKey ) const;

    /**
     * Set a state
     *
     * @since Series 60 3.1
     * @param aState State to set.
     */
    IMPORT_C void SetStateL( const TDesC8& aState );

    /**
     * Unset a state
     *
     * @since Series 60 3.1
     * @param aState State to unset.
     */
    IMPORT_C void UnsetStateL( const TDesC8& aState );

    /**
     * Is the node in focused state
     *
     * @since Series 60 3.1
     * @return ETrue if node is focused.
     */
    IMPORT_C TBool IsFocusedState();
    
    /**
     * Is the node in edit state
     *
     * @since Series 60 3.1
     * @return ETrue if node is in edit state.
     */    
    IMPORT_C TBool IsEditState();
    
    /**
     * Get node type
     *
     * @since Series 60 3.1
     * @return Node type
     */
    IMPORT_C CXnType* Type();

    /**
     * Set node's content rect
     *
     * @since Series 60 3.1
     * @param aRect Content rect
     */
    IMPORT_C void SetRect( const TRect& aRect );

    /**
     * Get node's content rect
     *
     * @since Series 60 3.1
     * @return Content rect
     */
    IMPORT_C TRect Rect();

    /**
     * Set node's border rect
     *
     * @since Series 60 3.1
     * @param aRect Border rect
     */
    IMPORT_C void SetBorderRect( const TRect& aRect );

    /**
     * Get node's border rect
     *
     * @since Series 60 3.1
     * @return Border rect
     */
    IMPORT_C TRect BorderRect();

    /**
     * Set node's margin rect
     *
     * @since Series 60 3.1
     * @param aRect Margin rect
     */
    IMPORT_C void SetMarginRect( const TRect& aRect );

    /**
     * Get node's margin rect
     *
     * @since Series 60 3.1
     * @return Margin rect
     */
    IMPORT_C TRect MarginRect();

    /**
     * Set node's padding rect
     *
     * @since Series 60 3.1
     * @param aRect Padding rect
     */
    IMPORT_C void SetPaddingRect( const TRect& aRect );

    /**
     * Get node's padding rect
     *
     * @since Series 60 3.1
     * @return Padding rect
     */
    IMPORT_C TRect PaddingRect();

    /**
     * Returns the parent. The ownership is not transferred.
     *
     * @since Series 60 3.1
     * @return The parent area, NULL if not set.
     */
    IMPORT_C CXnNodePluginIf* ParentL() const;

    /**
     * Adds a child node under this node. Assumes ownership of the node.
     *
     * @since Series 60 3.1
     * @param aChild Child to be added
     * @exception KXnErrAddChildToAreaFailed Adding child failed.
     */
    IMPORT_C void AddChildL( CXnNodePluginIf* aChild );

    /**
     * Get the child nodes
     *
     * @since Series 60 3.1
     * @return Child nodes
     */
    IMPORT_C RPointerArray< CXnNodePluginIf > ChildrenL();

    /**
     * Get whether the node is to be drawn
     *
     * @since Series 60 3.1
     * @return Flag indicating whether the node should be drawn or not
     */
    IMPORT_C TBool IsDrawingAllowed() const;

    /*
     * Get node application interface
     *
     * @return Node application interface
     */
    IMPORT_C CXnNodeAppIf& AppIfL();

    /**
     * Sets handle tooltip flag.
     *
     * If set to EFalse, tooltip
     * is not handled by node.
     *
     * @since S60 3.1
     * @return Pointer to DOM node
     */
    IMPORT_C void SetHandleTooltip( TBool aFlag );

    /**
     * Offers interface to report trigger event.
     *
     * @since S60 3.1
     * @param aTriggerName is a name of the trigger
     * @params aValueName and aValue delivers an attribute
     */
    IMPORT_C void ReportTriggerEventL(
        const TDesC8& aTriggerName,
        const TDesC8& aValueName,
        const TDesC8& aValue );

    /**
     * Gets namespace of node
     *
     * @since Series 60 5.0
     * @return namespace
     */
    IMPORT_C const TDesC8& Namespace();

    /**
     * Gets control of node
     *
     * @since Series 60 5.0
     * @return Control, NULL if not found
     */
    IMPORT_C CXnControlAdapter* Control() const;

    /**
     * Get the internal node
     *
     * @since Series 60 3.1
     * @return Internal node
     */
    CXnNode& Node();

    /**
     * Create a component interface according to the given type.
     *
     * @param aType Type of the interface to create
     * @return Created interface or NULL if the provided type is not supported.
     */
    IMPORT_C XnComponentInterface::MXnComponentInterface* MakeInterfaceL(
        const TDesC8& aType );

    /**
     * Get property as indicated by method name.
     *
     * @see GetPropertyL
     * @return The property mapped to the key or NULL if not found.
     */
    IMPORT_C CXnProperty* DisplayL();

    /**
     * Get property as indicated by method name.
     *
     * @see GetPropertyL
     * @return The property mapped to the key or NULL if not found.
     */
    IMPORT_C CXnProperty* VisibilityL();

    /**
     * Get property as indicated by method name.
     *
     * @see GetPropertyL
     * @return The property mapped to the key or NULL if not found.
     */
    IMPORT_C CXnProperty* LabelL();

    /**
     * Get property as indicated by method name.
     *
     * @see GetPropertyL
     * @return The property mapped to the key or NULL if not found.
     */
    IMPORT_C CXnProperty* IdL();

    /**
     * Get property as indicated by method name.
     *
     * @see GetPropertyL
     * @return The property mapped to the key or NULL if not found.
     */
    IMPORT_C CXnProperty* PathL();

    /**
     * Get property as indicated by method name.
     *
     * @see GetPropertyL
     * @return The property mapped to the key or NULL if not found.
     */
    IMPORT_C CXnProperty* MaskPathL();

    /**
     * Marks node as dirty, adds it to UiEngine's dirty list and
     * clears rendered and laidout from the node and its children.
     */
    IMPORT_C void SetDirtyL();

private:
    // Data

    /**
     * Pointer to internal node object.
     * Not own.
     */
    CXnNode* iNode;
    };

#endif
