/*
* Copyright (c) 2002-2005 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:  Layout calculation and UI rendering mechanism implementations.
*
*/

// User includes
#include "xnuiengineappif.h"
#include "xnuiengine.h"
#include "xnnode.h"
#include "xnodt.h"
#include "xndomdocument.h"
#include "xnpointerarray.h"
#include "xneditor.h"
#include "xnnodeappif.h"
#include "xnviewdata.h"

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// TXnUiEngineAppIf::TXnUiEngineAppIf
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
TXnUiEngineAppIf::TXnUiEngineAppIf( CXnUiEngine& aUiEngine )
    {
    iUiEngine = &aUiEngine;
    }

// -----------------------------------------------------------------------------
// TXnUiEngineAppIf::RootNode
// Forwards the call to the ui engine implementation
// -----------------------------------------------------------------------------
//
EXPORT_C CXnNodeAppIf& TXnUiEngineAppIf::RootNodeL()
    {
    return iUiEngine->RootNode()->AppIfL();
    }

// -----------------------------------------------------------------------------
// TXnUiEngineAppIf::FindNodeByIdL
// Forwards the call to the ui engine implementation
// -----------------------------------------------------------------------------
//
EXPORT_C CXnNodeAppIf* TXnUiEngineAppIf::FindNodeByIdL(
    const TDesC& aNodeId,
    const TDesC& aNamespace )
    {
    CXnNode* node( iUiEngine->FindNodeByIdL( aNodeId, aNamespace ) );

    if ( node )
        {
        return &( node->AppIfL() );
        }

    return NULL;
    }

// -----------------------------------------------------------------------------
// TXnUiEngineAppIf::FindNodeByIdL
// Forwards the call to the ui engine implementation
// -----------------------------------------------------------------------------
//
EXPORT_C CXnNodeAppIf* TXnUiEngineAppIf::FindNodeByIdL(
    const TDesC8& aNodeId,
    const TDesC8& aNamespace )
    {
    CXnNode* node( iUiEngine->FindNodeByIdL( aNodeId, aNamespace ) );

    if ( node )
        {
        return &( node->AppIfL() );
        }

    return NULL;
    }

// -----------------------------------------------------------------------------
// TXnUiEngineAppIf::FindNodeByClassL
// Forwards the call to the ui engine implementation
// -----------------------------------------------------------------------------
//
EXPORT_C RPointerArray< CXnNodeAppIf > TXnUiEngineAppIf::FindNodeByClassL(
    const TDesC& aClassId, const TDesC& aNamespace )
    {
    CXnPointerArray* array = iUiEngine->FindNodeByClassL(
        aClassId, aNamespace );
    CleanupStack::PushL( array );
    RPointerArray< CXnNodeAppIf > interfaceArray;
    CleanupClosePushL( interfaceArray );
    const TInt count = array->Container().Count();
    interfaceArray.ReserveL( count );
    for ( TInt i = 0; i < count; ++i )
        {
        CXnNode* node = static_cast< CXnNode* >( array->Container()[i] );
        // Append cannot fail because ReserveL call before this loop has
        // allocated the array buffer
        interfaceArray.Append( &( node->AppIfL() ) );
        }
    CleanupStack::Pop( &interfaceArray );
    CleanupStack::PopAndDestroy( array );
    return interfaceArray;
    }

// -----------------------------------------------------------------------------
// CXnUiEngine::FindNodeByClassL
// Forwards the call to the ui engine implementation
// -----------------------------------------------------------------------------
//
EXPORT_C RPointerArray< CXnNodeAppIf > TXnUiEngineAppIf::FindNodeByClassL(
    const TDesC8& aClassId, const TDesC8& aNamespace )
    {
    CXnPointerArray* array = iUiEngine->FindNodeByClassL(
        aClassId, aNamespace );
    CleanupStack::PushL( array );
    RPointerArray< CXnNodeAppIf > interfaceArray;
    CleanupClosePushL( interfaceArray );
    const TInt count = array->Container().Count();
    interfaceArray.ReserveL( count );
    for ( TInt i = 0; i < count; ++i )
        {
        CXnNode* node = static_cast< CXnNode* >( array->Container()[i] );
        // Append cannot fail because ReserveL call before this loop has
        // allocated the array buffer
        interfaceArray.Append( &( node->AppIfL() ) );
        }
    CleanupStack::Pop( &interfaceArray );
    CleanupStack::PopAndDestroy( array );
    return interfaceArray;
    }

