/** * */ package org.seqcode.viz.utils; import java.util.Collection; import java.util.LinkedList; import java.util.Vector; import javax.swing.table.AbstractTableModel; /** * @author Timothy Danford * */ public class SelectableTableModel<X> extends AbstractTableModel { private boolean isMultiSelectable; private Vector<Boolean> selections; private Vector<X> values; private Class[] columnTypes; private String[] columnNames; public SelectableTableModel(String colName, Class colClass) { selections = new Vector<Boolean>(); values = new Vector<X>(); columnTypes = new Class[2]; columnTypes[0] = Boolean.class; columnTypes[1] = colClass; columnNames = new String[2]; columnNames[0] = "?"; columnNames[1] = colName; isMultiSelectable = true; } public int getRowCount() { return values.size(); } public boolean isMultiSelectable() { return isMultiSelectable; } public void setMultiSelectable(boolean v) { isMultiSelectable = v; } public int getColumnCount() { return 2; } public Class getColumnClass(int c) { return columnTypes[c]; } public String getColumnName(int c) { return columnNames[c]; } public boolean isCellEditable(int r, int c) { return r >= 0 && r < values.size() && c == 0; } public void addValue(X v) { values.add(v); selections.add(false); fireTableRowsInserted(values.size()-1, values.size()-1); } public X getValue(int r) { return values.get(r); } public void setValue(int r, X v) { values.set(r, v); fireTableRowsUpdated(r, r); } public boolean isSelected(int r) { return selections.get(r); } public void setAllSelections(boolean v) { for(int i = 0; i < selections.size(); i++) { selections.set(i, v); } fireTableRowsUpdated(0, selections.size()-1); } public X getFirstSelected() { for(int i = 0; i < selections.size(); i++) { if(selections.get(i)) { return values.get(i); } } return null; } public Collection<X> getSelected() { LinkedList<X> lst = new LinkedList<X>(); for(int i = 0; i< selections.size(); i++) { if(selections.get(i)) { lst.addLast(values.get(i)); } } return lst; } public void clear() { int end = values.size()-1; selections.clear(); values.clear(); if(end >= 0) { fireTableRowsDeleted(0, end); } } public void setValueAt(Object v, int r, int c) { if(c == 0) { if(!isMultiSelectable && !selections.get(r)) { for(int i = 0; i < selections.size(); i++) { if(selections.get(i)) { selections.set(i, new Boolean(false)); fireTableRowsUpdated(i, i); } } } selections.set(r, (Boolean)v); fireTableRowsUpdated(r, r); } } public Object getValueAt(int r, int c) { if(c == 0) { return selections.get(r); } if(c == 1) { return values.get(r); } return null; } public int[] getSelectionIndices() { int count = 0; for(int i = 0; i < selections.size(); i++) { if(selections.get(i)) { count += 1; } } int[] array = new int[count]; int j = 0; for(int i = 0; i < selections.size(); i++) { if(selections.get(i)) { array[j++] = i; } } return array; } }