package org.incha.ui.classview;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import org.eclipse.jdt.core.IMember;
import org.incha.core.jswingripples.eig.JSwingRipplesEIGNode;
public class ClassTreeDataModel implements TableModel {
/**
* The item list.
*/
private final List<JSwingRipplesEIGNode> items = new LinkedList<JSwingRipplesEIGNode>();
/**
* The list of listeners.
*/
private final List<TableModelListener> listeners = new LinkedList<TableModelListener>();
private final String[] columns;
/**
* @param eig the EIG.
*/
public ClassTreeDataModel(final String... columns) {
super();
this.columns = columns;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getRowCount()
*/
@Override
public int getRowCount() {
return items.size();
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getColumnCount()
*/
@Override
public int getColumnCount() {
return columns.length;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getColumnName(int)
*/
@Override
public String getColumnName(final int columnIndex) {
return columns[columnIndex];
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getColumnClass(int)
*/
@Override
public Class<?> getColumnClass(final int columnIndex) {
return IMember.class;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#isCellEditable(int, int)
*/
@Override
public boolean isCellEditable(final int rowIndex, final int columnIndex) {
return false;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
@Override
public JSwingRipplesEIGNode getValueAt(final int rowIndex, final int columnIndex) {
checkBounds(rowIndex, columnIndex);
return items.get(rowIndex);
}
/**
* @param row the row index.
* @return
*/
public JSwingRipplesEIGNode getValueAt(final int row) {
return getValueAt(row, 0);
}
/**
* @param rowIndex
* @param columnIndex
*/
public void checkBounds(final int rowIndex, final int columnIndex) {
if (rowIndex >= items.size() || columnIndex >= columns.length) {
throw new RuntimeException("Out of data. Row: " + rowIndex
+ ", column: " + columnIndex);
}
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#setValueAt(java.lang.Object, int, int)
*/
@Override
public void setValueAt(final Object value, final int rowIndex, final int columnIndex) {
throw new IllegalAccessError("Unimplemented. Use add instead");
}
/**
* @param rember the value to add.
* @param pos position to insert.
*/
public void add(final JSwingRipplesEIGNode rember, final int pos) {
if (pos >= items.size()) {
items.add(rember);
final int row = items.size() - 1;
fireModelChanged(new TableModelEvent(this, row , row,
TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT));
} else {
items.add(pos, rember);
final int row = items.size() - 1;
fireModelChanged(new TableModelEvent(this, pos, row,
TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT));
}
}
/**
* @param members
* @param pos
*/
public void addAll(final JSwingRipplesEIGNode[] members, final int pos) {
if (members.length == 0) {
return;
}
final int oldSize = items.size();
if (pos >= items.size()) {
for (final JSwingRipplesEIGNode iType : members) {
items.add(iType);
}
fireModelChanged(new TableModelEvent(this, oldSize , items.size() - 1,
TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT));
} else {
for (int i = 0; i < members.length; i++) {
items.add(i + pos, members[i]);
}
fireModelChanged(new TableModelEvent(this, pos, pos + members.length -1,
TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT));
}
}
/**
* @param value the value to delete
*/
public void remove(final JSwingRipplesEIGNode value) {
final Iterator<JSwingRipplesEIGNode> iter = items.iterator();
while (iter.hasNext()) {
if (iter.next() == value) {
iter.remove();
break;
}
}
}
/**
* @param index
*/
public void removeRow(final int index) {
checkBounds(index, 0);
items.remove(index);
fireModelChanged(new TableModelEvent(this, index, index,
TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE));
}
/**
* @param e the model event.
*/
private void fireModelChanged(final TableModelEvent e) {
for (final TableModelListener l : listeners) {
l.tableChanged(e);
}
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#addTableModelListener(javax.swing.event.TableModelListener)
*/
@Override
public void addTableModelListener(final TableModelListener l) {
listeners.add(l);
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#removeTableModelListener(javax.swing.event.TableModelListener)
*/
@Override
public void removeTableModelListener(final TableModelListener l) {
listeners.remove(l);
}
/**
*
*/
public void refresh() {
final int size = items.size();
if (size > 0) {
fireModelChanged(new TableModelEvent(this, 0, size - 1,
TableModelEvent.ALL_COLUMNS, TableModelEvent.UPDATE));
}
}
/**
* @param type
* return index of given type.
*/
public int indexOf(final JSwingRipplesEIGNode type) {
for (int i = 0; i < items.size(); i++) {
final JSwingRipplesEIGNode item = items.get(i);
if (item == type) {
return i;
}
}
return -1;
}
/**
* @param index
*/
public void clear() {
final int size = items.size();
if (size > 0) {
items.clear();
fireModelChanged(new TableModelEvent(this, 0, size,
TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE));
}
}
}