View Javadoc
1   /*
2    * Copyright (c) 2004, 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.
8    *
9    * This code is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12   * version 2 for more details (a copy is included in the LICENSE file that
13   * accompanied this code).
14   *
15   * You should have received a copy of the GNU General Public License version
16   * 2 along with this work; if not, write to the Free Software Foundation,
17   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18   *
19   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20   * or visit www.oracle.com if you need additional information or have any
21   * questions.
22   *
23   */
24  
25  package sun.jvm.hotspot.ui;
26  
27  import java.io.*;
28  import java.awt.event.*;
29  import java.awt.im.InputContext;
30  import java.awt.datatransfer.*;
31  import javax.swing.*;
32  import javax.swing.event.*;
33  import javax.swing.text.*;
34  
35  /** A simple subclass of JEditorPane for displaying uneditable html
36   */
37  
38  public class SAEditorPane extends JEditorPane {
39  
40    public SAEditorPane() {
41      setEditable(false);
42      setContentType("text/html");
43    }
44  
45    /**
46        Override getSelectedText so that <br> elements produce \n when
47        text is copied out of the window.
48     */
49  
50    public String getSelectedText() {
51      StringBuffer result = new StringBuffer();
52      Document doc = getDocument();
53  
54      int start = getSelectionStart();
55      int end = getSelectionEnd();
56  
57      try {
58        // Create an iterator using the root element
59        ElementIterator it = new ElementIterator(doc.getDefaultRootElement());
60  
61        // Iterate all content elements (which are leaves)
62        Element e;
63        String separator = System.getProperty("line.separator");
64        while ((e = it.next()) != null) {
65          if (e.isLeaf()) {
66            int rangeStart = e.getStartOffset();
67            int rangeEnd = e.getEndOffset();
68  
69            if (rangeEnd < start || rangeStart > end) continue;
70            if (end < rangeEnd) rangeEnd = end;
71            if (start > rangeStart) rangeStart = start;
72            try {
73              String line = getText(rangeStart, rangeEnd-rangeStart);
74              if (e.getName().equals("br"))
75                result.append(separator);
76              else
77                result.append(line);
78            } catch (BadLocationException ex) {
79            }
80          }
81        }
82      } catch (Exception e) {
83        e.printStackTrace();
84      }
85      return result.toString();
86    }
87  
88    public void setText(String text) {
89      super.setText(text);
90      // put the cursor at the top instead of leaving it at the end.
91      setCaretPosition(0);
92    }
93  }