/*
 * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

#ifndef DO_NO_IMPORTS
import "oaidl.idl";
import "ocidl.idl";
import "DOMCore.idl";
#endif

interface IDOMNode;
interface IDOMDocumentFragment;

typedef enum _WebSelectionAffinity {
   WebSelectionAffinityUpstream = 0,
   WebSelectionAffinityDownstream = 1
} WebSelectionAffinity;

enum {
    //
    // DOM range exception codes
    //
    DOM_BAD_BOUNDARYPOINTS_ERR        = 1,
    DOM_INVALID_NODE_TYPE_ERR         = 2,
};

enum {
    //
    // DOM Range comparison codes
    //
    DOM_START_TO_START                = 0,
    DOM_START_TO_END                  = 1,
    DOM_END_TO_END                    = 2,
    DOM_END_TO_START                  = 3,
};

/*
    @interface DOMRange : DOMObject
*/
[
    object,
    oleautomation,
    uuid(2F33E42C-0B39-48b3-B7B6-E910CDB325AD),
    pointer_default(unique)
]
interface IDOMRange : IDOMObject
{
    /*
        - (DOMNode *)startContainer;
    */
    HRESULT startContainer([out, retval] IDOMNode** node);

    /*
        - (int)startOffset;
    */
    HRESULT startOffset([out, retval] int* offset);

    /*
        - (DOMNode *)endContainer;
    */
    HRESULT endContainer([out, retval] IDOMNode** node);

    /*
        - (int)endOffset;
    */
    HRESULT endOffset([out, retval] int* offset);

    /*
        - (BOOL)collapsed;
    */
    HRESULT collapsed([out, retval] BOOL* result);

    /*
        - (DOMNode *)commonAncestorContainer;
    */
    HRESULT commonAncestorContainer([out, retval] IDOMNode** container);

    /*
        - (void)setStart:(DOMNode *)refNode :(int)offset;
    */
    HRESULT setStart([in] IDOMNode* refNode, [in] int offset);

    /*
        - (void)setEnd:(DOMNode *)refNode :(int)offset;
    */
    HRESULT setEnd([in] IDOMNode* refNode, [in] int offset);

    /*
        - (void)setStartBefore:(DOMNode *)refNode;
    */
    HRESULT setStartBefore([in] IDOMNode* refNode);

    /*
        - (void)setStartAfter:(DOMNode *)refNode;
    */
    HRESULT setStartAfter([in] IDOMNode* refNode);

    /*
        - (void)setEndBefore:(DOMNode *)refNode;
    */
    HRESULT setEndBefore([in] IDOMNode* refNode);

    /*
        - (void)setEndAfter:(DOMNode *)refNode;
    */
    HRESULT setEndAfter([in] IDOMNode* refNode);

    /*
        - (void)collapse:(BOOL)toStart;
    */
    HRESULT collapse([in] BOOL toStart);

    /*
        - (void)selectNode:(DOMNode *)refNode;
    */
    HRESULT selectNode([in] IDOMNode* refNode);

    /*
        - (void)selectNodeContents:(DOMNode *)refNode;
    */
    HRESULT selectNodeContents([in] IDOMNode* refNode);

    /*
        - (short)compareBoundaryPoints:(unsigned short)how :(DOMRange *)sourceRange;
    */
    HRESULT compareBoundaryPoints([in] unsigned short how, [in] IDOMRange* sourceRange);

    /*
        - (void)deleteContents;
    */
    HRESULT deleteContents();

    /*
        - (DOMDocumentFragment *)extractContents;
    */
    HRESULT extractContents([out, retval] IDOMDocumentFragment** fragment);

    /*
        - (DOMDocumentFragment *)cloneContents;
    */
    HRESULT cloneContents([out, retval] IDOMDocumentFragment** fragment);

    /*
        - (void)insertNode:(DOMNode *)newNode;
    */
    HRESULT insertNode([in] IDOMNode* newNode);

    /*
        - (void)surroundContents:(DOMNode *)newParent;
    */
    HRESULT surroundContents([in] IDOMNode* newParent);

    /*
        - (DOMRange *)cloneRange;
    */
    HRESULT cloneRange([out, retval] IDOMRange** range);

    /*
        - (NSString *)toString;
    */
    HRESULT toString([out, retval] BSTR* str);

    /*
        - (void)detach;
    */
    HRESULT detach();
}
