X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FConsole.java;h=41da01fc2da4b49da87360308c47e4b6034ae3db;hb=ccc53e88e3260886f5d3bdacc619c0f374be9b8f;hp=a493640a9b4b7299b5c0ac7af9f8b836503827c3;hpb=1de3658f20c06bdf74813d1f98f18dcca63e73cc;p=jalview.git diff --git a/src/jalview/gui/Console.java b/src/jalview/gui/Console.java index a493640..41da01f 100644 --- a/src/jalview/gui/Console.java +++ b/src/jalview/gui/Console.java @@ -42,6 +42,7 @@ import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.PrintStream; +import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; @@ -49,12 +50,16 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; - -import org.apache.log4j.Level; -import org.apache.log4j.SimpleLayout; - -import jalview.bin.Cache; +import javax.swing.SwingUtilities; +import javax.swing.border.Border; +import javax.swing.text.DefaultCaret; + +import jalview.log.JLoggerI.LogLevel; +import jalview.log.JLoggerLog4j; +import jalview.log.JalviewAppender; +import jalview.util.ChannelProperties; import jalview.util.MessageManager; +import jalview.util.Platform; /** * Simple Jalview Java Console. Version 1 - allows viewing of console output @@ -100,7 +105,9 @@ public class Console extends WindowAdapter private int MIN_HEIGHT = 250; - private JComboBox logLevelCombo = new JComboBox(); + private JComboBox logLevelCombo = new JComboBox(); + + protected LogLevel startingLogLevel = null; public Console() { @@ -108,6 +115,7 @@ public class Console extends WindowAdapter Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); frame = initFrame("Java Console", screenSize.width / 2, screenSize.height / 2, -1, -1); + frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); initConsole(true); } @@ -129,12 +137,44 @@ public class Console extends WindowAdapter // textArea = cpt.getTextArea(); textArea = new JTextArea(); textArea.setEditable(false); + // autoscroll + DefaultCaret caret = (DefaultCaret) textArea.getCaret(); + caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); + // toggle autoscroll by clicking on the text area + Border pausedBorder = BorderFactory.createMatteBorder(2, 2, 2, 2, + textArea.getForeground()); + Border noBorder = BorderFactory.createEmptyBorder(2, 2, 2, 2); + JScrollPane scrollPane = new JScrollPane(textArea); + scrollPane.setBorder(noBorder); + textArea.addMouseListener(new MouseAdapter() + { + @Override + public void mouseClicked(MouseEvent e) + { + if (e.getButton() == MouseEvent.BUTTON1) + { + if (caret.getUpdatePolicy() == DefaultCaret.ALWAYS_UPDATE) + { + caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE); + scrollPane.setBorder(pausedBorder); + } + else + { + caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); + textArea.setCaretPosition(textArea.getDocument().getLength()); + scrollPane.setBorder(noBorder); + } + } + } + }); + JButton clearButton = new JButton( MessageManager.getString("action.clear")); JButton copyToClipboardButton = new JButton( MessageManager.getString("label.copy_to_clipboard")); copyToClipboardButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { copyConsoleTextToClipboard(); @@ -146,12 +186,14 @@ public class Console extends WindowAdapter private Color fg = textArea.getForeground(); + @Override public void mousePressed(MouseEvent e) { textArea.setBackground(textArea.getSelectionColor()); textArea.setForeground(textArea.getSelectedTextColor()); } + @Override public void mouseReleased(MouseEvent e) { textArea.setBackground(bg); @@ -165,22 +207,35 @@ public class Console extends WindowAdapter JLabel logLevelLabel = new JLabel( MessageManager.getString("label.log_level") + ":"); - // logLevelCombo.addItem(Level.ALL); - logLevelCombo.addItem(Level.TRACE); - logLevelCombo.addItem(Level.DEBUG); - logLevelCombo.addItem(Level.INFO); - logLevelCombo.addItem(Level.WARN); - // logLevelCombo.addItem(Level.ERROR); - // logLevelCombo.addItem(Level.FATAL); - // logLevelCombo.addItem(Level.OFF); + // logLevelCombo.addItem(LogLevel.ALL); + logLevelCombo.addItem(LogLevel.TRACE); + logLevelCombo.addItem(LogLevel.DEBUG); + logLevelCombo.addItem(LogLevel.INFO); + logLevelCombo.addItem(LogLevel.WARN); + // logLevelCombo.addItem(LogLevel.ERROR); + // logLevelCombo.addItem(LogLevel.FATAL); + // logLevelCombo.addItem(LogLevel.ERROR); + // logLevelCombo.addItem(LogLevel.OFF); + // set startingLogLevel + + if (jalview.bin.Console.getLogger() == null) + { + startingLogLevel = jalview.bin.Console.getCachedLogLevel(); + } + else + { + startingLogLevel = jalview.bin.Console.getLogger().getLevel(); + } setChosenLogLevelCombo(); logLevelCombo.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { - if (Cache.log != null) + if (jalview.bin.Console.log != null) { - Cache.log.setLevel((Level) logLevelCombo.getSelectedItem()); + jalview.bin.Console.log + .setLevel((LogLevel) logLevelCombo.getSelectedItem()); } } @@ -188,8 +243,7 @@ public class Console extends WindowAdapter // frame = cpt; frame.getContentPane().setLayout(new BorderLayout()); - frame.getContentPane().add(new JScrollPane(textArea), - BorderLayout.CENTER); + frame.getContentPane().add(scrollPane, BorderLayout.CENTER); JPanel southPanel = new JPanel(); southPanel.setLayout(new GridBagLayout()); @@ -197,10 +251,10 @@ public class Console extends WindowAdapter logLevelPanel.setAlignmentX(JPanel.LEFT_ALIGNMENT); logLevelPanel.add(logLevelLabel); logLevelPanel.add(logLevelCombo); - logLevelLabel.setToolTipText( - MessageManager.getString("label.log_level_tooltip")); - logLevelCombo.setToolTipText( - MessageManager.getString("label.log_level_tooltip")); + String logLevelTooltip = MessageManager.formatMessage( + "label.log_level_tooltip", startingLogLevel.toString()); + logLevelLabel.setToolTipText(logLevelTooltip); + logLevelCombo.setToolTipText(logLevelTooltip); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; @@ -250,26 +304,32 @@ public class Console extends WindowAdapter textAppender = new Thread(this); textAppender.setDaemon(true); textAppender.start(); + + // set icons + frame.setIconImages(ChannelProperties.getIconList()); } private void setChosenLogLevelCombo() { - Level currentLogLevel = Cache.log == null ? Level.INFO - : Cache.log.getLevel(); - logLevelCombo.setSelectedItem(currentLogLevel); - if (!logLevelCombo.getSelectedItem().equals(currentLogLevel)) // currentLogLevel - // not in list + setChosenLogLevelCombo(startingLogLevel); + } + + private void setChosenLogLevelCombo(LogLevel setLogLevel) + { + logLevelCombo.setSelectedItem(setLogLevel); + if (!logLevelCombo.getSelectedItem().equals(setLogLevel)) { - if (currentLogLevel != null && currentLogLevel instanceof Level) + // setLogLevel not (yet) in list + if (setLogLevel != null && setLogLevel instanceof LogLevel) { // add new item to list (might be set via .jalview_properties) boolean added = false; for (int i = 0; i < logLevelCombo.getItemCount(); i++) { - Level l = (Level) logLevelCombo.getItemAt(i); - if (l.isGreaterOrEqual(currentLogLevel)) + LogLevel l = logLevelCombo.getItemAt(i); + if (l.compareTo(setLogLevel) >= 0) { - logLevelCombo.insertItemAt(currentLogLevel, i); + logLevelCombo.insertItemAt(setLogLevel, i); added = true; break; } @@ -277,13 +337,13 @@ public class Console extends WindowAdapter if (!added) // lower priority than others or some confusion -- add to // end of list { - logLevelCombo.addItem(currentLogLevel); + logLevelCombo.addItem(setLogLevel); } - logLevelCombo.setSelectedItem(currentLogLevel); + logLevelCombo.setSelectedItem(setLogLevel); } else { - logLevelCombo.setSelectedItem(Level.INFO); + logLevelCombo.setSelectedItem(LogLevel.INFO); } } } @@ -386,20 +446,20 @@ public class Console extends WindowAdapter // you may omit this part for your application // - System.out.println("Hello World 2"); - System.out.println("All fonts available to Graphic2D:\n"); + jalview.bin.Console.outPrintln("Hello World 2"); + jalview.bin.Console.outPrintln("All fonts available to Graphic2D:\n"); GraphicsEnvironment ge = GraphicsEnvironment .getLocalGraphicsEnvironment(); String[] fontNames = ge.getAvailableFontFamilyNames(); for (int n = 0; n < fontNames.length; n++) { - System.out.println(fontNames[n]); + jalview.bin.Console.outPrintln(fontNames[n]); } // Testing part: simple an error thrown anywhere in this JVM will be printed // on the Console // We do it with a seperate Thread becasue we don't wan't to break a Thread // used by the Console. - System.out.println("\nLets throw an error on this console"); + jalview.bin.Console.outPrintln("\nLets throw an error on this console"); errorThrower = new Thread(this); errorThrower.setDaemon(true); errorThrower.start(); @@ -428,38 +488,45 @@ public class Console extends WindowAdapter */ public Console(Desktop desktop) { - this(desktop, true); - } - - /** - * attach a console to the desktop - the desktop will open it if requested. - * - * @param desktop - * @param showjconsole - * - if true, then redirect stdout immediately - */ - public Console(Desktop desktop, boolean showjconsole) - { parent = desktop; // window name - get x,y,width, height possibly scaled - Rectangle bounds = desktop.getLastKnownDimensions("JAVA_CONSOLE_"); - if (bounds == null) + Rectangle bounds = parent == null ? null + : parent.getLastKnownDimensions("JAVA_CONSOLE_"); + if (bounds != null) { - frame = initFrame("Jalview Java Console", desktop.getWidth() / 2, - desktop.getHeight() / 4, desktop.getX(), desktop.getY()); + frame = initFrame( + ChannelProperties.getProperty("app_name") + " Java Console", + bounds.width, bounds.height, bounds.x, bounds.y); + } + else if (parent != null && parent.getWidth() > 0 + && parent.getHeight() > 0) + { + frame = initFrame( + ChannelProperties.getProperty("app_name") + " Java Console", + parent.getWidth() / 2, parent.getHeight() / 4, parent.getX(), + parent.getY()); } else { - frame = initFrame("Jalview Java Console", bounds.width, bounds.height, - bounds.x, bounds.y); + frame = initFrame( + ChannelProperties.getProperty("app_name") + " Java Console", + MIN_WIDTH, MIN_HEIGHT, 10, 10); } frame.setMinimumSize(new Dimension(MIN_WIDTH, MIN_HEIGHT)); - // desktop.add(frame); + // parent.add(frame); initConsole(false); - JalviewAppender jappender = new JalviewAppender(); - jappender.setLayout(new SimpleLayout()); - JalviewAppender.setTextArea(textArea); - org.apache.log4j.Logger.getRootLogger().addAppender(jappender); + LogLevel level = (LogLevel) logLevelCombo.getSelectedItem(); + if (!Platform.isJS()) + { + JalviewAppender jappender = new JalviewAppender(level); + JalviewAppender.setTextArea(textArea); + jappender.start(); + if (jalview.bin.Console.log != null + && jalview.bin.Console.log instanceof JLoggerLog4j) + { + JLoggerLog4j.addAppender(jalview.bin.Console.log, jappender); + } + } } public synchronized void stopConsole() @@ -479,6 +546,7 @@ public class Console extends WindowAdapter pin.close(); } catch (Exception e) { + jalview.bin.Console.debug("pin.close() error", e); } try { @@ -486,18 +554,22 @@ public class Console extends WindowAdapter pin2.close(); } catch (Exception e) { + jalview.bin.Console.debug("pin2.close() error", e); } try { textAppender.join(10); } catch (Exception e) { + jalview.bin.Console.debug("textAppender.join(10) error", e); } } + /* if (!frame.isVisible()) { frame.dispose(); } + */ // System.exit(0); } @@ -550,12 +622,9 @@ public class Console extends WindowAdapter try { this.wait(100); - if (pin.available() == 0) - { - trimBuffer(false); - } } catch (InterruptedException ie) { + jalview.bin.Console.debug("pin.available() error", ie); } } @@ -581,13 +650,14 @@ public class Console extends WindowAdapter { try { - this.wait(100); + this.wait(100); // ##### implicated BLOCKED if (pin2.available() == 0) { trimBuffer(false); } } catch (InterruptedException ie) { + jalview.bin.Console.debug("pin.available() error", ie); } } while (pin2.available() != 0) @@ -612,23 +682,23 @@ public class Console extends WindowAdapter // check string buffer - if greater than console, clear console and // replace with last segment of content, otherwise, append all to // content. - long count; while (displayPipe.length() > 0) { - count = 0; StringBuffer tmp = new StringBuffer(), replace; synchronized (displayPipe) { replace = displayPipe; displayPipe = tmp; } - // simply append whole buffer - textArea.append(replace.toString()); - count += replace.length(); - if (count > byteslim) + // Append formatted message to textarea using the Swing Thread. + SwingUtilities.invokeLater(new Runnable() { - trimBuffer(false); - } + public void run() + { + textArea.append(replace.toString()); + trimBuffer(false); + } + }); } if (displayPipe.length() == 0) { @@ -637,12 +707,19 @@ public class Console extends WindowAdapter this.wait(100); if (displayPipe.length() == 0) { - trimBuffer(false); + // post a trim on Swing Thread. + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + trimBuffer(false); + } + }); } } catch (InterruptedException e) { + jalview.bin.Console.debug("displayPipe.length() error", e); } - ; } } else @@ -652,7 +729,7 @@ public class Console extends WindowAdapter this.wait(100); } catch (InterruptedException e) { - + jalview.bin.Console.debug("this.wait(100) error", e); } } if (quit) @@ -679,6 +756,7 @@ public class Console extends WindowAdapter this.wait(1000); } catch (InterruptedException ie) { + jalview.bin.Console.debug("this.wait(1000) error", ie); } throw new NullPointerException( MessageManager.getString("exception.application_test_npe")); @@ -698,9 +776,7 @@ public class Console extends WindowAdapter @Override public void run() { - displayPipe.append(input); // change to stringBuffer - // displayPipe.flush(); - + displayPipe.append(input); } }); // stderr.println("Time taken to Spawnappend:\t" + (System.nanoTime() - @@ -722,7 +798,7 @@ public class Console extends WindowAdapter + "\nTruncated...\n"; } catch (Exception e) { - e.printStackTrace(); + jalview.bin.Console.warn("textArea Exception", e); } } // trim the buffer @@ -746,7 +822,7 @@ public class Console extends WindowAdapter } } catch (Exception e) { - e.printStackTrace(); + jalview.bin.Console.warn("textArea Exception", e); } // lines = textArea.getLineCount(); } @@ -778,6 +854,10 @@ public class Console extends WindowAdapter return input; } + /** + * @j2sIgnore + * @param arg + */ public static void main(String[] arg) { new Console().test(); // create console with not reference @@ -796,12 +876,10 @@ public class Console extends WindowAdapter } else { - // reset log level to user preference - if (Cache.log != null) + // reset log level to what it was before + if (jalview.bin.Console.log != null) { - String userLogLevel = Cache.getDefault("logs.Jalview.level", - Level.INFO.toString()); - Cache.log.setLevel(Level.toLevel(userLogLevel)); + jalview.bin.Console.log.setLevel(startingLogLevel); } unredirectStreams();