/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.cismet.tools.gui.jtextcompoonent.undoredo;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.undo.*;
/**
* TableModel decoration for Undo/Redo Support.
*
* <p>WARNING: might fail on sorted Tables!</p>
*
* @author srichter
* @version $Revision$, $Date$
*/
public class UndoableTableModel extends AbstractTableModel implements TableModelListener {
//~ Instance fields --------------------------------------------------------
private TableModel delegate;
private UndoableEditSupport support = new UndoableEditSupport();
//~ Constructors -----------------------------------------------------------
/**
* Creates a new UndoableTableModel object.
*
* @param delegate DOCUMENT ME!
*/
public UndoableTableModel(final TableModel delegate) {
setDelegate(delegate);
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param delegate DOCUMENT ME!
*/
public void setDelegate(final TableModel delegate) {
if (this.delegate != null) {
this.delegate.removeTableModelListener(this);
}
this.delegate = delegate;
if (this.delegate != null) {
this.delegate.addTableModelListener(this);
}
fireTableStructureChanged();
}
@Override
public Class<?> getColumnClass(final int columnIndex) {
return delegate.getColumnClass(columnIndex);
}
@Override
public int getColumnCount() {
return delegate.getColumnCount();
}
@Override
public String getColumnName(final int columnIndex) {
return delegate.getColumnName(columnIndex);
}
@Override
public int getRowCount() {
return delegate.getRowCount();
}
@Override
public Object getValueAt(final int rowIndex, final int columnIndex) {
return delegate.getValueAt(rowIndex, columnIndex);
}
@Override
public boolean isCellEditable(final int rowIndex, final int columnIndex) {
return delegate.isCellEditable(rowIndex, columnIndex);
}
@Override
public void setValueAt(final Object aValue, final int rowIndex, final int columnIndex) {
final Object oldValue = delegate.getValueAt(rowIndex, columnIndex);
delegate.setValueAt(aValue, rowIndex, columnIndex);
final Object newValue = delegate.getValueAt(rowIndex, columnIndex);
fireChangeEdit(rowIndex, columnIndex, oldValue, newValue);
}
/**
* DOCUMENT ME!
*
* @param l DOCUMENT ME!
*/
public void addUndoableEditListener(final UndoableEditListener l) {
support.addUndoableEditListener(l);
}
/**
* DOCUMENT ME!
*
* @param l DOCUMENT ME!
*/
public void removeUndoableEditListener(final UndoableEditListener l) {
support.removeUndoableEditListener(l);
}
@Override
public void tableChanged(final TableModelEvent e) {
final TableModelEvent newEvent = new TableModelEvent(
this,
e.getFirstRow(),
e.getLastRow(),
e.getColumn(),
e.getType());
fireTableChanged(newEvent);
}
/**
* DOCUMENT ME!
*
* @param row DOCUMENT ME!
* @param col DOCUMENT ME!
* @param oldValue DOCUMENT ME!
* @param newValue DOCUMENT ME!
*/
protected void fireChangeEdit(final int row, final int col, final Object oldValue, final Object newValue) {
final UndoableEdit edit = new TableChangeEdit(row, col, oldValue, newValue);
support.beginUpdate();
support.postEdit(edit);
support.endUpdate();
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class TableChangeEdit extends AbstractUndoableEdit {
//~ Instance fields ----------------------------------------------------
private int columnIndex;
private int rowIndex;
private Object oldValue;
private Object newValue;
//~ Constructors -------------------------------------------------------
/**
* Creates a new TableChangeEdit object.
*
* @param rowIndex DOCUMENT ME!
* @param columnIndex DOCUMENT ME!
* @param oldValue DOCUMENT ME!
* @param newValue DOCUMENT ME!
*/
public TableChangeEdit(final int rowIndex,
final int columnIndex,
final Object oldValue,
final Object newValue) {
this.columnIndex = columnIndex;
this.rowIndex = rowIndex;
this.oldValue = oldValue;
this.newValue = newValue;
}
//~ Methods ------------------------------------------------------------
@Override
public void undo() {
super.undo();
delegate.setValueAt(oldValue, rowIndex, columnIndex);
}
@Override
public void redo() {
super.redo();
delegate.setValueAt(newValue, rowIndex, columnIndex);
}
}
}