package com.vci.client.uif.engine.client.combobox; import java.awt.Component; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; import com.vci.client.bof.ClientBusinessObject; import com.vci.client.bof.ClientBusinessObjectOperation; import com.vci.client.logon.base.TabPanelManage; import com.vci.client.uif.actions.client.UIFUtils; import com.vci.client.uif.engine.client.UILayoutPanel; import com.vci.client.uif.engine.client.controls.VCIJComboBoxModelValueObject; import com.vci.client.uif.engine.common.CBOHelper; import com.vci.client.uif.engine.common.DefaultTableNode; import com.vci.client.uif.engine.common.GlobalContextParam; import com.vci.client.uif.engine.common.IDataNode; import com.vci.corba.common.VCIError; import com.vci.mw.ClientContextVariable; /** * 提供在UI框架中,从已经打开的UILayoutPanel中,返回满足条件的InputData * @author xiongchao * */ public class TabInputDataProvider extends AbstractComboBoxDataProvider { public TabInputDataProvider(){ this(""); } public TabInputDataProvider(String param){ super(param); } /** * 返回 UI框架中,已经打开的UILayoutPanel中,其InputData的业务类型等于传入参数btmname的数据,作为ComBox的数据源(下拉列表) */ @Override public VCIJComboBoxModelValueObject[] getDatas() { VCIJComboBoxModelValueObject[] res = new VCIJComboBoxModelValueObject[0]; LinkedList list = new LinkedList(); Map paramMap = super.getParamKeyValueMap(); String btmname = paramMap.get("btmname"); String showForamt = paramMap.get("name"); Map btmFilterAttrMap = getBtmFilterAttrs(paramMap); if(btmname == null || "".equals(btmname)) return res; if(showForamt == null || "".equals(showForamt)) { showForamt = "name"; } Map cboMap = new HashMap(); Component[] compts = TabPanelManage.getInstance().getTabPanel().getComponents(); for(Component compt : compts){ if(!(compt instanceof UILayoutPanel)) continue; UILayoutPanel uilp = (UILayoutPanel)compt; IDataNode inputData = uilp.getInputData(); if(inputData == null) continue; if(!(inputData.getMaterObject() instanceof ClientBusinessObject)) continue; ClientBusinessObject cboInptuData = null; try { cboInptuData = getReloadedCBO(inputData.getClientBusinessObject()); } catch (VCIError e) { e.printStackTrace(); } if(cboInptuData == null) continue; if(!btmname.equals(cboInptuData.getBtmName())) continue; // add by xchao 2014.07.31 加上根据btm的属性值进行过滤 begin if(btmFilterAttrMap.size() > 0 && !isMatched(cboInptuData, btmFilterAttrMap)) continue; // add by xchao 2014.07.31 加上根据btm的属性值进行过滤 end String name = UIFUtils.getRuleValue(showForamt, inputData, null); String value = cboInptuData.getOid(); if(cboMap.containsKey(value)) continue; list.add(new VCIJComboBoxModelValueObject(value, name)); cboMap.put(value, cboInptuData); } res = list.toArray(new VCIJComboBoxModelValueObject[]{}); return res; } /** * 返回 重新加载的 CBO 对象 * @param cbo * @return * @throws VCIError */ private ClientBusinessObject getReloadedCBO(ClientBusinessObject cbo) throws VCIError{ ClientBusinessObjectOperation cboOperation = new ClientBusinessObjectOperation(); return cboOperation.readBusinessObjectById(cbo.getOid(), cbo.getBtmName()); } /** * 检查指定的ClientBusinessObject的属性值是否满足过滤条件 * @param cbo * @param btmFilterAttrMap key:bo的属性名 value:要过滤的属性值 * @return */ private boolean isMatched(ClientBusinessObject cbo, Map btmFilterAttrMap){ boolean res = true; Iterator its = btmFilterAttrMap.keySet().iterator(); while(its.hasNext()){ String key = its.next(); String value = btmFilterAttrMap.get(key); String attrVal = cbo.getAttributeValue(key); // 严格按值是否相等进行匹配(区分大小写) res &= value.equals(attrVal); } return res; } /** * 返回由此控件创建出的数据,在修改时需要显示的数据 */ @Override public String getDataByCreateValue(String value) { String res = ""; Map paramMap = super.getParamKeyValueMap(); String btmname = paramMap.get("btmname"); String showForamt = paramMap.get("name"); if(btmname == null || "".equals(btmname)) return res; if(showForamt == null || "".equals(showForamt)) { showForamt = "name"; } String oid = value; try { ClientBusinessObject cbo = new ClientBusinessObjectOperation().readBusinessObjectById(oid, btmname); IDataNode inputData = new DefaultTableNode(); inputData.setForward(true); inputData.setMasterObject(cbo); Map valueMap = CBOHelper.getBOValueMap(cbo.getBusinessObject()); inputData.setValueMap(valueMap); String nameValue = UIFUtils.getRuleValue(showForamt, inputData, null); res = nameValue; } catch (VCIError e) { e.printStackTrace(); } return res; } /** * 从按钮参数中,取出对BTM进行过滤的属性 * @param paramMap * @return */ private Map getBtmFilterAttrs(Map paramMap){ Map conditionMap = GlobalContextParam.getInstance().getDefaultConditionMap(); Map res = new HashMap(); Iterator its = paramMap.keySet().iterator(); while(its.hasNext()){ String key = its.next(); String value = paramMap.get(key); if(conditionMap.containsKey(value.replace("#", ""))){ value = conditionMap.get(value.replace("#", "")); } else if(conditionMap.containsKey(value)){ value = conditionMap.get(value); } if(key.contains("btm.")){ res.put(key.replace("btm.", ""), value); } } return res; } }