package org.incha.ui.buildpath; import java.io.File; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; public class FileTableModel implements TableModel { /** * The item list. */ private final List<File> items = new ArrayList<File>(); /** * The list of listeners. */ private final List<TableModelListener> listeners = new LinkedList<TableModelListener>(); /** * Default constructor. */ public FileTableModel() { super(); } /* (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 1; } /* (non-Javadoc) * @see javax.swing.table.TableModel#getColumnName(int) */ @Override public String getColumnName(final int columnIndex) { return columnIndex == 0 ? "file" : null; } /* (non-Javadoc) * @see javax.swing.table.TableModel#getColumnClass(int) */ @Override public Class<?> getColumnClass(final int columnIndex) { return File.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 Object getValueAt(final int rowIndex, final int columnIndex) { checkBounds(rowIndex, columnIndex); return items.get(rowIndex); } /** * @param rowIndex * @param columnIndex */ public void checkBounds(final int rowIndex, final int columnIndex) { if (rowIndex >= items.size() || columnIndex > 0) { 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) { checkBounds(rowIndex, columnIndex); items.set(rowIndex, (File) value); fireModelChanged(new TableModelEvent(this, rowIndex)); } /** * @param value the value to add. */ public void add(final File value) { items.add(value); final int row = items.size() - 1; fireModelChanged(new TableModelEvent(this, row, row, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT)); } public void remove(final File value) { int index = -1; for (int i = 0; i < items.size(); i++) { final File item = items.get(i); if (item.equals(value)) { index = i; break; } } if (index > -1) { removeRow(index); } } /** * @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)); } } }