package net.atlanticbb.tantlinger.ui.text; import java.io.Writer; import javax.swing.text.Element; import javax.swing.text.html.HTMLDocument; import javax.swing.text.html.HTMLWriter; /** * Writer for writing the html of a specified element only. * * @author Bob Tantlinger * */ public class ElementWriter extends HTMLWriter { private Element root; private static int getStartPos(Element root, int start) { if(start >= root.getStartOffset() && start <= root.getEndOffset()) return start; return root.getStartOffset(); } private static int getEndPos(Element root, int end) { if(end >= root.getStartOffset() && end <= root.getEndOffset()) return end; return root.getEndOffset(); } public ElementWriter(Writer out, Element root) { this(out, root, root.getStartOffset(), root.getEndOffset()); } public ElementWriter(Writer out, Element root, int startPos, int endPos) { super(out, (HTMLDocument)root.getDocument(), getStartPos(root, startPos), Math.min(root.getDocument().getLength(), getEndPos(root, endPos) - getStartPos(root, startPos))); this.root = root; //setIndentSpace(0); setLineLength(Integer.MAX_VALUE); } protected boolean synthesizedElement(Element e) { return e.getStartOffset() < getStartOffset() || isAncestor(e, root) || super.synthesizedElement(e); } private static boolean isAncestor(Element a, Element d) { for(Element e = d.getParentElement(); e != null; e = e.getParentElement()) if(e == a) return true; return false; } }