import java.io.PipedOutputStream;
import java.io.PrintStream;
+import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.SimpleLayout;
+import javax.swing.border.Border;
+import javax.swing.text.DefaultCaret;
import jalview.bin.Cache;
+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
private int MIN_HEIGHT = 250;
- private JComboBox logLevelCombo = new JComboBox();
+ private JComboBox<LogLevel> logLevelCombo = new JComboBox<LogLevel>();
+
+ protected LogLevel startingLogLevel = null;
public Console()
{
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);
}
// 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();
{
private Color bg = textArea.getBackground();
+ 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);
+ textArea.setForeground(fg);
}
});
JLabel logLevelLabel = new JLabel(
MessageManager.getString("label.log_level") + ":");
- // logLevelCombo.addItem(Level.ALL);
- 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(Level.TRACE);
+ // 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.log == null)
+ {
+ try
+ {
+ startingLogLevel = LogLevel
+ .valueOf(Cache.getDefault(Cache.JALVIEWLOGLEVEL, null));
+ } catch (IllegalArgumentException e1)
+ {
+ jalview.bin.Console.debug(
+ "Invalid value for preference " + Cache.JALVIEWLOGLEVEL);
+ } catch (NullPointerException e2)
+ {
+ // no value in preferences
+ } finally
+ {
+ if (startingLogLevel == null)
+ {
+ startingLogLevel = LogLevel.INFO;
+ }
+ }
+ }
+ else
+ {
+ startingLogLevel = jalview.bin.Console.log.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());
}
}
// 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());
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;
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))
+ setChosenLogLevelCombo(startingLogLevel);
+ }
+
+ private void setChosenLogLevelCombo(LogLevel setLogLevel)
+ {
+ logLevelCombo.setSelectedItem(setLogLevel);
+ if (!logLevelCombo.getSelectedItem().equals(setLogLevel))
{
- logLevelCombo.setSelectedItem(Level.INFO);
+ // 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++)
+ {
+ LogLevel l = logLevelCombo.getItemAt(i);
+ if (l.compareTo(setLogLevel) >= 0)
+ {
+ logLevelCombo.insertItemAt(setLogLevel, i);
+ added = true;
+ break;
+ }
+ }
+ if (!added) // lower priority than others or some confusion -- add to
+ // end of list
+ {
+ logLevelCombo.addItem(setLogLevel);
+ }
+ logLevelCombo.setSelectedItem(setLogLevel);
+ }
+ else
+ {
+ logLevelCombo.setSelectedItem(LogLevel.INFO);
+ }
}
}
cb.setContents(consoleTextSelection, null);
}
- private void setLogLevel()
- {
-
- }
-
PipedOutputStream pout = null, perr = null;
public void redirectStreams()
// 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();
*/
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()
pin.close();
} catch (Exception e)
{
+ jalview.bin.Console.debug("pin.close() error", e);
}
try
{
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);
}
{
try
{
- this.wait(100);
+ this.wait(100); // ##### implicated BLOCKED
if (pin.available() == 0)
{
trimBuffer(false);
}
} catch (InterruptedException ie)
{
+ jalview.bin.Console.debug("pin.available() error", ie);
}
}
{
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)
displayPipe = tmp;
}
// simply append whole buffer
- textArea.append(replace.toString());
- count += replace.length();
- if (count > byteslim)
+ synchronized (textArea.getDocument())
{
- trimBuffer(false);
+ textArea.append(replace.toString()); // ##### implicated BLOCKED
+ count += replace.length();
+ if (count > byteslim)
+ {
+ trimBuffer(false);
+ }
}
+
}
if (displayPipe.length() == 0)
{
}
} catch (InterruptedException e)
{
+ jalview.bin.Console.debug("displayPipe.length() error", e);
}
- ;
}
}
else
this.wait(100);
} catch (InterruptedException e)
{
-
+ jalview.bin.Console.debug("this.wait(100) error", e);
}
}
if (quit)
this.wait(1000);
} catch (InterruptedException ie)
{
+ jalview.bin.Console.debug("this.wait(1000) error", ie);
}
throw new NullPointerException(
MessageManager.getString("exception.application_test_npe"));
+ "\nTruncated...\n";
} catch (Exception e)
{
- e.printStackTrace();
+ jalview.bin.Console.warn("textArea Exception", e);
}
}
// trim the buffer
}
} catch (Exception e)
{
- e.printStackTrace();
+ jalview.bin.Console.warn("textArea Exception", e);
}
// lines = textArea.getLineCount();
}
return input;
}
+ /**
+ * @j2sIgnore
+ * @param arg
+ */
public static void main(String[] arg)
{
new Console().test(); // create console with not reference
}
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();