package com.vci.client.uif.engine.client.compare.dialog;
|
|
import java.awt.BorderLayout;
|
import java.awt.Color;
|
import java.awt.Component;
|
import java.awt.Dimension;
|
import java.awt.GridBagConstraints;
|
import java.awt.GridBagLayout;
|
import java.awt.GridLayout;
|
import java.awt.Insets;
|
import java.awt.Rectangle;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import javax.swing.BorderFactory;
|
import javax.swing.JButton;
|
import javax.swing.JDialog;
|
import javax.swing.JLabel;
|
import javax.swing.JPanel;
|
import javax.swing.JScrollPane;
|
import javax.swing.JTextArea;
|
import javax.swing.JTextField;
|
import javax.swing.border.Border;
|
import javax.swing.event.DocumentEvent;
|
import javax.swing.event.DocumentListener;
|
|
import com.vci.client.uif.engine.client.compare.attribute.Attdef;
|
import com.vci.client.uif.engine.client.compare.attribute.AttrType;
|
import com.vci.client.uif.engine.client.compare.dialog.NodeCompareDialog;
|
import com.vci.client.uif.engine.client.compare.dialog.treenode.TreeNodeObject;
|
import com.vci.client.uif.engine.client.compare.tools.CompareTools;
|
|
/**
|
* 属性编辑器:
|
* 1、只有在节点的状态为节点存在,节点及关系存在的情况下才能编辑属性
|
* 2、只有在关系存在的情况下才能编辑关系属性
|
*
|
* 编辑情况分析:
|
* 1、节点不存在,通过更新操作创建的,再修改它的属性,其状态应该还为原来的状态
|
* 2、关系不存在,新创建了关系,又编辑了关系的属性
|
* @author VCI-STGK006
|
*
|
*/
|
public class NodeAttributeCompareDialog extends JDialog {
|
|
/**
|
* serialVersionUID
|
*/
|
private static final long serialVersionUID = -8229026473768355449L;
|
|
/**
|
* 所属窗口
|
*/
|
private NodeCompareDialog owner;
|
|
/**
|
* 边框
|
*/
|
private Border lBorder = BorderFactory.createTitledBorder("系统数据");
|
|
/**
|
* 边框
|
*/
|
private Border dsBorder = BorderFactory.createTitledBorder("系统数据");
|
|
/**
|
* 左侧节点
|
*/
|
private TreeNodeObject lTno;
|
|
/**
|
* 右侧节点
|
*/
|
private TreeNodeObject rTno;
|
|
/**
|
* 是否可编辑
|
*/
|
private boolean editable = false;
|
|
/**
|
* 显示属性定义
|
*/
|
private List<Attdef> attdefList;
|
|
/**
|
* 属性定义
|
*/
|
private Map<String, Attdef> attdefMap = new HashMap<String, Attdef>();
|
|
/**
|
* 左侧属性
|
*/
|
private Map<String, Component> lPanelComp = new HashMap<String, Component>();
|
|
/**
|
* 右侧属性
|
*/
|
private Map<String, Component> rPanelComp = new HashMap<String, Component>();
|
|
|
/**
|
* 构造器
|
* @param ed 所属窗口
|
* @param lTno 左侧树节点
|
* @param rTno 右侧树节点
|
*/
|
public NodeAttributeCompareDialog(NodeCompareDialog ed, TreeNodeObject lTno, TreeNodeObject rTno) {
|
super(ed, true);
|
this.owner = ed;
|
this.lTno = lTno;
|
this.rTno = rTno;
|
this.editable = ed.getComparer().isEditable();
|
this.attdefList = ed.getComparer().getAttributes().getDisplayAttributes();
|
String title = editable ? "属性编辑器" : "属性查看器";
|
this.setTitle(title);
|
this.init();
|
this.setLocationRelativeTo(ed);
|
this.setVisible(true);
|
}
|
|
/**
|
* 绘制
|
*
|
* 注意:
|
* 在为控件设置值时需要首先设置excel
|
* 数据区的值,然后设置ds数据区的值
|
*/
|
public void init() {
|
this.setSize(600, 500);
|
this.getContentPane();
|
|
JPanel centerPanel = new JPanel(new GridLayout(1, 2, 5, 5));
|
//创建左侧数据区
|
JPanel lPanel = createLPanel();
|
//创建右侧数据区
|
JPanel rPanel = createRPanel();
|
//创建按钮区
|
JPanel bottonPanel = buttonPanel();
|
//设置表格数据
|
setData();
|
centerPanel.add(lPanel);
|
centerPanel.add(rPanel);
|
this.getContentPane().add(centerPanel, BorderLayout.CENTER);
|
this.getContentPane().add(bottonPanel, BorderLayout.SOUTH);
|
}
|
|
int gridy = 0;
|
/**
|
* 创建左侧数据区
|
* @return
|
*/
|
private JPanel createLPanel() {
|
gridy = 0;
|
|
JPanel lPanel = new JPanel();
|
lPanel.setBorder(lBorder);
|
lPanel.setLayout(new GridBagLayout());
|
if(attdefList != null) {
|
for(int i = 0; i < attdefList.size(); i++) {
|
Attdef ad = attdefList.get(i);
|
//判断是否可编辑
|
boolean tempEditabel = this.editable && ad.isEditable();
|
|
this.attdefMap.put(ad.getAttrName(), ad);
|
JLabel label = new JLabel(ad.getAttrDisplayName());
|
addComponent(lPanel, label, true, false);
|
if(ad.getAttrType() == AttrType.String) {
|
JTextField lField = new JTextField();
|
this.lPanelComp.put(ad.getAttrName(), lField);
|
lField.setEditable(tempEditabel);
|
addComponent(lPanel, lField, false, false);
|
} else if (ad.getAttrType() == AttrType.LongText) {
|
JTextArea areaField = new JTextArea();
|
this.lPanelComp.put(ad.getAttrName(), areaField);
|
areaField.setEditable(tempEditabel);
|
areaField.setLineWrap(true);
|
JScrollPane sp1 = new JScrollPane(areaField);
|
addComponent(lPanel, sp1, false, true);
|
} else {
|
JTextField lField = new JTextField();
|
this.lPanelComp.put(ad.getAttrName(), lField);
|
lField.setEditable(tempEditabel);
|
addComponent(lPanel, lField, false, false);
|
}
|
}
|
GridBagConstraints c = getGBC(0, gridy, 2, 1, 1.0, 0.1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, 2, 5);
|
lPanel.add(new JLabel(), c);
|
} else {
|
JLabel label = new JLabel("无数据");
|
addComponent(lPanel, label, true, false);
|
}
|
return lPanel;
|
}
|
|
/**
|
* 右侧数据区
|
* @return
|
*/
|
private JPanel createRPanel() {
|
gridy = 0;
|
JPanel rPanel = new JPanel();
|
rPanel.setBorder(dsBorder);
|
rPanel.setLayout(new GridBagLayout());
|
|
if(attdefList != null) {
|
for(int i = 0; i < attdefList.size(); i++) {
|
Attdef ad = attdefList.get(i);
|
//判断是否可编辑
|
boolean tempEditabel = this.editable && ad.isEditable();
|
|
JLabel label = new JLabel(ad.getAttrDisplayName());
|
addComponent(rPanel, label, true, false);
|
if(ad.getAttrType() == AttrType.String) {
|
JTextField field = new JTextField();
|
this.rPanelComp.put(ad.getAttrName(), field);
|
field.setEditable(tempEditabel);
|
final String attrName = ad.getAttrName();
|
field.getDocument().addDocumentListener(new DocumentListener() {
|
public void removeUpdate(DocumentEvent e) {
|
textChange(e, attrName);
|
}
|
public void insertUpdate(DocumentEvent e) {
|
textChange(e, attrName);
|
}
|
public void changedUpdate(DocumentEvent e) {
|
textChange(e, attrName);
|
}
|
});
|
addComponent(rPanel, field, false, false);
|
} else if(ad.getAttrType() == AttrType.LongText) {
|
JTextArea areaField = new JTextArea();
|
this.rPanelComp.put(ad.getAttrName(), areaField);
|
areaField.setEditable(tempEditabel);
|
final String attrName = ad.getAttrName();
|
areaField.getDocument().addDocumentListener(new DocumentListener() {
|
public void removeUpdate(DocumentEvent e) {
|
textChange(e, attrName);
|
}
|
public void insertUpdate(DocumentEvent e) {
|
textChange(e, attrName);
|
}
|
public void changedUpdate(DocumentEvent e) {
|
textChange(e, attrName);
|
}
|
});
|
areaField.setLineWrap(true);
|
JScrollPane sp1 = new JScrollPane(areaField);
|
addComponent(rPanel, sp1, false, true);
|
} else {
|
JTextField field = new JTextField();
|
this.rPanelComp.put(ad.getAttrName(), field);
|
field.setEditable(tempEditabel);
|
final String attrName = ad.getAttrName();
|
field.getDocument().addDocumentListener(new DocumentListener() {
|
public void removeUpdate(DocumentEvent e) {
|
textChange(e, attrName);
|
}
|
public void insertUpdate(DocumentEvent e) {
|
textChange(e, attrName);
|
}
|
public void changedUpdate(DocumentEvent e) {
|
textChange(e, attrName);
|
}
|
});
|
addComponent(rPanel, field, false, false);
|
}
|
}
|
GridBagConstraints c = getGBC(0, gridy, 2, 1, 1.0, 0.1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, 2, 5);
|
rPanel.add(new JLabel(), c);
|
} else {
|
JLabel label = new JLabel("无数据");
|
addComponent(rPanel, label, true, false);
|
}
|
return rPanel;
|
}
|
|
/**
|
* 创建按钮
|
* @return
|
*/
|
public JPanel buttonPanel() {
|
JPanel buttonPanel = new JPanel(null);
|
|
// if(!isEditor) {
|
// String mhtml = "<html><font color='red'> " + "* " + message + " </font></html>";
|
// JLabel messageLabel = new JLabel();
|
// messageLabel.setText(mhtml);
|
// messageLabel.setBounds(new Rectangle(15, 5, 300, 22));
|
// buttonPanel.add(messageLabel);
|
// }
|
|
JButton ok = new JButton("保存");
|
ok.setBounds(new Rectangle(350, 5, 60, 22));
|
ok.addActionListener(new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
ok();
|
}
|
});
|
JButton cancel = new JButton("关闭");
|
//if(!this.editable) {
|
// System.out.println(cancel.requestFocus(false));
|
//}
|
cancel.setBounds(new Rectangle(420, 5, 60, 22));
|
cancel.addActionListener(new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
cancel();
|
}
|
});
|
if(editable) {
|
buttonPanel.add(ok);
|
}
|
buttonPanel.add(cancel);
|
buttonPanel.setPreferredSize(new Dimension(600, 35));
|
return buttonPanel;
|
}
|
|
/**
|
* 确定按钮
|
*/
|
private void ok() {
|
this.dispose();
|
}
|
|
/**
|
* 关闭窗口
|
*/
|
private void cancel() {
|
this.dispose();
|
}
|
|
/**
|
* 设置控件的值
|
*/
|
private void setData() {
|
for (Attdef ad : attdefList) {
|
Component lComp = this.lPanelComp.get(ad.getAttrName());
|
Component rComp = this.rPanelComp.get(ad.getAttrName());
|
if (ad.getAttrType() == AttrType.String) {
|
Object lValue = this.owner
|
.getComparer()
|
.getAttributes()
|
.convert(
|
ad,
|
this.lTno.getAttribute(
|
ad.getlNodeObjectAttr(),
|
ad.islIsRelationAttr() ? TreeNodeObject.RELATIONOBJECT
|
: TreeNodeObject.MAINOBJECT));
|
((JTextField) lComp).setText(lValue == null ? "" : lValue.toString());
|
Object rValue = this.owner
|
.getComparer()
|
.getAttributes()
|
.convert(
|
ad,
|
this.rTno.getAttribute(
|
ad.getrNodeObjectAttr(),
|
ad.isrIsRelationAttr() ? TreeNodeObject.RELATIONOBJECT
|
: TreeNodeObject.MAINOBJECT));
|
((JTextField) rComp).setText(rValue == null ? "" : rValue.toString());
|
} else if (ad.getAttrType() == AttrType.LongText) {
|
Object lValue = this.owner
|
.getComparer()
|
.getAttributes()
|
.convert(
|
ad,
|
this.lTno.getAttribute(
|
ad.getlNodeObjectAttr(),
|
ad.islIsRelationAttr() ? TreeNodeObject.RELATIONOBJECT
|
: TreeNodeObject.MAINOBJECT));
|
Object rValue = this.owner
|
.getComparer()
|
.getAttributes()
|
.convert(
|
ad,
|
this.rTno.getAttribute(
|
ad.getrNodeObjectAttr(),
|
ad.isrIsRelationAttr() ? TreeNodeObject.RELATIONOBJECT
|
: TreeNodeObject.MAINOBJECT));
|
((JTextArea) lComp).setText(lValue == null ? "" : lValue.toString());
|
((JTextArea) rComp).setText(rValue == null ? "" : rValue.toString());
|
//在使用setText方式时没有触发DocumentListener事件,手动调用
|
textChange(null, ad.getAttrName());
|
} else {
|
Object lValue = this.owner
|
.getComparer()
|
.getAttributes()
|
.convert(
|
ad,
|
this.lTno.getAttribute(
|
ad.getlNodeObjectAttr(),
|
ad.islIsRelationAttr() ? TreeNodeObject.RELATIONOBJECT
|
: TreeNodeObject.MAINOBJECT));
|
Object rValue = this.owner
|
.getComparer()
|
.getAttributes()
|
.convert(
|
ad,
|
this.rTno.getAttribute(
|
ad.getrNodeObjectAttr(),
|
ad.isrIsRelationAttr() ? TreeNodeObject.RELATIONOBJECT
|
: TreeNodeObject.MAINOBJECT));
|
((JTextField) lComp).setText(lValue == null ? "" : lValue.toString());
|
((JTextField) rComp).setText(rValue == null ? "" : rValue.toString());
|
}
|
}
|
}
|
|
/**
|
* 控件属性值比较
|
* @param e
|
* @param attr
|
*/
|
private void textChange(DocumentEvent e, String attr) {
|
Attdef ad = this.attdefMap.get(attr);
|
Component lComp = this.lPanelComp.get(attr);
|
Component rComp = this.rPanelComp.get(attr);
|
String lValue = "";
|
String rValue = "";
|
if(ad.getAttrType() == AttrType.String) {
|
lValue = ((JTextField) lComp).getText();
|
rValue = ((JTextField) rComp).getText();
|
} else if(ad.getAttrType() == AttrType.LongText) {
|
lValue = ((JTextArea) lComp).getText();
|
rValue = ((JTextArea) rComp).getText();
|
} else {
|
lValue = ((JTextField) lComp).getText();
|
rValue = ((JTextField) rComp).getText();
|
}
|
if(ad.getAttrType() == AttrType.String
|
|| ad.getAttrType() == AttrType.LongText) {
|
if(!lValue.equals(rValue)) {
|
lComp.setForeground(Color.RED);
|
rComp.setForeground(Color.RED);
|
} else {
|
lComp.setForeground(Color.BLACK);
|
rComp.setForeground(Color.BLACK);
|
}
|
} else if(ad.getAttrType() == AttrType.Number) {
|
if(CompareTools.validateNumber(lValue, rValue)) {
|
lComp.setForeground(Color.BLACK);
|
rComp.setForeground(Color.BLACK);
|
} else {
|
lComp.setForeground(Color.RED);
|
rComp.setForeground(Color.RED);
|
}
|
} else {
|
if(!lValue.equals(rValue)) {
|
lComp.setForeground(Color.RED);
|
rComp.setForeground(Color.RED);
|
} else {
|
lComp.setForeground(Color.BLACK);
|
rComp.setForeground(Color.BLACK);
|
}
|
}
|
}
|
|
/**
|
* 添加控件
|
* @param panel
|
* @param comp
|
*/
|
private void addComponent(JPanel panel, Component comp, boolean isLabel, boolean isLongText) {
|
int archo = GridBagConstraints.EAST;
|
int gridx = 0;
|
double weightx = 0.0;
|
double weighty = 0.0;
|
int gridWidth = 1;
|
int gridHeight = 1;
|
if(!isLabel){
|
gridx = 1;
|
weightx = 1.0;
|
weighty = 0.0;
|
archo = GridBagConstraints.WEST;
|
}
|
if(isLongText) {
|
weighty = 3;
|
}
|
GridBagConstraints c = getGBC(gridx, gridy, gridWidth, gridHeight, weightx, weighty, archo, GridBagConstraints.BOTH, 2, 5);
|
if(!isLabel){
|
gridy++;
|
}
|
panel.add(comp, c);
|
}
|
|
private GridBagConstraints getGBC(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor, int fill, int insets,int padxy) {
|
return new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, new Insets(insets, insets, insets, insets), padxy, padxy);
|
}
|
}
|