package com.vci.client.uif.engine.client.controls;
|
|
import java.awt.BorderLayout;
|
import java.awt.Color;
|
import java.awt.Component;
|
import java.awt.Cursor;
|
import java.awt.Graphics;
|
import java.awt.Graphics2D;
|
import java.awt.GridBagConstraints;
|
import java.awt.GridBagLayout;
|
import java.awt.Image;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
import java.awt.event.MouseEvent;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
import com.vci.client.bof.BOFactoryClient;
|
import com.vci.client.bof.ClientBusinessObject;
|
import com.vci.client.bof.ClientLinkObject;
|
import com.vci.client.common.providers.ServiceProvider;
|
import com.vci.client.omd.provider.ApProvider;
|
import com.vci.client.portal.utility.PRMItem;
|
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.VCIJOptionPane;
|
import com.vci.client.ui.swing.components.VCIJPanel;
|
import com.vci.client.ui.swing.components.VCIJTextField;
|
import com.vci.client.ui.swing.components.VCIJDialog.DialogResult;
|
import com.vci.client.uif.actions.client.UIFUtils;
|
import com.vci.client.uif.engine.client.UIHelper;
|
import com.vci.client.uif.engine.client.UILayoutPanel;
|
import com.vci.client.uif.engine.client.objopt.ObjectAddEditDialog;
|
import com.vci.client.uif.engine.client.objopt.ObjectAddEditPanel;
|
import com.vci.client.uif.engine.client.tableArea.TablePanel;
|
import com.vci.client.uif.engine.client.tree.TreePanel;
|
import com.vci.client.uif.engine.common.CBOHelper;
|
import com.vci.client.uif.engine.common.IDataNode;
|
import com.vci.corba.common.VCIError;
|
import com.vci.corba.omd.atm.AttribItem;
|
import com.vci.corba.omd.data.BusinessObject;
|
import com.vci.mw.ClientContextVariable;
|
import com.vci.omd.objects.OtherInfo;
|
|
public class RefObjChooseControl extends AbstractCustomControl {
|
|
private static final long serialVersionUID = 4501645055912094463L;
|
|
public static final String REF_OBJECT_CHANGED = "REF_OBJECT_CHANGED";
|
|
private final Image img = VCISwingUtil.createImageIcon("search.png").getImage();
|
private HashMap<String, String> refParamsMap = new HashMap<String, String>();
|
|
@SuppressWarnings("serial")
|
private final VCIJTextField txt = new VCIJTextField("") {
|
@Override
|
public void paintComponent(Graphics g) {
|
super.paintComponent(g);
|
Graphics2D g2 = (Graphics2D) g;
|
if (img != null) {
|
g2.drawImage(img, getWidth() - img.getWidth(null), getHeight()
|
- img.getHeight(null), img.getWidth(null),
|
img.getHeight(null), null);
|
}
|
RefObjChooseControl.this.drawRequiredFlag(g);
|
}
|
|
@Override
|
public void mouseClicked(MouseEvent e) {
|
super.mouseClicked(e);
|
if (!isEnabled() || !editable)
|
return;
|
if (isClickImage(e)) {
|
showRefObjChooseDialog();
|
}
|
}
|
|
private boolean isClickImage(MouseEvent e) {
|
boolean res = false;
|
int imgWidth = img.getWidth(null);
|
int imgHeight = img.getHeight(null);
|
int width = getWidth();
|
int height = getHeight();
|
int pointX = e.getX();
|
int pointY = e.getY();
|
if (width - imgWidth < pointX && pointX < width
|
&& height - imgHeight < pointY && pointY < height) {
|
res = true;
|
}
|
// ignore cals
|
res = true;
|
return res;
|
}
|
};
|
|
public RefObjChooseControl(PRMItem item) {
|
super(item);
|
editable = item.getItemIsEditable().equals("1") ? false : true;
|
init();
|
setEditable(editable);
|
if (editable) {
|
txt.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
}
|
}
|
|
private void init() {
|
setLayout(new GridBagLayout());
|
add(txt, getGBC(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.BOTH, 0));
|
|
txt.setEditable(false);
|
if (editable) {
|
txt.setBackground(Color.WHITE);
|
}
|
}
|
|
private RefObjChooseDailog dialog = null;
|
|
private void showRefObjChooseDialog() {
|
VCISwingUtil.invokeLater(new Runnable() {
|
@Override
|
public void run() {
|
dialog = new RefObjChooseDailog();
|
dialog.init();
|
dialog.setSize(UIHelper.DIALOG_DEFAULT_WIDTH,
|
UIHelper.DIALOG_DEFAULT_HEIGHT);
|
dialog.setLocationRelativeTo(ClientContextVariable.getFrame());
|
dialog.setVisible(true);
|
}
|
}, 0);
|
}
|
|
private UILayoutPanel uipl = null;
|
private String key = "";
|
private String value = "";
|
|
@SuppressWarnings("serial")
|
private class RefObjChooseDailog extends VCIJDialog {
|
public RefObjChooseDailog() {
|
super(ClientContextVariable.getFrame(), true);
|
}
|
|
public void init() {
|
setTitle("参照对象选择");
|
setIconImage(img);
|
setLayout(new BorderLayout());
|
add(getCenterDataPanel(), BorderLayout.CENTER);
|
add(getSouthButtonPanel(), BorderLayout.SOUTH);
|
this.repaint();
|
this.validate();
|
this.update(getGraphics());
|
}
|
}
|
|
private UILayoutPanel getCenterDataPanel() {
|
//VCIJPanel pal = new VCIJPanel(new BorderLayout());
|
PRMItem item = getPRMItem();
|
String type = item.getItemListTable();
|
String context = item.getItemStyle();
|
HashMap<String, String> map = new HashMap<String, String>();
|
map.put(UIHelper.TYPE, type);
|
// 分析原Style参数,加入到将context参数加入到map中,其它参数存入refParamsMap中
|
refParamsMap.clear();
|
String[] paramItem = context.split(";");
|
|
if (paramItem.length == 1 && !context.contains("=")) {// 兼容原context模式
|
map.put(UIHelper.CONTEXT, paramItem[0]);
|
} else {
|
for (int i = 0; i < paramItem.length; i++) {
|
String[] params = paramItem[i].split("=", 2);
|
if (params[0].trim().toLowerCase().equalsIgnoreCase(RefAttachAttrContants.CONTANT_1)) {
|
map.put(UIHelper.CONTEXT, params[1].trim());
|
} else {
|
if (params.length == 2) {
|
refParamsMap.put(params[0].toLowerCase().trim(), params[1].toLowerCase().trim());
|
}
|
}
|
}
|
}
|
map.put(UIHelper.OID, map.get(UIHelper.OID));
|
// 加入来源参数
|
map.put("fromType", type);
|
map.put("fromContext", context);
|
map.put("fromObjectId", map.get(UIHelper.OID));
|
map.put("tableRowSelectType", "singleSelect");
|
|
this.uipl = getUILayoutPanel(map);
|
//pal.add(uipl, BorderLayout.CENTER); //直接返回UILayoutPanel对象(之前在"uipl"之上嵌套VCIJPanel) modify by zhonggy 2015-09-18
|
uipl.repaint();
|
uipl.validate();
|
uipl.updateUI();
|
return uipl;
|
}
|
|
|
private UILayoutPanel getUILayoutPanel(HashMap<String, String> map) {
|
UILayoutPanel uipl = new UILayoutPanel(map) {
|
private static final long serialVersionUID = 7167045011920499526L;
|
|
@Override
|
public String getValue(String key) {
|
String value = super.getValue(key);
|
ObjectAddEditPanel compt = getOwnedObjectAddEditPanel();
|
if (compt != null && compt.getRegionPanel() != null
|
&& compt.getRegionPanel().getBaseLayoutPanel() != null) {
|
value = compt.getRegionPanel().getBaseLayoutPanel()
|
.getValue(key);
|
}
|
return value;
|
}
|
};
|
// add by xchao 2015.08.13 begin
|
// 设置参照对象选择窗口的 inputDataNode 等于 参照数据选择控件所在的Dialog的inputDataNode
|
ObjectAddEditDialog oaed = getOwnedObjectAddEditDialog();
|
if(oaed != null){
|
//SDIsNull=true; TODO:约定根据参照属性控件设置的"SDIsNull"参数确定是否往后传递"SourceData" ,modify zhonggy 2015-09-17
|
boolean SDIsNull = true;
|
if(oaed.getSourceDataNode() != null
|
&& oaed.getSourceDataNode().getClientBusinessObject() != null
|
&& oaed.getSourceDataNode().getClientBusinessObject().getBusinessObject() != null
|
&& oaed.getSourceDataNode().getClientBusinessObject().getBusinessObject().btName != null
|
&& oaed.getSourceDataNode().getClientBusinessObject().getBusinessObject().btName.equals("folder")){
|
SDIsNull = false; //临时这样处理下,统一解释"SDIsNull"参数时去掉这个临时逻辑
|
}
|
if (SDIsNull) {
|
uipl.setSourceDataNode(oaed.getSourceDataNode());
|
}
|
uipl.setInputData(oaed.getInputDataNode());
|
}
|
// add by xchao 2015.08.13 end
|
uipl.setDataValueMap(map);
|
uipl.prep();
|
uipl.initMainPanel();
|
return uipl;
|
}
|
|
private ObjectAddEditPanel getOwnedObjectAddEditPanel() {
|
ObjectAddEditPanel res = null;
|
Component compt = this.getParentComponent();
|
while (compt != null) {
|
if (compt instanceof ObjectAddEditPanel) {
|
res = (ObjectAddEditPanel) compt;
|
break;
|
}
|
compt = compt.getParent();
|
}
|
return res;
|
}
|
|
private ObjectAddEditDialog getOwnedObjectAddEditDialog() {
|
ObjectAddEditDialog res = null;
|
Component compt = this.getParentComponent();
|
while (compt != null) {
|
if (compt instanceof ObjectAddEditDialog) {
|
res = (ObjectAddEditDialog) compt;
|
break;
|
}
|
compt = compt.getParent();
|
}
|
return res;
|
}
|
private VCIJPanel getSouthButtonPanel() {
|
VCIJPanel pal = new VCIJPanel();
|
VCIJButton btnOk = VCISwingUtil.createVCIJButton("ok", "确定", "确定",
|
"accept.png");
|
VCIJButton btnCancel = VCISwingUtil.createVCIJButton("cancel", "取消",
|
"取消", "cancel.png");
|
btnOk.addActionListener(new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
ok();
|
}
|
});
|
btnCancel.addActionListener(new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
cancel();
|
}
|
});
|
pal.add(btnOk);
|
pal.add(btnCancel);
|
return pal;
|
}
|
|
@SuppressWarnings("deprecation")
|
private void ok() {
|
Component compt = uipl.getMainDataPanel(); // 在定义参照上下文时三个UI区域原则上都可以定义,且获取优先级为“右上-->右下-->导航”
|
// //modify by ZhongGY
|
// 2015-05-26
|
/**
|
* 增加方法,确定提取数据的区域
|
* @author Zylon at 2015-7-6 下午5:29:38
|
*/
|
{// dataregion 参数(导航区=1,控制区=2,操作区=3)
|
// datafield参数 如果不设置,默认为oid
|
String dataRegion = refParamsMap.get(RefAttachAttrContants.CONTANT_2);
|
int reginoIndex = 1;
|
// 共三个区域,为了加大兼容性只检测是否包含1、2、3
|
if (dataRegion != null && !dataRegion.equals("")) {
|
if (dataRegion.contains("3")) {
|
reginoIndex = 3;
|
}
|
if (dataRegion.contains("2")) {
|
reginoIndex = 2;
|
}
|
if (dataRegion.contains("1")) {
|
reginoIndex = 1;
|
}
|
|
switch (reginoIndex) {
|
case 1:
|
compt = uipl.getNavigatorPanel();
|
break;
|
case 2:
|
compt = uipl.getMainDataPanel();
|
break;
|
case 3:
|
compt = uipl.getTabPanel();
|
break;
|
}
|
} else {// 没有设置走原逻辑
|
if (compt == null) {
|
compt = uipl.getTabPanel();
|
if (compt == null) {
|
compt = uipl.getNavigatorPanel();
|
}
|
}
|
}
|
}
|
Object[] objs = null;
|
if (compt instanceof TablePanel) {
|
TablePanel tablePanel = (TablePanel) compt;
|
objs = tablePanel.getTablePanelModel().getSelectObjects();
|
} else if (compt instanceof TreePanel) {
|
TreePanel treePanel = (TreePanel) compt;
|
objs = treePanel.getDataModel().getSelectObjects();
|
// 判断选择的是否为根节点,如果跟为String类型,表示选择的是分类的根
|
// 因为下面做了非空的校验
|
if (objs != null && objs.length > 0) {
|
if (objs[0] instanceof IDataNode) {
|
if (((IDataNode) objs[0]).getMaterObject() instanceof String) {
|
UIFUtils.showMessage(ClientContextVariable.getFrame(),"不能选择根节点");
|
return;
|
}
|
}
|
}
|
}
|
Map<String, String> valueMap = new HashMap<String, String>();
|
if (objs == null || objs.length <= 0) {
|
VCIJOptionPane.showError(dialog, "请先选择数据!");
|
return;
|
}
|
if (objs.length > 1) {
|
VCIJOptionPane.showError(dialog, "一次只能选择一条数据!");
|
return;
|
}
|
if (objs[0] instanceof IDataNode) {
|
IDataNode dataNode = (IDataNode) objs[0];
|
valueMap = dataNode.getValueMap();
|
if (valueMap == null || valueMap.size() == 0) {
|
Object obj = dataNode.getMaterObject();
|
if (obj instanceof ClientLinkObject) {
|
valueMap = CBOHelper.getLOValueMap(((ClientLinkObject) obj)
|
.getLinkObject());
|
} else if (obj instanceof ClientBusinessObject) {
|
valueMap = CBOHelper
|
.getBOValueMap(((ClientBusinessObject) obj)
|
.getBusinessObject());
|
}
|
}
|
}
|
setChooseRecObjToControl(valueMap);
|
}
|
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
private void setChooseRecObjToControl(Map refObjValMap) {
|
/*
|
* String ownOBJOID = ""; ObjectAddEditPanel compt =
|
* getOwnedObjectAddEditPanel(); if (compt != null &&
|
* compt.getRegionPanel() != null &&
|
* compt.getRegionPanel().getBaseLayoutPanel() != null) { Object[]
|
* ownSelectObjects = compt.getRegionPanel().getDataModel()
|
* .getSelectObjects(); if (ownSelectObjects != null) { Object
|
* ownSelectObject = ownSelectObjects[0]; if (ownSelectObject instanceof
|
* DefaultTableNode) { ownOBJOID = ((DefaultTableNode) ownSelectObject)
|
* .getClientBusinessObject().getAttributeValue("oid"); } } } if
|
* (refObjValMap.get("oid") != null && !ownOBJOID.equals("") &&
|
* ownOBJOID.equals(refObjValMap.get("oid"))) { // 不能参照自身
|
* VCIJOptionPane.showError(dialog, "不能参照自身!"); // modify by ZhongGY //
|
* 2015-05-26 return; }
|
*/
|
PRMItem item = getPRMItem();
|
Map<String, String> map = refObjValMap;
|
/**
|
* @author Zylon at 2015-7-6 下午5:34:58
|
*/
|
{
|
// datafield 参数 如果不设置,默认为oid
|
String datafield = refParamsMap.get(RefAttachAttrContants.CONTANT_3);
|
if(datafield == null ||datafield.equalsIgnoreCase("") ){
|
//默认值为oid
|
datafield = "oid";
|
}else{
|
//有设置returnvalue 则取出
|
datafield = datafield.toLowerCase().trim();
|
}
|
//保存的id
|
String saveId = getNOtNullString(map.get(datafield));
|
//页面回显内容
|
String showString = "";
|
if(datafield.equals("t_oid") || datafield.equals("f_oid") || datafield.contains(".")){
|
// datafield 等于 t_oid\f_oid\t_oid.xxx\xxx.xxx\xx.xx.xx形式时,
|
// 直接从选择数据对应的map中取数据值(key 等于 item.getItemListVal()),
|
showString = map.get(item.getItemListVal());
|
if(showString == null){
|
// 如果没有取到数据,则直接显示配置的 ‘item.getItemListVal()’ 值
|
showString = item.getItemListVal();
|
}
|
} else {
|
showString = getShowString(datafield,saveId,item.getItemListVal());
|
}
|
|
String newVal = saveId + ","+showString;
|
|
setValue(newVal);
|
}
|
close(DialogResult.OK);
|
firePropertyChange(REF_OBJECT_CHANGED, null, refObjValMap);
|
}
|
|
private String getShowString(String refAtrrName, String Oid, String refObjAttrName) {
|
//refAtrrName-->业务类型的名称refTypeName
|
try {
|
AttribItem attribItem = ApProvider.getAbItemByName(refAtrrName);
|
OtherInfo otherInfo = OtherInfo.getOtherInfoByText(attribItem.other);
|
String refTypeName = otherInfo.getRefTypeName();
|
if (refTypeName == null || refTypeName.trim().equals("")) {
|
PRMItem item = getPRMItem();
|
String itemField = item.getItemField();
|
if (itemField.indexOf(".")>0) {
|
String[] strs = itemField.split("\\.");
|
itemField = strs[strs.length -1];
|
}
|
attribItem = ApProvider.getAbItemByName(itemField);
|
otherInfo = OtherInfo.getOtherInfoByText(attribItem.other);
|
refTypeName = otherInfo.getRefTypeName();
|
}
|
//根据refTypeName+Oid获取BO对象;
|
BusinessObject refBO = null;
|
if(refTypeName != null && !"".equals(refTypeName)){
|
refBO = ServiceProvider.getBOFService().readBusinessObject(Oid, refTypeName);
|
//根据BO对象+attrName获取返回值
|
ClientBusinessObject helper = new ClientBusinessObject();
|
helper.setBusinessObject(refBO);
|
return helper.getAttributeValue(refObjAttrName);
|
}
|
} catch (VCIError e) {
|
e.printStackTrace();
|
}
|
return "";
|
}
|
|
|
private String getNOtNullString(String string) {
|
if(string == null){
|
return "";
|
}
|
return string;
|
}
|
|
public void firePropertyChangeManual(String propertyName, String oldValue,
|
Map<String, String> newValue) {
|
super.firePropertyChange(propertyName, oldValue, newValue);
|
}
|
|
private void cancel() {
|
close(DialogResult.CANCEL);
|
}
|
|
private void close(DialogResult dialogRes) {
|
dialog.setDialogResult(dialogRes);
|
dialog.setVisible(false);
|
}
|
|
public String getKey() {
|
return key;
|
}
|
|
public void setKey(String key) {
|
this.key = key;
|
}
|
|
@Override
|
public String getValue() {
|
return value;
|
}
|
|
@Override
|
public void setValue(String value) {
|
if (value == null || "".equals(value))
|
return;
|
String[] values = value.split(",");
|
if (values == null || values.length < 1) {
|
return;
|
}
|
this.value = values[0];
|
if (values.length >= 2) {
|
this.txt.setText(values[1]);
|
}
|
}
|
|
private boolean editable = true;
|
|
@Override
|
public void setEditable(boolean editable) {
|
this.editable = editable;
|
}
|
|
@Override
|
public void setEnabled(boolean enabled) {
|
super.setEnabled(enabled);
|
setEditable(enabled);
|
txt.setEnabled(enabled);
|
}
|
}
|