/*
* Created on 08.05.2008
*
*/
package org.jdesktop.swingx.binding;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import org.jdesktop.beans.AbstractBean;
public class TableRowCountAdapter extends AbstractBean {
private JTable table;
private TableModelListener tableModelListener;
private PropertyChangeListener tableListener;
public TableRowCountAdapter(JTable table) {
this.table = table;
table.getModel().addTableModelListener(getTableModelListener());
table.addPropertyChangeListener(getTableListener());
}
private PropertyChangeListener getTableListener() {
if (tableListener == null) {
tableListener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if (!"model".equals(evt.getPropertyName())) return;
reinstallTableModelListener((TableModel) evt.getOldValue());
}
};
}
return tableListener;
}
protected void reinstallTableModelListener(TableModel oldValue) {
oldValue.removeTableModelListener(getTableModelListener());
table.getModel().addTableModelListener(getTableModelListener());
}
public int getRowCount() {
return table.getRowCount();
}
private TableModelListener getTableModelListener() {
if (tableModelListener == null) {
tableModelListener = new TableModelListener() {
public void tableChanged(TableModelEvent e) {
if (isModification(e)) {
firePropertyChange("rowCount", -1, table.getRowCount());
}
}
private boolean isModification(TableModelEvent e) {
if (isStructureChanged(e) || (e.getType() == TableModelEvent.INSERT)
|| (e.getType() == TableModelEvent.DELETE)) {
return true;
}
return false;
}
private boolean isStructureChanged(TableModelEvent e) {
return e == null || e.getFirstRow() == TableModelEvent.HEADER_ROW;
}
};
}
return tableModelListener;
}
}