package com.vci.client.ui.table; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; import javax.swing.event.EventListenerList; import javax.swing.table.AbstractTableModel; public class VCIBaseTableModel extends AbstractTableModel{ /** * */ private static final long serialVersionUID = -3143694192308233038L; public ArrayList list = null; private String[] columns = null; private Class[] classes = null; /** * create a tableModel with the columns and the classes. * * @param columns String[], the data columns * @param classes String[], the data classes */ public VCIBaseTableModel(String[] columns, Class[] classes) { super(); this.columns = columns; this.classes = classes; initList(); } /** * init the ArrayList, the data's type is TableNode. * */ private void initList() { list = new ArrayList(); } /** * get column name */ public String getColumnName(int c) { return columns[c]; } /** * get column class */ @SuppressWarnings("unchecked") public Class getColumnClass(int c) { return classes == null ? String.class : classes[c]; } /** * get the count of columns */ public int getColumnCount() { return columns.length; } /** * get the row of the model */ public int getRowCount() { return list.size(); } /** * get vlaue of each cell of table */ public Object getValueAt(int rowIndex, int columnIndex) { Object obj = null; try { VCIBaseTableNode tableNode = (VCIBaseTableNode)list.get(rowIndex); return tableNode.getPropertyValueByName(columns[columnIndex]); } catch (Exception e){ e.printStackTrace(); obj = null; } return obj; } /** * set value to table cell */ public void setValueAt(Object obj, int row, int columnIndex) { VCIBaseTableNode tableNode = (VCIBaseTableNode)list.get(row); tableNode.setPropertyValueByName(columns[columnIndex], obj); } /** * add a row data into the model, if the row vlaue is 0, insert data * into the first line. Others, insert data into the next row of the given one. * * @param row int, the current row. * @param tableNode TableNode, the data which we want to insert into model. * @return */ public boolean addRow(int row, VCIBaseTableNode tableNode) { boolean rs = false; try { if (list.size() == 0 || row == 0) { list.add(0, tableNode); } else { list.add(list.size(), tableNode); } rs = true; } catch (Exception e) { e.printStackTrace(); rs = false; } return rs; } /** * remove the current row data from the model * * @param row int * @return */ public boolean removeRow(int row) { boolean rs = false; try { list.remove(row); rs = true; } catch (Exception e) { e.printStackTrace(); rs = false; } return rs; } public VCIBaseTableNode getValueAt(int row) { return list.get(row); } // add by xchao 2010.11.03 // 增加单元格数据改变后的事件处理 private boolean cancelCellValueChange = false; /** * 是否取消单元格数据发生的改变 * @return */ public boolean isCancelCellValueChange(){ return cancelCellValueChange; } /** * 设置是否取消单元格数据发生的改变 * @param isCancel 是否取消 true:取消单元格数据发生的改变 false:保持单元格数据改变 */ public void setCancelCellValueChange(boolean isCancel){ cancelCellValueChange = isCancel; } protected EventListenerList listenerList = new EventListenerList(); /** * 添加单元格数据已经修改完毕后的事件处理 * @param l 单元格数据已经修改完毕后的事件处理程序 */ public void addCellValueChangedListener(CellValueChangedListener l){ listenerList.add(CellValueChangedListener.class, l); } /** * 移除单元格数据已经修改完毕后的事件处理 * @param l 单元格数据已经修改完毕后的事件处理程序 */ public void removeCellValueChangedListener(CellValueChangedListener l){ if(l != null) listenerList.remove(CellValueChangedListener.class, l); } /** * 返回全部的 单元格数据已经修改完毕后的事件处理程序 * @return */ public CellValueChangedListener[] getCellValueChangedListeners(){ return (CellValueChangedListener[])listenerList.getListeners(CellValueChangedListener.class); } /** * 引发 单元格数据已经修改完毕的事件处理程序 * @param e */ public void fireCellValueChanged(CellValueChanagedEvent e){ CellValueChangedListener[] listeners = getCellValueChangedListeners(); for(int i = listeners.length - 1; i >= 0; i--){ ((CellValueChangedListener)listeners[i]).cellValueChanged(e); } } // xxc /** * 添加在单元格数据修改之前的事件处理 * @param l 单元格数据修改之前的事件程序 */ public void addBeforeCellValueChangedListener(BeforeCellValueChangedListener l){ listenerList.add(BeforeCellValueChangedListener.class, l); } /** * 移除在单元格数据修改之前的事件处理 * @param l 单元格数据修改之前的事件程序 */ public void removeBeforeCellValueChangedListener(BeforeCellValueChangedListener l){ if(l != null) listenerList.remove(BeforeCellValueChangedListener.class, l); } /** * 返回全部的 在单元格数据修改之前的事件处理 * @return */ public BeforeCellValueChangedListener[] getBeforeCellValueChangedListeners(){ return (BeforeCellValueChangedListener[])listenerList.getListeners(BeforeCellValueChangedListener.class); } /** * 引发 在单元格数据修改之前的事件程序 * @param e */ public void fireBeforeCellValueChanged(CellValueChanagedEvent e){ BeforeCellValueChangedListener[] listeners = getBeforeCellValueChangedListeners(); for(int i = listeners.length - 1; i >= 0; i--){ ((BeforeCellValueChangedListener)listeners[i]).beforeCellValueChanged(e); } } private Map editableColumns = new LinkedHashMap(); /** * 添加可编辑列的列索引 * @param columnIndexs 列索引序列 */ public void addEditableColumn(int...columnIndexs){ for(int col : columnIndexs){ addEditableColumn(col); } } /** * 添加可编辑列的列索引 * @param columnIndex 列索引 */ public void addEditableColumn(int columnIndex){ editableColumns.put(columnIndex, columnIndex); } /** * 移除可编辑列的列索引 * @param columnIndexs 列索引序列 */ public void removeEditableColumn(int...columnIndexs){ for(int col : columnIndexs){ removeEditableColumn(col); } } /** * 移除可编辑列的列索引 * @param columnIndex 列索引 */ public void removeEditableColumn(int columnIndex){ if(editableColumns.containsKey(columnIndex)){ editableColumns.remove(columnIndex); } } public boolean isCellEditable(int row, int col) { return editableColumns.containsKey(col); } }