History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/javax/swing/JTextPane.java (1 of 18352 files). Show all

Unified · Split

java/pkg/javax/swing/JTextPane.java+493−0
@@ -0,0 +1,493 @@
1/*
2 * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25package javax.swing;
26
27import java.awt.*;
28import java.awt.event.ActionEvent;
29
30import java.io.ObjectOutputStream;
31import java.io.ObjectInputStream;
32import java.io.IOException;
33
34import javax.swing.text.*;
35import javax.swing.event.*;
36import javax.swing.plaf.*;
37
38/**
39 * A text component that can be marked up with attributes that are
40 * represented graphically.
41 * You can find how-to information and examples of using text panes in
42 * <a href="http://java.sun.com/docs/books/tutorial/uiswing/components/text.html">Using Text Components</a>,
43 * a section in <em>The Java Tutorial.</em>
44 *
45 * <p>
46 * This component models paragraphs
47 * that are composed of runs of character level attributes. Each
48 * paragraph may have a logical style attached to it which contains
49 * the default attributes to use if not overridden by attributes set
50 * on the paragraph or character run. Components and images may
51 * be embedded in the flow of text.
52 * <p>
53 * <dl>
54 * <dt><b><font size=+1>Newlines</font></b>
55 * <dd>
56 * For a discussion on how newlines are handled, see
57 * <a href="text/DefaultEditorKit.html">DefaultEditorKit</a>.
58 * </dl>
59 *
60 * <p>
61 * <strong>Warning:</strong> Swing is not thread safe. For more
62 * information see <a
63 * href="package-summary.html#threading">Swing's Threading
64 * Policy</a>.
65 * <p>
66 * <strong>Warning:</strong>
67 * Serialized objects of this class will not be compatible with
68 * future Swing releases. The current serialization support is
69 * appropriate for short term storage or RMI between applications running
70 * the same version of Swing. As of 1.4, support for long term storage
71 * of all JavaBeans<sup><font size="-2">TM</font></sup>
72 * has been added to the <code>java.beans</code> package.
73 * Please see {@link java.beans.XMLEncoder}.
74 *
75 * @beaninfo
76 * attribute: isContainer true
77 * description: A text component that can be marked up with attributes that are graphically represented.
78 *
79 * @author Timothy Prinzing
80 * @see javax.swing.text.StyledEditorKit
81 */
82public class JTextPane extends JEditorPane {
83
84 /**
85 * Creates a new <code>JTextPane</code>. A new instance of
86 * <code>StyledEditorKit</code> is
87 * created and set, and the document model set to <code>null</code>.
88 */
89 public JTextPane() {
90 super();
91 EditorKit editorKit = createDefaultEditorKit();
92 String contentType = editorKit.getContentType();
93 if (contentType != null
94 && getEditorKitClassNameForContentType(contentType) ==
95 defaultEditorKitMap.get(contentType)) {
96 setEditorKitForContentType(contentType, editorKit);
97 }
98 setEditorKit(editorKit);
99 }
100
101 /**
102 * Creates a new <code>JTextPane</code>, with a specified document model.
103 * A new instance of <code>javax.swing.text.StyledEditorKit</code>
104 * is created and set.
105 *
106 * @param doc the document model
107 */
108 public JTextPane(StyledDocument doc) {
109 this();
110 setStyledDocument(doc);
111 }
112
113 /**
114 * Returns the class ID for the UI.
115 *
116 * @return the string "TextPaneUI"
117 *
118 * @see JComponent#getUIClassID
119 * @see UIDefaults#getUI
120 */
121 public String getUIClassID() {
122 return uiClassID;
123 }
124
125 /**
126 * Associates the editor with a text document. This
127 * must be a <code>StyledDocument</code>.
128 *
129 * @param doc the document to display/edit
130 * @exception IllegalArgumentException if <code>doc</code> can't
131 * be narrowed to a <code>StyledDocument</code> which is the
132 * required type of model for this text component
133 */
134 public void setDocument(Document doc) {
135 if (doc instanceof StyledDocument) {
136 super.setDocument(doc);
137 } else {
138 throw new IllegalArgumentException("Model must be StyledDocument");
139 }
140 }
141
142 /**
143 * Associates the editor with a text document.
144 * The currently registered factory is used to build a view for
145 * the document, which gets displayed by the editor.
146 *
147 * @param doc the document to display/edit
148 */
149 public void setStyledDocument(StyledDocument doc) {
150 super.setDocument(doc);
151 }
152
153 /**
154 * Fetches the model associated with the editor.
155 *
156 * @return the model
157 */
158 public StyledDocument getStyledDocument() {
159 return (StyledDocument) getDocument();
160 }
161
162 /**
163 * Replaces the currently selected content with new content
164 * represented by the given string. If there is no selection
165 * this amounts to an insert of the given text. If there
166 * is no replacement text this amounts to a removal of the
167 * current selection. The replacement text will have the
168 * attributes currently defined for input at the point of
169 * insertion. If the document is not editable, beep and return.
170 *
171 * @param content the content to replace the selection with
172 */
173 @Override
174 public void replaceSelection(String content) {
175 replaceSelection(content, true);
176 }
177
178 private void replaceSelection(String content, boolean checkEditable) {
179 if (checkEditable && !isEditable()) {
180 UIManager.getLookAndFeel().provideErrorFeedback(JTextPane.this);
181 return;
182 }
183 Document doc = getStyledDocument();
184 if (doc != null) {
185 try {
186 Caret caret = getCaret();
187 boolean composedTextSaved = saveComposedText(caret.getDot());
188 int p0 = Math.min(caret.getDot(), caret.getMark());
189 int p1 = Math.max(caret.getDot(), caret.getMark());
190 AttributeSet attr = getInputAttributes().copyAttributes();
191 if (doc instanceof AbstractDocument) {
192 ((AbstractDocument)doc).replace(p0, p1 - p0, content,attr);
193 }
194 else {
195 if (p0 != p1) {
196 doc.remove(p0, p1 - p0);
197 }
198 if (content != null && content.length() > 0) {
199 doc.insertString(p0, content, attr);
200 }
201 }
202 if (composedTextSaved) {
203 restoreComposedText();
204 }
205 } catch (BadLocationException e) {
206 UIManager.getLookAndFeel().provideErrorFeedback(JTextPane.this);
207 }
208 }
209 }
210
211 /**
212 * Inserts a component into the document as a replacement
213 * for the currently selected content. If there is no
214 * selection the component is effectively inserted at the
215 * current position of the caret. This is represented in
216 * the associated document as an attribute of one character
217 * of content.
218 * <p>
219 * The component given is the actual component used by the
220 * JTextPane. Since components cannot be a child of more than
221 * one container, this method should not be used in situations
222 * where the model is shared by text components.
223 * <p>
224 * The component is placed relative to the text baseline
225 * according to the value returned by
226 * <code>Component.getAlignmentY</code>. For Swing components
227 * this value can be conveniently set using the method
228 * <code>JComponent.setAlignmentY</code>. For example, setting
229 * a value of <code>0.75</code> will cause 75 percent of the
230 * component to be above the baseline, and 25 percent of the
231 * component to be below the baseline.
232 *
233 * @param c the component to insert
234 */
235 public void insertComponent(Component c) {
236 MutableAttributeSet inputAttributes = getInputAttributes();
237 inputAttributes.removeAttributes(inputAttributes);
238 StyleConstants.setComponent(inputAttributes, c);
239 replaceSelection(" ", false);
240 inputAttributes.removeAttributes(inputAttributes);
241 }
242
243 /**
244 * Inserts an icon into the document as a replacement
245 * for the currently selected content. If there is no
246 * selection the icon is effectively inserted at the
247 * current position of the caret. This is represented in
248 * the associated document as an attribute of one character
249 * of content.
250 *
251 * @param g the icon to insert
252 * @see Icon
253 */
254 public void insertIcon(Icon g) {
255 MutableAttributeSet inputAttributes = getInputAttributes();
256 inputAttributes.removeAttributes(inputAttributes);
257 StyleConstants.setIcon(inputAttributes, g);
258 replaceSelection(" ", false);
259 inputAttributes.removeAttributes(inputAttributes);
260 }
261
262 /**
263 * Adds a new style into the logical style hierarchy. Style attributes
264 * resolve from bottom up so an attribute specified in a child
265 * will override an attribute specified in the parent.
266 *
267 * @param nm the name of the style (must be unique within the
268 * collection of named styles). The name may be <code>null</code>
269 * if the style is unnamed, but the caller is responsible
270 * for managing the reference returned as an unnamed style can't
271 * be fetched by name. An unnamed style may be useful for things
272 * like character attribute overrides such as found in a style
273 * run.
274 * @param parent the parent style. This may be <code>null</code>
275 * if unspecified
276 * attributes need not be resolved in some other style.
277 * @return the new <code>Style</code>
278 */
279 public Style addStyle(String nm, Style parent) {
280 StyledDocument doc = getStyledDocument();
281 return doc.addStyle(nm, parent);
282 }
283
284 /**
285 * Removes a named non-<code>null</code> style previously added to
286 * the document.
287 *
288 * @param nm the name of the style to remove
289 */
290 public void removeStyle(String nm) {
291 StyledDocument doc = getStyledDocument();
292 doc.removeStyle(nm);
293 }
294
295 /**
296 * Fetches a named non-<code>null</code> style previously added.
297 *
298 * @param nm the name of the style
299 * @return the <code>Style</code>
300 */
301 public Style getStyle(String nm) {
302 StyledDocument doc = getStyledDocument();
303 return doc.getStyle(nm);
304 }
305
306 /**
307 * Sets the logical style to use for the paragraph at the
308 * current caret position. If attributes aren't explicitly set
309 * for character and paragraph attributes they will resolve
310 * through the logical style assigned to the paragraph, which
311 * in term may resolve through some hierarchy completely
312 * independent of the element hierarchy in the document.
313 *
314 * @param s the logical style to assign to the paragraph,
315 * or <code>null</code> for no style
316 */
317 public void setLogicalStyle(Style s) {
318 StyledDocument doc = getStyledDocument();
319 doc.setLogicalStyle(getCaretPosition(), s);
320 }
321
322 /**
323 * Fetches the logical style assigned to the paragraph represented
324 * by the current position of the caret, or <code>null</code>.
325 *
326 * @return the <code>Style</code>
327 */
328 public Style getLogicalStyle() {
329 StyledDocument doc = getStyledDocument();
330 return doc.getLogicalStyle(getCaretPosition());
331 }
332
333 /**
334 * Fetches the character attributes in effect at the
335 * current location of the caret, or <code>null</code>.
336 *
337 * @return the attributes, or <code>null</code>
338 */
339 public AttributeSet getCharacterAttributes() {
340 StyledDocument doc = getStyledDocument();
341 Element run = doc.getCharacterElement(getCaretPosition());
342 if (run != null) {
343 return run.getAttributes();
344 }
345 return null;
346 }
347
348 /**
349 * Applies the given attributes to character
350 * content. If there is a selection, the attributes
351 * are applied to the selection range. If there
352 * is no selection, the attributes are applied to
353 * the input attribute set which defines the attributes
354 * for any new text that gets inserted.
355 *
356 * @param attr the attributes
357 * @param replace if true, then replace the existing attributes first
358 */
359 public void setCharacterAttributes(AttributeSet attr, boolean replace) {
360 int p0 = getSelectionStart();
361 int p1 = getSelectionEnd();
362 if (p0 != p1) {
363 StyledDocument doc = getStyledDocument();
364 doc.setCharacterAttributes(p0, p1 - p0, attr, replace);
365 } else {
366 MutableAttributeSet inputAttributes = getInputAttributes();
367 if (replace) {
368 inputAttributes.removeAttributes(inputAttributes);
369 }
370 inputAttributes.addAttributes(attr);
371 }
372 }
373
374 /**
375 * Fetches the current paragraph attributes in effect
376 * at the location of the caret, or <code>null</code> if none.
377 *
378 * @return the attributes
379 */
380 public AttributeSet getParagraphAttributes() {
381 StyledDocument doc = getStyledDocument();
382 Element paragraph = doc.getParagraphElement(getCaretPosition());
383 if (paragraph != null) {
384 return paragraph.getAttributes();
385 }
386 return null;
387 }
388
389 /**
390 * Applies the given attributes to paragraphs. If
391 * there is a selection, the attributes are applied
392 * to the paragraphs that intersect the selection.
393 * If there is no selection, the attributes are applied
394 * to the paragraph at the current caret position.
395 *
396 * @param attr the non-<code>null</code> attributes
397 * @param replace if true, replace the existing attributes first
398 */
399 public void setParagraphAttributes(AttributeSet attr, boolean replace) {
400 int p0 = getSelectionStart();
401 int p1 = getSelectionEnd();
402 StyledDocument doc = getStyledDocument();
403 doc.setParagraphAttributes(p0, p1 - p0, attr, replace);
404 }
405
406 /**
407 * Gets the input attributes for the pane.
408 *
409 * @return the attributes
410 */
411 public MutableAttributeSet getInputAttributes() {
412 return getStyledEditorKit().getInputAttributes();
413 }
414
415 /**
416 * Gets the editor kit.
417 *
418 * @return the editor kit
419 */
420 protected final StyledEditorKit getStyledEditorKit() {
421 return (StyledEditorKit) getEditorKit();
422 }
423
424 /**
425 * @see #getUIClassID
426 * @see #readObject
427 */
428 private static final String uiClassID = "TextPaneUI";
429
430
431 /**
432 * See <code>readObject</code> and <code>writeObject</code> in
433 * <code>JComponent</code> for more
434 * information about serialization in Swing.
435 *
436 * @param s the output stream
437 */
438 private void writeObject(ObjectOutputStream s) throws IOException {
439 s.defaultWriteObject();
440 if (getUIClassID().equals(uiClassID)) {
441 byte count = JComponent.getWriteObjCounter(this);
442 JComponent.setWriteObjCounter(this, --count);
443 if (count == 0 && ui != null) {
444 ui.installUI(this);
445 }
446 }
447 }
448
449
450 // --- JEditorPane ------------------------------------
451
452 /**
453 * Creates the <code>EditorKit</code> to use by default. This
454 * is implemented to return <code>javax.swing.text.StyledEditorKit</code>.
455 *
456 * @return the editor kit
457 */
458 protected EditorKit createDefaultEditorKit() {
459 return new StyledEditorKit();
460 }
461
462 /**
463 * Sets the currently installed kit for handling
464 * content. This is the bound property that
465 * establishes the content type of the editor.
466 *
467 * @param kit the desired editor behavior
468 * @exception IllegalArgumentException if kit is not a
469 * <code>StyledEditorKit</code>
470 */
471 public final void setEditorKit(EditorKit kit) {
472 if (kit instanceof StyledEditorKit) {
473 super.setEditorKit(kit);
474 } else {
475 throw new IllegalArgumentException("Must be StyledEditorKit");
476 }
477 }
478
479 /**
480 * Returns a string representation of this <code>JTextPane</code>.
481 * This method
482 * is intended to be used only for debugging purposes, and the
483 * content and format of the returned string may vary between
484 * implementations. The returned string may be empty but may not
485 * be <code>null</code>.
486 *
487 * @return a string representation of this <code>JTextPane</code>
488 */
489 protected String paramString() {
490 return super.paramString();
491 }
492
493}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t