/*
 * Copyright 2012 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
 */

#define DO_NO_IMPORTS
import "oaidl.idl";
import "oleacc.idl";

enum NavigateDirection {
    NavigateDirection_Parent          = 0x0000,
    NavigateDirection_NextSibling     = 0x0001,
    NavigateDirection_PreviousSibling = 0x0002,
    NavigateDirection_FirstChild      = 0x0003,
    NavigateDirection_LastChild       = 0x0004,
};

enum ProviderOptions {
    ProviderOptions_ClientSideProvider    = 0x0001,
    ProviderOptions_ServerSideProvider    = 0x0002,
    ProviderOptions_NonClientAreaProvider = 0x0004,
    ProviderOptions_OverrideProvider      = 0x0008,
    ProviderOptions_ProviderOwnsSetFocus  = 0x0010,
    ProviderOptions_UseComThreading       = 0x0020,
    ProviderOptions_RefuseNonClientSupport = 0x0040,
    ProviderOptions_HasNativeIAccessible   = 0x0080,
    ProviderOptions_UseClientCoordinates   = 0x0100,
};

enum StructureChangeType {
    StructureChangeType_ChildAdded          = 0x0000,
    StructureChangeType_ChildRemoved        = 0x0001,
    StructureChangeType_ChildrenInvalidated = 0x0002,
    StructureChangeType_ChildrenBulkAdded   = 0x0003,
    StructureChangeType_ChildrenBulkRemoved = 0x0004,
    StructureChangeType_ChildrenReordered   = 0x0005,
};

enum TextEditChangeType {
    TextEditChangeType_None                 = 0x0000,
    TextEditChangeType_AutoCorrect          = 0x0001,
    TextEditChangeType_Composition          = 0x0002,
    TextEditChangeType_CompositionFinalized = 0x0003,
    TextEditChangeType_AutoComplete         = 0x0004,
};

enum OrientationType {
    OrientationType_None       = 0x0000,
    OrientationType_Horizontal = 0x0001,
    OrientationType_Vertical   = 0x0002,
};

enum DockPosition {
    DockPosition_Top    = 0x0000,
    DockPosition_Left   = 0x0001,
    DockPosition_Bottom = 0x0002,
    DockPosition_Right  = 0x0003,
    DockPosition_Fill   = 0x0004,
    DockPosition_None   = 0x0005,
};

enum ExpandCollapseState {
    ExpandCollapseState_Collapsed         = 0x0000,
    ExpandCollapseState_Expanded          = 0x0001,
    ExpandCollapseState_PartiallyExpanded = 0x0002,
    ExpandCollapseState_LeafNode          = 0x0003,
};

enum ScrollAmount {
    ScrollAmount_LargeDecrement = 0x0000,
    ScrollAmount_SmallDecrement = 0x0001,
    ScrollAmount_NoAmount       = 0x0002,
    ScrollAmount_LargeIncrement = 0x0003,
    ScrollAmount_SmallIncrement = 0x0004,
};

enum RowOrColumnMajor {
    RowOrColumnMajor_RowMajor      = 0x0000,
    RowOrColumnMajor_ColumnMajor   = 0x0001,
    RowOrColumnMajor_Indeterminate = 0x0002,
};

enum ToggleState {
    ToggleState_Off           = 0x0000,
    ToggleState_On            = 0x0001,
    ToggleState_Indeterminate = 0x0002,
};

enum WindowVisualState {
    WindowVisualState_Normal    = 0x0000,
    WindowVisualState_Maximized = 0x0001,
    WindowVisualState_Minimized = 0x0002,
};

enum SynchronizedInputType {
    SynchronizedInputType_KeyUp          = 0x0001,
    SynchronizedInputType_KeyDown        = 0x0002,
    SynchronizedInputType_LeftMouseUp    = 0x0004,
    SynchronizedInputType_LeftMouseDown  = 0x0008,
    SynchronizedInputType_RightMouseUp   = 0x0010,
    SynchronizedInputType_RightMouseDown = 0x0020,
};

cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(SynchronizedInputType)")

enum WindowInteractionState {
    WindowInteractionState_Running                 = 0x0000,
    WindowInteractionState_Closing                 = 0x0001,
    WindowInteractionState_ReadyForUserInteraction = 0x0002,
    WindowInteractionState_BlockedByModalWindow    = 0x0003,
    WindowInteractionState_NotResponding           = 0x0004,
};

enum TextUnit {
    TextUnit_Character = 0x0000,
    TextUnit_Format    = 0x0001,
    TextUnit_Word      = 0x0002,
    TextUnit_Line      = 0x0003,
    TextUnit_Paragraph = 0x0004,
    TextUnit_Page      = 0x0005,
    TextUnit_Document  = 0x0006,
};

enum TextPatternRangeEndpoint {
    TextPatternRangeEndpoint_Start = 0x0000,
    TextPatternRangeEndpoint_End   = 0x0001,
};

enum SupportedTextSelection {
    SupportedTextSelection_None     = 0x0000,
    SupportedTextSelection_Single   = 0x0001,
    SupportedTextSelection_Multiple = 0x0002,
};

enum LiveSetting {
    Off       = 0x0000,
    Polite    = 0x0001,
    Assertive = 0x0002,
};

enum ZoomUnit {
    ZoomUnit_NoAmount       = 0x0000,
    ZoomUnit_LargeDecrement = 0x0001,
    ZoomUnit_SmallDecrement = 0x0002,
    ZoomUnit_LargeIncrement = 0x0003,
    ZoomUnit_SmallIncrement = 0x0004,
};

