OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [libjava/] [classpath/] [javax/] [swing/] [text/] [PlainDocument.java] - Blame information for rev 14

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 14 jlechner
/* PlainDocument.java --
2
   Copyright (C) 2002, 2004  Free Software Foundation, Inc.
3
 
4
This file is part of GNU Classpath.
5
 
6
GNU Classpath is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2, or (at your option)
9
any later version.
10
 
11
GNU Classpath is distributed in the hope that it will be useful, but
12
WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with GNU Classpath; see the file COPYING.  If not, write to the
18
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
02110-1301 USA.
20
 
21
Linking this library statically or dynamically with other modules is
22
making a combined work based on this library.  Thus, the terms and
23
conditions of the GNU General Public License cover the whole
24
combination.
25
 
26
As a special exception, the copyright holders of this library give you
27
permission to link this library with independent modules to produce an
28
executable, regardless of the license terms of these independent
29
modules, and to copy and distribute the resulting executable under
30
terms of your choice, provided that you also meet, for each linked
31
independent module, the terms and conditions of the license of that
32
module.  An independent module is a module which is not derived from
33
or based on this library.  If you modify this library, you may extend
34
this exception to your version of the library, but you are not
35
obligated to do so.  If you do not wish to do so, delete this
36
exception statement from your version. */
37
 
38
 
39
package javax.swing.text;
40
 
41
import java.util.ArrayList;
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
    // added and removed are Element arrays used to add an ElementEdit
117
    // to the DocumentEvent if there were entire lines added or removed.
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
        // Determine how many NEW lines were added by finding the newline
126
        // characters within the newly inserted text
127
        int j = firstElement.getStartOffset();
128
        int i = str.indexOf('\n', offset);
129
        while (i != -1 && i <= end)
130
          {
131
            // For each new line, create a new element
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
        // If there were new lines added we have to add an ElementEdit to 
140
        // the DocumentEvent and we have to call rootElement.replace to 
141
        // insert the new lines
142
        if (elts.size() != 0)
143
          {
144
            // Set up the ElementEdit by filling the added and removed 
145
            // arrays with the proper Elements
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
            // Now create and add the ElementEdit
152
            ElementEdit e = new ElementEdit(rootElement, elementIndex, removed,
153
                                            added);
154
            event.addEdit(e);
155
 
156
            // And call replace to actually make the changes
157
            ((BranchElement) rootElement).replace(elementIndex, 1, added);
158
          }
159
      }
160
    catch (BadLocationException e)
161
      {
162
        // This shouldn't happen so we throw an AssertionError
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
    // added and removed are Element arrays used to add an ElementEdit
175
    // to the DocumentEvent if there were entire lines added or removed
176
    // from the Document
177
    Element[] added = new Element[1];
178
    Element[] removed;
179
    int p0 = event.getOffset();
180
 
181
    // check if we must collapse some elements
182
    int i1 = rootElement.getElementIndex(p0);
183
    int i2 = rootElement.getElementIndex(p0 + event.getLength());
184
    if (i1 != i2)
185
      {
186
        // If there were lines removed then we have to add an ElementEdit
187
        // to the DocumentEvent so we set it up now by filling the Element
188
        // arrays "removed" and "added" appropriately
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
        // Now create and add the ElementEdit
200
        ElementEdit e = new ElementEdit(rootElement, i1, removed, added);
201
        event.addEdit(e);
202
 
203
        // collapse elements if the removal spans more than 1 line
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
  /**
220
   * Inserts a string into the document. If the document property
221
   * '<code>filterNewLines</code>' is set to <code>Boolean.TRUE</code>, then
222
   * all newlines in the inserted string are replaced by space characters,
223
   * otherwise the superclasses behaviour is executed.
224
   *
225
   * Inserting content causes a write lock to be acquired during this method
226
   * call.
227
   *
228
   * @param offs the offset at which to insert the string
229
   * @param str the string to be inserted
230
   * @param atts the text attributes of the string to be inserted
231
   *
232
   * @throws BadLocationException
233
   */
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
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.