/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.bearsoft.gui.grid.data;
import com.bearsoft.gui.grid.insets.InsetPart;
import com.bearsoft.gui.grid.insets.LinearInset;
import java.util.HashSet;
import java.util.Set;
import javax.swing.table.TableModel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
/**
* This table model wrapper is intended to work around a situation when row sorter or column model
* generate illegal indexes, such as less than 0 or greater than some max bias.
* @see InsetPart#AFTER_INSET_BIAS
* @author Gala
*/
public class BoundaredTableModel implements TableModelWrapper {
protected class DelegateListener implements TableModelListener {
@Override
public void tableChanged(TableModelEvent e) {
fireTableChanged(e);
}
}
protected TableModel delegate;
protected int maxBias = InsetPart.AFTER_INSET_BIAS;
protected LinearInset rowsInset;
protected LinearInset columnsInset;
protected Set<TableModelListener> listeners = new HashSet<>();
public BoundaredTableModel(TableModel aDelegate, int aMaxBias, LinearInset aRowsInset, LinearInset aColumnsInset) {
super();
delegate = aDelegate;
maxBias = aMaxBias;
rowsInset = aRowsInset;
columnsInset = aColumnsInset;
delegate.addTableModelListener(new DelegateListener());
//rowsInset.addInsetChangeListener(new RowsInsetListener());
//columnsInset.addInsetChangeListener(new ColumnsInsetListener());
}
protected boolean isLegal(int aIndex) {
return aIndex >= 0 && aIndex < maxBias;
}
@Override
public int getRowCount() {
return delegate.getRowCount();
}
@Override
public int getColumnCount() {
return delegate.getColumnCount();
}
@Override
public String getColumnName(int aColIndex) {
if (isLegal(aColIndex)) {
return delegate.getColumnName(aColIndex);
} else {
return "";
}
}
public Class<?> getColumnClass(int aColIndex) {
if (isLegal(aColIndex)) {
return delegate.getColumnClass(aColIndex);
} else {
return String.class;
}
}
@Override
public boolean isCellEditable(int aRowIndex, int aColIndex) {
if (isLegal(aRowIndex) && isLegal(aColIndex)) {
return delegate.isCellEditable(aRowIndex, aColIndex);
} else {
return false;
}
}
@Override
public Object getValueAt(int aRowIndex, int aColIndex) {
if (isLegal(aRowIndex) && isLegal(aColIndex)) {
return delegate.getValueAt(aRowIndex, aColIndex);
} else {
return null;
}
}
@Override
public void setValueAt(Object aValue, int aRowIndex, int aColIndex) {
if (isLegal(aRowIndex) && isLegal(aColIndex)) {
delegate.setValueAt(aValue, aRowIndex, aColIndex);
}
}
@Override
public void addTableModelListener(TableModelListener l) {
listeners.add(l);
}
public void removeTableModelListener(TableModelListener l) {
listeners.remove(l);
}
public TableModel unwrap() {
return delegate;
}
protected void fireTableChanged(TableModelEvent e) {
for (TableModelListener l : listeners) {
l.tableChanged(e);
}
}
}