package org.openslx.dozmod.gui.helper; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Insets; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.border.BevelBorder; import javax.swing.border.EmptyBorder; import javax.swing.text.BadLocationException; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; import org.apache.log4j.Appender; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Level; import org.apache.log4j.Priority; import org.apache.log4j.spi.LoggingEvent; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.openslx.dozmod.gui.Gui; @SuppressWarnings("serial") public class DebugWindow extends JPanel { private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm:ss"); private final JTextPane txtLog; public DebugWindow() { setLayout(new BorderLayout()); txtLog = new JTextPane(); txtLog.setEditable(false); txtLog.setBackground(Color.WHITE); txtLog.setForeground(Color.BLACK); txtLog.setBorder(new EmptyBorder(new Insets(5, 5, 5, 5))); JScrollPane sp = new JScrollPane(txtLog, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); sp.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); add(sp, BorderLayout.CENTER); registerLogger(); validate(); } private void registerLogger() { Appender appender = new AppenderSkeleton() { @Override public boolean requiresLayout() { return false; } @Override public void close() { // Nothing to do } @Override protected void append(final LoggingEvent event) { final Level l = event.getLevel(); final Color c; if (l.isGreaterOrEqual(Priority.ERROR)) { c = Color.RED; } else if (l.isGreaterOrEqual(Priority.WARN)) { c = Color.ORANGE; } else if (l.isGreaterOrEqual(Priority.INFO)) { c = Color.BLACK; } else { c = Color.GRAY; } Gui.asyncExec(new Runnable() { @Override public void run() { log("[" + formatter.print(event.getTimeStamp()) + "] ", Color.BLACK); log(event.getThreadName() + "@" + event.getLoggerName().replaceAll("^.*\\.", ""), Color.GRAY); log(" " + event.getMessage() + "\n", c); } }); } }; BasicConfigurator.configure(appender); } private void log(String msg, Color c) { StyledDocument doc = txtLog.getStyledDocument(); SimpleAttributeSet keyWord = new SimpleAttributeSet(); StyleConstants.setForeground(keyWord, c); try { doc.insertString(doc.getLength(), msg, keyWord); } catch (BadLocationException e) { e.printStackTrace(); // Do not use LOGGER here to prevent infinite loop } txtLog.setCaretPosition(doc.getLength()); } }