1 /*
   2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   3  *
   4  * This code is free software; you can redistribute it and/or modify it
   5  * under the terms of the GNU General Public License version 2 only, as
   6  * published by the Free Software Foundation.  Oracle designates this
   7  * particular file as subject to the "Classpath" exception as provided
   8  * by Oracle in the LICENSE file that accompanied this code.
   9  *
  10  * This code is distributed in the hope that it will be useful, but WITHOUT
  11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13  * version 2 for more details (a copy is included in the LICENSE file that
  14  * accompanied this code).
  15  *
  16  * You should have received a copy of the GNU General Public License version
  17  * 2 along with this work; if not, write to the Free Software Foundation,
  18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19  *
  20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21  * or visit www.oracle.com if you need additional information or have any
  22  * questions.
  23  */
  24 
  25 /*
  26  * This file is available under and governed by the GNU General Public
  27  * License version 2 only, as published by the Free Software Foundation.
  28  * However, the following notice accompanied the original version of this
  29  * file and, per its terms, should not be removed:
  30  *
  31  * Copyright (c) 2000 World Wide Web Consortium,
  32  * (Massachusetts Institute of Technology, Institut National de
  33  * Recherche en Informatique et en Automatique, Keio University). All
  34  * Rights Reserved. This program is distributed under the W3C's Software
  35  * Intellectual Property License. This program is distributed in the
  36  * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
  37  * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  38  * PURPOSE.
  39  * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
  40  */
  41 
  42 package org.w3c.dom.ranges;
  43 
  44 import org.w3c.dom.Node;
  45 import org.w3c.dom.DOMException;
  46 import org.w3c.dom.DocumentFragment;
  47 
  48 /**
  49  * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
  50  * @since 9, DOM Level 2
  51  */
  52 public interface Range {
  53     /**
  54      * Node within which the Range begins
  55      * @exception DOMException
  56      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
  57      *   invoked on this object.
  58      */
  59     public Node getStartContainer()
  60                        throws DOMException;
  61 
  62     /**
  63      * Offset within the starting node of the Range.
  64      * @exception DOMException
  65      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
  66      *   invoked on this object.
  67      */
  68     public int getStartOffset()
  69                        throws DOMException;
  70 
  71     /**
  72      * Node within which the Range ends
  73      * @exception DOMException
  74      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
  75      *   invoked on this object.
  76      */
  77     public Node getEndContainer()
  78                        throws DOMException;
  79 
  80     /**
  81      * Offset within the ending node of the Range.
  82      * @exception DOMException
  83      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
  84      *   invoked on this object.
  85      */
  86     public int getEndOffset()
  87                        throws DOMException;
  88 
  89     /**
  90      * TRUE if the Range is collapsed
  91      * @exception DOMException
  92      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
  93      *   invoked on this object.
  94      */
  95     public boolean getCollapsed()
  96                        throws DOMException;
  97 
  98     /**
  99      * The deepest common ancestor container of the Range's two
 100      * boundary-points.
 101      * @exception DOMException
 102      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
 103      *   invoked on this object.
 104      */
 105     public Node getCommonAncestorContainer()
 106                        throws DOMException;
 107 
 108     /**
 109      * Sets the attributes describing the start of the Range.
 110      * @param refNode The <code>refNode</code> value. This parameter must be
 111      *   different from <code>null</code>.
 112      * @param offset The <code>startOffset</code> value.
 113      * @exception RangeException
 114      *   INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor
 115      *   of <code>refNode</code> is an Entity, Notation, or DocumentType
 116      *   node.
 117      * @exception DOMException
 118      *   INDEX_SIZE_ERR: Raised if <code>offset</code> is negative or greater
 119      *   than the number of child units in <code>refNode</code>. Child units
 120      *   are 16-bit units if <code>refNode</code> is a type of CharacterData
 121      *   node (e.g., a Text or Comment node) or a ProcessingInstruction
 122      *   node. Child units are Nodes in all other cases.
 123      *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
 124      *   been invoked on this object.
 125      *   <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
 126      *   from a different document than the one that created this range.
 127      */
 128     public void setStart(Node refNode,
 129                          int offset)
 130                          throws RangeException, DOMException;
 131 
 132     /**
 133      * Sets the attributes describing the end of a Range.
 134      * @param refNode The <code>refNode</code> value. This parameter must be
 135      *   different from <code>null</code>.
 136      * @param offset The <code>endOffset</code> value.
 137      * @exception RangeException
 138      *   INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor
 139      *   of <code>refNode</code> is an Entity, Notation, or DocumentType
 140      *   node.
 141      * @exception DOMException
 142      *   INDEX_SIZE_ERR: Raised if <code>offset</code> is negative or greater
 143      *   than the number of child units in <code>refNode</code>. Child units
 144      *   are 16-bit units if <code>refNode</code> is a type of CharacterData
 145      *   node (e.g., a Text or Comment node) or a ProcessingInstruction
 146      *   node. Child units are Nodes in all other cases.
 147      *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
 148      *   been invoked on this object.
 149      *   <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
 150      *   from a different document than the one that created this range.
 151      */
 152     public void setEnd(Node refNode,
 153                        int offset)
 154                        throws RangeException, DOMException;
 155 
 156     /**
 157      * Sets the start position to be before a node
 158      * @param refNode Range starts before <code>refNode</code>
 159      * @exception RangeException
 160      *   INVALID_NODE_TYPE_ERR: Raised if the root container of
 161      *   <code>refNode</code> is not an Attr, Document, or DocumentFragment
 162      *   node or if <code>refNode</code> is a Document, DocumentFragment,
 163      *   Attr, Entity, or Notation node.
 164      * @exception DOMException
 165      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
 166      *   invoked on this object.
 167      *   <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
 168      *   from a different document than the one that created this range.
 169      */
 170     public void setStartBefore(Node refNode)
 171                                throws RangeException, DOMException;
 172 
 173     /**
 174      * Sets the start position to be after a node
 175      * @param refNode Range starts after <code>refNode</code>
 176      * @exception RangeException
 177      *   INVALID_NODE_TYPE_ERR: Raised if the root container of
 178      *   <code>refNode</code> is not an Attr, Document, or DocumentFragment
 179      *   node or if <code>refNode</code> is a Document, DocumentFragment,
 180      *   Attr, Entity, or Notation node.
 181      * @exception DOMException
 182      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
 183      *   invoked on this object.
 184      *   <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
 185      *   from a different document than the one that created this range.
 186      */
 187     public void setStartAfter(Node refNode)
 188                               throws RangeException, DOMException;
 189 
 190     /**
 191      * Sets the end position to be before a node.
 192      * @param refNode Range ends before <code>refNode</code>
 193      * @exception RangeException
 194      *   INVALID_NODE_TYPE_ERR: Raised if the root container of
 195      *   <code>refNode</code> is not an Attr, Document, or DocumentFragment
 196      *   node or if <code>refNode</code> is a Document, DocumentFragment,
 197      *   Attr, Entity, or Notation node.
 198      * @exception DOMException
 199      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
 200      *   invoked on this object.
 201      *   <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
 202      *   from a different document than the one that created this range.
 203      */
 204     public void setEndBefore(Node refNode)
 205                              throws RangeException, DOMException;
 206 
 207     /**
 208      * Sets the end of a Range to be after a node
 209      * @param refNode Range ends after <code>refNode</code>.
 210      * @exception RangeException
 211      *   INVALID_NODE_TYPE_ERR: Raised if the root container of
 212      *   <code>refNode</code> is not an Attr, Document or DocumentFragment
 213      *   node or if <code>refNode</code> is a Document, DocumentFragment,
 214      *   Attr, Entity, or Notation node.
 215      * @exception DOMException
 216      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
 217      *   invoked on this object.
 218      *   <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
 219      *   from a different document than the one that created this range.
 220      */
 221     public void setEndAfter(Node refNode)
 222                             throws RangeException, DOMException;
 223 
 224     /**
 225      * Collapse a Range onto one of its boundary-points
 226      * @param toStart If TRUE, collapses the Range onto its start; if FALSE,
 227      *   collapses it onto its end.
 228      * @exception DOMException
 229      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
 230      *   invoked on this object.
 231      */
 232     public void collapse(boolean toStart)
 233                          throws DOMException;
 234 
 235     /**
 236      * Select a node and its contents
 237      * @param refNode The node to select.
 238      * @exception RangeException
 239      *   INVALID_NODE_TYPE_ERR: Raised if an ancestor of <code>refNode</code>
 240      *   is an Entity, Notation or DocumentType node or if
 241      *   <code>refNode</code> is a Document, DocumentFragment, Attr, Entity,
 242      *   or Notation node.
 243      * @exception DOMException
 244      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
 245      *   invoked on this object.
 246      *   <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
 247      *   from a different document than the one that created this range.
 248      */
 249     public void selectNode(Node refNode)
 250                            throws RangeException, DOMException;
 251 
 252     /**
 253      * Select the contents within a node
 254      * @param refNode Node to select from
 255      * @exception RangeException
 256      *   INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor
 257      *   of <code>refNode</code> is an Entity, Notation or DocumentType node.
 258      * @exception DOMException
 259      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
 260      *   invoked on this object.
 261      *   <br>WRONG_DOCUMENT_ERR: Raised if <code>refNode</code> was created
 262      *   from a different document than the one that created this range.
 263      */
 264     public void selectNodeContents(Node refNode)
 265                                    throws RangeException, DOMException;
 266 
 267     // CompareHow
 268     /**
 269      * Compare start boundary-point of <code>sourceRange</code> to start
 270      * boundary-point of Range on which <code>compareBoundaryPoints</code>
 271      * is invoked.
 272      */
 273     public static final short START_TO_START            = 0;
 274     /**
 275      * Compare start boundary-point of <code>sourceRange</code> to end
 276      * boundary-point of Range on which <code>compareBoundaryPoints</code>
 277      * is invoked.
 278      */
 279     public static final short START_TO_END              = 1;
 280     /**
 281      * Compare end boundary-point of <code>sourceRange</code> to end
 282      * boundary-point of Range on which <code>compareBoundaryPoints</code>
 283      * is invoked.
 284      */
 285     public static final short END_TO_END                = 2;
 286     /**
 287      * Compare end boundary-point of <code>sourceRange</code> to start
 288      * boundary-point of Range on which <code>compareBoundaryPoints</code>
 289      * is invoked.
 290      */
 291     public static final short END_TO_START              = 3;
 292 
 293     /**
 294      * Compare the boundary-points of two Ranges in a document.
 295      * @param how A code representing the type of comparison, as defined
 296      *   above.
 297      * @param sourceRange The <code>Range</code> on which this current
 298      *   <code>Range</code> is compared to.
 299      * @return  -1, 0 or 1 depending on whether the corresponding
 300      *   boundary-point of the Range is respectively before, equal to, or
 301      *   after the corresponding boundary-point of <code>sourceRange</code>.
 302      * @exception DOMException
 303      *   WRONG_DOCUMENT_ERR: Raised if the two Ranges are not in the same
 304      *   Document or DocumentFragment.
 305      *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
 306      *   been invoked on this object.
 307      */
 308     public short compareBoundaryPoints(short how,
 309                                        Range sourceRange)
 310                                        throws DOMException;
 311 
 312     /**
 313      * Removes the contents of a Range from the containing document or
 314      * document fragment without returning a reference to the removed
 315      * content.
 316      * @exception DOMException
 317      *   NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the content of
 318      *   the Range is read-only or any of the nodes that contain any of the
 319      *   content of the Range are read-only.
 320      *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
 321      *   been invoked on this object.
 322      */
 323     public void deleteContents()
 324                                throws DOMException;
 325 
 326     /**
 327      * Moves the contents of a Range from the containing document or document
 328      * fragment to a new DocumentFragment.
 329      * @return A DocumentFragment containing the extracted contents.
 330      * @exception DOMException
 331      *   NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the content of
 332      *   the Range is read-only or any of the nodes which contain any of the
 333      *   content of the Range are read-only.
 334      *   <br>HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be
 335      *   extracted into the new DocumentFragment.
 336      *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
 337      *   been invoked on this object.
 338      */
 339     public DocumentFragment extractContents()
 340                                             throws DOMException;
 341 
 342     /**
 343      * Duplicates the contents of a Range
 344      * @return A DocumentFragment that contains content equivalent to this
 345      *   Range.
 346      * @exception DOMException
 347      *   HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be
 348      *   extracted into the new DocumentFragment.
 349      *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
 350      *   been invoked on this object.
 351      */
 352     public DocumentFragment cloneContents()
 353                                           throws DOMException;
 354 
 355     /**
 356      * Inserts a node into the Document or DocumentFragment at the start of
 357      * the Range. If the container is a Text node, this will be split at the
 358      * start of the Range (as if the Text node's splitText method was
 359      * performed at the insertion point) and the insertion will occur
 360      * between the two resulting Text nodes. Adjacent Text nodes will not be
 361      * automatically merged. If the node to be inserted is a
 362      * DocumentFragment node, the children will be inserted rather than the
 363      * DocumentFragment node itself.
 364      * @param newNode The node to insert at the start of the Range
 365      * @exception DOMException
 366      *   NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of the
 367      *   start of the Range is read-only.
 368      *   <br>WRONG_DOCUMENT_ERR: Raised if <code>newNode</code> and the
 369      *   container of the start of the Range were not created from the same
 370      *   document.
 371      *   <br>HIERARCHY_REQUEST_ERR: Raised if the container of the start of
 372      *   the Range is of a type that does not allow children of the type of
 373      *   <code>newNode</code> or if <code>newNode</code> is an ancestor of
 374      *   the container.
 375      *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
 376      *   been invoked on this object.
 377      * @exception RangeException
 378      *   INVALID_NODE_TYPE_ERR: Raised if <code>newNode</code> is an Attr,
 379      *   Entity, Notation, or Document node.
 380      */
 381     public void insertNode(Node newNode)
 382                            throws DOMException, RangeException;
 383 
 384     /**
 385      * Reparents the contents of the Range to the given node and inserts the
 386      * node at the position of the start of the Range.
 387      * @param newParent The node to surround the contents with.
 388      * @exception DOMException
 389      *   NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of
 390      *   either boundary-point of the Range is read-only.
 391      *   <br>WRONG_DOCUMENT_ERR: Raised if <code> newParent</code> and the
 392      *   container of the start of the Range were not created from the same
 393      *   document.
 394      *   <br>HIERARCHY_REQUEST_ERR: Raised if the container of the start of
 395      *   the Range is of a type that does not allow children of the type of
 396      *   <code>newParent</code> or if <code>newParent</code> is an ancestor
 397      *   of the container or if <code>node</code> would end up with a child
 398      *   node of a type not allowed by the type of <code>node</code>.
 399      *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
 400      *   been invoked on this object.
 401      * @exception RangeException
 402      *   BAD_BOUNDARYPOINTS_ERR: Raised if the Range partially selects a
 403      *   non-text node.
 404      *   <br>INVALID_NODE_TYPE_ERR: Raised if <code> node</code> is an Attr,
 405      *   Entity, DocumentType, Notation, Document, or DocumentFragment node.
 406      */
 407     public void surroundContents(Node newParent)
 408                                  throws DOMException, RangeException;
 409 
 410     /**
 411      * Produces a new Range whose boundary-points are equal to the
 412      * boundary-points of the Range.
 413      * @return The duplicated Range.
 414      * @exception DOMException
 415      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
 416      *   invoked on this object.
 417      */
 418     public Range cloneRange()
 419                             throws DOMException;
 420 
 421     /**
 422      * Returns the contents of a Range as a string. This string contains only
 423      * the data characters, not any markup.
 424      * @return The contents of the Range.
 425      * @exception DOMException
 426      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
 427      *   invoked on this object.
 428      */
 429     public String toString()
 430                            throws DOMException;
 431 
 432     /**
 433      * Called to indicate that the Range is no longer in use and that the
 434      * implementation may relinquish any resources associated with this
 435      * Range. Subsequent calls to any methods or attribute getters on this
 436      * Range will result in a <code>DOMException</code> being thrown with an
 437      * error code of <code>INVALID_STATE_ERR</code>.
 438      * @exception DOMException
 439      *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
 440      *   invoked on this object.
 441      */
 442     public void detach()
 443                        throws DOMException;
 444 
 445 }