001 package org.shiftone.jrat.desktop.action.inject;
002
003 import org.shiftone.jrat.util.Exceptions;
004 import org.shiftone.jrat.util.log.Logger;
005 import org.shiftone.jrat.util.log.LoggerFactory;
006 import org.shiftone.jrat.util.log.target.LogTarget;
007
008 import javax.swing.*;
009 import javax.swing.text.BadLocationException;
010 import javax.swing.text.Document;
011 import javax.swing.text.SimpleAttributeSet;
012 import java.awt.*;
013
014 /**
015 * @author (jeff@shiftone.org) Jeff Drost
016 */
017 public class RunnableLogPanel extends JPanel {
018 private static final Logger LOG = Logger.getLogger(RunnableLogPanel.class);
019 private JLabel label;
020 private Thread thread;
021 private JTextArea textArea;
022 private JScrollPane scrollPane;
023 private Document document;
024 private int textOffset = 0;
025 private BoundedRangeModel scrollBarRangeModel;
026
027 public RunnableLogPanel() {
028
029 textArea = new JTextArea();
030 scrollPane = new JScrollPane(textArea);
031 document = textArea.getDocument();
032 scrollBarRangeModel = scrollPane.getVerticalScrollBar().getModel();
033 label = new JLabel();
034
035 textArea.setEditable(false);
036
037 setLayout(new BorderLayout());
038 add(label, BorderLayout.NORTH);
039 add(scrollPane, BorderLayout.CENTER);
040 }
041
042
043 public synchronized void run(final Runnable target) {
044
045 Runnable runnable = new Runnable() {
046 public void run() {
047 setLabel("Running...");
048 try {
049 LoggerFactory.executeInThreadScope(new GuiLogTarget(), target);
050 setLabel("Finished.");
051 } catch (Throwable e) {
052 setLabel("Failed.");
053 }
054 }
055 };
056 Thread thread = new Thread(runnable);
057
058 thread.start();
059 }
060
061
062 private void setLabel(final String text) {
063 SwingUtilities.invokeLater(new Runnable() {
064 public void run() {
065 label.setText(text);
066 }
067 });
068 }
069
070
071 private void addText(final String text) {
072
073 SwingUtilities.invokeLater(new Runnable() {
074 public void run() {
075 try {
076
077 document.insertString(textOffset, text, SimpleAttributeSet.EMPTY);
078 textOffset += text.length();
079 scrollBarRangeModel.setValue(scrollBarRangeModel.getMaximum());
080
081 } catch (BadLocationException e) {
082
083 // todo - decide what to do
084
085 }
086
087 }
088 });
089 }
090
091 private class GuiLogTarget implements LogTarget {
092
093 long start = System.currentTimeMillis();
094
095 public boolean isLevelEnabled(String topic, int level) {
096 return true;
097 }
098
099
100 public void log(String topic, int level, Object message, Throwable throwable) {
101
102 if (isLevelEnabled(topic, level)) {
103 StringBuffer buffer = new StringBuffer(80);
104
105 buffer.append("[");
106 buffer.append(Logger.LEVEL_NAMES[level]);
107 buffer.append("] ");
108 buffer.append(System.currentTimeMillis() - start);
109 buffer.append(" ");
110 //buffer.append(topic);
111 //buffer.append(" - ");
112 buffer.append(String.valueOf(message));
113
114 if (throwable != null) {
115 buffer.append("\n");
116 buffer.append(Exceptions.printStackTrace(throwable));
117 }
118
119 buffer.append('\n');
120 addText(buffer.toString());
121 }
122 }
123 }
124
125 }