/* * This file is part of the DOM implementation for KDE. * * (C) 1999 Lars Knoll (knoll@kde.org) * (C) 2000 Gunnstein Lye (gunnstein@netcom.no) * (C) 2000 Frederik Holljen (frederik.holljen@hig.no) * (C) 2001 Peter Kelly (pmk@post.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * This file includes excerpts from the Document Object Model (DOM) * Level 2 Specification (Candidate Recommendation) * http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/ * Copyright © 2000 W3C® (MIT, INRIA, Keio), All Rights Reserved. * */ #ifndef _dom2_range_h_ #define _dom2_range_h_ #include #include namespace DOM { class DocumentFragment; class Node; class DOMString; class DocumentImpl; class RangeImpl; class DOMException; // Introduced in DOM Level 2: class TDEHTML_EXPORT RangeException { public: RangeException(unsigned short _code) { code = _code; } RangeException(const RangeException &other) { code = other.code; } RangeException & operator = (const RangeException &other) { code = other.code; return *this; } virtual ~RangeException() {} /** * An integer indicating the type of error generated. * */ enum RangeExceptionCode { BAD_BOUNDARYPOINTS_ERR = 1, INVALID_NODE_TYPE_ERR = 2, _EXCEPTION_OFFSET = 2000, _EXCEPTION_MAX = 2999 }; unsigned short code; }; class TDEHTML_EXPORT Range { friend class DocumentImpl; friend class Document; friend class RangeImpl; public: Range(); Range(const Document rootContainer); Range(const Range &other); Range(const Node startContainer, const long startOffset, const Node endContainer, const long endOffset); Range & operator = (const Range &other); ~Range(); /** * Node within which the range begins * */ Node startContainer() const; /** * Offset within the starting node of the range. * */ long startOffset() const; /** * Node within which the range ends * */ Node endContainer() const; /** * Offset within the ending node of the range. * */ long endOffset() const; /** * true if the range is collapsed * */ bool collapsed() const; /** * Gets the common ancestor container of the range's two end-points. * Also sets it. * */ // ### BIC make const in the next release Node commonAncestorContainer(); /** * Sets the attributes describing the start of the range. * * @param refNode The \c refNode value. This parameter * must be different from \c null . * * @param offset The \c startOffset value. * * @return * * @exception RangeException * NULL_NODE_ERR: Raised if \c refNode is \c null . * * INVALID_NODE_TYPE_ERR: Raised if \c refNode or an * ancestor of \c refNode is an Attr, Entity, * Notation, or DocumentType node. * * If an offset is out-of-bounds, should it just be fixed up or * should an exception be raised. * */ void setStart ( const Node &refNode, long offset ); /** * Sets the attributes describing the end of a range. * * @param refNode The \c refNode value. This parameter * must be different from \c null . * * @param offset The \c endOffset value. * * @return * * @exception RangeException * NULL_NODE_ERR: Raised if \c refNode is \c null . * * INVALID_NODE_TYPE_ERR: Raised if \c refNode or an * ancestor of \c refNode is an Attr, Entity, * Notation, or DocumentType node. * */ void setEnd ( const Node &refNode, long offset ); /** * Sets the start position to be before a node * * @param refNode Range starts before \c refNode * * @return * * @exception RangeException * INVALID_NODE_TYPE_ERR: Raised if an ancestor of \c refNode * is an Attr, Entity, Notation, or DocumentType node or * if \c refNode is a Document, DocumentFragment, * Attr, Entity, or Notation node. * */ void setStartBefore ( const Node &refNode ); /** * Sets the start position to be after a node * * @param refNode Range starts after \c refNode * * @return * * @exception RangeException * INVALID_NODE_TYPE_ERR: Raised if an ancestor of \c refNode * is an Attr, Entity, Notation, or DocumentType node or * if \c refNode is a Document, DocumentFragment, * Attr, Entity, or Notation node. * */ void setStartAfter ( const Node &refNode ); /** * Sets the end position to be before a node. * * @param refNode Range ends before \c refNode * * @return * * @exception RangeException * INVALID_NODE_TYPE_ERR: Raised if an ancestor of \c refNode * is an Attr, Entity, Notation, or DocumentType node or * if \c refNode is a Document, DocumentFragment, * Attr, Entity, or Notation node. * */ void setEndBefore ( const Node &refNode ); /** * Sets the end of a range to be after a node * * @param refNode Range ends after \c refNode . * * @return * * @exception RangeException * INVALID_NODE_TYPE_ERR: Raised if an ancestor of \c refNode * is an Attr, Entity, Notation or DocumentType node or if * \c refNode is a Document, DocumentFragment, Attr, * Entity, or Notation node. * */ void setEndAfter ( const Node &refNode ); /** * Collapse a range onto one of its end-points * * @param toStart If true, collapses the Range onto its start; if * false, collapses it onto its end. * * @return * */ void collapse ( bool toStart ); /** * Select a node and its contents * * @param refNode The node to select. * * @return * * @exception RangeException * INVALID_NODE_TYPE_ERR: Raised if an ancestor of \c refNode * is an Attr, Entity, Notation or DocumentType node or if * \c refNode is a Document, DocumentFragment, Attr, * Entity, or Notation node. * */ void selectNode ( const Node &refNode ); /** * Select the contents within a node * * @param refNode Node to select from * * @return * * @exception RangeException * INVALID_NODE_TYPE_ERR: Raised if \c refNode or an * ancestor of \c refNode is an Attr, Entity, Notation * or DocumentType node. * */ void selectNodeContents ( const Node &refNode ); enum CompareHow { START_TO_START = 0, START_TO_END = 1, END_TO_END = 2, END_TO_START = 3 }; /** * Compare the end-points of two ranges in a document. * * @param how * * @param sourceRange * * @return -1, 0 or 1 depending on whether the corresponding * end-point of the Range is before, equal to, or after the * corresponding end-point of \c sourceRange . * * @exception DOMException * WRONG_DOCUMENT_ERR: Raised if the two Ranges are not in the * same document or document fragment. * */ short compareBoundaryPoints ( CompareHow how, const Range &sourceRange ); /** * @internal * not part of the DOM * * Compare the boundary-points of a range. * * Return true if the startContainer is before the endContainer, * or if they are equal. * Return false if the startContainer is after the endContainer. * */ bool boundaryPointsValid ( ); /** * Removes the contents of a range from the containing document or * document fragment without returning a reference to the removed * content. * * @return * * @exception DOMException * NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the * content of the range is read-only or any of the nodes that * contain any of the content of the range are read-only. * */ void deleteContents ( ); /** * Moves the contents of a range from the containing document or * document fragment to a new DocumentFragment. * * @return A DocumentFragment containing the extracted contents. * * @exception DOMException * NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the * content of the range is read-only or any of the nodes which * contain any of the content of the range are read-only. * * HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be * extracted into the new DocumentFragment. * */ DocumentFragment extractContents ( ); /** * Duplicates the contents of a range * * @return A DocumentFragment containing contents equivalent to * those of this range. * * @exception DOMException * HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be * extracted into the new DocumentFragment. * */ DocumentFragment cloneContents ( ); /** * Inserts a node into the document or document fragment at the * start of the range. * * @param newNode The node to insert at the start of the range * * @return * * @exception DOMException * NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of * the start of the range is read-only. * * WRONG_DOCUMENT_ERR: Raised if \c newNode and the * container of the start of the Range were not created from the * same document. * * HIERARCHY_REQUEST_ERR: Raised if the container of the start of * the Range is of a type that does not allow children of the type * of \c newNode or if \c newNode is an * ancestor of the container . * * @exception RangeException * INVALID_NODE_TYPE_ERR: Raised if \c node is an * Attr, Entity, Notation, DocumentFragment, or Document node. * */ void insertNode ( const Node &newNode ); /** * Reparents the contents of the range to the given node and * inserts the node at the position of the start of the range. * * @param newParent The node to surround the contents with. * * @return * * @exception DOMException * NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of * either end-point of the range is read-only. * * WRONG_DOCUMENT_ERR: Raised if \c newParent and the * container of the start of the Range were not created from the * same document. * * HIERARCHY_REQUEST_ERR: Raised if the container of the start of * the Range is of a type that does not allow children of the type * of \c newParent or if \c newParent is * an ancestor of the container or if \c node would * end up with a child node of a type not allowed by the type of * \c node . * * @exception RangeException * BAD_ENDPOINTS_ERR: Raised if the range partially selects a * non-text node. * * INVALID_NODE_TYPE_ERR: Raised if \c node is an * Attr, Entity, DocumentType, Notation, Document, or * DocumentFragment node. * */ void surroundContents ( const Node &newParent ); /** * Produces a new range whose end-points are equal to the * end-points of the range. * * @return The duplicated range. * */ Range cloneRange ( ); /** * Returns the contents of a range as a string. * * @return The contents of the range. * */ DOMString toString ( ); /** * @internal Not part of DOM */ DOMString toHTML ( ); /* Mozilla extension - only works for HTML documents. */ DocumentFragment createContextualFragment (const DOMString &html); /** * Called to indicate that the range is no longer in use and that * the implementation may relinquish any resources associated with * this range. Subsequent calls to any methods or attribute getters * on this range will result in a DOMException being thrown with an * error code of INVALID_STATE_ERR. * */ void detach ( ); /** * not part of the DOM * true if the range is detached * */ bool isDetached() const; /** * @internal * not part of the DOM */ RangeImpl *handle() const; bool isNull() const; protected: RangeImpl *impl; Range(RangeImpl *i); private: void throwException(int exceptioncode) const; }; } // namespace #endif