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    }