package com.vci.client.uif.engine.client.tableArea.editable.editor; import java.awt.Component; import java.lang.reflect.Constructor; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.swing.DefaultCellEditor; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import com.vci.client.portal.utility.PRMItem; import com.vci.client.ui.swing.components.VCIJOptionPane; import com.vci.client.ui.swing.components.table.VCIJTableNode; import com.vci.client.uif.engine.client.tableArea.editable.EditableTablePanel; import com.vci.client.uif.engine.client.tableArea.editable.check.CellValueChecker; import com.vci.client.uif.engine.common.IDataNode; /** * 通用、基础编辑器对象 * @author xiongchao * */ public abstract class BaseCellEditor extends DefaultCellEditor implements CellEditorListener { /** * */ private static final long serialVersionUID = -6335644331796023522L; protected PRMItem prmItem = null; protected EditableTablePanel tablePanel = null; private Object oldValue = ""; private int editRowIndex = -1; private int editColumnIndex = -1; public BaseCellEditor(JCheckBox checkBox) { super(checkBox); addCellEditorListener(this); } public BaseCellEditor(JComboBox comboBox) { super(comboBox); addCellEditorListener(this); } public BaseCellEditor(JTextField textField) { super(textField); addCellEditorListener(this); } protected void addLocalEditorListener(){ addCellEditorListener(this); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { oldValue = value; editRowIndex = row; editColumnIndex = column; tablePanel.setChanged(false); // 单元格,修改前的值 tablePanel.setOldValue(value); // 处于当前编辑的行(索引) tablePanel.setEditingRowIndex(row); // 处理当前编辑的列(索引) tablePanel.setEditingColumnIndex(column); return super.getTableCellEditorComponent(table, value, isSelected, row, column); } @Override public void editingCanceled(ChangeEvent e) { } @Override public void editingStopped(ChangeEvent e) { CellValueChecker checker = getCellValueCheckInstance(getPrmItem().getItemValue()); if(checker != null){ String cellNewValue = getCellEditorValue().toString(); if(!cellNewValue.equals(oldValue)){ boolean isValid = checker.isValidate(cellNewValue); if(!isValid){ VCIJOptionPane.showError(tablePanel, "输入的数据不规范,请重新输入!"); cancelCellEditing(); setCellValueLocal(oldValue.toString()); tablePanel.setChanged(false); return; } } } if(!checkValueChanged()) return; setCellValue(); resetSelectedCheckbox(); } private CellValueChecker getCellValueCheckInstance(String className){ CellValueChecker instance = null; try{ if(className != null && !"".equals(className)){ Class clazz = Class.forName(className); if(clazz != null){ Constructor cont = clazz.getConstructor(); if(cont != null){ Object obj = cont.newInstance(); if(obj != null && obj instanceof CellValueChecker){ instance = (CellValueChecker)obj; } } } } }catch(Exception ex){ ex.printStackTrace(); } return instance; } /** * 当前编辑的值是否发生了变更 * @return */ protected boolean checkValueChanged(){ Object newValueObj = getCellEditorValue(); if(newValueObj == null){ return false; } String newValue = newValueObj.toString(); boolean changed = !tablePanel.getOldValue().equals(newValue); tablePanel.setChanged(changed); return changed; } /** * 设置选中行的编辑列的值 */ protected void setCellValue() { setCellValueLocal(getCellEditorValue().toString()); } private void setCellValueLocal(String newEditorValue) { String field = getPrmItem().getItemField(); List> tableNodeList = tablePanel.getDataTablePanel().getTableModel().getList(); Map fieldToHeaderMap = tablePanel.getDataProvider().getColumnsMap(); // 全部勾先的行 int[] selectedRowIndex = tablePanel.getDataTablePanel().getSelectedRowIndexs(); // 仅是当前处于编辑的行 int editingRowIndex = tablePanel.getDataTablePanel().getTable().getSelectedRow(); selectedRowIndex = new int[]{editingRowIndex}; for(int rowIndex : selectedRowIndex){ if(rowIndex < 0) continue; VCIJTableNode tableNode = tableNodeList.get(rowIndex); String header = fieldToHeaderMap.get(field); if(header != null){ tableNode.setPropertyValue(header, newEditorValue); } } } /** * 重置被行的选中状态 */ protected void resetSelectedCheckbox(){ int[] rows = tablePanel.getDataTablePanel().getSelectedRowIndexs(); tablePanel.getDataTablePanel().getTableModel().fireTableDataChanged(); for(int rowIndex : rows){ tablePanel.getDataTablePanel().addClickedRow(rowIndex); } if(!checkRowIndexIsSelected(tablePanel.getEditingRowIndex())){ tablePanel.getDataTablePanel().addClickedRow(tablePanel.getEditingRowIndex()); } rows = tablePanel.getDataTablePanel().getSelectedRowIndexs(); // 设置哪些行、列上的数据发生了变化 setChangeRowColumnData(rows); } protected void setChangeRowColumnData(int[] changeRowIndexs){ Map> changedRowColumnMap = tablePanel.getChangedRowColumnMap(); for(int rowIndex : changeRowIndexs){ List changedColumns = new LinkedList(); if(changedRowColumnMap.containsKey(rowIndex)){ changedColumns = changedRowColumnMap.get(rowIndex); } if(!changedColumns.contains(tablePanel.getEditingColumnIndex())){ changedColumns.add(tablePanel.getEditingColumnIndex()); } changedRowColumnMap.put(rowIndex, changedColumns); } tablePanel.setChangedRowColumnMap(changedRowColumnMap); } /** * 检查指定的行是否处于选中状态 * @param rowIndex 被检查的过行索引 * @return 如果 rowIndex 处于选中状态返回 true,否则返回false */ protected boolean checkRowIndexIsSelected(int rowIndex){ boolean res = false; int[] rows = tablePanel.getDataTablePanel().getSelectedRowIndexs(); for(int rowIndexIn : rows){ if(rowIndexIn == rowIndex) { res = true; break; } } return res; } public PRMItem getPrmItem() { return prmItem; } public void setPrmItem(PRMItem prmItem) { this.prmItem = prmItem; } public EditableTablePanel getTablePanel() { return tablePanel; } public void setTablePanel(EditableTablePanel tablePanel) { this.tablePanel = tablePanel; } }