Initial revision
[old-projects.git] / ekit / com / hexidec / ekit / component / ExtendedHTMLDocument.java
CommitLineData
c2da4d40
JL
1package com.hexidec.ekit.component;\r
2\r
3import javax.swing.text.html.HTMLDocument;\r
4import javax.swing.text.Element;\r
5import javax.swing.text.AttributeSet;\r
6import javax.swing.text.MutableAttributeSet;\r
7import javax.swing.text.AbstractDocument;\r
8import javax.swing.text.BadLocationException;\r
9import javax.swing.undo.UndoableEdit;\r
10import javax.swing.text.html.StyleSheet;\r
11import javax.swing.text.html.HTML;\r
12import javax.swing.text.AbstractDocument.BranchElement;\r
13import java.util.Enumeration;\r
14import javax.swing.event.DocumentEvent;\r
15import javax.swing.event.UndoableEditEvent;\r
16\r
17public class ExtendedHTMLDocument\r
18 extends HTMLDocument {\r
19\r
20 public ExtendedHTMLDocument() {\r
21\r
22 }\r
23\r
24 public ExtendedHTMLDocument(AbstractDocument.Content c, StyleSheet styles) {\r
25 super(c, styles);\r
26 }\r
27\r
28 public ExtendedHTMLDocument(StyleSheet styles) {\r
29 super(styles);\r
30 }\r
31\r
32//-------------------------------------------------------------------------------------\r
33\r
34\r
35/**\r
36 *\r
37 * Überschreibt die Attribute des Elements.\r
38 *\r
39 * @param e Element bei dem die Attribute geändert werden sollen\r
40 * @param a AttributeSet mit den neuen Attributen\r
41 * @param tag Angabe was für ein Tag das Element ist\r
42 */\r
43 public void replaceAttributes(Element e, AttributeSet a, HTML.Tag tag) {\r
44 if( (e != null) && (a != null)) {\r
45 try {\r
46 writeLock();\r
47 int start = e.getStartOffset();\r
48 DefaultDocumentEvent changes = new DefaultDocumentEvent(start,\r
49 e.getEndOffset() - start, DocumentEvent.EventType.CHANGE);\r
50 AttributeSet sCopy = a.copyAttributes();\r
51 changes.addEdit(new AttributeUndoableEdit(e, sCopy, false));\r
52 MutableAttributeSet attr = (MutableAttributeSet) e.getAttributes();\r
53 Enumeration aNames = attr.getAttributeNames();\r
54 Object value;\r
55 Object aName;\r
56 while (aNames.hasMoreElements()) {\r
57 aName = aNames.nextElement();\r
58 value = attr.getAttribute(aName);\r
59 if(value != null && !value.toString().equalsIgnoreCase(tag.toString())) {\r
60 attr.removeAttribute(aName);\r
61 }\r
62 }\r
63 attr.addAttributes(a);\r
64 changes.end();\r
65 fireChangedUpdate(changes);\r
66 fireUndoableEditUpdate(new UndoableEditEvent(this, changes));\r
67 }\r
68 finally {\r
69 writeUnlock();\r
70 }\r
71 }\r
72 }\r
73\r
74\r
75 public void removeElements(Element e, int index, int count) throws\r
76 BadLocationException {\r
77 writeLock();\r
78 int start = e.getElement(index).getStartOffset();\r
79 int end = e.getElement(index + count - 1).getEndOffset();\r
80 try {\r
81 Element[] removed = new Element[count];\r
82 Element[] added = new Element[0];\r
83 for (int counter = 0; counter < count; counter++) {\r
84 removed[counter] = e.getElement(counter + index);\r
85 }\r
86 DefaultDocumentEvent dde = new DefaultDocumentEvent(\r
87 start, end - start, DocumentEvent.EventType.REMOVE);\r
88 ( (AbstractDocument.BranchElement) e).replace(index, removed.length,\r
89 added);\r
90 dde.addEdit(new ElementEdit(e, index, removed, added));\r
91 UndoableEdit u = getContent().remove(start, end - start);\r
92 if(u != null) {\r
93 dde.addEdit(u);\r
94 }\r
95 postRemoveUpdate(dde);\r
96 dde.end();\r
97 fireRemoveUpdate(dde);\r
98 if(u != null) {\r
99 fireUndoableEditUpdate(new UndoableEditEvent(this, dde));\r
100 }\r
101 }\r
102 finally {\r
103 writeUnlock();\r
104 }\r
105 }\r
106}