/*
 * Copyright 2017 Alex Henrie
 *
 * 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";
import "docobj.idl";
import "mshtml.idl";

#include "dhtmldid.h"

#ifndef __WIDL__
#define threading(model)
#define progid(str)
#define vi_progid(str)
#endif

[
    uuid(683364a1-b37d-11d1-adc5-006008a5848c),
    version(1.0)
]
library DHTMLEDLib
{
    importlib("stdole2.tlb");

    typedef
    [
        uuid(7179FC44-B2E4-11d1-ADC5-006008A5848C)
    ]
    enum DHTMLEDITAPPEARANCE {
        DEAPPEARANCE_FLAT,
        DEAPPEARANCE_3D
    } DHTMLEDITAPPEARANCE;

    typedef
    [
        uuid(bf82426a-b961-11d1-adc5-006008a5848c)
    ]
    enum DHTMLEDITCMDF {
        DECMDF_NOTSUPPORTED = 0,
        DECMDF_DISABLED = 1,
        DECMDF_ENABLED = 3,
        DECMDF_LATCHED = 7,
        DECMDF_NINCHED = 11
    } DHTMLEDITCMDF;

    typedef enum DHTMLEDITCMDID {
        DECMD_BOLD = 5000,
        DECMD_COPY = 5002,
        DECMD_CUT,
        DECMD_DELETE,
        DECMD_DELETECELLS,
        DECMD_DELETECOLS,
        DECMD_DELETEROWS,
        DECMD_FINDTEXT,
        DECMD_FONT,
        DECMD_GETBACKCOLOR,
        DECMD_GETBLOCKFMT,
        DECMD_GETBLOCKFMTNAMES,
        DECMD_GETFONTNAME,
        DECMD_GETFONTSIZE,
        DECMD_GETFORECOLOR,
        DECMD_HYPERLINK,
        DECMD_IMAGE,
        DECMD_INDENT,
        DECMD_INSERTCELL,
        DECMD_INSERTCOL,
        DECMD_INSERTROW,
        DECMD_INSERTTABLE,
        DECMD_ITALIC,
        DECMD_JUSTIFYCENTER,
        DECMD_JUSTIFYLEFT,
        DECMD_JUSTIFYRIGHT,
        DECMD_LOCK_ELEMENT,
        DECMD_MAKE_ABSOLUTE,
        DECMD_MERGECELLS,
        DECMD_ORDERLIST,
        DECMD_OUTDENT,
        DECMD_PASTE,
        DECMD_REDO,
        DECMD_REMOVEFORMAT,
        DECMD_SELECTALL,
        DECMD_SEND_BACKWARD,
        DECMD_BRING_FORWARD,
        DECMD_SEND_BELOW_TEXT,
        DECMD_BRING_ABOVE_TEXT,
        DECMD_SEND_TO_BACK,
        DECMD_BRING_TO_FRONT,
        DECMD_SETBACKCOLOR,
        DECMD_SETBLOCKFMT,
        DECMD_SETFONTNAME,
        DECMD_SETFONTSIZE,
        DECMD_SETFORECOLOR,
        DECMD_SPLITCELL,
        DECMD_UNDERLINE,
        DECMD_UNDO,
        DECMD_UNLINK,
        DECMD_UNORDERLIST,
        DECMD_PROPERTIES
    } DHTMLEDITCMDID;

    [
        object,
        uuid(ce04b590-2b1f-11d2-8d1e-00a0c959bc0a),
        dual,
        pointer_default(unique)
    ]
    interface IDHTMLSafe : IDispatch
    {
        [
            id(DISPID_EXECCOMMAND)
        ]
        HRESULT ExecCommand(
            [in] DHTMLEDITCMDID cmd_id,
            [in, defaultvalue(OLECMDEXECOPT_DODEFAULT)] OLECMDEXECOPT options,
            [in, optional] VARIANT *code_in,
            [out, retval] VARIANT *code_out
        );

        [
            id(DISPID_QUERYSTATUS)
        ]
        HRESULT QueryStatus(
            [in] DHTMLEDITCMDID cmd_id,
            [out, retval] DHTMLEDITCMDF *status
        );

        [
            id(DISPID_SETCONTEXTMENU)
        ]
        HRESULT SetContextMenu(
            [in] VARIANT *strings,
            [in] VARIANT *states
        );

        [
            id(DISPID_NEWDOCUMENT)
        ]
        HRESULT NewDocument();

        [
            id(DISPID_LOADURL)
        ]
        HRESULT LoadURL(
            [in] BSTR url
        );

        [
            id(DISPID_FILTERSRCCODE)
        ]
        HRESULT FilterSourceCode(
            [in] BSTR in,
            [out, retval] BSTR *out
        );

        [
            id(DISPID_REFRESHDOC)
        ]
        HRESULT Refresh();

        [
            propget,
            id(DISPID_DOCUMENT)
        ]
        HRESULT DOM(
            [out, retval] IHTMLDocument2 **value
        );

        [
            propget,
            id(DISPID_DOCUMENTHTML)
        ]
        HRESULT DocumentHTML(
            [out, retval] BSTR *value
        );

        [
            propput,
            id(DISPID_DOCUMENTHTML)
        ]
        HRESULT DocumentHTML(
            [in] BSTR html
        );

        [
            propget,
            id(DISPID_ACTIVATEAPPLETS)
        ]
        HRESULT ActivateApplets(
            [out, retval] VARIANT_BOOL *value
        );

        [
            propput,
            id(DISPID_ACTIVATEAPPLETS)
        ]
        HRESULT ActivateApplets(
            [in] VARIANT_BOOL value
        );

        [
            propget,
            id(DISPID_ACTIVATEACTIVEXCONTROLS)
        ]
        HRESULT ActivateActiveXControls(
            [out, retval] VARIANT_BOOL *value
        );

        [
            propput,
            id(DISPID_ACTIVATEACTIVEXCONTROLS)
        ]
        HRESULT ActivateActiveXControls(
            [in] VARIANT_BOOL value
        );

        [
            propget,
            id(DISPID_ACTIVATEDTCS)
        ]
        HRESULT ActivateDTCs(
            [out, retval] VARIANT_BOOL *value
        );

        [
            propput,
            id(DISPID_ACTIVATEDTCS)
        ]
        HRESULT ActivateDTCs(
            [in] VARIANT_BOOL value
        );

        [
            propget,
            id(DISPID_SHOWDETAILS)
        ]
        HRESULT ShowDetails(
            [out, retval] VARIANT_BOOL *value
        );

        [
            propput,
            id(DISPID_SHOWDETAILS)
        ]
        HRESULT ShowDetails(
            [in] VARIANT_BOOL value
        );

        [
            propget,
            id(DISPID_SHOWBORDERS)
        ]
        HRESULT ShowBorders(
            [out, retval] VARIANT_BOOL *value
        );

        [
            propput,
            id(DISPID_SHOWBORDERS)
        ]
        HRESULT ShowBorders(
            [in] VARIANT_BOOL value
        );

        [
            propget,
            id(DISPID_DHTMLEDITAPPEARANCE)
        ]
        HRESULT Appearance(
            [out, retval] DHTMLEDITAPPEARANCE *value
        );

        [
            propput,
            id(DISPID_DHTMLEDITAPPEARANCE)
        ]
        HRESULT Appearance(
            [in] DHTMLEDITAPPEARANCE value
        );

        [
            propget,
            id(DISPID_DHTMLEDITSCROLLBARS)
        ]
        HRESULT Scrollbars(
            [out, retval] VARIANT_BOOL *value
        );

        [
            propput,
            id(DISPID_DHTMLEDITSCROLLBARS)
        ]
        HRESULT Scrollbars(
            [in] VARIANT_BOOL value
        );

        [
            propget,
            id(DISPID_SCROLLBARAPPEARANCE)
        ]
        HRESULT ScrollbarAppearance(
            [out, retval] DHTMLEDITAPPEARANCE *value
        );

        [
            propput,
            id(DISPID_SCROLLBARAPPEARANCE)
        ]
        HRESULT ScrollbarAppearance(
            [in] DHTMLEDITAPPEARANCE value
        );

        [
            propget,
            id(DISPID_SOURCECODEPRESERVATION)
        ]
        HRESULT SourceCodePreservation(
            [out, retval] VARIANT_BOOL *value
        );

        [
            propput,
            id(DISPID_SOURCECODEPRESERVATION)
        ]
        HRESULT SourceCodePreservation(
            [in] VARIANT_BOOL value
        );

        [
            propget,
            id(DISPID_ABSOLUTEDROPMODE)
        ]
        HRESULT AbsoluteDropMode(
            [out, retval] VARIANT_BOOL *value
        );

        [
            propput,
            id(DISPID_ABSOLUTEDROPMODE)
        ]
        HRESULT AbsoluteDropMode(
            [in] VARIANT_BOOL value
        );

        [
            propget,
            id(DISPID_SNAPTOGRIDX)
        ]
        HRESULT SnapToGridX(
            [out, retval] long *value
        );

        [
            propput,
            id(DISPID_SNAPTOGRIDX)
        ]
        HRESULT SnapToGridX(
            [in] long value
        );

        [
            propget,
            id(DISPID_SNAPTOGRIDY)
        ]
        HRESULT SnapToGridY(
            [out, retval] long *value
        );

        [
            propput,
            id(DISPID_SNAPTOGRIDY)
        ]
        HRESULT SnapToGridY(
            [in] long value
        );

        [
            propget,
            id(DISPID_SNAPTOGRID)
        ]
        HRESULT SnapToGrid(
            [out, retval] VARIANT_BOOL *value
        );

        [
            propput,
            id(DISPID_SNAPTOGRID)
        ]
        HRESULT SnapToGrid(
            [in] VARIANT_BOOL value
        );

        [
            propget,
            id(DISPID_ISDIRTY)
        ]
        HRESULT IsDirty(
            [out, retval] VARIANT_BOOL *value
        );

        [
            propget,
            id(DISPID_CURRENTDOCUMENTPATH)
        ]
        HRESULT CurrentDocumentPath(
            [out, retval] BSTR *value
        );

        [
            propget,
            id(DISPID_BASEURL)
        ]
        HRESULT BaseURL(
            [out, retval] BSTR *value
        );

        [
            propput,
            id(DISPID_BASEURL)
        ]
        HRESULT BaseURL(
            [in] BSTR value
        );

        [
            propget,
            id(DISPID_DOCUMENTTITLE)
        ]
        HRESULT DocumentTitle(
            [out, retval] BSTR *value
        );

        [
            propget,
            id(DISPID_USEDIVONCR)
        ]
        HRESULT UseDivOnCarriageReturn(
            [out, retval] VARIANT_BOOL *value
        );

        [
            propput,
            id(DISPID_USEDIVONCR)
        ]
        HRESULT UseDivOnCarriageReturn(
            [in] VARIANT_BOOL value
        );

        [
            propget,
            id(DISPID_BUSY)
        ]
        HRESULT Busy(
            [out, retval] VARIANT_BOOL *value
        );
    };

    [
        uuid(d1fc78e8-b380-11d1-adc5-006008a5848c)
    ]
    dispinterface _DHTMLSafeEvents
    {
    properties:
    methods:
        [
            id(DISPID_DOCUMENTCOMPLETE)
        ]
        void DocumentComplete();

        [
            id(DISPID_DISPLAYCHANGED)
        ]
        void DisplayChanged();

        [
            id(DISPID_SHOWCONTEXTMENU)
        ]
        void ShowContextMenu(
            [in] long x,
            [in] long y
        );

        [
            id(DISPID_CONTEXTMENUACTION)
        ]
        void ContextMenuAction(
            [in] long index
        );

        [
            id(DISPID_ONMOUSEDOWN)
        ]
        void onmousedown();

        [
            id(DISPID_ONMOUSEMOVE)
        ]
        void onmousemove();

        [
            id(DISPID_ONMOUSEUP)
        ]
        void onmouseup();

        [
            id(DISPID_ONMOUSEOUT)
        ]
        void onmouseout();

        [
            id(DISPID_ONMOUSEOVER)
        ]
        void onmouseover();

        [
            id(DISPID_ONCLICK)
        ]
        void onclick();

        [
            id(DISPID_ONDBLCLICK)
        ]
        void ondblclick();

        [
            id(DISPID_ONKEYDOWN)
        ]
        void onkeydown();

        [
            id(DISPID_ONKEYPRESS)
        ]
        void onkeypress();

        [
            id(DISPID_ONKEYUP)
        ]
        void onkeyup();

        [
            id(DISPID_ONBLUR)
        ]
        void onblur();

        [
            id(DISPID_ONREADYSTATECHANGE)
        ]
        void onreadystatechange();
    };

    [
        uuid(2d360201-fff5-11d1-8d03-00a0c959bc0a),
        threading(apartment),
        progid("DHTMLSafe.DHTMLSafe.1"),
        vi_progid("DHTMLSafe.DHTMLSafe")
    ]
    coclass DHTMLSafe
    {
        [default] interface IDHTMLSafe;
        [default, source] interface _DHTMLSafeEvents;
    };

    [
        uuid(ce04b591-2b1f-11d2-8d1e-00a0c959bc0a),
        dual,
        pointer_default(unique)
    ]
    interface IDHTMLEdit : IDHTMLSafe
    {
        [
            id(DISPID_LOADDOCUMENT)
        ]
        HRESULT LoadDocument(
            [in] VARIANT *path,
            [in, optional] VARIANT *prompt
        );

        [
            id(DISPID_SAVEDOCUMENT)
        ]
        HRESULT SaveDocument(
            [in] VARIANT *path,
            [in, optional] VARIANT *prompt
        );

        [
            id(DISPID_PRINT)
        ]
        HRESULT PrintDocument(
            [in, optional] VARIANT *prompt
        );

        [
            propget,
            id(DISPID_BROWSEMODE)
        ]
        HRESULT BrowseMode(
            [out, retval] VARIANT_BOOL *value
        );

        [
            propput,
            id(DISPID_BROWSEMODE)
        ]
        HRESULT BrowseMode(
            [in] VARIANT_BOOL value
        );
    };

    [
        uuid(588d5040-cf28-11d1-8cd3-00a0c959bc0a)
    ]
    dispinterface _DHTMLEditEvents
    {
    properties:
    methods:
        [
            id(DISPID_DOCUMENTCOMPLETE)
        ]
        void DocumentComplete();

        [
            id(DISPID_DISPLAYCHANGED)
        ]
        void DisplayChanged();

        [
            id(DISPID_SHOWCONTEXTMENU)
        ]
        void ShowContextMenu(
            [in] long x,
            [in] long y
        );

        [
            id(DISPID_CONTEXTMENUACTION)
        ]
        void ContextMenuAction(
            [in] long index
        );

        [
            id(DISPID_ONMOUSEDOWN)
        ]
        void onmousedown();

        [
            id(DISPID_ONMOUSEMOVE)
        ]
        void onmousemove();

        [
            id(DISPID_ONMOUSEUP)
        ]
        void onmouseup();

        [
            id(DISPID_ONMOUSEOUT)
        ]
        void onmouseout();

        [
            id(DISPID_ONMOUSEOVER)
        ]
        void onmouseover();

        [
            id(DISPID_ONCLICK)
        ]
        void onclick();

        [
            id(DISPID_ONDBLCLICK)
        ]
        void ondblclick();

        [
            id(DISPID_ONKEYDOWN)
        ]
        void onkeydown();

        [
            id(DISPID_ONKEYPRESS)
        ]
        void onkeypress();

        [
            id(DISPID_ONKEYUP)
        ]
        void onkeyup();

        [
            id(DISPID_ONBLUR)
        ]
        void onblur();

        [
            id(DISPID_ONREADYSTATECHANGE)
        ]
        void onreadystatechange();
    };

    [
        uuid(2d360200-fff5-11d1-8d03-00a0c959bc0a),
        threading(apartment),
        progid("DHTMLEdit.DHTMLEdit.1"),
        vi_progid("DHTMLEdit.DHTMLEdit")
    ]
    coclass DHTMLEdit
    {
        [default] interface IDHTMLEdit;
        [default, source] interface _DHTMLEditEvents;
    };
}