package com.vci.client.uif.engine.client.controls; import java.awt.Color; import java.awt.Component; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.swing.ComboBoxModel; import javax.swing.DefaultComboBoxModel; import com.vci.client.bof.AttributeChecker; import com.vci.client.bof.ClientBusinessObject; import com.vci.client.omd.btm.ui.BtmClient; import com.vci.client.omd.provider.ApProvider; import com.vci.client.omd.provider.EnumProvider; import com.vci.client.portal.utility.DataModelFactory; import com.vci.client.portal.utility.PRMItem; import com.vci.client.ui.swing.components.VCIJComboBox; import com.vci.client.ui.swing.components.VCIJLabel; import com.vci.client.ui.swing.components.VCIJPasswordField; import com.vci.client.ui.swing.components.VCIJRadioButton; import com.vci.client.ui.swing.components.VCIJRealTextField; import com.vci.client.ui.swing.components.VCIJTextArea; import com.vci.client.ui.swing.components.VCIJTextField; import com.vci.client.ui.swing.components.table.AbstractVCIJTableDataProvider; import com.vci.client.ui.swing.components.table.VCIJTableDataProvider; import com.vci.client.ui.swing.components.table.VCIJTableNode; import com.vci.client.ui.swing.components.table.VCIJTablePanel; import com.vci.client.ui.swing.event.VciKeyListener; import com.vci.client.uif.actions.client.UIFUtils; import com.vci.client.uif.engine.client.combobox.IComboBoxDataProvider; import com.vci.common.portal.enums.ControlType; import com.vci.common.resource.CommonProperties; import com.vci.corba.common.VCIError; import com.vci.corba.omd.atm.AttribItem; import com.vci.corba.omd.btm.BtmItem; import com.vci.corba.omd.data.BusinessObject; import com.vci.corba.omd.etm.EnumChild; import com.vci.corba.omd.etm.EnumItem; import com.vci.corba.omd.lcm.LifeCycle; import com.vci.corba.omd.lcm.TransitionVO; public class ControlFactory { /** * 返回用于显示ClientBusinessObject的TablePanel * @param fieldToNameMap field to name map key:field value:属性名称 * @param cbos ClientBusinessObject 对象列表 * @return 加载了数据的TablePanel */ public VCIJTablePanel getClientBusinessObjectDataPanel( HashMap fieldToNameMap, ClientBusinessObject[] cbos){ final HashMap map = fieldToNameMap; final ClientBusinessObject[] objs = cbos; VCIJTableDataProvider dataProvider = new AbstractVCIJTableDataProvider() { String[] specialColumns = new String[0]; LinkedList nameList = new LinkedList(); LinkedList fieldList = new LinkedList(); { Iterator its = map.keySet().iterator(); while(its.hasNext()){ String field = its.next(); String name = map.get(field); fieldList.add(field); nameList.add(name); } specialColumns = nameList.toArray(new String[]{}); } @Override public String[] getSpecialColumns() { return specialColumns; } @Override public int getTotal() { return objs.length; } @Override public VCIJTableNode getNewRowNode( ClientBusinessObject dataObj) { VCIJTableNode node = new VCIJTableNode(dataObj); for(int i = 0; i < nameList.size(); i++){ String field = fieldList.get(i); String name = nameList.get(i); node.setPropertyValue(name, dataObj.getAttributeValue(field)); } return node; } @Override public ClientBusinessObject[] getDatas(int pageIndex, int pageSize) { return objs; } }; VCIJTablePanel pal = new VCIJTablePanel(dataProvider); pal.buildTablePanel(); pal.refreshTableData(); return pal; } private static AttributeChecker curAttrChecker = null; private static Component createBooleanTypeControl(PRMItem item){ Component compt = null; String field = item.getItemField(); int index = field.lastIndexOf("."); if(index > 0){ field = field.substring(index + 1); } if (curAttrChecker == null) { curAttrChecker = new AttributeChecker(); curAttrChecker.getAllAttribute(); } AttribItem ai = curAttrChecker.attrItemMap.get(field); if(ai != null){ if(ai.vtDataType.equals("VTBoolean")){ VCIJComboBox cbx = new VCIJComboBox(); DefaultComboBoxModel aModel = new DefaultComboBoxModel(); aModel.addElement(new VCIJComboBoxModelValueObject("false", "否")); aModel.addElement(new VCIJComboBoxModelValueObject("true", "是")); cbx.setModel(aModel); int selectedIndex = 0; if(item.getItemValue() != null){ if(item.getItemValue().equals("false")){ selectedIndex = 0; }else { selectedIndex = 1; } cbx.setSelectedIndex(selectedIndex);; } compt = cbx; } } return compt; } /** * 判断UI表单的属性是否是必填的 * @param item UI表单定义的单个属性元素 * @return true:可以编辑 false:不可以编辑 */ public static boolean isRequired(PRMItem item){ // 1:必填 0:非必填 return item.getItemIsRequired().equals("1")?true:false; } /** * 判断UI表单的属性是否是可编辑的 * @param item UI表单定义的单个属性元素 * @return true:可以编辑 false:不可以编辑 */ public static boolean isEditable(PRMItem item){ // 1:只读 0:非只读 return item.getItemIsEditable().equals("1")?false:true; } //modify by weidayong@2017/12/14 //因为在查询区域中如果有多行文本的时候,界面会不停地往右边撑大也页面,因此在此场景中,把多行文本处理成单行文本 /** * 用于查询区域部分的创建 * @param item * @return */ public static Component createControlForSearch(PRMItem item){ return createControl(item,true); } public static Component createControl(PRMItem item){ return createControl(item,false); } @SuppressWarnings({ "rawtypes", "unchecked" }) public static Component createControl(PRMItem item,boolean isUseToSearchArea){ Component compt = null; String itemType = item.getItemType().toLowerCase(); System.out.println("====itemType = " + itemType); ControlType ctrlType = ControlType.Parse(itemType); if (ctrlType == null) return null; System.out.println("====ctrlType = " + ctrlType.name()); String itemListTable = item.getItemListTable(); String itemListValue = item.getItemListVal(); boolean required = isRequired(item); boolean editable = isEditable(item); compt = createBooleanTypeControl(item); if(compt != null) { return compt; } if(itemListTable != null && !"".equals(itemListTable) && itemListValue != null && !"".equals(itemListValue)){ //自定义类 String refClass = CommonProperties.getStringProperty("engin.refObjectChoose"); if(refClass!=null&&!"".equals(refClass)){ try { Class c = Class.forName(refClass); compt = (Component) c.getConstructor(PRMItem.class).newInstance(item); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } }else{ compt = createRefObjChooseControl(item); } } else if(ctrlType == ControlType.Checkbox) { //itemType.equals(ControlType.Checkbox.name().toLowerCase())){ compt = createCheckBoxControl(item, required, editable); } else if(ctrlType == ControlType.Text) { //itemType.equals(ControlType.Text.name().toLowerCase())){ compt = createText(item, required, editable); } else if(ctrlType == ControlType.TextBtn) { //itemType.equals(ControlType.TextBtn.name().toLowerCase())){ compt = createTextBtn(item, required, editable); } else if(ctrlType == ControlType.TextArea) { //itemType.equals(ControlType.TextArea.name().toLowerCase())){ if(isUseToSearchArea){//weidy主要修改的此处 compt = createText(item, required, editable); }else{ compt = createTextArea(item, required, editable); } } else if(ctrlType == ControlType.Number) { //itemType.equals(ControlType.Number.name().toLowerCase())){ compt = createNumber(item, required, editable); } else if(ctrlType == ControlType.Password) { //itemType.equals(ControlType.Password.name().toLowerCase())){ compt = createPassword(item, required, editable); } else if(ctrlType == ControlType.Radio) { //itemType.equals(ControlType.Radio.name().toLowerCase())){ compt = createRadion(item, required, editable); } else if(ctrlType == ControlType.Select) { //itemType.equals(ControlType.Select.name().toLowerCase())){ compt = createSelect(item, required, editable); } else if(ctrlType == ControlType.WebEditor) { //itemType.equals(ControlType.WebEditor.name().toLowerCase())){ //WebEditor compt = createNotimplement(item, required, editable, ControlType.WebEditor.name()); } else if(ctrlType == ControlType.Date) { //itemType.equals(ControlType.Date.name().toLowerCase())){ compt = createDate(item, required, editable); } else if(ctrlType == ControlType.Time) { //itemType.equals(ControlType.Time.name().toLowerCase())){ compt = createTime(item, required, editable); } else if(ctrlType == ControlType.Datetime) { //itemType.equals(ControlType.Datetime.name().toLowerCase())){ compt = createDateTime(item, required, editable); } else if(ctrlType == ControlType.Customform) { //itemType.equals(ControlType.Customform.name().toLowerCase())){ //TODO Customform compt = createNotimplement(item, required, editable, ControlType.Customform.name()); } else if(ctrlType == ControlType.File) { //itemType.equals(ControlType.File.name().toLowerCase())){ compt = createFile(item, required, editable); } else if(ctrlType == ControlType.MultiFile) { //itemType.equals(ControlType.MultiFile.name().toLowerCase())){ compt = createMultiFile(item, required, editable); } else if(ctrlType == ControlType.Custom) { //itemType.equals(ControlType.Custom.name().toLowerCase())){ compt = getCustomControl(item); } else if(ctrlType == ControlType.UserChoose) { //itemType.equals(ControlType.UserChoose.name().toLowerCase())){ compt = createUserChooseControl(item, required, editable); } return compt; } //end weidy@2017/12/14 private static Component getCustomControl(PRMItem item){ Component res = null; try { String className = item.getItemCustomClass(); if (className == null || "".equals(className)) return null; Class c1 = Class.forName(className); //if (!c1.isAssignableFrom(ICustomControl.class) && !c1.isAssignableFrom(Component.class)) { // return null; //} ICustomControl ctrl = null; //Object obj = c1.getConstructor(PRMItem.class).newInstance(item); Object obj = null; try { Constructor con = c1.getConstructor(PRMItem.class); if (con != null) obj = con.newInstance(item); } catch (Exception ex){ Constructor con = c1.getConstructor(); obj = con.newInstance(); } if (obj instanceof ICustomControl) { ctrl = (ICustomControl) obj; ctrl.setPRMItem(item); } if (obj instanceof Component) { res = (Component) obj; } } catch (Exception ex) { ex.printStackTrace(); } return res; } private static RefObjChooseControl createRefObjChooseControl(PRMItem item){ RefObjChooseControl res = new RefObjChooseControl(item); res.setObj(item); return res; } private static VCIJLabel createNotimplement(PRMItem item, boolean required, boolean editable, String text){ VCIJLabel res = new VCIJLabel(text + " not implement "); res.setObj(item); res.setForeground(Color.red); return res; } private static CheckBoxControl createCheckBoxControl(PRMItem item, boolean required, boolean editable){ CheckBoxControl res = new CheckBoxControl(item, required, editable); res.setObj(item); return res; } private static VCIJTextField createText(PRMItem item, boolean required, boolean editable){ String extParameterStr = item.getItemStyle(); String[] extParameterArray = extParameterStr.split(";"); String key = "keyListener"; String value = ""; String rightClickKey = "rightClickEvent"; String rightClickVal = ""; for (int i = 0; i < extParameterArray.length; i++) { String extParameter = extParameterArray[i]; if (extParameter == null) { continue; } String[] parameters = extParameter.split("="); if (parameters == null || parameters.length != 2) { continue; } if (parameters[0].equalsIgnoreCase(key)) { value = parameters[1]; } else if (parameters[0].equalsIgnoreCase(rightClickKey)) { rightClickVal = parameters[1]; } } boolean isSupportRightClick = true; if (rightClickVal != null && rightClickVal.equalsIgnoreCase("false")) { isSupportRightClick = false; } VCIJTextField res = new VCIJTextField("", isSupportRightClick); res.setRequired(required); res.setEditable(editable); res.setObj(item); if (value != null && !value.trim().equals("")) { try { Class cls; cls = Class.forName(value); VciKeyListener keyListener = (VciKeyListener)cls.getConstructor(Object.class).newInstance(item); res.addKeyListener(keyListener); } catch (Throwable e) { e.printStackTrace(); } } return res; } private static VCIJTextField createTextBtn(PRMItem item, boolean required, boolean editable){ String extParameterStr = item.getItemStyle(); String[] extParameterArray = extParameterStr.split(";"); String key = "keyListener"; String value = ""; String rightClickKey = "rightClickEvent"; String rightClickVal = ""; for (int i = 0; i < extParameterArray.length; i++) { String extParameter = extParameterArray[i]; if (extParameter == null) { continue; } String[] parameters = extParameter.split("="); if (parameters == null || parameters.length != 2) { continue; } if (parameters[0].equalsIgnoreCase(key)) { value = parameters[1]; } else if (parameters[0].equalsIgnoreCase(rightClickKey)) { rightClickVal = parameters[1]; } } boolean isSupportRightClick = true; if (rightClickVal != null && rightClickVal.equalsIgnoreCase("false")) { isSupportRightClick = false; } VCIJTextField res = new VCIJTextField("", isSupportRightClick); res.setRequired(required); res.setEditable(editable); res.setObj(item); if (value != null && !value.trim().equals("")) { try { Class cls; cls = Class.forName(value); VciKeyListener keyListener = (VciKeyListener)cls.getConstructor(Object.class).newInstance(item); res.addKeyListener(keyListener); } catch (Throwable e) { e.printStackTrace(); } } return res; } private static VCIJTextArea createTextArea(PRMItem item, boolean required, boolean editable){ VCIJTextArea res = new VCIJTextArea(""); res.setBorder(null); res.setRequired(required); res.setEditable(editable); res.setObj(item); res.setLineWrap(true); return res; } private static VCIJRealTextField createNumber(PRMItem item, boolean required, boolean editable){ VCIJRealTextField res = new VCIJRealTextField(""); res.setRequired(required); res.setEditable(editable); res.setObj(item); return res; } private static VCIJPasswordField createPassword(PRMItem item, boolean required, boolean editable){ VCIJPasswordField res = new VCIJPasswordField(); res.setRequired(required); res.setEditable(editable); res.setObj(item); return res; } private static VCIJRadioButton createRadion(PRMItem item, boolean required, boolean editable){ VCIJRadioButton res = new VCIJRadioButton(); res.setRequired(required); res.setObj(item); return res; } // private static VCIJComboBox createCheckBox(PRMItem item, boolean required, boolean editable){ // VCIJComboBox res = new VCIJComboBox(); // res.setRequired(required); // res.setObj(item); // return res; // } private static VCIJComboBox createSelect(PRMItem item, boolean required, boolean editable){ VCIJComboBox res = new VCIJComboBox(); res.setRequired(required); res.setModel(getSelectDataModel(item, required)); res.setObj(item); //add by songyf res.setEnabled(editable); if (editable) { res.setBackground(Color.WHITE); } String itemClass = item.getItemCustomClass(); if(itemClass != null && !"".equals(itemClass)){ IComboBoxDataProvider dataProvider = UIFUtils.getComboBoxDataProvider(itemClass); if(dataProvider != null){ VCIJComboBoxModelValueObject[] datas = dataProvider.getDatas(); if(datas != null){ DefaultComboBoxModel model = new DefaultComboBoxModel(); for(VCIJComboBoxModelValueObject bmvo : datas){ model.addElement(bmvo); } res.setModel(model); } } } return res; } private static ComboBoxModel getSelectDataModel(PRMItem item, boolean required){ ComboBoxModel model = new DefaultComboBoxModel(); List list = item.getItemValueList(); boolean isEnumAttr = isEnumAttr(item.getItemField()); if (isEnumAttr == false) { list.clear(); //修正:非枚举属性选项定义无效处理,modify zhonggy 2015-06-02 }else if(list.size() > 0) { //根据枚举定义修正表单选项定义 Add by zhonggy 2015-06-02 String[] fields = item.getItemField().split("\\."); AttribItem attr = ApProvider.getInstance().getAbItemByName(fields[fields.length - 1]); String enumName = ApProvider.getInstance().getOtherValueByType(attr.other, "enumName"); if (enumName== null || enumName.equals("")) { list.clear(); } Map listMap = new HashMap(); for (int i = 0; i < list.size(); i++) { String valueStr = list.get(i); //String value = valueStr.substring(0, valueStr.indexOf("{")); String key = valueStr.substring(valueStr.indexOf("{") + 1, valueStr.indexOf("}")); if (!listMap.containsKey(key)) { listMap.put(key, valueStr); } } Map enumChildMap = new HashMap(); EnumItem enumItem = EnumProvider.getInstance().getEnumByName(enumName); for (EnumChild child : enumItem.children) { String key = child.value; if (!enumChildMap.containsKey(key)) { enumChildMap.put(key, child.name); } } for (Map.Entry Listitem : listMap.entrySet()) { if (!enumChildMap.containsKey(Listitem.getKey())) { list.remove(Listitem.getValue()); //去掉无效的选项 } } } Map map = new HashMap(); if (list.size() > 0) { model = getSelectListDataModel(item, list, "", map); } else if ((!item.getItemListTable().equals("") || !item.getItemListTxt().equals("")) && !item.getItemListVal().equals("")) { // 参照属性 model = getSelectRefDataModel(item, map); } else if (!item.getItemAddFilter().equals("")) { // BusinessObjectConstants.SELECT_ATTRIBUTE.put(selectVal, item.getItemAddFilter()); // getSelectTypeQueryHtml(field, operation, map, item); } else if(isEnumAttr){ model = getSelectEnumDataModel(item, "", map, required); } else if(isLCStatusAttr(item.getItemField())){ System.out.println(item); } return model; } /** * 判断属性是否是 生命周期属性 * @param field 属性名称 * @return */ public static boolean isLCStatusAttr(String field){ return (field.equalsIgnoreCase("lcstatus") || field.contains(".lcstatus")); } /** * 返回生命周期属性 ComboBoxModel * @param prmItem prmItem * @param btmName 业务类型名称 * @return */ public static ComboBoxModel getLCStatusComboboxModel(PRMItem prmItem, String btmName){ DefaultComboBoxModel model = new DefaultComboBoxModel(); if(btmName == null || "".equals(btmName) || !isLCStatusAttr(prmItem.getItemField())) return model; int insertIndex = 0; if(prmItem != null && !prmItem.getItemField().equals("") && !isRequired(prmItem)){ VCIJComboBoxModelValueObject mvo = new VCIJComboBoxModelValueObject("", ""); model.addElement(mvo); insertIndex = 1; } try { BtmItem bi = BtmClient.getService().getBtmItemByName(btmName); if(bi == null || "".equals(bi.name)) return model; UIFUtils uif = new UIFUtils(); LifeCycle lc = UIFUtils.getLifeCycle(bi.lifeCycle); if(lc == null) return model; TransitionVO[] routes = lc.routes; String startStatus = lc.startState; Map map = new HashMap(); for(TransitionVO tvo : routes){ String value = tvo.source; if(value == null || "".equals(value)) continue; String name = uif.transferLifecycle(tvo.source); if(value == null || "".equals(value)) continue; if(map.containsKey(value)) continue; map.put(value, tvo); VCIJComboBoxModelValueObject mvo = new VCIJComboBoxModelValueObject(value, name); if(startStatus.equals(value)){ model.insertElementAt(mvo, insertIndex); } else { model.addElement(mvo); } } } catch (VCIError e) { // TODO Auto-generated catch block e.printStackTrace(); } return model; } /** * 判断属性是否是使用枚举 * @param field 属性名称 * @return */ public static boolean isEnumAttr(String field){ boolean res = false; String[] fields = field.split("\\."); AttribItem attr = ApProvider.getInstance().getAbItemByName(fields[fields.length - 1]); if(attr == null) return false; String enumName = ApProvider.getInstance().getOtherValueByType(attr.other, "enumName"); if(enumName == null || "".equals(enumName)) return false; EnumItem enumItem = EnumProvider.getInstance().getEnumByName(enumName); if(enumItem == null) return false; res = true; return res; } private static ComboBoxModel getSelectListDataModel(PRMItem item, List list, String operation, Map map){ DefaultComboBoxModel model = new DefaultComboBoxModel(); for (int i = 0; i < list.size(); i++) { String valueStr = list.get(i); String key = valueStr.substring(0, valueStr.indexOf("{")); String value = valueStr.substring(valueStr.indexOf("{") + 1, valueStr.indexOf("}")); VCIJComboBoxModelValueObject data = new VCIJComboBoxModelValueObject(value, key); model.addElement(data); } return model; } private static ComboBoxModel getSelectRefDataModel(PRMItem item, Map map){ DefaultComboBoxModel model = new DefaultComboBoxModel(); // String field = item.getItemField(); String type = item.getItemListTable(); if (!item.getItemListTxt().equals("")) { type = item.getItemListTxt(); } // String[] fields = field.split("\\."); String column = item.getItemListVal(); String affectCol = item.getItemQueryRefFields(); if (affectCol == null) { affectCol = ""; } DataModelFactory factory = new DataModelFactory(); BusinessObject[] bos = new BusinessObject[0]; try { bos = factory.getAllTypeInfo(type); } catch (VCIError e) { e.printStackTrace(); } for (int i = 0; i < bos.length; i++) { String oidVal = getBOValueByAttr("oid", bos[i]); String displayVal = getBOValueByAttr(column, bos[i]); VCIJComboBoxModelValueObject vo = new VCIJComboBoxModelValueObject(oidVal, displayVal); model.addElement(vo); } return model; } protected static String getBOValueByAttr(String attrName, BusinessObject bo) { for (int i = 0; i < bo.hisAttrValList.length; i++) { if (bo.hisAttrValList[i].attrName.equalsIgnoreCase(attrName)) { return bo.hisAttrValList[i].attrVal; } } return ""; } private static ComboBoxModel getSelectEnumDataModel(PRMItem item, String operation, Map map, boolean required){ DefaultComboBoxModel model = new DefaultComboBoxModel(); String[] fields = item.getItemField().split("\\."); AttribItem attr = ApProvider.getInstance().getAbItemByName(fields[fields.length - 1]); String enumName = ApProvider.getInstance().getOtherValueByType(attr.other, "enumName"); if (enumName== null || enumName.equals("")) { return model; } EnumItem enumItem = EnumProvider.getInstance().getEnumByName(enumName); if(!required){ model.addElement(new VCIJComboBoxModelValueObject("", "")); } for (EnumChild child : enumItem.children) { VCIJComboBoxModelValueObject data = new VCIJComboBoxModelValueObject(child.value, child.name); model.addElement(data); } return model; } private static DateTimeControl createDateTime(PRMItem item, boolean required, boolean editable){ DateTimeControl res = new DateTimeControl(item); res.setObj(item); //add by songyf res.setEnabled(editable); return res; } private static DateControl createDate(PRMItem item, boolean required, boolean editable){ DateControl res = new DateControl(item); res.setObj(item); //add by songyf res.setEnabled(editable); return res; } private static TimeControl createTime(PRMItem item, boolean required, boolean editable){ TimeControl res = new TimeControl(item); res.setObj(item); //add by songyf res.setEnabled(editable); return res; } /** * @Title :createFile * @Description : Modify By ZGY 2015-03-19 * @param item * @param required * @param editable * @return */ private static Component createFile(PRMItem item, boolean required, boolean editable){ AbstractCustomControl panel = null; try { panel = new FileChooseControlPanel(item); panel.setObj(item); return panel; } catch (Exception e) { e.printStackTrace(); return null; } } private static FileChooseControlPanel createMultiFile(PRMItem item, boolean required, boolean editable){ FileChooseControlPanel res = new FileChooseControlPanel(item); res.setObj(item); return res; } private static UserChooseControl createUserChooseControl(PRMItem item, boolean required, boolean editable){ UserChooseControl res = new UserChooseControl(item); res.setEnabled(editable); return res; } }