package com.google.code.joto.ui.table;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.code.joto.eventrecorder.RecordEventSummary;
/**
* a working copy of a TableModel, synchronized for icnoming events, but with
*/
public class SubSelectionRecordEventTableModel extends DefaultRecordEventTableModel {
/** internal for java.io.Serializable */
private static final long serialVersionUID = 1L;
private static Logger log = LoggerFactory.getLogger(SubSelectionRecordEventTableModel.class);
private boolean syncToUnderlying = true;
private AbstractRecordEventTableModel underlyingModel;
private TableModelListener innerTableModelListener;
// ------------------------------------------------------------------------
public SubSelectionRecordEventTableModel(AbstractRecordEventTableModel underlyingModel) {
super();
this.underlyingModel = underlyingModel;
this.innerTableModelListener = new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
onUnderlyingTableChanged(e);
}
};
underlyingModel.addTableModelListener(innerTableModelListener);
}
// ------------------------------------------------------------------------
public boolean isSyncToUnderlying() {
return syncToUnderlying;
}
public void setSyncToUnderlying(boolean p) {
this.syncToUnderlying = p;
}
public void reloadAllEvents() {
super.clearEventRows();
List<RecordEventSummary> rows = underlyingModel.getEventRowsSubList(0, underlyingModel.getRowCount()-1);
super.setRowElts(rows);
}
public void reloadNthLastEvents(int n) {
super.clearEventRows();
int underlyingRowLen = underlyingModel.getRowCount();
int underlyingFirstRow = (n >= underlyingRowLen)? 0 : (underlyingRowLen-n);
List<RecordEventSummary> rows = underlyingModel.getEventRowsSubList(underlyingFirstRow, underlyingRowLen-1);
super.setRowElts(rows);
}
// ------------------------------------------------------------------------
private void onUnderlyingTableChanged(TableModelEvent e) {
if (!syncToUnderlying) {
return;
}
int underlyingModelLen = underlyingModel.getRowCount();
int firstRow = e.getFirstRow();
int lastRow = e.getLastRow();
switch(e.getType()) {
case TableModelEvent.INSERT: {
if (firstRow == lastRow && lastRow < underlyingModelLen) {
// standard case: added 1 elt
RecordEventSummary addedRow = underlyingModel.getEventRow(lastRow);
super.addEventRow(addedRow);
} else if (firstRow >= 0 && lastRow < underlyingModelLen) {
// append multiple events
List<RecordEventSummary> addedRows = new ArrayList<RecordEventSummary>();
for (int i = firstRow; i <= lastRow; i++) {
addedRows.add(underlyingModel.getEventRow(i));
}
super.addEventRows(addedRows);
} else {
log.warn("non standard INSERT NOT supported yet ... ignore");
}
} break;
case TableModelEvent.UPDATE:
if (firstRow == 0 && lastRow == Integer.MAX_VALUE) {
log.warn("full table UPDATE NOT supported yet ... ignore");
} else if (firstRow == lastRow && lastRow < underlyingModelLen) {
// update 1 row
RecordEventSummary row = underlyingModel.getEventRow(lastRow);
int foundIndex = super.findEventRowIndex(row);
if (foundIndex != -1) {
super.updateRowAt(foundIndex, row);
}// else row already filtered out => do nothing
} else if (firstRow >= 0 && lastRow < underlyingModelLen) {
// update several rows (should not occur)
for (int i = firstRow; i <= lastRow; i++) {
RecordEventSummary row = underlyingModel.getEventRow(i);
int foundIndex = super.findEventRowIndex(row);
if (foundIndex != -1) {
super.updateRowAt(foundIndex, row);
}// else row already filtered out => do nothing
}
} else {
log.warn("non standard UPDATE NOT supported yet ... ignore");
}
break;
case TableModelEvent.DELETE:
if (firstRow >= 0 && lastRow < underlyingModelLen) {
// remove multiple events ???
// List<RecordEventSummary> removedRows = new ArrayList<RecordEventSummary>();
// for (int i = firstRow; i <= lastRow; i++) {
// removedRows.add(underlyingModel.getEventRow(i));
// }
// super.removeEventRows(removedRows);
log.warn("DELETE NOT supported yet (event mapping for deleted rows?) ... ignore");
} else {
log.warn("non standard DELETE NOT supported yet ... ignore");
}
break;
default:
break;
}
}
}