@Override public Point<N> locate(int location) { return doc.locate(location); }
@Override public String elementStartingAt(int pos) { E el = Point.elementAfter(doc, doc.locate(pos)); return isUsableElement(el) ? doc.getTagName(el) : null; }
@Override public String elementEndingAt(int pos) { E el = Point.elementEndingAt(doc, doc.locate(pos)); return isUsableElement(el) ? doc.getTagName(el) : null; }
@Override public Range deleteRange(int start, int end) { Preconditions.checkPositionIndexes(start, end, size()); // TODO(davidbyttow/danilatos): Handle this more efficiently. PointRange<N> range = deleteRange(doc.locate(start), doc.locate(end)); return new Range(doc.getLocation(range.getFirst()), doc.getLocation(range.getSecond())); }
@Override public Attributes attributesAt(int pos) { E el = Point.elementAfter(doc, doc.locate(pos)); return isUsableElement(el) ? new AttributesImpl(doc.getAttributes(el)) : null; }
@Override public String nthEnclosingElementTag(int insertionPoint, int depth) { E el = Point.enclosingElement(doc, doc.locate(insertionPoint)); while (depth > 0 && isUsableElement(el)) { el = doc.getParentElement(el); } return isUsableElement(el) ? doc.getTagName(el) : null; }
@Override public E insertXml(Point<N> point, XmlStringBuilder xml) { Point.checkPoint(this, point, "MutableDocumentImpl.insertXml"); try { begin(); int where = doc.getLocation(point); Builder builder = at(where); appendXmlToBuilder(xml, builder); consume(builder); return Point.elementAfter(this, doc.locate(where)); } finally { end(); } }
@SuppressWarnings("unchecked") @Override public int remainingCharactersInElement(int insertionPoint) { Point<N> point = doc.locate(insertionPoint); int num = 0; N node; if (point.isInTextNode()) { num += doc.getLength((T) point.getContainer()) - point.getTextOffset(); node = doc.getNextSibling(point.getContainer()); } else { node = point.getNodeAfter(); } T textNode; while ((textNode = doc.asText(node)) != null) { num += doc.getLength(textNode); node = doc.getNextSibling(node); } return num; }
@Override public E createElement(Point<N> point, String tagName, Map<String, String> attributes) { // TODO(danilatos): Validate point is in document. indexed doc should throw an exception // when calling getLocation anyway. Preconditions.checkNotNull(tagName, "createElement: tagName must not be null"); Point.checkPoint(this, point, "MutableDocumentImpl.createElement"); try { begin(); int location = doc.getLocation(point); consume(createElement(tagName, new AttributesImpl(attributes), at(location))); Point<N> result = doc.locate(location); return doc.asElement(result.isInTextNode() ? doc.getNextSibling(result.getContainer()) : result.getNodeAfter()); } finally { end(); } }