1:
37:
38:
39: package ;
40:
41: import ;
42:
43: public class PlainDocument extends AbstractDocument
44: {
45: private static final long serialVersionUID = 4758290289196893664L;
46:
47: public static final String lineLimitAttribute = "lineLimit";
48: public static final String tabSizeAttribute = "tabSize";
49:
50: private BranchElement rootElement;
51: private int tabSize;
52:
53: public PlainDocument()
54: {
55: this(new GapContent());
56: }
57:
58: public PlainDocument(AbstractDocument.Content content)
59: {
60: super(content);
61: tabSize = 8;
62: rootElement = (BranchElement) createDefaultRoot();
63: }
64:
65: private void reindex()
66: {
67: Element[] lines;
68: try
69: {
70: String str = content.getString(0, content.length());
71:
72: ArrayList elts = new ArrayList();
73: int j = 0;
74: for (int i = str.indexOf('\n', 0); i != -1; i = str.indexOf('\n', i + 1))
75: {
76: elts.add(createLeafElement(rootElement, SimpleAttributeSet.EMPTY, j, i + 1));
77: j = i + 1;
78: }
79:
80: if (j < content.length())
81: elts.add(createLeafElement(rootElement, SimpleAttributeSet.EMPTY, j, content.length()));
82:
83: lines = new Element[elts.size()];
84: for (int i = 0; i < elts.size(); ++i)
85: lines[i] = (Element) elts.get(i);
86: }
87: catch (BadLocationException e)
88: {
89: lines = new Element[1];
90: lines[0] = createLeafElement(rootElement, SimpleAttributeSet.EMPTY, 0, 1);
91: }
92:
93: ((BranchElement) rootElement).replace(0, rootElement.getElementCount(), lines);
94: }
95:
96: protected AbstractDocument.AbstractElement createDefaultRoot()
97: {
98: BranchElement root =
99: (BranchElement) createBranchElement(null, SimpleAttributeSet.EMPTY);
100:
101: Element[] array = new Element[1];
102: array[0] = createLeafElement(root, SimpleAttributeSet.EMPTY, 0, 1);
103: root.replace(0, 0, array);
104:
105: return root;
106: }
107:
108: protected void insertUpdate(DefaultDocumentEvent event,
109: AttributeSet attributes)
110: {
111: int offset = event.getOffset();
112: int end = offset + event.getLength();
113: int elementIndex = rootElement.getElementIndex(offset);
114: Element firstElement = rootElement.getElement(elementIndex);
115:
116:
117:
118: Element[] removed = new Element[1];
119: Element[] added;
120: try
121: {
122: String str = content.getString(0, content.length());
123: ArrayList elts = new ArrayList();
124:
125:
126:
127: int j = firstElement.getStartOffset();
128: int i = str.indexOf('\n', offset);
129: while (i != -1 && i <= end)
130: {
131:
132: elts.add(createLeafElement(rootElement, SimpleAttributeSet.EMPTY,
133: j, i + 1));
134: j = i + 1;
135: if (j >= str.length())
136: break;
137: i = str.indexOf('\n', j);
138: }
139:
140:
141:
142: if (elts.size() != 0)
143: {
144:
145:
146: added = new Element[elts.size()];
147: for (int k = 0; k < elts.size(); ++k)
148: added[k] = (Element) elts.get(k);
149: removed[0] = firstElement;
150:
151:
152: ElementEdit e = new ElementEdit(rootElement, elementIndex, removed,
153: added);
154: event.addEdit(e);
155:
156:
157: ((BranchElement) rootElement).replace(elementIndex, 1, added);
158: }
159: }
160: catch (BadLocationException e)
161: {
162:
163: AssertionError ae = new AssertionError();
164: ae.initCause(e);
165: throw ae;
166: }
167: super.insertUpdate(event, attributes);
168: }
169:
170: protected void removeUpdate(DefaultDocumentEvent event)
171: {
172: super.removeUpdate(event);
173:
174:
175:
176:
177: Element[] added = new Element[1];
178: Element[] removed;
179: int p0 = event.getOffset();
180:
181:
182: int i1 = rootElement.getElementIndex(p0);
183: int i2 = rootElement.getElementIndex(p0 + event.getLength());
184: if (i1 != i2)
185: {
186:
187:
188:
189: removed = new Element [i2 - i1 + 1];
190: for (int i = i1; i <= i2; i++)
191: removed[i-i1] = rootElement.getElement(i);
192:
193: int start = rootElement.getElement(i1).getStartOffset();
194: int end = rootElement.getElement(i2).getEndOffset();
195: added[0] = createLeafElement(rootElement,
196: SimpleAttributeSet.EMPTY,
197: start, end);
198:
199:
200: ElementEdit e = new ElementEdit(rootElement, i1, removed, added);
201: event.addEdit(e);
202:
203:
204: rootElement.replace(i1, i2 - i1 + 1, added);
205: }
206: }
207:
208: public Element getDefaultRootElement()
209: {
210: return rootElement;
211: }
212:
213: public Element getParagraphElement(int pos)
214: {
215: Element root = getDefaultRootElement();
216: return root.getElement(root.getElementIndex(pos));
217: }
218:
219:
234: public void insertString(int offs, String str, AttributeSet atts)
235: throws BadLocationException
236: {
237: String string = str;
238: if (str != null && Boolean.TRUE.equals(getProperty("filterNewlines")))
239: string = str.replaceAll("\n", " ");
240: super.insertString(offs, string, atts);
241: }
242: }