package com.vci.client.ui.swing.components.table.setting;
|
|
import java.awt.BorderLayout;
|
import java.awt.Dimension;
|
import java.awt.Font;
|
import java.awt.Point;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
import java.awt.event.KeyAdapter;
|
import java.awt.event.KeyEvent;
|
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseEvent;
|
import java.text.MessageFormat;
|
import java.util.LinkedHashMap;
|
import java.util.LinkedList;
|
import java.util.List;
|
import java.util.regex.Pattern;
|
|
import javax.swing.DefaultCellEditor;
|
import javax.swing.event.CellEditorListener;
|
import javax.swing.event.ChangeEvent;
|
import javax.swing.table.TableColumn;
|
import javax.swing.table.TableColumnModel;
|
|
import com.vci.client.ui.swing.VCISwingUtil;
|
import com.vci.client.ui.swing.components.VCIJButton;
|
import com.vci.client.ui.swing.components.VCIJDialog;
|
import com.vci.client.ui.swing.components.VCIJIntegerTextField;
|
import com.vci.client.ui.swing.components.VCIJLabel;
|
import com.vci.client.ui.swing.components.VCIJOptionPane;
|
import com.vci.client.ui.swing.components.VCIJPanel;
|
import com.vci.client.ui.swing.components.table.AbstractVCIJTableDataProvider;
|
import com.vci.client.ui.swing.components.table.VCIJTableNode;
|
import com.vci.client.ui.swing.components.table.VCIJTablePanel;
|
|
public class ColumnSettingDialog<T> extends VCIJDialog implements ActionListener {
|
|
/**
|
*
|
*/
|
private static final long serialVersionUID = 2685955148137843953L;
|
|
|
private VCIJTablePanel<T> tablePanel = null;
|
private VCIJIntegerTextField txtWidth = new VCIJIntegerTextField("100");
|
private VCIJButton btnWidthSet = VCISwingUtil.createVCIJButton("widthSet", "设定", "设定", "table_edit.png", this);
|
private VCIJButton btnOk = VCISwingUtil.createVCIJButton("ok", "确定", "确定", "accept.png", this);
|
private VCIJButton btnCancel = VCISwingUtil.createVCIJButton("cancel", "取消", "取消", "cancel.png", this);
|
public ColumnSettingDialog(VCIJTablePanel<T> tablePanel){
|
super(VCISwingUtil.getClientMainFrame(), true);
|
this.tablePanel = tablePanel;
|
setTitle("列设置");
|
setSize(new Dimension(700, 550));
|
this.setLocationRelativeTo(tablePanel);
|
setModal(true);
|
}
|
|
public void buildDialog(){
|
init();
|
}
|
|
private void init(){
|
setLayout(new BorderLayout());
|
add(getNouthPanel(), BorderLayout.NORTH);
|
add(getCenterContentPanel(), BorderLayout.CENTER);
|
add(getSouthButtonPanel(), BorderLayout.SOUTH);
|
}
|
private VCIJPanel getNouthPanel(){
|
VCIJPanel pal = new VCIJPanel();
|
return pal;
|
}
|
|
private SettingTableDataProvider dataProvider = null;
|
private VCIJTablePanel<SettingDataStruct> settingTablePanel = null;
|
private VCIJPanel getCenterContentPanel(){
|
VCIJPanel pal = new VCIJPanel();
|
dataProvider = new SettingTableDataProvider();
|
settingTablePanel = new VCIJTablePanel<SettingDataStruct>(dataProvider);
|
settingTablePanel.setShowCheckbox(true);
|
settingTablePanel.setShowPaging(false);
|
settingTablePanel.setShowExport(false);
|
settingTablePanel.setShowColumnSetting(false);
|
settingTablePanel.setReorderingAllowed(false);
|
settingTablePanel.setEnableSorter(false);
|
LinkedList<Integer> editableColumnList = new LinkedList<Integer>();
|
editableColumnList.add(3);editableColumnList.add(4);
|
settingTablePanel.setEdiableColumnList(editableColumnList);
|
LinkedHashMap<Integer, Integer> columnWidthMaps = new LinkedHashMap<Integer, Integer>();
|
columnWidthMaps.put(3, 60);columnWidthMaps.put(4, 40);
|
settingTablePanel.setColumnWidthMaps(columnWidthMaps);
|
settingTablePanel.buildTablePanel();
|
settingTablePanel.refreshTableData();
|
settingTablePanel.getTable().getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(new VCIJIntegerTextField("")));
|
settingTablePanel.getTable().getColumnModel().getColumn(3).getCellEditor().addCellEditorListener(new CellEditorListener() {
|
@Override
|
public void editingStopped(ChangeEvent e) {
|
editionEvent(e);
|
}
|
|
@Override
|
public void editingCanceled(ChangeEvent e) {
|
editionEvent(e);
|
}
|
private void editionEvent(ChangeEvent e){
|
DefaultCellEditor editor = (DefaultCellEditor)e.getSource();
|
Object value = editor.getCellEditorValue();
|
setValueToText(value);
|
}
|
});
|
settingTablePanel.getTable().addMouseListener(new MouseAdapter() {
|
public void mouseClicked(MouseEvent e) {
|
settingTablePanel.getTable().getColumnModel().getColumn(3).getCellEditor().stopCellEditing();
|
settingTablePanel_mouseClicked(e);
|
}
|
});
|
pal = settingTablePanel;
|
|
return pal;
|
}
|
private void settingTablePanel_mouseClicked(MouseEvent e){
|
Point point = e.getPoint();
|
int row = settingTablePanel.getTable().rowAtPoint(point);
|
int column = settingTablePanel.getTable().columnAtPoint(point);
|
if(row < 0 || column < 0) return;
|
VCIJTableNode<SettingDataStruct> tableNode = settingTablePanel.getTableModel().getList().get(row);
|
Object value = tableNode.getPropertyValue(COLUMN_WIDTH);
|
setValueToText(value);
|
}
|
private void setValueToText(Object value){
|
txtWidth.setText(String.valueOf(value));
|
}
|
private Pattern ptnNumber = Pattern.compile("[0-9]+");
|
final String COLUMN_NAME = "属性名称";
|
final String COLUMN_WIDTH = "宽度";
|
final String COLUMN_VISIABLE = "显示";
|
private String[] tablePanelColumns = new String[0];
|
private LinkedHashMap<String, Integer> tablePanelColumnNameToIndexMap = new LinkedHashMap<String, Integer>();
|
|
class SettingTableDataProvider extends AbstractVCIJTableDataProvider<SettingDataStruct> {
|
{
|
tablePanelColumns = tablePanel.getDataProvider().getSpecialColumns();
|
int index = ((AbstractVCIJTableDataProvider<T>)tablePanel.getDataProvider()).getDataColumnStartIndex();
|
for(String columnName : tablePanelColumns){
|
tablePanelColumnNameToIndexMap.put(columnName, index++);
|
}
|
}
|
@Override
|
public Class<?>[] getClasses() {
|
String[] columns = getColumns();
|
this.classes = new Class<?>[this.getColumns().length];
|
classes[0] = Boolean.class;
|
for (int i = 1; i < classes.length; i++) {
|
classes[i] = columns[i].getClass();
|
if(columns[i].equals(COLUMN_VISIABLE)){
|
classes[i] = Boolean.class;
|
}
|
}
|
return this.classes;
|
}
|
|
@Override
|
public String[] getSpecialColumns() {
|
return new String[]{COLUMN_NAME, COLUMN_WIDTH};
|
}
|
@Override
|
public int getTotal() {
|
return tablePanel.getDataProvider().getSpecialColumns().length;
|
}
|
@Override
|
public VCIJTableNode<SettingDataStruct> getNewRowNode(SettingDataStruct dataObj) {
|
VCIJTableNode<SettingDataStruct> tableNode = new VCIJTableNode<SettingDataStruct>(dataObj);
|
tableNode.setPropertyValue(COLUMN_NAME, dataObj.attrName);
|
int width = getColumnWidth(dataObj.attrName);
|
tableNode.setPropertyValue(COLUMN_WIDTH, width);
|
tableNode.setPropertyValue(COLUMN_VISIABLE, true);
|
return tableNode;
|
}
|
|
private int getColumnWidth(String columnName){
|
int res = tablePanel.getColumnDefaultWidth();
|
if(tablePanelColumnNameToIndexMap.containsKey(columnName)){
|
TableColumnModel tcm = tablePanel.getTable().getColumnModel();
|
int columnIndex = tablePanelColumnNameToIndexMap.get(columnName);
|
if(columnIndex < tcm.getColumnCount()){
|
TableColumn tc = tcm.getColumn(columnIndex);
|
res = tc.getWidth();
|
}
|
}
|
return res;
|
}
|
|
@SuppressWarnings("unchecked")
|
@Override
|
public SettingDataStruct[] getDatas(int pageIndex, int pageSize) {
|
LinkedList<SettingDataStruct> list = new LinkedList<ColumnSettingDialog<T>.SettingDataStruct>();
|
String[] columns = tablePanel.getDataProvider().getSpecialColumns();
|
for(String column : columns){
|
SettingDataStruct data = new SettingDataStruct();
|
data.attrName = column;
|
list.add(data);
|
}
|
return list.toArray(new ColumnSettingDialog.SettingDataStruct[]{});
|
}
|
}
|
class SettingDataStruct{
|
String attrName = "";
|
int width = tablePanel.getColumnDefaultWidth();
|
int index = 1;
|
}
|
|
private VCIJPanel getSouthButtonPanel(){
|
VCIJPanel pal = new VCIJPanel(new BorderLayout());
|
VCIJLabel lblInfo = new VCIJLabel(
|
"<html>" +
|
"<p color='blue'>1、鼠标双击数据行或按F2键,进入编辑状态,按回车键(Enter)结束编辑</p>" +
|
"</html>");
|
Font f = lblInfo.getFont();
|
lblInfo.setFont(new Font(f.getFamily(), Font.BOLD, 14));
|
pal.add(lblInfo, BorderLayout.CENTER);
|
|
VCIJPanel palBtn = new VCIJPanel();
|
VCIJLabel lbl = new VCIJLabel(COLUMN_WIDTH);
|
palBtn.add(lbl);
|
txtWidth.addKeyListener(new KeyAdapter() {
|
public void keyReleased(KeyEvent e) {
|
widthSet();
|
}
|
});
|
palBtn.add(txtWidth);
|
palBtn.add(btnWidthSet);
|
palBtn.add(btnOk);
|
palBtn.add(btnCancel);
|
pal.add(palBtn, BorderLayout.SOUTH);
|
return pal;
|
}
|
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
String actionCommand = e.getActionCommand();
|
if(actionCommand.equals(btnWidthSet.getActionCommand())) widthSet();
|
else if(actionCommand.equals(btnOk.getActionCommand())) ok();
|
else if(actionCommand.equals(btnCancel.getActionCommand())) cancel();
|
}
|
|
private void widthSet(){
|
int[] rows = settingTablePanel.getSelectedRowIndexs();
|
if(rows.length == 0){
|
VCIJOptionPane.showError(this, "请先选择数据!");
|
return;
|
}
|
if(!isValidNumber(0, "", txtWidth.getText(), false)){
|
return;
|
}
|
List<VCIJTableNode<SettingDataStruct>> list = settingTablePanel.getTableModel().getList();
|
for(int row : rows){
|
VCIJTableNode<SettingDataStruct> tableNode = list.get(row);
|
tableNode.setPropertyValue(COLUMN_WIDTH, txtWidth.getText());
|
}
|
settingTablePanel.validate();
|
settingTablePanel.updateUI();
|
}
|
private void ok(){
|
if(!columnWidthIsOk()){
|
return;
|
} else {
|
setTablePanelWidth();
|
}
|
|
tablePanel.validate();
|
tablePanel.updateUI();
|
close(DialogResult.OK);
|
}
|
|
private void setTablePanelWidth(){
|
TableColumnModel tcm = tablePanel.getTable().getColumnModel();
|
LinkedList<VCIJTableNode<SettingDataStruct>> list = settingTablePanel.getTableModel().getList();
|
for(int i = 0; i < list.size(); i++){
|
VCIJTableNode<SettingDataStruct> tableNode = list.get(i);
|
String columnName = tableNode.getPropertyValue(COLUMN_NAME).toString();
|
if(tablePanelColumnNameToIndexMap.containsKey(columnName)){
|
int columnIndex = tablePanelColumnNameToIndexMap.get(columnName);
|
if(columnIndex < tcm.getColumnCount()){
|
TableColumn tc = tcm.getColumn(columnIndex);
|
int width = tableNode.getObject().width;
|
tc.setWidth(width);
|
tc.setMaxWidth(width*2);
|
tc.setPreferredWidth(width);
|
}
|
}
|
}
|
}
|
|
private boolean columnWidthIsOk(){
|
boolean res = false;
|
LinkedList<VCIJTableNode<SettingDataStruct>> list = settingTablePanel.getTableModel().getList();
|
for(int i = 0; i < list.size(); i++){
|
VCIJTableNode<SettingDataStruct> tableNode = list.get(i);
|
String columnName = tableNode.getPropertyValue(COLUMN_NAME).toString();
|
String widthString = tableNode.getPropertyValue(COLUMN_WIDTH).toString();
|
if(!isValidNumber(i+1, columnName, widthString, true)){
|
return false;
|
}
|
int width = Integer.valueOf(widthString);
|
boolean visiable = Boolean.valueOf(tableNode.getPropertyValue(COLUMN_VISIABLE).toString());
|
if(!visiable){
|
width = 0;
|
}
|
tableNode.setPropertyValue(COLUMN_WIDTH, String.valueOf(width));
|
tableNode.getObject().width = width;
|
res = true;
|
}
|
return res;
|
}
|
|
private boolean isValidNumber(int rowIndex, String columnName, String numberString, boolean showRowInfo){
|
boolean res = false;
|
String errorMessage = "列宽只能是大于等于0、小于等于2000的正整数";
|
if(showRowInfo){
|
errorMessage = MessageFormat.format(
|
"第{0}行‘{1}’的" + errorMessage,
|
String.valueOf(rowIndex), columnName);
|
}
|
boolean isNumber = ptnNumber.matcher(numberString).matches();
|
if(!isNumber){
|
VCIJOptionPane.showError(this, errorMessage);
|
return false;
|
}
|
try{
|
Integer i = Integer.valueOf(numberString);
|
if(i < 0 || i > 2000) {
|
throw new NumberFormatException(errorMessage);
|
}
|
res = true;
|
}catch(Exception ex){
|
VCIJOptionPane.showError(this, errorMessage);
|
return false;
|
}
|
return res;
|
}
|
|
|
private void cancel(){
|
close(DialogResult.CANCEL);
|
}
|
private void close(DialogResult dialogResult){
|
dispose();
|
setVisible(false);
|
setDialogResult(dialogResult);
|
}
|
|
}
|