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, AttributeSet attributes)
109: {
110: reindex();
111:
112: super.insertUpdate(event, attributes);
113: }
114:
115: protected void removeUpdate(DefaultDocumentEvent event)
116: {
117: super.removeUpdate(event);
118:
119: int p0 = event.getOffset();
120: int len = event.getLength();
121: int p1 = len + p0;
122:
123:
124: int i1 = rootElement.getElementIndex(p0);
125: int i2 = rootElement.getElementIndex(p1);
126: if (i1 != i2)
127: {
128: Element el1 = rootElement.getElement(i1);
129: Element el2 = rootElement.getElement(i2);
130: int start = el1.getStartOffset();
131: int end = el2.getEndOffset();
132:
133: Element newEl = createLeafElement(rootElement,
134: SimpleAttributeSet.EMPTY,
135: start, end - len);
136: rootElement.replace(i1, i2 - i1, new Element[]{ newEl });
137: }
138: }
139:
140: public Element getDefaultRootElement()
141: {
142: return rootElement;
143: }
144:
145: public Element getParagraphElement(int pos)
146: {
147: Element root = getDefaultRootElement();
148: return root.getElement(root.getElementIndex(pos));
149: }
150: }