/*
* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:  
*
*/

#ifndef __WIDGETENGINEINTERFACE
#define __WIDGETENGINEINTERFACE

//  INCLUDES
#include "config.h"
#include <e32base.h>
#include <eikenv.h>
#include <brctldefs.h>
#include "WidgetEngineCallbacks.h"
#include "WidgetJSObjectProtector.h"
#include "wtf/HashCountedSet.h"

// CONSTANTS

// MACROS

// DATA TYPES

// FUNCTION PROTOTYPES

// FORWARD DECLARATION
class CMenuClient;
class CWidgetClient;
class MWidgetCallback;
class WidgetPreferences;

namespace KJS {
	class JSValue;
}

// CLASS DECLARATION
class MWidgetEngineBridge
{
public:
    inline virtual ~MWidgetEngineBridge() {};       
    virtual void* Widget(MWidgetCallback& aWidgetCallback, MWidgetEngineCallbacks& aWidgetEngineCallback) = 0;
    virtual void* Menu(MWidgetCallback& aWidgetCallback, MWidgetEngineCallbacks& aWidgetEngineCallback) = 0;
    virtual void* MenuItem(MWidgetCallback& aWidgetCallback, MWidgetEngineCallbacks& aWidgetEngineCallback) = 0;    
    virtual void SetParamL(TBrCtlDefs::TBrCtlWidgetParams aParam, const TDesC& aValue) = 0;
    virtual void SetParamL(TBrCtlDefs::TBrCtlWidgetParams aParam, TUint aValue) = 0;
    virtual TBool HandleCommandL( TInt aCommandId ) = 0;        
    virtual void OnShowSelected() = 0;
    virtual void OnHideSelected() = 0;
    virtual void AddOptionMenuItemsL(CEikMenuPane& aMenuPane, TInt aResourceId) = 0;
    virtual void MenuItemSelected( TInt aInternalId ) = 0;
    virtual void MenuShowed() = 0;
    virtual void DrawTransition(CWindowGc& gc, CFbsBitmap* fbsBm) = 0;
    virtual void Clear() = 0;

};

/**
*  WidgetEngineBridge
*
*  @lib widgetengine.dll
*  @since 3.1
*/

NONSHARABLE_CLASS( WidgetEngineBridge ): public MWidgetEngineBridge, public MJSObjectProtector
{
public:
    WidgetEngineBridge();
    virtual ~WidgetEngineBridge();
    
public: //From MWidgetEngineBridge    
    void* Widget(MWidgetCallback& aWidgetCallback, MWidgetEngineCallbacks& aWidgetEngineCallback);
    void* Menu(MWidgetCallback& aWidgetCallback, MWidgetEngineCallbacks& aWidgetEngineCallback);
    void* MenuItem(MWidgetCallback& aWidgetCallback, MWidgetEngineCallbacks& aWidgetEngineCallback);    
    
    void SetParamL(TBrCtlDefs::TBrCtlWidgetParams aParam, const TDesC& aValue);
    void SetParamL(TBrCtlDefs::TBrCtlWidgetParams aParam, TUint aValue);
    TBool HandleCommandL( TInt aCommandId );
    void OnShowSelected();
    void OnHideSelected();
    void AddOptionMenuItemsL(CEikMenuPane& aMenuPane, TInt aResourceId);
    void MenuItemSelected( TInt aInternalId );
    void MenuShowed();
    void DrawTransition(CWindowGc& gc, CFbsBitmap* fbsBm);
    void Clear();
    
	void Protect(KJS::JSValue* obj);
	void Unprotect(KJS::JSValue* obj);

private:    
    CMenuClient*			m_menuclient;
    CWidgetClient*			m_widgetclient;                
    WidgetPreferences*		m_preferences;
	WTF::HashCountedSet<KJS::JSValue*>	m_protectedObjects;
 };


#endif
