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 }