/*
 * Copyright 2006,2011 Jacek Caban for CodeWeavers
 *
 * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "objidl.idl";
import "oleidl.idl";

/*****************************************************************************
 *    ITargetNotify interface
 */
[
    object,
    uuid(863a99a0-21bc-11d0-82b4-00a0c90c29c5),
    pointer_default(unique)
]
interface ITargetNotify : IUnknown
{
    typedef [unique] ITargetNotify *LPTARGETNOTIFY;

    HRESULT OnCreate(
            [in] IUnknown *pUnkDestination,
            [in] ULONG cbCookie);

    HRESULT OnReuse([in] IUnknown *pUnkDestination);
}

/*****************************************************************************
 *    ITargetNotify2 interface
 */
[
    object,
    uuid(3050f6b1-98b5-11cf-bb82-00aa00bdce0b),
    pointer_default(unique)
]
interface ITargetNotify2 : ITargetNotify
{
    typedef [unique] ITargetNotify2 *LPTARGETNOTIFY2;

    HRESULT GetOptionString([in,out] BSTR *pbstrOptions);
}

/*****************************************************************************
 *    ITargetFrame2 interface
 */
[
    object,
    uuid(86d52e11-94a8-11d0-82af-00c04fd5ae38),
    pointer_default(unique)
]
interface ITargetFrame2 : IUnknown
{
    typedef [unique] ITargetFrame2 *LPTARGETFRAME2;

    typedef enum {
        FINDFRAME_NONE               = 0,
        FINDFRAME_JUSTTESTEXISTENCE  = 1,
        FINDFRAME_INTERNAL           = 0x80000000
    } FINDFRAME_FLAGS;

    typedef enum {
        FRAMEOPTIONS_SCROLL_YES   = 0x00000001,
        FRAMEOPTIONS_SCROLL_NO    = 0x00000002,
        FRAMEOPTIONS_SCROLL_AUTO  = 0x00000004,
        FRAMEOPTIONS_NORESIZE     = 0x00000008,
        FRAMEOPTIONS_NO3DBORDER   = 0x00000010,
        FRAMEOPTIONS_DESKTOP      = 0x00000020,
        FRAMEOPTIONS_BROWSERBAND  = 0x00000040
    } FRAMEOPTIONS_FLAGS;

    HRESULT SetFrameName([in] LPCWSTR pszFrameName);

    HRESULT GetFrameName([out] LPWSTR *ppszFrameName);

    HRESULT GetParentFrame([out] IUnknown **ppunkParent);

    HRESULT SetFrameSrc([in] LPCWSTR pszFrameSrc);

    HRESULT GetFrameSrc([out] LPWSTR *ppszFrameSrc);

    HRESULT GetFramesContainer([out] IOleContainer **ppContainer);

    HRESULT SetFrameOptions([in] DWORD dwFlags);

    HRESULT GetFrameOptions([out] DWORD *pdwFlags);

    HRESULT SetFrameMargins(
            [in] DWORD dwWidth,
            [in] DWORD dwHeight);

    HRESULT GetFrameMargins(
            [out] DWORD *pdwWidth,
            [out] DWORD *pdwHeight);

    HRESULT FindFrame(
            [in,unique] LPCWSTR pszTargetName,
            [in] DWORD dwFlags,
            [out] IUnknown **ppunkTargetFrame);

    HRESULT GetTargetAlias(
            [in,unique] LPCWSTR pszTargetName,
             [out] LPWSTR *ppszTargetAlias);
}

/*****************************************************************************
 *    ITargetContainer interface
 */
[
    object,
    uuid(7847ec01-2bec-11d0-82b4-00a0c90C29c5),
    pointer_default(unique)
]
interface ITargetContainer : IUnknown
{
    typedef [unique] ITargetContainer *LPTARGETCONTAINER;

    HRESULT GetFrameUrl([out] LPWSTR *ppszFrameSrc);

    HRESULT GetFramesContainer([out] IOleContainer **ppContainer);

}
