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