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 attdefList; /** * 属性定义 */ private Map attdefMap = new HashMap(); /** * 左侧属性 */ private Map lPanelComp = new HashMap(); /** * 右侧属性 */ private Map rPanelComp = new HashMap(); /** * 构造器 * @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 = " " + "* " + message + " "; // 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); } }