/*
 * Defines the COM interfaces and APIs related to the IE Web browser
 *
 * Copyright (C) 2001 John R. Sheets (for CodeWeavers)
 * Copyright (C) 2003 Alexandre Julliard
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

import "ocidl.idl";
import "docobj.idl";


/*****************************************************************************
 * IWebBrowser interface
 */
[
    object,
    oleautomation,
    uuid(eab22ac1-30c1-11cf-a7eb-0000c05bae0b)
]
interface IWebBrowser : IDispatch
{
    typedef enum BrowserNavConstants
    {
        navOpenInNewWindow   = 0x1,
        navNoHistory         = 0x2,
        navNoReadFromCache   = 0x4,
        navNoWriteToCache    = 0x8,
        navAllowAutosearch   = 0x10,
        navBrowserBar        = 0x20,
        navHyperlink         = 0x40,
        navEnforceRestricted = 0x80
    } BrowserNavConstants;

    typedef enum RefreshConstants
    {
        REFRESH_NORMAL     = 0,
        REFRESH_IFEXPIRED  = 1,
        REFRESH_COMPLETELY = 3
    } RefreshConstants;

    HRESULT GoBack();
    HRESULT GoForward();
    HRESULT GoHome();
    HRESULT GoSearch();
    HRESULT Navigate(
        [in] BSTR URL,
        [in] VARIANT *Flags,
        [in] VARIANT *TargetFrameName,
        [in] VARIANT *PostData,
        [in] VARIANT *Headers);
    HRESULT Refresh();
    HRESULT Refresh2( [in] VARIANT *Level );
    HRESULT Stop();
    HRESULT get_Application([out] IDispatch** ppDisp);
    HRESULT get_Parent([out] IDispatch** ppDisp);
    HRESULT get_Container([out] IDispatch** ppDisp);
    HRESULT get_Document([out] IDispatch** ppDisp);
    HRESULT get_TopLevelContainer([out] VARIANT_BOOL* pBool);
    HRESULT get_Type([out] BSTR* Type);
    HRESULT get_Left([out] long *pl);
    HRESULT put_Left([in] long Left);
    HRESULT get_Top([out] long *pl);
    HRESULT put_Top([in] long Top);
    HRESULT get_Width([out] long *pl);
    HRESULT put_Width([in] long Width);
    HRESULT get_Height([out] long *pl);
    HRESULT put_Height([in] long Height);
    HRESULT get_LocationName([out] BSTR *LocationName);
    HRESULT get_LocationURL([out] BSTR * LocationURL);
    HRESULT get_Busy([out] VARIANT_BOOL *pBool);
}


/*****************************************************************************
 * IWebBrowserApp interface
 */
[
    object,
    oleautomation,
    uuid(0002df05-0000-0000-c000-000000000046)
]
interface IWebBrowserApp : IWebBrowser
{
    HRESULT Quit();
    HRESULT ClientToWindow([in,out] int* pcx, [in,out] int* pcy);
    HRESULT PutProperty([in] BSTR szProperty, [in] VARIANT vtValue);
    HRESULT GetProperty([in] BSTR szProperty, [out] VARIANT *pvtValue);
    HRESULT get_Name([out] BSTR* Name);
    HRESULT get_HWND([out] long *pHWND);
    HRESULT get_FullName([out] BSTR* FullName);
    HRESULT get_Path([out] BSTR* Path);
    HRESULT get_Visible([out] VARIANT_BOOL* pBool);
    HRESULT put_Visible([in] VARIANT_BOOL Value);
    HRESULT get_StatusBar([out] VARIANT_BOOL* pBool);
    HRESULT put_StatusBar([in] VARIANT_BOOL Value);
    HRESULT get_StatusText([out] BSTR *StatusText);
    HRESULT put_StatusText([in] BSTR StatusText);
    HRESULT get_ToolBar([out] int * Value);
    HRESULT put_ToolBar([in] int Value);
    HRESULT get_MenuBar([out] VARIANT_BOOL * Value);
    HRESULT put_MenuBar([in] VARIANT_BOOL Value);
    HRESULT get_FullScreen([out] VARIANT_BOOL * pbFullScreen);
    HRESULT put_FullScreen([in] VARIANT_BOOL bFullScreen);
}

/* FIXME */
cpp_quote("DEFINE_GUID(CLSID_WebBrowser, 0x8856f961, 0x340a, 0x11d0, 0xa9, 0x6b, 0x00, 0xc0, 0x4f, 0xd7, 0x05, 0xa2);")
