home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / VCAFE.3.0A / Main.bin / Range.java < prev    next >
Text File  |  1998-10-25  |  5KB  |  151 lines

  1. /*
  2.  * Copyright 1998 Symantec Corporation, All Rights Reserved.
  3.  */
  4.  
  5. package com.symantec.itools.vcafe.openapi;
  6.  
  7. /**
  8.  * A byte offset and length in a <code>SourceFile</code>. It is <i>not</i> the range of the unicode
  9.  * version of that text. Note that this means that a <code>Range</code> cannot be computed arbitrarily
  10.  * from the unicode <code>StringBuffer</code> equivalent text. Ranges are meant to be passed from
  11.  * Visual Cafe to plug-ins, and not vice-versa.
  12.  *
  13.  * @see     SourceFile
  14.  *
  15.  * @author Symantec Internet Tools Division
  16.  * @version 1.0
  17.  * @since VCafe 3.0
  18.  */
  19. public final class Range
  20. {
  21.     /**
  22.      * Starting character position in bytes, numbering from zero.
  23.      */
  24.     int start;
  25.     
  26.     /**
  27.      * Length of range in bytes.
  28.      */
  29.     int length;
  30.     
  31.     /**
  32.      * Constructs a <code>Range</code> that starts at the specified character position (in bytes), and
  33.      * has the given length (also in bytes).
  34.      * @param start starting character position in bytes, numbering from zero.
  35.      * @param length length of the range in bytes.
  36.      */
  37.     public Range(int start, int length) {
  38.         this.start = start;
  39.         this.length = length;
  40.     }
  41.     
  42.     /**
  43.      * Constructs a <code>Range</code> that has the same start and length as the given <code>Range</code>.
  44.      * @param r the given <code>Range</code>.
  45.      */
  46.     public Range(Range r) {
  47.         this(r.start, r.length);
  48.     }
  49.  
  50.     /**
  51.      * Determines whether the range is empty (<code>Range</code> length is zero). If this is true, this
  52.      * <code>Range</code> is an insertion point, otherwise it is an area of text.
  53.      * @return <code>true</code> if the range is empty.
  54.      */
  55.     public boolean isEmpty() {
  56.         return length == 0;
  57.     }
  58.     
  59.     /**
  60.      * Gets the starting character position, in zero-based bytes.
  61.      * @return the start of this <code>Range</code> in zero-based bytes.
  62.      */
  63.     public int getStart() {
  64.         return start;
  65.     }
  66.     
  67.     /**
  68.      * Gets the length.
  69.      * @return the length of this <code>Range</code> in bytes.
  70.      */
  71.     public int getLength() {
  72.         return length;
  73.     }
  74.  
  75.     /**
  76.      * Determines the ending character position, in zero-based bytes.
  77.      * @return the ending character position in bytes, in zero-based based.
  78.      */
  79.     public int getEnd() {
  80.         if (length == 0) return start;
  81.         return start+length-1;
  82.     }
  83.  
  84.     /**
  85.      * Creates a new <code>Range</code> that contains the full extend of both this and the
  86.      * given <code>Range</code>.
  87.      * @param r the given <code>Range</code> (may be <code>null</code>).
  88.      * @return a new <code>Range</code> whose extent contains both this and the given <code>Range</code>.
  89.      */
  90.     public Range union(Range r) {
  91.         if (r == null) return new Range(this);
  92.  
  93.         int newStart, newEnd;
  94.         int currentEnd = getEnd();
  95.         newStart = (this.start < r.start) ? this.start : r.start;
  96.         newEnd = (currentEnd < r.getEnd()) ? r.getEnd() : currentEnd;
  97.         return new Range(newStart, newEnd - newStart + 1);
  98.     }
  99.  
  100.     /**
  101.      * Determines whether the extent of this <code>Range</code> contains the specified offset.
  102.      * @param offset the offset, in zero-based bytes.
  103.      * @return <code>true</code> if this <code>Range</code> contains the offset, <code>false</code> otherwise.
  104.      */
  105.     public boolean contains(int offset) {
  106.         if (offset < start) return false;
  107.         if (offset > getEnd()) return false;
  108.         return true;
  109.     }
  110.  
  111.     /**
  112.      * Determines whether this <code>Range</code> fully contains the give <code>Range r</code>.
  113.      * @param r the given <code>Range</code>.
  114.      * @return <code>true</code> if the given <code>Range</code> is fully contained by this
  115.      * <code>Range</code>, <code>false</code> otherwise.
  116.      */
  117.     public boolean contains(Range r) {
  118.         return this.contains(r.start) && this.contains(r.getEnd());
  119.     }
  120.  
  121.     /**
  122.      * Determines whether this <code>Range</code> has the identical extent as the given <code>Range</code>.
  123.      * @param r the given <code>Range</code>.
  124.      * @return <code>true</code> if the extents are the same,  <code>false</code> otherwise.
  125.      */
  126.     public boolean equals(Range r) {
  127.         return (this.start == r.start) && (this.length == r.length);
  128.     }
  129.  
  130.     /**
  131.      * Determines the absolute distance of the given offset from this <code>Range</code>.  If the offset is
  132.      * contained within the extent of this <code>Range</code>, 0 is returned.
  133.      * @param offset the given offset
  134.      * @return the offset's absolute distance away, or 0 if the offset is contained by this <code>Range</code>.
  135.      */
  136.     public int getDistance(int offset) {
  137.         if (offset < start) return start - offset;
  138.         offset -= getEnd();
  139.         if (offset > 0) return offset;
  140.         return 0;
  141.     }
  142.     
  143.     /**
  144.      * Gets a <code>String</code> that represents this object.
  145.      * @return the <code>String</code>.
  146.      */
  147.     public String toString() {
  148.         return "Range[" + start + "," + length + ")";
  149.     }
  150. }
  151.