diff agent/src/share/classes/sun/jvm/hotspot/ui/DebuggerConsolePanel.java @ 0:a61af66fc99e jdk7-b24

Initial load
author duke
date Sat, 01 Dec 2007 00:00:00 +0000
parents
children c70a245cad3a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/agent/src/share/classes/sun/jvm/hotspot/ui/DebuggerConsolePanel.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,232 @@
+/*
+ * Copyright 2000-2001 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+package sun.jvm.hotspot.ui;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+
+import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.utilities.*;
+
+/** A JPanel subclass containing a scrollable text area displaying the
+    debugger's console, if it has one. This should not be created for
+    a debugger which does not have a console. */
+
+public class DebuggerConsolePanel extends JPanel {
+  private Debugger debugger;
+  private JTextComponent editor;
+  private boolean updating;
+  private int     mark;
+  private String  curText;  // handles multi-line input via '\'
+  // Don't run the "main" method of this class unless this flag is set to true first
+  private static final boolean DEBUGGING = false;
+
+  public DebuggerConsolePanel(Debugger debugger) {
+    this.debugger = debugger;
+    if (!DEBUGGING) {
+      if (Assert.ASSERTS_ENABLED) {
+        Assert.that(debugger.hasConsole(), "should not create a DebuggerConsolePanel for non-console debuggers");
+      }
+    }
+
+    setLayout(new BorderLayout());
+
+    editor = new JTextArea();
+    editor.setDocument(new EditableAtEndDocument());
+    editor.setFont(GraphicsUtilities.lookupFont("Courier"));
+    JScrollPane scroller = new JScrollPane();
+    scroller.getViewport().add(editor);
+    add(scroller, BorderLayout.CENTER);
+
+    editor.getDocument().addDocumentListener(new DocumentListener() {
+        public void changedUpdate(DocumentEvent e) {
+        }
+
+        public void insertUpdate(DocumentEvent e) {
+          if (updating) return;
+          beginUpdate();
+          editor.setCaretPosition(editor.getDocument().getLength());
+          if (insertContains(e, '\n')) {
+            String cmd = getMarkedText();
+            // Handle multi-line input
+            if ((cmd.length() == 0) || (cmd.charAt(cmd.length() - 1) != '\\')) {
+              // Trim "\\n" combinations
+              cmd = trimContinuations(cmd);
+              final String result;
+              if (DEBUGGING) {
+                System.err.println("Entered command: \"" + cmd + "\"");
+                result = "";
+              } else {
+                result = DebuggerConsolePanel.this.debugger.consoleExecuteCommand(cmd);
+              }
+
+              SwingUtilities.invokeLater(new Runnable() {
+                  public void run() {
+                    print(result);
+                    printPrompt();
+                    setMark();
+                    endUpdate();
+                  }
+                });
+            }
+          } else {
+            endUpdate();
+          }
+        }
+
+        public void removeUpdate(DocumentEvent e) {
+        }
+      });
+
+    // This is a bit of a hack but is probably better than relying on
+    // the JEditorPane to update the caret's position precisely the
+    // size of the insertion
+    editor.addCaretListener(new CaretListener() {
+        public void caretUpdate(CaretEvent e) {
+          int len = editor.getDocument().getLength();
+          if (e.getDot() > len) {
+            editor.setCaretPosition(len);
+          }
+        }
+      });
+
+    Box hbox = Box.createHorizontalBox();
+    hbox.add(Box.createGlue());
+    JButton button = new JButton("Clear Saved Text");
+    button.addActionListener(new ActionListener() {
+        public void actionPerformed(ActionEvent e) {
+          clear();
+        }
+      });
+    hbox.add(button);
+    hbox.add(Box.createGlue());
+    add(hbox, BorderLayout.SOUTH);
+
+    clear();
+  }
+
+  public void requestFocus() {
+    editor.requestFocus();
+  }
+
+  public void clear() {
+    EditableAtEndDocument d = (EditableAtEndDocument) editor.getDocument();
+    d.clear();
+    printPrompt();
+    setMark();
+    editor.requestFocus();
+  }
+
+  public void setMark() {
+    ((EditableAtEndDocument) editor.getDocument()).setMark();
+  }
+
+  public String getMarkedText() {
+    try {
+      String s = ((EditableAtEndDocument) editor.getDocument()).getMarkedText();
+      int i = s.length();
+      while ((i > 0) && (s.charAt(i - 1) == '\n')) {
+        i--;
+      }
+      return s.substring(0, i);
+    }
+    catch (BadLocationException e) {
+      e.printStackTrace();
+      return null;
+    }
+  }
+
+  //--------------------------------------------------------------------------------
+  // Internals only below this point
+  //
+
+  private void beginUpdate() {
+    updating = true;
+  }
+
+  private void endUpdate() {
+    updating = false;
+  }
+
+  private void print(String s) {
+    Document d = editor.getDocument();
+    try {
+      d.insertString(d.getLength(), s, null);
+    }
+    catch (BadLocationException e) {
+      e.printStackTrace();
+    }
+  }
+
+  private void printPrompt() {
+    if (DEBUGGING) {
+      print("foo> ");
+    } else {
+      print(debugger.getConsolePrompt());
+    }
+  }
+
+  private boolean insertContains(DocumentEvent e, char c) {
+    String s = null;
+    try {
+      s = editor.getText(e.getOffset(), e.getLength());
+      for (int i = 0; i < e.getLength(); i++) {
+        if (s.charAt(i) == c) {
+          return true;
+        }
+      }
+    }
+    catch (BadLocationException ex) {
+      ex.printStackTrace();
+    }
+    return false;
+  }
+
+  private String trimContinuations(String text) {
+    int i;
+    while ((i = text.indexOf("\\\n")) >= 0) {
+      text = text.substring(0, i) + text.substring(i+2, text.length());
+    }
+    return text;
+  }
+
+  public static void main(String[] args) {
+    JFrame frame = new JFrame();
+    frame.getContentPane().setLayout(new BorderLayout());
+    DebuggerConsolePanel panel = new DebuggerConsolePanel(null);
+    frame.getContentPane().add(panel, BorderLayout.CENTER);
+    frame.addWindowListener(new WindowAdapter() {
+        public void windowClosing(WindowEvent e) {
+          System.exit(0);
+        }
+      });
+    frame.setSize(500, 500);
+    frame.show();
+    panel.requestFocus();
+  }
+}