enum NotificationProcessing {
    NotificationProcessing_ImportantAll          = 0x0000,
    NotificationProcessing_ImportantMostRecent   = 0x0001,
    NotificationProcessing_All                   = 0x0002,
    NotificationProcessing_MostRecent            = 0x0003,
    NotificationProcessing_CurrentThenMostRecent = 0x0004,
};

enum NotificationKind {
    NotificationKind_ItemAdded       = 0x0000,
    NotificationKind_ItemRemoved     = 0x0001,
    NotificationKind_ActionCompleted = 0x0002,
    NotificationKind_ActionAborted   = 0x0003,
    NotificationKind_Other           = 0x0004,
};

typedef int PROPERTYID;
typedef int PATTERNID;
typedef int EVENTID;
typedef int TEXTATTRIBUTEID;
typedef int CONTROLTYPEID;
typedef int LANDMARKTYPEID;
typedef int METADATAID;
typedef int HEADINGLEVELID;

struct UiaRect {
    double left;
    double top;
    double width;
    double height;
};

struct UiaPoint {
    double x;
    double y;
};

struct UiaChangeInfo {
    int     uiaId;
    VARIANT payload;
    VARIANT extraInfo;
};

[
    version(1.0),
    uuid(930299ce-9965-4dec-b0f4-a54848d4b667),
    lcid(0),
    id(3),
    hidden
]
library UIA
{
    importlib("stdole2.tlb");

    [
        object,
        uuid(d6dd68d1-86fd-4332-8666-9abedea2d24c),
        pointer_default(unique),
        oleautomation
    ]
    interface IRawElementProviderSimple : IUnknown
    {
        [propget] HRESULT ProviderOptions([out, retval] enum ProviderOptions *pRetVal);

        HRESULT GetPatternProvider(
                [in] PATTERNID patternId,
                [out, retval] IUnknown **pRetVal);

        HRESULT GetPropertyValue(
                [in] PROPERTYID propertyId,
                [out, retval] VARIANT *pRetVal);

        [propget] HRESULT HostRawElementProvider([out, retval] IRawElementProviderSimple **pRetVal);
    }

    [
        object,
        uuid(a0a839a9-8da1-4a82-806a-8e0d44e79f56),
        pointer_default(unique),
        oleautomation
    ]
    interface IRawElementProviderSimple2 : IRawElementProviderSimple
    {
        HRESULT ShowContextMenu();
    }

    [
        object,
        uuid(fcf5d820-d7ec-4613-bdf6-42a84ce7daaf),
        pointer_default(unique),
        oleautomation
    ]
    interface IRawElementProviderSimple3 : IRawElementProviderSimple2
    {
        HRESULT GetMetadataValue(
                [in] int targetId,
                [in] METADATAID metadataId,
                [out, retval] VARIANT *returnVal);
    }

    [
        object,
        uuid(f8b80ada-2c44-48d0-89be-5ff23c9cd875),
        pointer_default(unique),
        oleautomation
    ]
    interface IAccessibleEx : IUnknown
    {
        HRESULT GetObjectForChild(
                [in] long idChild,
                [out, retval] IAccessibleEx **pRetVal);

        HRESULT GetIAccessiblePair(
                [out] IAccessible **ppAcc,
                [out] long *pidChild);

        HRESULT GetRuntimeId(
                [out, retval] SAFEARRAY(int) *pRetVal);

        HRESULT ConvertReturnedElement(
                [in] IRawElementProviderSimple *pIn,
                [out] IAccessibleEx **ppRetValOut);
    }

    interface IRawElementProviderFragmentRoot;

    [
        object,
        uuid(f7063da8-8359-439c-9297-bbc5299a7d87),
        pointer_default(unique),
        oleautomation
    ]
    interface IRawElementProviderFragment : IUnknown
    {
        HRESULT Navigate(
                [in] enum NavigateDirection direction,
                [out, retval] IRawElementProviderFragment **pRetVal);

        HRESULT GetRuntimeId([out, retval] SAFEARRAY(int) *pRetVal);
        HRESULT get_BoundingRectangle([out, retval] struct UiaRect *pRetVal);
        /*
         * FIXME: Current versions of Windows SDK use
         * SAFEARRAY(IRawElementProviderFragmentRoot *) instead of
         * SAFEARRAY(VARIANT). The new type is currently unsupported
         * in widl, we should switch to it when it is.
         */
        HRESULT GetEmbeddedFragmentRoots([out, retval] SAFEARRAY(VARIANT) *pRetVal);
        HRESULT SetFocus();

        [propget] HRESULT FragmentRoot([out, retval] IRawElementProviderFragmentRoot **pRetVal);
    }

    [
        object,
        uuid(620ce2a5-ab8f-40a9-86cb-de3c75599b58),
        pointer_default(unique),
        oleautomation
    ]
    interface IRawElementProviderFragmentRoot : IUnknown
    {
        HRESULT ElementProviderFromPoint(
                [in] double x,
                [in] double y,
                [out, retval] IRawElementProviderFragment **pRetVal);

        HRESULT GetFocus([out, retval] IRawElementProviderFragment **pRetVal);
    }


    [
        object,
        uuid(1d5df27c-8947-4425-b8d9-79787bb460b8),
        pointer_default(unique),
        oleautomation
    ]
    interface IRawElementProviderHwndOverride : IUnknown
    {
        HRESULT GetOverrideProviderForHwnd(
                [in] HWND hwnd,
                [out, retval] IRawElementProviderSimple **pRetVal);
    }

    [
        object,
        uuid(a407b27b-0f6d-4427-9292-473c7bf93258),
        pointer_default(unique),
        oleautomation
    ]
    interface IRawElementProviderAdviseEvents : IUnknown
    {
        HRESULT AdviseEventAdded(
                [in] EVENTID eventId,
                [in] SAFEARRAY(PROPERTYID) propertyIDs);
        HRESULT AdviseEventRemoved(
                [in] EVENTID eventId,
                [in] SAFEARRAY(PROPERTYID) propertyIDs);
    }

    [
        object,
        uuid(4fd82b78-a43e-46ac-9803-0a6969c7c183),
        pointer_default(unique),
        oleautomation
    ]
    interface IProxyProviderWinEventSink : IUnknown
    {
        HRESULT AddAutomationPropertyChangedEvent(
                [in] IRawElementProviderSimple *pProvider,
                [in] PROPERTYID id,
                [in] VARIANT newValue);

        HRESULT AddAutomationEvent(
                [in] IRawElementProviderSimple *pProvider,
                [in] EVENTID id);

        HRESULT AddStructureChangedEvent(
                [in] IRawElementProviderSimple *pProvider,
                [in] enum StructureChangeType structureChangeType,
                [in] SAFEARRAY(int) runtimeId);
    }

    [
        object,
        uuid(89592ad4-f4e0-43d5-a3b6-bad7e111b435),
        pointer_default(unique),
        oleautomation
    ]
    interface IProxyProviderWinEventHandler : IUnknown
    {
        HRESULT RespondToWinEvent(
                [in] DWORD idWinEvent,
                [in] HWND hwnd,
                [in] LONG idObject,
                [in] LONG idChild,
                [in] IProxyProviderWinEventSink *pSink);
    }

    [
        object,
        uuid(0a2a93cc-bfad-42ac-9b2e-0991fb0d3ea0),
        pointer_default(unique),
        oleautomation
    ]
    interface IRawElementProviderWindowlessSite : IUnknown
    {
        HRESULT GetAdjacentFragment(
                [in] enum NavigateDirection direction,
                [out, retval] IRawElementProviderFragment **ppParent);

        HRESULT GetRuntimeIdPrefix([out, retval] SAFEARRAY(int) *pRetVal);
    }

    [
        object,
        uuid(33ac331b-943e-4020-b295-db37784974a3),
        pointer_default(unique),
        oleautomation
    ]
    interface IAccessibleHostingElementProviders : IUnknown
    {
        /*
         * FIXME: Current versions of Windows SDK use
         * SAFEARRAY(IRawElementProviderSimple *) instead of
         * SAFEARRAY(VARIANT). The new type is currently unsupported
         * in widl, we should switch to it when it is.
         */
        HRESULT GetEmbeddedFragmentRoots([out,retval] SAFEARRAY(VARIANT) *pRetVal);

        HRESULT GetObjectIdForProvider (
                [in] IRawElementProviderSimple *pProvider,
                [out] long *pidObject);
    }

    [
        object,
        uuid(24be0b07-d37d-487a-98cf-a13ed465e9b3),
        pointer_default(unique),
        oleautomation
    ]
    interface IRawElementProviderHostingAccessibles : IUnknown
    {
        /*
         * FIXME: Current versions of Windows SDK use
         * SAFEARRAY(IAccessible *) instead of
         * SAFEARRAY(VARIANT). The new type is currently unsupported
         * in widl, we should switch to it when it is.
         */
        HRESULT GetEmbeddedAccessibles([out, retval] SAFEARRAY(VARIANT) *pRetVal);
    }

    [
        object,
        uuid(e44c3566-915d-4070-99c6-047bff5a08f5),
        pointer_default(unique),
        oleautomation
    ]
    interface ILegacyIAccessibleProvider : IUnknown
    {
        HRESULT Select(long flagsSelect);
        HRESULT DoDefaultAction();
        HRESULT SetValue(LPCWSTR szValue);
        HRESULT GetIAccessible([out, retval] IAccessible **ppAccessible);

        [propget] HRESULT ChildId([out, retval] int *pRetVal);
        [propget] HRESULT Name([out, retval] BSTR *pszName);
        [propget] HRESULT Value([out, retval] BSTR *pszValue);
        [propget] HRESULT Description([out, retval] BSTR *pszDescription);
        [propget] HRESULT Role([out, retval] DWORD *pdwRole);
        [propget] HRESULT State([out, retval] DWORD *pdwState);
        [propget] HRESULT Help([out, retval] BSTR *pszHelp);
        [propget] HRESULT KeyboardShortcut([out, retval] BSTR *pszKeyboardShortcut);
        /*
         * FIXME: Current versions of Windows SDK use
         * SAFEARRAY(IRawElementProviderSimple *) instead of
         * SAFEARRAY(VARIANT). The new type is currently unsupported
         * in widl, we should switch to it when it is.
         */
        HRESULT GetSelection([out, retval] SAFEARRAY(VARIANT) *pvarSelectedChildren);
        [propget] HRESULT DefaultAction([out, retval] BSTR *pszDefaultAction);
    }

    [
        object,
        uuid(159bc72c-4ad3-485e-9637-d7052edf0146),
        pointer_default(unique),
        oleautomation
    ]
    interface IDockProvider : IUnknown
    {
        HRESULT SetDockPosition([in] enum DockPosition dockPosition);
        [propget] HRESULT DockPosition([out, retval] enum DockPosition *pRetVal);
    };

    [
        object,
        uuid(d847d3a5-cab0-4a98-8c32-ecb45c59ad24),
        pointer_default(unique),
        oleautomation
    ]
    interface IExpandCollapseProvider : IUnknown
    {
        HRESULT Expand();
        HRESULT Collapse();
        [propget] HRESULT ExpandCollapseState([out, retval] enum ExpandCollapseState *pRetVal);
    };

    [
        object,
        uuid(b17d6187-0907-464b-a168-0ef17a1572b1),
        pointer_default(unique),
        oleautomation
    ]
    interface IGridProvider : IUnknown
    {
        HRESULT GetItem(
                [in] int row,
                [in] int column,
                [out, retval] IRawElementProviderSimple **pRetVal);

        [propget] HRESULT RowCount([out, retval] int *pRetVal);
        [propget] HRESULT ColumnCount([out, retval] int *pRetVal);
    };

    [
        object,
        uuid(d02541f1-fb81-4d64-ae32-f520f8a6dbd1),
        pointer_default(unique),
        oleautomation
    ]
    interface IGridItemProvider : IUnknown
    {
        [propget] HRESULT Row([out, retval] int *pRetVal);
        [propget] HRESULT Column([out, retval] int *pRetVal);
        [propget] HRESULT RowSpan([out, retval] int *pRetVal);
        [propget] HRESULT ColumnSpan([out, retval] int *pRetVal);
        [propget] HRESULT ContainingGrid([out, retval] IRawElementProviderSimple **pRetVal);
    };

    [
        object,
        uuid(54fcb24b-e18e-47a2-b4d3-eccbe77599a2),
        pointer_default(unique),
        oleautomation
    ]
    interface IInvokeProvider : IUnknown
    {
        HRESULT Invoke();
    };

    [
        object,
        uuid(6278cab1-b556-4a1a-b4e0-418acc523201),
        pointer_default(unique),
        oleautomation
    ]
    interface IMultipleViewProvider : IUnknown
    {
        HRESULT GetViewName(
                [in] int viewId,
                [out, retval] BSTR *pRetVal);

        HRESULT SetCurrentView([in] int viewId);
        [propget] HRESULT CurrentView([out, retval] int *pRetVal);
        HRESULT GetSupportedViews([out, retval] SAFEARRAY(int) *pRetVal);
    };

    [
        object,
        uuid(36dc7aef-33e6-4691-afe1-2be7274b3d33),
        pointer_default(unique),
        oleautomation
    ]
    interface IRangeValueProvider : IUnknown
    {
        HRESULT SetValue([in] double val);
        [propget] HRESULT Value([out, retval] double *pRetVal);
        [propget] HRESULT IsReadOnly([out, retval] BOOL *pRetVal);
        [propget] HRESULT Maximum([out, retval] double *pRetVal);
        [propget] HRESULT Minimum([out, retval] double *pRetVal);
        [propget] HRESULT LargeChange([out, retval] double *pRetVal);
        [propget] HRESULT SmallChange([out, retval] double *pRetVal);
    };

    [
        object,
        uuid(2360c714-4bf1-4b26-ba65-9b21316127eb),
        pointer_default(unique),
        oleautomation
    ]
    interface IScrollItemProvider : IUnknown
    {
        HRESULT ScrollIntoView();
    };

    [
        object,
        uuid(fb8b03af-3bdf-48d4-bd36-1a65793be168),
        pointer_default(unique),
        oleautomation
    ]
    interface ISelectionProvider : IUnknown
    {
        /*
         * FIXME: Current versions of Windows SDK use
         * SAFEARRAY(IRawElementProviderSimple *) instead of
         * SAFEARRAY(VARIANT).
         */
        HRESULT GetSelection([out, retval] SAFEARRAY(VARIANT) *pRetVal);
        [propget] HRESULT CanSelectMultiple([out, retval] BOOL *pRetVal);
        [propget] HRESULT IsSelectionRequired([out, retval] BOOL *pRetVal);
    };

    [
        object,
        uuid(14f68475-ee1c-44f6-a869-d239381f0fe7),
        pointer_default(unique),
        oleautomation
    ]
    interface ISelectionProvider2 : ISelectionProvider
    {
        [propget] HRESULT FirstSelectedItem([out, retval] IRawElementProviderSimple **val);
        [propget] HRESULT LastSelectedItem([out, retval] IRawElementProviderSimple **val);
        [propget] HRESULT CurrentSelectedItem([out, retval] IRawElementProviderSimple **val);
        [propget] HRESULT ItemCount([out, retval] int *val);
    }

    [
        object,
        uuid(b38b8077-1fc3-42a5-8cae-d40c2215055a),
        pointer_default(unique),
        oleautomation
    ]
    interface IScrollProvider : IUnknown
    {
        HRESULT Scroll(
                [in] enum ScrollAmount horizontalAmount,
                [in] enum ScrollAmount verticalAmount);
        HRESULT SetScrollPercent(
                [in] double horizontalPercent,
                [in] double verticalPercent);

        [propget] HRESULT HorizontalScrollPercent([out, retval] double *pRetVal);
        [propget] HRESULT VerticalScrollPercent([out, retval] double *pRetVal);
        [propget] HRESULT HorizontalViewSize([out, retval] double *pRetVal);
        [propget] HRESULT VerticalViewSize([out, retval] double *pRetVal);
        [propget] HRESULT HorizontallyScrollable([out, retval] BOOL *pRetVal);
        [propget] HRESULT VerticallyScrollable([out, retval] BOOL *pRetVal);
    };

    [
        object,
        uuid(2acad808-b2d4-452d-a407-91ff1ad167b2),
        pointer_default(unique),
        oleautomation
    ]
    interface ISelectionItemProvider : IUnknown
    {
        HRESULT Select();
        HRESULT AddToSelection();
        HRESULT RemoveFromSelection();
        [propget] HRESULT IsSelected([out, retval] BOOL *pRetVal);
        [propget] HRESULT SelectionContainer([out, retval] IRawElementProviderSimple **pRetVal);
    };

    [
        object,
        uuid(29db1a06-02ce-4cf7-9b42-565d4fab20ee),
        pointer_default(unique),
        oleautomation
    ]
    interface ISynchronizedInputProvider : IUnknown
    {
        HRESULT StartListening([in] enum SynchronizedInputType inputType);
        HRESULT Cancel();
    };

    [
        object,
        uuid(9c860395-97b3-490a-b52a-858cc22af166),
        pointer_default(unique),
        oleautomation
    ]
    interface ITableProvider : IUnknown
    {
        /*
         * FIXME: Current versions of Windows SDK use
         * SAFEARRAY(IRawElementProviderSimple *) instead of
         * SAFEARRAY(VARIANT).
         */
        HRESULT GetRowHeaders([out, retval] SAFEARRAY(VARIANT) *pRetVal);
        HRESULT GetColumnHeaders([out, retval] SAFEARRAY(VARIANT) *pRetVal);
        [propget] HRESULT RowOrColumnMajor([out, retval] enum RowOrColumnMajor *pRetVal);
    };

    [
        object,
        uuid(b9734fa6-771f-4d78-9c90-2517999349cd),
        pointer_default(unique),
        oleautomation
    ]
    interface ITableItemProvider : IUnknown
    {
        /*
         * FIXME: Current versions of Windows SDK use
         * SAFEARRAY(IRawElementProviderSimple *) instead of
         * SAFEARRAY(VARIANT).
         */
        HRESULT GetRowHeaderItems([out, retval] SAFEARRAY(VARIANT) *pRetVal);
        HRESULT GetColumnHeaderItems([out, retval] SAFEARRAY(VARIANT) *pRetVal);
    };

    [
        object,
        uuid(56d00bd0-c4f4-433c-a836-1a52a57e0892),
        pointer_default(unique),
        oleautomation
    ]
    interface IToggleProvider : IUnknown
    {
        HRESULT Toggle();
        [propget] HRESULT ToggleState([out, retval] enum ToggleState *pRetVal);
    };

    [
        object,
        uuid(6829ddc4-4f91-4ffa-b86f-bd3e2987cb4c),
        pointer_default(unique),
        oleautomation
    ]
    interface ITransformProvider : IUnknown
    {
        HRESULT Move(
                [in] double x,
                [in] double y);
        HRESULT Resize(
                [in] double width,
                [in] double height);

        HRESULT Rotate([in] double degrees);
        [propget] HRESULT CanMove([out, retval] BOOL *pRetVal);
        [propget] HRESULT CanResize([out, retval] BOOL *pRetVal);
        [propget] HRESULT CanRotate([out, retval] BOOL *pRetVal);
    };

    [
        object,
        uuid(c7935180-6fb3-4201-b174-7df73adbf64a),
        pointer_default(unique),
        oleautomation
    ]
    interface IValueProvider : IUnknown
    {
        HRESULT SetValue([in] LPCWSTR val);
        [propget] HRESULT Value([out, retval] BSTR *pRetVal);
        [propget] HRESULT IsReadOnly([out, retval] BOOL *pRetVal);
    };

    [
        object,
        uuid(987df77b-db06-4d77-8f8a-86a9c3bb90b9),
        pointer_default(unique),
        oleautomation
    ]
    interface IWindowProvider : IUnknown
    {
        HRESULT SetVisualState([in] enum WindowVisualState state);
        HRESULT Close();

        HRESULT WaitForInputIdle(
                [in] int milliseconds,
                [out, retval] BOOL *pRetVal);

        [propget] HRESULT CanMaximize([out, retval] BOOL *pRetVal);
        [propget] HRESULT CanMinimize([out, retval] BOOL *pRetVal);
        [propget] HRESULT IsModal([out, retval] BOOL *pRetVal);
        [propget] HRESULT WindowVisualState([out, retval] enum WindowVisualState *pRetVal);
        [propget] HRESULT WindowInteractionState([out, retval] enum WindowInteractionState *pRetVal);
        [propget] HRESULT IsTopmost([out, retval] BOOL *pRetVal);
    };

    [
        object,
        uuid(e747770b-39ce-4382-ab30-d8fb3f336f24),
        pointer_default(unique),
        oleautomation
    ]
    interface IItemContainerProvider : IUnknown
    {
        HRESULT FindItemByProperty(
                [in] IRawElementProviderSimple *pStartAfter,
                [in] PROPERTYID propertyId,
                [in] VARIANT value,
                [out, retval] IRawElementProviderSimple **pFound);
    };

    [
        object,
        uuid(cb98b665-2d35-4fac-ad35-f3c60d0c0b8b),
        pointer_default(unique),
        oleautomation
    ]
    interface IVirtualizedItemProvider : IUnknown
    {
        HRESULT Realize();
    };

    [
        object,
        uuid(3ad86ebd-f5ef-483d-bb18-b1042a475d64),
        pointer_default(unique),
        oleautomation
    ]
    interface IObjectModelProvider : IUnknown
    {
        HRESULT GetUnderlyingObjectModel([out, retval] IUnknown **ppUnknown);
    };

    [
        object,
        uuid(f95c7e80-bd63-4601-9782-445ebff011fc),
        pointer_default(unique),
        oleautomation
    ]
    interface IAnnotationProvider : IUnknown
    {
        [propget] HRESULT AnnotationTypeId([out, retval] int *retVal);
        [propget] HRESULT AnnotationTypeName([out, retval] BSTR *retVal);
        [propget] HRESULT Author([out, retval] BSTR *retVal);
        [propget] HRESULT DateTime([out, retval] BSTR *retVal);
        [propget] HRESULT Target([out, retval] IRawElementProviderSimple **retVal);
    };

    [
        object,
        uuid(19b6b649-f5d7-4a6d-bdcb-129252be588a),
        pointer_default(unique),
        oleautomation
    ]
    interface IStylesProvider : IUnknown
    {
        [propget] HRESULT StyleId([out, retval] int *retVal);
        [propget] HRESULT StyleName([out, retval] BSTR *retVal);
        [propget] HRESULT FillColor([out, retval] int *retVal);
        [propget] HRESULT FillPatternStyle([out, retval] BSTR *retVal);
        [propget] HRESULT Shape([out, retval] BSTR *retVal);
        [propget] HRESULT FillPatternColor([out, retval] int *retVal);
        [propget] HRESULT ExtendedProperties([out, retval] BSTR *retVal);
    };

    [
        object,
        uuid(6f6b5d35-5525-4f80-b758-85473832ffc7),
        pointer_default(unique),
        oleautomation
    ]
    interface ISpreadsheetProvider : IUnknown
    {
        HRESULT GetItemByName(
                [in] LPCWSTR name,
                [out, retval] IRawElementProviderSimple **pRetVal);
    };

    [
        object,
        uuid(eaed4660-7b3d-4879-a2e6-365ce603f3d0),
        pointer_default(unique),
        oleautomation
    ]
    interface ISpreadsheetItemProvider : IUnknown
    {
        [propget] HRESULT Formula([out, retval] BSTR *pRetVal);

        /*
         * FIXME: Current versions of Windows SDK use
         * SAFEARRAY(IRawElementProviderSimple *) instead of
         * SAFEARRAY(VARIANT).
         */
        HRESULT GetAnnotationObjects([out, retval] SAFEARRAY(VARIANT) *pRetVal);
        HRESULT GetAnnotationTypes([out, retval] SAFEARRAY(int) *pRetVal);
    };

    [
        object,
        uuid(4758742f-7ac2-460c-bc48-09fc09308a93),
        pointer_default(unique),
        oleautomation
    ]
    interface ITransformProvider2 : ITransformProvider
    {
        HRESULT Zoom([in] double zoom);
        [propget] HRESULT CanZoom([out, retval] BOOL *pRetVal);
        [propget] HRESULT ZoomLevel([out, retval] double *pRetVal);
        [propget] HRESULT ZoomMinimum([out, retval] double *pRetVal);
        [propget] HRESULT ZoomMaximum([out, retval] double *pRetVal);
        HRESULT ZoomByUnit([in] enum ZoomUnit zoomUnit);
    }

    [
        object,
        uuid(6aa7bbbb-7ff9-497d-904f-d20b897929d8),
        pointer_default(unique),
        oleautomation
    ]
    interface IDragProvider : IUnknown
    {
        [propget] HRESULT IsGrabbed([out, retval] BOOL *pRetVal);
        [propget] HRESULT DropEffect([out, retval] BSTR *pRetVal);
        [propget] HRESULT DropEffects([out, retval] SAFEARRAY(BSTR) *pRetVal);

        /*
         * FIXME: Current versions of Windows SDK use
         * SAFEARRAY(IRawElementProviderSimple *) instead of
         * SAFEARRAY(VARIANT).
         */
        HRESULT GetGrabbedItems([out, retval] SAFEARRAY(VARIANT) *pRetVal);
    };

    [
        object,
        uuid(bae82bfd-358a-481c-85a0-d8b4d90a5d61),
        pointer_default(unique),
        oleautomation
    ]
    interface IDropTargetProvider : IUnknown
    {
        [propget] HRESULT DropTargetEffect([out, retval] BSTR *pRetVal);
        [propget] HRESULT DropTargetEffects([out, retval] SAFEARRAY(BSTR) *pRetVal);
    };

    interface ITextRangeProvider;
    [
        object,
        uuid(3589c92c-63f3-4367-99bb-ada653b77cf2),
        pointer_default(unique),
        oleautomation
    ]
    interface ITextProvider : IUnknown
    {
        /*
         * FIXME: Current versions of Windows SDK use
         * SAFEARRAY(ITextRangeProvider *) instead of
         * SAFEARRAY(VARIANT).
         */
        HRESULT GetSelection([out, retval] SAFEARRAY(VARIANT) *pRetVal);
        HRESULT GetVisibleRanges([out, retval] SAFEARRAY(VARIANT) *pRetVal);

        HRESULT RangeFromChild(
                [in] IRawElementProviderSimple *childElement,
                [out, retval] ITextRangeProvider **pRetVal);
        HRESULT RangeFromPoint(
                [in] struct UiaPoint point,
                [out, retval] ITextRangeProvider **pRetVal);

        [propget] HRESULT DocumentRange([out, retval] ITextRangeProvider **pRetVal);
        [propget] HRESULT SupportedTextSelection([out, retval] enum SupportedTextSelection *pRetVal);
    };

    [
        object,
        uuid(0dc5e6ed-3e16-4bf1-8f9a-a979878bc195),
        pointer_default(unique),
        oleautomation
    ]
    interface ITextProvider2 : ITextProvider
    {
        HRESULT RangeFromAnnotation(
                [in] IRawElementProviderSimple *annotationElement,
                [out, retval] ITextRangeProvider **pRetVal);
        HRESULT GetCaretRange(
                [out] BOOL *isActive,
                [out, retval] ITextRangeProvider **pRetVal);
    }

    [
        object,
        uuid(ea3605b4-3a05-400e-b5f9-4e91b40f6176),
        pointer_default(unique),
        oleautomation
    ]
    interface ITextEditProvider : ITextProvider
    {
        HRESULT GetActiveComposition([out, retval] ITextRangeProvider **pRetVal);
        HRESULT GetConversionTarget([out, retval] ITextRangeProvider **pRetVal);
    }

    [
        object,
        uuid(5347ad7b-c355-46f8-aff5-909033582f63),
        pointer_default(unique),
        oleautomation
    ]
    interface ITextRangeProvider : IUnknown
    {
        HRESULT Clone([out, retval] ITextRangeProvider **pRetVal);

        HRESULT Compare(
                [in] ITextRangeProvider *range,
                [out, retval] BOOL *pRetVal);
        HRESULT CompareEndpoints(
                [in] enum TextPatternRangeEndpoint endpoint,
                [in] ITextRangeProvider *targetRange,
                [in] enum TextPatternRangeEndpoint targetEndpoint,
                [out, retval] int *pRetVal);

        HRESULT ExpandToEnclosingUnit([in] enum TextUnit unit);

        HRESULT FindAttribute(
                [in] TEXTATTRIBUTEID attributeId,
                [in] VARIANT val,
                [in] BOOL backward,
                [out, retval] ITextRangeProvider **pRetVal);
        HRESULT FindText(
                [in] BSTR text,
                [in] BOOL backward,
                [in] BOOL ignoreCase,
                [out, retval] ITextRangeProvider **pRetVal);

        HRESULT GetAttributeValue(
                [in] TEXTATTRIBUTEID attributeId,
                [out, retval] VARIANT *pRetVal);

        HRESULT GetBoundingRectangles([out, retval] SAFEARRAY(double) *pRetVal);
        HRESULT GetEnclosingElement([out, retval] IRawElementProviderSimple **pRetVal);

        HRESULT GetText(
                [in] int maxLength,
                [out, retval] BSTR *pRetVal);

        HRESULT Move(
                [in] enum TextUnit unit,
                [in] int count,
                [out, retval] int *pRetVal);
        HRESULT MoveEndpointByUnit(
                [in] enum TextPatternRangeEndpoint endpoint,
                [in] enum TextUnit unit,
                [in] int count,
                [out, retval] int *pRetVal);
        HRESULT MoveEndpointByRange(
                [in] enum TextPatternRangeEndpoint endpoint,
                [in] ITextRangeProvider *targetRange,
                [in] enum TextPatternRangeEndpoint targetEndpoint);

        HRESULT Select();
        HRESULT AddToSelection();
        HRESULT RemoveFromSelection();
        HRESULT ScrollIntoView([in] BOOL alignToTop);

        /*
         * FIXME: Current versions of Windows SDK use
         * SAFEARRAY(IRawElementProviderSimple *) instead of
         * SAFEARRAY(VARIANT).
         */
        HRESULT GetChildren([out, retval] SAFEARRAY(VARIANT) *pRetVal);
    };

    [
        object,
        uuid(9bbce42c-1921-4f18-89ca-dba1910a0386),
        pointer_default(unique),
        oleautomation
    ]
    interface ITextRangeProvider2 : ITextRangeProvider
    {
        HRESULT ShowContextMenu();
    }

    [
        object,
        uuid(4c2de2b9-c88f-4f88-a111-f1d336b7d1a9),
        pointer_default(unique),
        oleautomation
    ]
    interface ITextChildProvider : IUnknown
    {
        [propget] HRESULT TextContainer([out, retval] IRawElementProviderSimple **pRetVal);
        [propget] HRESULT TextRange([out, retval] ITextRangeProvider **pRetVal);
    };

    [
        object,
        uuid(2062a28a-8c07-4b94-8e12-7037c622aeb8),
        pointer_default(unique),
        oleautomation
    ]
    interface ICustomNavigationProvider : IUnknown
    {
        HRESULT Navigate(
                [in] enum NavigateDirection direction,
                [out, retval] IRawElementProviderSimple **pRetVal);
    }

    enum UIAutomationType {
        UIAutomationType_Int     = 0x01,
        UIAutomationType_Bool    = 0x02,
        UIAutomationType_String  = 0x03,
        UIAutomationType_Double  = 0x04,
        UIAutomationType_Point   = 0x05,
        UIAutomationType_Rect    = 0x06,
        UIAutomationType_Element = 0x07,

        UIAutomationType_Array = 0x00010000,
        UIAutomationType_Out   = 0x00020000,

        UIAutomationType_IntArray    = ( UIAutomationType_Int    | UIAutomationType_Array ),
        UIAutomationType_BoolArray   = ( UIAutomationType_Bool   | UIAutomationType_Array ),
        UIAutomationType_StringArray = ( UIAutomationType_String | UIAutomationType_Array ),
        UIAutomationType_DoubleArray = ( UIAutomationType_Double | UIAutomationType_Array ),
        UIAutomationType_PointArray  = ( UIAutomationType_Point  | UIAutomationType_Array ),
        UIAutomationType_RectArray   = ( UIAutomationType_Rect   | UIAutomationType_Array ),
        UIAutomationType_ElementArray = ( UIAutomationType_Element | UIAutomationType_Array ),

        UIAutomationType_OutInt    = ( UIAutomationType_Int    | UIAutomationType_Out ),
        UIAutomationType_OutBool   = ( UIAutomationType_Bool   | UIAutomationType_Out ),
        UIAutomationType_OutString = ( UIAutomationType_String | UIAutomationType_Out ),
        UIAutomationType_OutDouble = ( UIAutomationType_Double | UIAutomationType_Out ),
        UIAutomationType_OutPoint  = ( UIAutomationType_Point  | UIAutomationType_Out ),
        UIAutomationType_OutRect   = ( UIAutomationType_Rect   | UIAutomationType_Out ),
        UIAutomationType_OutElement = ( UIAutomationType_Element | UIAutomationType_Out ),

        UIAutomationType_OutIntArray    = ( UIAutomationType_Int    | UIAutomationType_Array | UIAutomationType_Out ),
        UIAutomationType_OutBoolArray   = ( UIAutomationType_Bool   | UIAutomationType_Array | UIAutomationType_Out ),
        UIAutomationType_OutStringArray = ( UIAutomationType_String | UIAutomationType_Array | UIAutomationType_Out ),
        UIAutomationType_OutDoubleArray = ( UIAutomationType_Double | UIAutomationType_Array | UIAutomationType_Out ),
        UIAutomationType_OutPointArray  = ( UIAutomationType_Point  | UIAutomationType_Array | UIAutomationType_Out ),
        UIAutomationType_OutRectArray   = ( UIAutomationType_Rect   | UIAutomationType_Array | UIAutomationType_Out ),
        UIAutomationType_OutElementArray = ( UIAutomationType_Element | UIAutomationType_Array | UIAutomationType_Out ),
    };

cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(UIAutomationType)")

    struct UIAutomationParameter {
        enum UIAutomationType type;
        void *pData;
    };

    struct UIAutomationPropertyInfo {
        GUID guid;
        LPCWSTR pProgrammaticName;
        enum UIAutomationType type;
    };

    struct UIAutomationEventInfo {
        GUID guid;
        LPCWSTR pProgrammaticName;
    };

    struct UIAutomationMethodInfo {
        LPCWSTR pProgrammaticName;
        BOOL doSetFocus;
        UINT cInParameters;
        UINT cOutParameters;
        [size_is(cInParameters + cOutParameters)]enum UIAutomationType *pParameterTypes;
        [size_is(cInParameters + cOutParameters)]LPCWSTR *pParameterNames;
    };

    [
        object,
        uuid(c03a7fe4-9431-409f-bed8-ae7c2299bc8d),
        pointer_default(unique),
        oleautomation
    ]
    interface IUIAutomationPatternInstance : IUnknown
    {
        [local] HRESULT GetProperty(
                        [in] UINT index,
                        [in] BOOL cached,
                        [in] enum UIAutomationType type,
                        [out] void *pPtr);

        [local] HRESULT CallMethod(
                        [in] UINT index,
                        [in] const struct UIAutomationParameter *pParams,
                        [in] UINT cParams);
    }

    [
        object,
        uuid(d97022f3-a947-465e-8b2a-ac4315fa54e8),
        pointer_default(unique),
        oleautomation
    ]
    interface IUIAutomationPatternHandler : IUnknown
    {
        HRESULT CreateClientWrapper(
                [in] IUIAutomationPatternInstance *pPatternInstance,
                [out] IUnknown **pClientWrapper);

        [local] HRESULT Dispatch(
                        [in] IUnknown *pTarget,
                        [in] UINT index,
                        [in] const struct UIAutomationParameter *pParams,
                        [in] UINT cParams);
    }

    struct UIAutomationPatternInfo {
        GUID guid;
        LPCWSTR pProgrammaticName;
        GUID providerInterfaceId;
        GUID clientInterfaceId;
        UINT cProperties;
        [size_is(cProperties)]struct UIAutomationPropertyInfo *pProperties;
        UINT cMethods;
        [size_is(cMethods)]struct UIAutomationMethodInfo *pMethods;
        UINT cEvents;
        [size_is(cEvents)]struct UIAutomationEventInfo *pEvents;
        IUIAutomationPatternHandler *pPatternHandler;
    };

    [
        object,
        uuid(8609c4ec-4a1a-4d88-a357-5a66e060e1cf),
        pointer_default(unique),
        oleautomation
    ]
    interface IUIAutomationRegistrar : IUnknown
    {
        HRESULT RegisterProperty(
                [in] const struct UIAutomationPropertyInfo *property,
                [out] PROPERTYID *propertyId);

        HRESULT RegisterEvent(
                [in] const struct UIAutomationEventInfo *event,
                [out] EVENTID *eventId);

        HRESULT RegisterPattern(
                [in] const struct UIAutomationPatternInfo *pattern,
                [out] PATTERNID *pPatternId,
                [out] PROPERTYID *pPatternAvailablePropertyId,
                [in] UINT propertyIdCount,
                [out, size_is(propertyIdCount)] PROPERTYID *pPropertyIds,
                [in] UINT eventIdCount,
                [out, size_is(eventIdCount)] EVENTID *pEventIds);
    };

    [
        uuid(6e29fabf-9977-42d1-8d0e-ca7e61ad87e6),
        version(1.0),
        threading(both)
    ]
    coclass CUIAutomationRegistrar
    {
        [default] interface IUIAutomationRegistrar;
    }
}
