package org.yamcs.ui.eventviewer;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.TableCellRenderer;
import org.yamcs.protobuf.Yamcs.Event;
import org.yamcs.ui.UiColors;
/**
* Event table renderer class. Its purpose is to highlight the events with
* severity WARNING and ERROR
*/
class EventTableRenderer extends JTextArea implements TableCellRenderer {
private static final long serialVersionUID=1L;
@Override
public void validate() {
}
@Override
public void invalidate() {
}
@Override
public void revalidate() {
}
@Override
public void repaint() {
}
public void firePropertyChange() {
}
@Override
public boolean isOpaque() {
return true;
}
public EventTableRenderer() {
super();
}
/**
* Calculates the height required for showing this row. Extracted outside of
* getTableCellRendererComponent, so that the height can be retrieved (and
* set!) without the row having been rendered yet.
*/
public int updateCalculatedHeight(JTable table, Object value, int row) {
Event event = (Event) value;
String[] lines=event.getMessage().split("\n");
if(lines.length>5) {
StringBuilder buf=new StringBuilder();
for(int i=0;i<5;i++) {
buf.append(lines[i]).append("\n");
}
buf.append("[truncated]");
setText(buf.toString());
} else {
setText(event.getMessage());
}
int wantedHeight = (int) getPreferredSize().getHeight() + table.getIntercellSpacing().height;
if (wantedHeight != table.getRowHeight(row)) {
table.setRowHeight(row, wantedHeight);
}
return wantedHeight;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
updateCalculatedHeight(table, value, row);
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
} else {
// This is a textarea, so does not follow the row layout set by prepareRenderer
Event event = (Event) value;
switch (event.getSeverity()) {
case WARNING:
setForeground(UiColors.WARNING_FAINT_FG);
setBackground(UiColors.WARNING_FAINT_BG);
break;
case ERROR:
setForeground(UiColors.ERROR_FAINT_FG);
setBackground(UiColors.ERROR_FAINT_BG);
break;
default:
setForeground(table.getForeground());
setBackground(table.getBackground());
break;
}
}
return this;
}
}