/*
 * 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;

[
    uuid(46eb5926-582e-4017-9fdf-e8998daa0950),
    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(192b9d83-50fc-457b-90a0-2b82a8b5dae1),
    local
]
interface IImageList2 : IImageList
{
    typedef struct tagIMAGELISTSTATS
    {
        DWORD cbSize;
        INT   cAlloc;
        INT   cUsed;
        INT   cStandby;
    } IMAGELISTSTATS;

    HRESULT Resize(INT x_size, INT y_size);
    HRESULT GetOriginalSize([in] INT image, [in] DWORD flags, [out] INT *cx, [out] INT *cy);
    HRESULT SetOriginalSize([in] INT image, [in] INT cx, [in] INT cy);
    HRESULT SetCallback([in, unique] IUnknown *callback);
    HRESULT GetCallback([in] REFIID riid, [out, iid_is(riid)] void** ppv);
    HRESULT ForceImagePresent([in] INT image, DWORD flags);
    HRESULT DiscardImages([in] INT first_image, [in] INT last_image, [in] DWORD flags);
    HRESULT PreloadImages([in] IMAGELISTDRAWPARAMS *params);
    HRESULT GetStatistics([in, out] IMAGELISTSTATS *stats);
    HRESULT Initialize([in] INT cx, [in] INT cy, [in] UINT flags, [in] INT initial, [in] INT grow);
    HRESULT Replace2([in] INT i, [in] HBITMAP image, [in, unique] HBITMAP mask, [in, unique] IUnknown *unk, [in] DWORD flags);
    HRESULT ReplaceFromImageList([in] INT i, [in] IImageList *imagelist, [in] INT src, [in, unique] IUnknown *unk, [in] DWORD flags);
}

[
    uuid(bcada15B-b428-420c-8d28-023590924c9f)
]
library CommonControlObjects
{
    [
        uuid(7c476ba2-02b1-48f4-8048-b24619ddc058)
    ]
    coclass ImageList
    {
        interface IImageList;
        interface IImageList2;
    }
}
