package org.obo.annotation.view;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.util.Comparator;
import java.util.Date;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
import org.bbop.framework.AbstractGUIComponent;
import org.obo.annotation.view.LogViewComponentFactory.LogViewAppender;
import org.obo.app.swing.BugWorkaroundTable;
import org.obo.app.swing.SortDisabler;
import org.obo.app.util.EverythingEqualComparator;
import ca.odell.glazedlists.GlazedLists;
import ca.odell.glazedlists.SortedList;
import ca.odell.glazedlists.gui.AdvancedTableFormat;
import ca.odell.glazedlists.swing.EventTableModel;
import ca.odell.glazedlists.swing.TableComparatorChooser;
import com.eekboom.utils.Strings;
public class LogViewComponent extends AbstractGUIComponent {
private final LogViewAppender appender;
public LogViewComponent(String id, LogViewAppender appender) {
super(id);
this.appender = appender;
}
@Override
public void init() {
super.init();
this.initializeInterface();
}
private void initializeInterface() {
this.setLayout(new BorderLayout());
final SortedList<LoggingEvent> sortedMessages = new SortedList<LoggingEvent>(this.appender.getMessages(), new EverythingEqualComparator<LoggingEvent>());
final EventTableModel<LoggingEvent> tableModel = new EventTableModel<LoggingEvent>(sortedMessages, new LogTableFormat());
final JTable logTable = new BugWorkaroundTable(tableModel);
logTable.setDefaultRenderer(Level.class, new LevelRenderer());
final TableComparatorChooser<LoggingEvent> sortChooser = new TableComparatorChooser<LoggingEvent>(logTable, sortedMessages, false);
sortChooser.addSortActionListener(new SortDisabler());
logTable.putClientProperty("Quaqua.Table.style", "striped");
logTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
logTable.getColumnModel().getColumn(0).setWidth(15);
logTable.setFont(new Font("Monospaced", Font.PLAIN, 12));
this.add(new JScrollPane(logTable), BorderLayout.CENTER);
}
private class LevelComparator implements Comparator<Level> {
@Override
public int compare(Level o1, Level o2) {
if (o1.equals(o2)) { return 0; }
if (o1.isGreaterOrEqual(o2)) {
return 1;
} else {
return -1;
}
}
}
private class LevelRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
final Level level = (Level)value;
if (level.equals(Level.DEBUG)) {
this.setBackground(Color.GREEN);
} else if (level.equals(Level.INFO)) {
this.setBackground(Color.BLUE);
} else if (level.equals(Level.WARN)) {
this.setBackground(Color.YELLOW);
} else if (level.isGreaterOrEqual(Level.ERROR)) {
this.setBackground(Color.RED);
}
return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column);
}
}
private class LogTableFormat implements AdvancedTableFormat<LoggingEvent> {
@Override
public int getColumnCount() {
return 4;
}
@Override
public String getColumnName(int column) {
switch(column) {
case(0): return "";
case(1): return "Time";
case(2): return "Source";
case(3): return "Message";
default: return null;
}
}
@Override
public Object getColumnValue(LoggingEvent event, int column) {
switch(column) {
case(0): return event.getLevel();
case(1): return new Date(event.timeStamp);
case(2): return event.getLoggerName();
case(3): return event.getMessage().toString();
default: return null;
}
}
@Override
public Class<?> getColumnClass(int column) {
switch(column) {
case(0): return Level.class;
case(1): return Date.class;
case(2): return String.class;
case(3): return String.class;
default: return null;
}
}
@Override
public Comparator<?> getColumnComparator(int column) {
switch(column) {
case(0): return new LevelComparator();
case(1): return GlazedLists.comparableComparator();
case(2): return Strings.getNaturalComparator();
case(3): return Strings.getNaturalComparator();
default: return null;
}
}
}
}