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<VCIJTableNode<IDataNode>> tableNodeList = tablePanel.getDataTablePanel().getTableModel().getList();
|
Map<String, String> 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<IDataNode> 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<Integer, List<Integer>> changedRowColumnMap = tablePanel.getChangedRowColumnMap();
|
for(int rowIndex : changeRowIndexs){
|
List<Integer> changedColumns = new LinkedList<Integer>();
|
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;
|
}
|
|
}
|