// -----------------------------------------------------------------------------
// CXnUiEngine::FindContentSourceNodesL
// Forwards the call to the ui engine implementation
// -----------------------------------------------------------------------------
//
EXPORT_C RPointerArray< CXnNodeAppIf > TXnUiEngineAppIf::FindContentSourceNodesL(
    const TDesC8& aNamespace )
    {   
    CXnPointerArray* array = iUiEngine->FindContentSourceNodesL( aNamespace );
    CleanupStack::PushL( array );
    
    RPointerArray< CXnNodeAppIf > interfaceArray;
    CleanupClosePushL( interfaceArray );
    
    const TInt count = array->Container().Count();
    interfaceArray.ReserveL( count );
    
    for ( TInt i = 0; i < count; i++ )
        {
        CXnNode* node = static_cast< CXnNode* >( array->Container()[i] );
        // Append cannot fail because ReserveL call before this loop has
        // allocated the array buffer
        interfaceArray.Append( &( node->AppIfL() ) );    
        }
    
    CleanupStack::Pop( &interfaceArray );
    CleanupStack::PopAndDestroy( array );
    return interfaceArray;    
    }

// -----------------------------------------------------------------------------
// TXnUiEngineAppIf::RenderUIL
// Forwards the call to the ui engine implementation
// -----------------------------------------------------------------------------
//
EXPORT_C void TXnUiEngineAppIf::RenderUIL( CXnNodeAppIf* aNode )
    {
    CXnNode* node = NULL;
    if ( aNode != NULL )
        {
        node = &( aNode->Node() );
        }
    iUiEngine->RenderUIL( node );
    }

// -----------------------------------------------------------------------------
// TXnUiEngineAppIf::StringPool
// Forwards the call to the ui engine implementation
// -----------------------------------------------------------------------------
//
EXPORT_C CXnDomStringPool& TXnUiEngineAppIf::StringPool()
    {
    return *iUiEngine->ODT()->DomDocument().StringPool();
    }

// -----------------------------------------------------------------------------
// TXnUiEngineAppIf::ActiveView
// Return the active view
// -----------------------------------------------------------------------------
//
EXPORT_C CXnNodeAppIf* TXnUiEngineAppIf::ActiveView()
    {
    CXnNodeAppIf* ret( NULL );
    TRAP_IGNORE( ret = &( iUiEngine->ActiveView()->AppIfL() ) );
    return ret;
    }

// -----------------------------------------------------------------------------
// TXnUiEngineAppIf::RefreshMenuL
// Refresh current menu
// -----------------------------------------------------------------------------
//
EXPORT_C void TXnUiEngineAppIf::RefreshMenuL()
    {
    iUiEngine->RefreshMenuL();
    }

// -----------------------------------------------------------------------------
// TXnUiEngineAppIf::IsMenuDisplaying
// Checks whether the menu is displaying or not.
// -----------------------------------------------------------------------------
//
EXPORT_C TBool TXnUiEngineAppIf::IsMenuDisplaying()
    {
    return iUiEngine->IsMenuDisplaying();
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C TInt TXnUiEngineAppIf::GetPluginNodeArrayL(
    RPointerArray< CXnNodeAppIf >& aArray )
    {
    aArray.Reset();
    RPointerArray< CXnNode >* plugins = iUiEngine->Plugins();
    if ( !plugins )
        {
        return 0;
        }
    TInt count( plugins->Count() );
    for ( TInt i = 0; i < count; ++i )
        {
        CXnNode* tmp = ( *plugins )[i];
        aArray.AppendL( &( tmp->AppIfL() ) );
        }
    return count;
    }

// -----------------------------------------------------------------------------
// TXnUiEngineAppIf::FocusedNode
// Gets the currently focused node
// -----------------------------------------------------------------------------
//
EXPORT_C CXnNodeAppIf* TXnUiEngineAppIf::FocusedNode()
    {
    CXnNode* focused( iUiEngine->FocusedNode() );
    CXnNodeAppIf* ret( NULL );

    if ( focused )
        {
        TRAP_IGNORE( ret = &( focused->AppIfL() ) );
        }

    return ret;
    }

// -----------------------------------------------------------------------------
// TXnUiEngineAppIf::IsEditMode
// Returns ETrue if the current mode is edit, otherwise EFalse.
// -----------------------------------------------------------------------------
//
EXPORT_C TBool TXnUiEngineAppIf::IsEditMode()
    {
    return ( iUiEngine->IsEditMode() );
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C void TXnUiEngineAppIf::SetUiEngine( CXnUiEngine* aUiEngine )
    {
    iUiEngine = aUiEngine;
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C TInt TXnUiEngineAppIf::GetThemeResource(
    const TDesC& aPath, RFile& aFile )
    {
    return iUiEngine->GetThemeResource( aPath, aFile );
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C TBool TXnUiEngineAppIf::WidgetsVisible() const
    {
    return iUiEngine->Editor()->WidgetsVisible();
    }
