Exemplo n.º 1
0
 public OffsetRange findOffsetRangeForOffset(int offset) {
   if (optimizedRangeListElement.offsetInRange(offset)) {
     return optimizedRangeListElement;
   } else if (offset > optimizedRangeListElement.getStart()) {
     while (optimizedRangeListElement.getStart() < offset && optimizedListPointer.hasNext()) {
       optimizedRangeListElement = optimizedListPointer.next();
       if (optimizedRangeListElement.offsetInRange(offset)) {
         return optimizedRangeListElement;
       }
     }
     throw new RuntimeException("Offset " + offset + " beyond last range");
   } else {
     // we don't expect to exercise this case.
     // has to be smaller, no?
     while (offset < optimizedRangeListElement.getStart() && optimizedListPointer.hasPrevious()) {
       optimizedRangeListElement = optimizedListPointer.previous();
       if (optimizedRangeListElement.offsetInRange(offset)) {
         return optimizedRangeListElement;
       }
     }
     throw new RuntimeException("Offset " + offset + " before the first offset");
   }
 }
Exemplo n.º 2
0
 /**
  * If we need to split a range for annotation, we want to keep the map of offset ranges usable.
  * Note that the caller has to revalidate or maintain any indices it has grabbed for ranges after
  * the one we are splitting. Note that this does not insert the new text node into the parent
  * contents, the caller does that.
  *
  * @param range
  * @param splitPoint
  * @return
  */
 public TextNode splitText(int rangePoint, int splitPoint) {
   assert splitPoint > 0;
   OffsetRange range = offsetRanges.get(rangePoint);
   assert splitPoint < range.getText().text().length();
   TextNode newText = new TextNode(range.getText().text().substring(splitPoint), null);
   range.getText().text(range.getText().text().substring(0, splitPoint));
   OffsetRange newRange = new OffsetRange(range.getStart() + splitPoint, range.getEnd(), newText);
   offsetRanges.add(rangePoint + 1, newRange);
   range.setEnd(splitPoint + range.getStart());
   assert range.getText().text().length() == range.getEnd() - range.getStart();
   return newText;
 }