/*
 * Common controls v6 interface definitions
 *
 * Copyright 2009 Owen Rudge 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 "oaidl.idl";
import "ocidl.idl";

/* Definitions required for widl, but already defined in commctrl.h for C */
cpp_quote("#if 0")
typedef DWORD RGBQUAD;
typedef IUnknown* HIMAGELIST;

typedef struct
{
    HBITMAP hbmImage;
    HBITMAP hbmMask;
    int     Unused1;
    int     Unused2;
    RECT    rcImage;
} IMAGEINFO;

typedef IMAGEINFO* LPIMAGEINFO;

typedef struct
{
    DWORD      cbSize;
    HIMAGELIST himl;
    int        i;
    HDC        hdcDst;
    int        x;
    int        y;
    int        cx;
    int        cy;
    int        xBitmap;
    int        yBitmap;
    COLORREF   rgbBk;
    COLORREF   rgbFg;
    UINT       fStyle;
    DWORD      dwRop;
    DWORD      fState;
    DWORD      Frame;
    COLORREF   crEffect;
} IMAGELISTDRAWPARAMS;

typedef IMAGELISTDRAWPARAMS* LPIMAGELISTDRAWPARAMS;
cpp_quote("#endif")

cpp_quote("HRESULT WINAPI ImageList_CoCreateInstance(REFCLSID,const IUnknown *, REFIID,void **);")

const UINT ILIF_ALPHA = 1;

[
    object,
    uuid(46EB5926-582E-4017-9FDF-E8998DAA0950),
    helpstring("Image List"),
    local
]
interface IImageList : IUnknown
{
    HRESULT Add(
        [in] HBITMAP hbmImage,
        [in] HBITMAP hbmMask,
        [out] int* pi);

    HRESULT ReplaceIcon(
        [in] int i,
        [in] HICON hicon,
        [out] int* pi);

    HRESULT SetOverlayImage(
        [in] int iImage,
        [in] int iOverlay);

    HRESULT Replace(
        [in] int i,
        [in] HBITMAP hbmImage,
        [in] HBITMAP hbmMask);

    HRESULT AddMasked(
        [in] HBITMAP hbmImage,
        [in] COLORREF crMask,
        [out] int* pi);

    HRESULT Draw(
        [in] IMAGELISTDRAWPARAMS* pimldp);

    HRESULT Remove(
        [in] int i);

    HRESULT GetIcon(
        [in] int i,
        [in] UINT flags,
        [out] HICON* picon);

    HRESULT GetImageInfo(
        [in] int i,
        [out] IMAGEINFO* pImageInfo);

    HRESULT Copy(
        [in] int iDst,
        [in] IUnknown* punkSrc,
        [in] int iSrc,
        [in] UINT uFlags);

    HRESULT Merge(
        [in] int i1,
        [in] IUnknown* punk2,
        [in] int i2,
        [in] int dx,
        [in] int dy,
        [out] REFIID riid,
        [out] PVOID* ppv);

    HRESULT Clone(
        [in] REFIID riid,
        [out] PVOID* ppv);

    HRESULT GetImageRect(
        [in] int i,
        [out] RECT* prc);

    HRESULT GetIconSize(
        [out] int* cx,
        [out] int* cy);

    HRESULT SetIconSize(
        [in] int cx,
        [in] int cy);

    HRESULT GetImageCount(
        [out] int* pi);

    HRESULT SetImageCount(
        [in] UINT uNewCount);

    HRESULT SetBkColor(
        [in] COLORREF clrBk,
        [out] COLORREF* pclr);

    HRESULT GetBkColor(
        [out] COLORREF* pclr);

    HRESULT BeginDrag(
        [in] int iTrack,
        [in] int dxHotspot,
        [in] int dyHotspot);

    HRESULT EndDrag();

    HRESULT DragEnter(
        [in] HWND hwndLock,
        [in] int x,
        [in] int y);

    HRESULT DragLeave(
        [in] HWND hwndLock);

    HRESULT DragMove(
        [in] int x,
        [in] int y);

    HRESULT SetDragCursorImage(
        [in] IUnknown* punk,
        [in] int iDrag,
        [in] int dxHotspot,
        [in] int dyHotspot);

    HRESULT DragShowNolock(
        [in] BOOL fShow);

    HRESULT GetDragImage(
        [out] POINT * ppt,
        [out] POINT * pptHotspot,
        [out] REFIID riid,
        [out] PVOID* ppv);

    HRESULT GetItemFlags(
        [in] int i,
        [out] DWORD *dwFlags);

    HRESULT GetOverlayImage(
        [in] int iOverlay,
        [out] int* piIndex);
}

[
    uuid(BCADA15B-B428-420c-8D28-023590924C9F)
]
library CommonControlObjects
{
    [
        uuid(7C476BA2-02B1-48f4-8048-B24619DDC058)
    ]
    coclass ImageList
    {
        interface IImageList;
    }
}
