/**
   * Returns the x-value for a time period.
   *
   * @param period the time period.
   * @return The x-value.
   */
  private long getX(TimePeriod period) {

    if (this.xPosition == TimePeriodAnchor.START) {
      return period.getStart().getTime();
    } else if (this.xPosition == TimePeriodAnchor.MIDDLE) {
      return period.getStart().getTime() / 2 + period.getEnd().getTime() / 2;
    } else if (this.xPosition == TimePeriodAnchor.END) {
      return period.getEnd().getTime();
    } else {
      throw new IllegalStateException("TimePeriodAnchor unknown.");
    }
  }
 /**
  * Returns the x-value for a time period.
  *
  * @param period the time period.
  * @return The x-value.
  */
 private long getXValue(TimePeriod period) {
   long result = 0L;
   if (this.xPosition == TimePeriodAnchor.START) {
     result = period.getStart().getTime();
   } else if (this.xPosition == TimePeriodAnchor.MIDDLE) {
     long t0 = period.getStart().getTime();
     long t1 = period.getEnd().getTime();
     result = t0 + (t1 - t0) / 2L;
   } else if (this.xPosition == TimePeriodAnchor.END) {
     result = period.getEnd().getTime();
   }
   return result;
 }
  /**
   * Returns the range of the values in this dataset's domain.
   *
   * @param includeInterval a flag that controls whether or not the x-intervals are taken into
   *     account.
   * @return The range.
   */
  public Range getDomainBounds(boolean includeInterval) {
    List keys = this.values.getRowKeys();
    if (keys.isEmpty()) {
      return null;
    }

    TimePeriod first = (TimePeriod) keys.get(0);
    TimePeriod last = (TimePeriod) keys.get(keys.size() - 1);

    if (!includeInterval || this.domainIsPointsInTime) {
      return new Range(getXValue(first), getXValue(last));
    } else {
      return new Range(first.getStart().getTime(), last.getEnd().getTime());
    }
  }
 /**
  * Returns the range of the values in this dataset's domain.
  *
  * @param includeInterval a flag that determines whether or not the x-interval is taken into
  *     account.
  * @return The range.
  */
 @Override
 public Range getDomainBounds(boolean includeInterval) {
   boolean interval = includeInterval || this.domainIsPointsInTime;
   Range result = null;
   Range temp = null;
   Iterator iterator = this.data.iterator();
   while (iterator.hasNext()) {
     TimePeriodValues series = (TimePeriodValues) iterator.next();
     int count = series.getItemCount();
     if (count > 0) {
       TimePeriod start = series.getTimePeriod(series.getMinStartIndex());
       TimePeriod end = series.getTimePeriod(series.getMaxEndIndex());
       if (!interval) {
         if (this.xPosition == TimePeriodAnchor.START) {
           TimePeriod maxStart = series.getTimePeriod(series.getMaxStartIndex());
           temp = new Range(start.getStart().getTime(), maxStart.getStart().getTime());
         } else if (this.xPosition == TimePeriodAnchor.MIDDLE) {
           TimePeriod minMiddle = series.getTimePeriod(series.getMinMiddleIndex());
           long s1 = minMiddle.getStart().getTime();
           long e1 = minMiddle.getEnd().getTime();
           TimePeriod maxMiddle = series.getTimePeriod(series.getMaxMiddleIndex());
           long s2 = maxMiddle.getStart().getTime();
           long e2 = maxMiddle.getEnd().getTime();
           temp = new Range(s1 + (e1 - s1) / 2, s2 + (e2 - s2) / 2);
         } else if (this.xPosition == TimePeriodAnchor.END) {
           TimePeriod minEnd = series.getTimePeriod(series.getMinEndIndex());
           temp = new Range(minEnd.getEnd().getTime(), end.getEnd().getTime());
         }
       } else {
         temp = new Range(start.getStart().getTime(), end.getEnd().getTime());
       }
       result = Range.combine(result, temp);
     }
   }
   return result;
 }
 /**
  * Returns the end x-value (as a double primitive) for an item within a series.
  *
  * @param series the series index (zero-based).
  * @param item the item index (zero-based).
  * @return The value.
  */
 public double getEndXValue(int series, int item) {
   TimePeriod period = (TimePeriod) this.values.getRowKey(item);
   return period.getEnd().getTime();
 }
  /**
   * Update the index values for the maximum and minimum bounds.
   *
   * @param period the time period.
   * @param index the index of the time period.
   */
  private void updateBounds(TimePeriod period, int index) {

    long start = period.getStart().getTime();
    long end = period.getEnd().getTime();
    long middle = start + ((end - start) / 2);

    if (this.minStartIndex >= 0) {
      long minStart = getDataItem(this.minStartIndex).getPeriod().getStart().getTime();
      if (start < minStart) {
        this.minStartIndex = index;
      }
    } else {
      this.minStartIndex = index;
    }

    if (this.maxStartIndex >= 0) {
      long maxStart = getDataItem(this.maxStartIndex).getPeriod().getStart().getTime();
      if (start > maxStart) {
        this.maxStartIndex = index;
      }
    } else {
      this.maxStartIndex = index;
    }

    if (this.minMiddleIndex >= 0) {
      long s = getDataItem(this.minMiddleIndex).getPeriod().getStart().getTime();
      long e = getDataItem(this.minMiddleIndex).getPeriod().getEnd().getTime();
      long minMiddle = s + (e - s) / 2;
      if (middle < minMiddle) {
        this.minMiddleIndex = index;
      }
    } else {
      this.minMiddleIndex = index;
    }

    if (this.maxMiddleIndex >= 0) {
      long s = getDataItem(this.maxMiddleIndex).getPeriod().getStart().getTime();
      long e = getDataItem(this.maxMiddleIndex).getPeriod().getEnd().getTime();
      long maxMiddle = s + (e - s) / 2;
      if (middle > maxMiddle) {
        this.maxMiddleIndex = index;
      }
    } else {
      this.maxMiddleIndex = index;
    }

    if (this.minEndIndex >= 0) {
      long minEnd = getDataItem(this.minEndIndex).getPeriod().getEnd().getTime();
      if (end < minEnd) {
        this.minEndIndex = index;
      }
    } else {
      this.minEndIndex = index;
    }

    if (this.maxEndIndex >= 0) {
      long maxEnd = getDataItem(this.maxEndIndex).getPeriod().getEnd().getTime();
      if (end > maxEnd) {
        this.maxEndIndex = index;
      }
    } else {
      this.maxEndIndex = index;
    }
  }