package com.traxel.lumbermill.event;
import com.traxel.lumbermill.filter.FilterEvent;
import com.traxel.lumbermill.filter.FilterListener;
import com.traxel.lumbermill.filter.FilterSet;
import com.traxel.lumbermill.log.Log;
import com.traxel.lumbermill.log.LogListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class Table extends AbstractTableModel
implements LogListener, FilterListener {
private List EVENTS = Collections.synchronizedList(new ArrayList());
private final ColumnSet COLUMN_SET;
private final Log LOG;
private final FilterSet FILTER_SET;
private Integer insertLocker = 1;
public Table(
final Log log,
final FilterSet filterSet,
final ColumnSet columnSet) {
COLUMN_SET = columnSet;
FILTER_SET = filterSet;
FILTER_SET.addFilterListener(this);
LOG = log;
LOG.addLogListener(this);
}
return LOG;
}
fireTableDataChanged();
}
@Override
public Object
getValueAt(
final int rowIndex,
final int columnIndex) {
final Column column;
final Event event;
column = getColumn(columnIndex);
event = getEvent(rowIndex);
return column.getValue(event);
}
@Override
return COLUMN_SET.getColumnCount();
}
@Override
return EVENTS.size();
}
@Override
public void added(
final Log source,
final Event event) {
if (LOG.equals(source)) {
insert(event);
}
}
@Override
public void removed(
final Log source,
final Event[] events) {
if (LOG.equals(source)) {
remove(events);
}
}
@Override
public void cleared(
final Log source) {
if (LOG.equals(source)) {
removeAll();
}
}
return EVENTS;
}
EVENTS = events;
fireChange();
}
@Override
synchronized (EVENTS) {
removeAll();
insertAll(LOG.toArray());
}
}
@Override
return getColumn(columnIndex).getName();
}
@Override
return getColumn(columnIndex).getType();
}
public Event
getEvent(
final int rowIndex) {
try {
return (Event)EVENTS.get(rowIndex);
} catch (Exception e) {
return null;
}
}
public void insertAll(
final Event[] events) {
int count = 0;
synchronized (EVENTS) {
for (int i = 0; i < events.length; i++) {
if ((events[i] != null)
&& FILTER_SET.isVisible(events[i])) {
count++;
EVENTS.add(0, events[i]);
}
}
if (count > 0) {
fireTableRowsInserted(0, count - 1);
}
}
}
synchronized (EVENTS) {
final int minRow = 0;
final int maxRow = EVENTS.size() - 1;
EVENTS.clear();
if (maxRow >= minRow) {
fireTableRowsDeleted(minRow, maxRow);
}
}
}
return COLUMN_SET;
}
return getColumnSet().columnForIndex(columnIndex);
}
private void insert(
final Event event) {
if ((event != null) && FILTER_SET.isVisible(event)) {
synchronized (insertLocker) {
EVENTS.add(0, event);
fireTableRowsInserted(0, 0);
}
}
}
private void remove(
final Event[] events) {
int minRow = -1;
int maxRow = -1;
int row;
synchronized (EVENTS) {
for (int i = 0; i < events.length; i++) {
row = EVENTS.indexOf(events[i]);
if ((minRow == -1) || (row < minRow)) {
minRow = row;
}
if ((maxRow == -1) || (row > maxRow)) {
maxRow = row;
}
}
for (int i = 0; i < events.length; i++) {
EVENTS.remove(events[i]);
}
if ((minRow > -1) && (maxRow > -1)) {
fireTableRowsDeleted(minRow, maxRow);
}
}
}
}