Initial revision
[old-projects.git] / ekit / com / hexidec / ekit / component / ExtendedHTMLDocument.java
diff --git a/ekit/com/hexidec/ekit/component/ExtendedHTMLDocument.java b/ekit/com/hexidec/ekit/component/ExtendedHTMLDocument.java
new file mode 100644 (file)
index 0000000..2c016db
--- /dev/null
@@ -0,0 +1,106 @@
+package com.hexidec.ekit.component;\r
+\r
+import javax.swing.text.html.HTMLDocument;\r
+import javax.swing.text.Element;\r
+import javax.swing.text.AttributeSet;\r
+import javax.swing.text.MutableAttributeSet;\r
+import javax.swing.text.AbstractDocument;\r
+import javax.swing.text.BadLocationException;\r
+import javax.swing.undo.UndoableEdit;\r
+import javax.swing.text.html.StyleSheet;\r
+import javax.swing.text.html.HTML;\r
+import javax.swing.text.AbstractDocument.BranchElement;\r
+import java.util.Enumeration;\r
+import javax.swing.event.DocumentEvent;\r
+import javax.swing.event.UndoableEditEvent;\r
+\r
+public class ExtendedHTMLDocument\r
+    extends HTMLDocument {\r
+\r
+  public ExtendedHTMLDocument() {\r
+\r
+  }\r
+\r
+  public ExtendedHTMLDocument(AbstractDocument.Content c, StyleSheet styles) {\r
+    super(c, styles);\r
+  }\r
+\r
+  public ExtendedHTMLDocument(StyleSheet styles) {\r
+    super(styles);\r
+  }\r
+\r
+//-------------------------------------------------------------------------------------\r
+\r
+\r
+/**\r
+ *\r
+ * Überschreibt die Attribute des Elements.\r
+ *\r
+ * @param e Element bei dem die Attribute geändert werden sollen\r
+ * @param a AttributeSet mit den neuen Attributen\r
+ * @param tag Angabe was für ein Tag das Element ist\r
+ */\r
+  public void replaceAttributes(Element e, AttributeSet a, HTML.Tag tag) {\r
+    if( (e != null) && (a != null)) {\r
+      try {\r
+       writeLock();\r
+       int start = e.getStartOffset();\r
+       DefaultDocumentEvent changes = new DefaultDocumentEvent(start,\r
+           e.getEndOffset() - start, DocumentEvent.EventType.CHANGE);\r
+       AttributeSet sCopy = a.copyAttributes();\r
+       changes.addEdit(new AttributeUndoableEdit(e, sCopy, false));\r
+       MutableAttributeSet attr = (MutableAttributeSet) e.getAttributes();\r
+       Enumeration aNames = attr.getAttributeNames();\r
+       Object value;\r
+       Object aName;\r
+       while (aNames.hasMoreElements()) {\r
+         aName = aNames.nextElement();\r
+         value = attr.getAttribute(aName);\r
+         if(value != null && !value.toString().equalsIgnoreCase(tag.toString())) {\r
+           attr.removeAttribute(aName);\r
+         }\r
+       }\r
+       attr.addAttributes(a);\r
+       changes.end();\r
+       fireChangedUpdate(changes);\r
+       fireUndoableEditUpdate(new UndoableEditEvent(this, changes));\r
+      }\r
+      finally {\r
+       writeUnlock();\r
+      }\r
+    }\r
+  }\r
+\r
+\r
+  public void removeElements(Element e, int index, int count) throws\r
+      BadLocationException {\r
+    writeLock();\r
+    int start = e.getElement(index).getStartOffset();\r
+    int end = e.getElement(index + count - 1).getEndOffset();\r
+    try {\r
+      Element[] removed = new Element[count];\r
+      Element[] added = new Element[0];\r
+      for (int counter = 0; counter < count; counter++) {\r
+       removed[counter] = e.getElement(counter + index);\r
+      }\r
+      DefaultDocumentEvent dde = new DefaultDocumentEvent(\r
+         start, end - start, DocumentEvent.EventType.REMOVE);\r
+      ( (AbstractDocument.BranchElement) e).replace(index, removed.length,\r
+         added);\r
+      dde.addEdit(new ElementEdit(e, index, removed, added));\r
+      UndoableEdit u = getContent().remove(start, end - start);\r
+      if(u != null) {\r
+       dde.addEdit(u);\r
+      }\r
+      postRemoveUpdate(dde);\r
+      dde.end();\r
+      fireRemoveUpdate(dde);\r
+      if(u != null) {\r
+       fireUndoableEditUpdate(new UndoableEditEvent(this, dde));\r
+      }\r
+    }\r
+    finally {\r
+      writeUnlock();\r
+    }\r
+  }\r
+}
\ No newline at end of file