package com.vci.client.uif.engine.client;
|
|
import java.awt.BorderLayout;
|
import java.awt.Color;
|
import java.awt.Component;
|
import java.awt.Dimension;
|
import java.awt.Point;
|
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseEvent;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.Iterator;
|
import java.util.LinkedHashMap;
|
import java.util.LinkedList;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.regex.Pattern;
|
|
import javax.swing.JPanel;
|
import javax.swing.JSplitPane;
|
import javax.swing.JTextArea;
|
import javax.swing.tree.TreeModel;
|
import javax.swing.tree.TreeNode;
|
|
import com.vci.client.LogonApplication;
|
import com.vci.client.bof.ClientBusinessObject;
|
import com.vci.client.bof.ClientLinkObject;
|
import com.vci.client.common.FreeMarkerCommon;
|
import com.vci.client.common.FreemarkerParamObject;
|
import com.vci.client.framework.rightdistribution.object.RoleRightObject;
|
import com.vci.client.framework.util.RightControlUtil;
|
import com.vci.client.omd.provider.BtmProvider;
|
import com.vci.client.portal.utility.DataModelFactory;
|
import com.vci.client.portal.utility.DataModelProcessor;
|
import com.vci.client.portal.utility.PLDefination;
|
import com.vci.client.portal.utility.UITools;
|
import com.vci.client.ui.exception.VCIException;
|
import com.vci.client.ui.swing.components.VCIJPanel;
|
import com.vci.client.uif.actions.client.UIFUtils;
|
import com.vci.client.uif.engine.client.TreeTable.TreeTablePanel;
|
import com.vci.client.uif.engine.client.mainDataArea.MainDataFormPanel;
|
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.DefaultTableNode;
|
import com.vci.client.uif.engine.common.GlobalContextParam;
|
import com.vci.client.uif.engine.common.IDataNode;
|
import com.vci.common.exception.VciExceptionTool;
|
import com.vci.corba.common.VCIError;
|
import com.vci.corba.omd.btm.BtmItem;
|
import com.vci.corba.omd.data.BusinessObject;
|
import com.vci.corba.omd.data.LinkObject;
|
import com.vci.corba.portal.data.PLPageDefination;
|
import com.vci.corba.portal.data.PLUILayout;
|
import com.vci.corba.portal.data.PLTabPage;
|
import com.vci.mw.ClientContextVariable;
|
|
/**
|
* 根据传递的类型、上下文以及参数信息,动态构建显示的Panel
|
* @author VCI_STGK_Lincq
|
*
|
*/
|
public class UILayoutPanel extends UIBaseLayoutPanel{
|
|
private static final long serialVersionUID = -889811444944434818L;
|
private PLUILayout curMainPageContext; //当前主界面上下文
|
private Map<String, PLUILayout> contextDefMap = new HashMap<String, PLUILayout>(); //Del By ZGY
|
private UILayoutModel layoutModel = new UILayoutModel();
|
private Component navigatorPanel = null;
|
private Component rightTopPanel = null;
|
private Component rightBottomPanel = null;
|
// private Map<String, Map<PLTabPage, PLDefination>> contextCache = new HashMap<String, Map<PLTabPage, PLDefination>>();
|
private Map<String, Map<PLTabPage, List<PLDefination>>> contextCache = new HashMap<String, Map<PLTabPage, List<PLDefination>>>();
|
private Map<String, Map<PLTabPage, List<PLPageDefination>>> contextCachePD = new HashMap<String, Map<PLTabPage, List<PLPageDefination>>>();
|
/**
|
* 主界面的分隔面板
|
*/
|
private JSplitPane mainSplitPane = null;
|
|
public UILayoutPanel(String url, Map<String, String> parameters) {
|
super(url, parameters);
|
}
|
|
public UILayoutPanel(Map<String, String> parameters) {
|
super(parameters);
|
}
|
|
@Override
|
public boolean prep() {
|
boolean rs = true;
|
if (url != null) {
|
String cparameter = url.substring(url.indexOf("?") + 1);
|
String[] cparameters = cparameter.split("&");
|
String queryTemplate = "";
|
String queryType = "";
|
for (int i = 0; i < cparameters.length; i++) {
|
if (cparameters[i].indexOf("type") == 0) {
|
this.type = cparameters[i].substring(cparameters[i].indexOf("=") + 1);
|
continue;
|
} else if (cparameters[i].indexOf("context") == 0) {
|
this.context = cparameters[i].substring(cparameters[i].indexOf("=") + 1);
|
} else if( cparameters[i].indexOf("querytemplate") == 0){
|
//从url中获得查询模板
|
queryTemplate = cparameters[i].substring(cparameters[i].indexOf("=") + 1);
|
}else if ( cparameters[i].indexOf("querytype") ==0 ){
|
//从url中获得查询模板类型
|
queryType = cparameters[i].substring(cparameters[i].indexOf("=") + 1);
|
}
|
}
|
if (queryTemplate != null && !queryTemplate.equals("")
|
&& queryType != null && !queryType.equals("")) {
|
try {
|
this.sourceDataNode = new DefaultTableNode();
|
//从查询模板中查询数据
|
DataModelProcessor processor = new DataModelProcessor();
|
Map<String, String> conditionMap = GlobalContextParam.getInstance().getDefaultConditionMap();
|
if(queryType.equals("0")){
|
//业务对象查询模板 并设置全局的OID
|
BusinessObject[] bos = processor.getBusinessObjectByQueryTemplate(queryTemplate, conditionMap);
|
if(bos != null && bos.length > 0){
|
this.paramters.put(UIHelper.OID, bos[0].oid);
|
ClientBusinessObject cbo = new ClientBusinessObject();
|
cbo.setBusinessObject(bos[0]);
|
sourceDataNode.setMasterObject(cbo);
|
sourceDataNode.setValueMap(CBOHelper.getBOValueMap(cbo.getBusinessObject()));
|
} else {
|
VCIException exp = new VCIException("uifmodel.plm.uif.engine.querytemplate.novalue");
|
this.showMessage(ClientContextVariable.getFrame(), exp);
|
return false;
|
}
|
} else {
|
LinkObject[] los = processor.getLinkObjectByQueryTemplate(queryTemplate, conditionMap);
|
if(los != null && los.length > 0){
|
this.paramters.put(UIHelper.OID, los[0].oid);
|
ClientLinkObject clo = new ClientLinkObject();
|
clo.setLinkObject(los[0]);
|
sourceDataNode.setMasterObject(clo);
|
sourceDataNode.setValueMap(CBOHelper.getLOValueMap(clo.getLinkObject()));
|
} else {
|
VCIException exp = new VCIException("uifmodel.plm.uif.engine.querytemplate.novalue");
|
this.showMessage(ClientContextVariable.getFrame(), exp);
|
return false;
|
}
|
}
|
|
} catch (Exception e) {
|
e.printStackTrace();
|
VCIException exp = new VCIException("uifmodel.plm.uif.engine.querytemplate.queryError", new String[]{VciExceptionTool.getExceptionStr(e), VciExceptionTool.getExceptionDetail(e)});
|
this.showMessage(ClientContextVariable.getFrame(), exp);
|
return false;
|
}
|
}
|
|
} else {
|
this.type = this.paramters.get("type");
|
this.context = this.paramters.get("context");
|
}
|
return rs;
|
}
|
|
@Override
|
public void initMainPanel() {
|
try {
|
curMainPageContext = getContext(type, context);
|
if (curMainPageContext == null) {
|
return;
|
}
|
setReflectArea(curMainPageContext);
|
//contextDefMap.put(type, pageContext); // By ZGY
|
if (curMainPageContext.plIsShowNavigator == 1) {
|
navigatorPanel = initNavigator(this.getSourceDataNode(), type, context, this.getDataValueMap(), curMainPageContext.plOId);
|
}
|
if (curMainPageContext.plIsShowForm == 1) {
|
rightTopPanel = initMainDataArea(this.getSourceDataNode(), type, context, this.getDataValueMap(), curMainPageContext.plOId);
|
}
|
if (curMainPageContext.plIsShowTab == 1) {
|
rightBottomPanel = initTabArea(this.getSourceDataNode(), type, context, this.getDataValueMap(), curMainPageContext.plOId);
|
}
|
mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
|
|
if(curMainPageContext.plIsShowNavigator == 1){
|
mainSplitPane.setDividerSize(10);
|
mainSplitPane.setDividerLocation(getNavigatorWidth());
|
mainSplitPane.setContinuousLayout(true);
|
mainSplitPane.setOneTouchExpandable(true);
|
mainSplitPane.setLeftComponent(navigatorPanel);
|
if(navigatorPanel instanceof TreePanel){
|
TreePanel tp = (TreePanel)navigatorPanel;
|
TreeModel tm = tp.getTree().getModel();
|
TreeNode root = (TreeNode)tm.getRoot();
|
if(root.getChildCount() > 0){
|
tp.getTree().setSelectionRow(0);
|
}
|
}
|
}
|
JSplitPane rightMainSplitPane = initRightPanel(curMainPageContext);
|
mainSplitPane.setRightComponent(rightMainSplitPane);
|
this.setLayout(new BorderLayout());
|
this.add(mainSplitPane,BorderLayout.CENTER);
|
// this.add(rightBottomPanel,BorderLayout.CENTER);
|
} catch (VCIError e) {
|
e.printStackTrace();
|
} catch (Throwable e) {
|
e.printStackTrace();
|
}
|
}
|
|
private int getNavigatorWidth() {
|
int width = 248;
|
try {
|
String conf = curMainPageContext.plDesc;
|
if (conf == null || conf.trim().equals("")) {
|
return width;
|
}
|
String[] confs = conf.split(";");
|
for (String c : confs) {
|
String[] ca = c.split("=");
|
if (ca.length != 2) {
|
continue;
|
}
|
if (ca[0].equalsIgnoreCase("width_n")) {
|
width = Integer.valueOf(ca[1]).intValue();
|
return width;
|
}
|
}
|
} catch (Throwable e) {
|
e.printStackTrace();
|
}
|
|
return width;
|
}
|
|
/**
|
* 初始化右侧界面
|
* @param pageContext
|
* @return
|
*/
|
private JSplitPane initRightPanel(PLUILayout pageContext) {
|
JSplitPane rightMainSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
|
if (pageContext.plIsShowForm == 1 && pageContext.plIsShowTab == 1) {//右上右下区域
|
rightMainSplitPane.setDividerSize(10);
|
rightMainSplitPane.setDividerLocation(300);
|
rightMainSplitPane.setContinuousLayout(true);
|
rightMainSplitPane.setOneTouchExpandable(true);
|
rightMainSplitPane.setTopComponent(rightTopPanel);
|
rightMainSplitPane.setBottomComponent(rightBottomPanel);
|
} else if (pageContext.plIsShowForm == 1) {//右上区域
|
rightMainSplitPane.setDividerSize(0);
|
rightMainSplitPane.setDividerLocation(1.0);
|
rightMainSplitPane.setTopComponent(rightTopPanel);
|
} else { //右下区域
|
rightMainSplitPane.setDividerSize(0);
|
rightMainSplitPane.setDividerLocation(0);
|
rightMainSplitPane.setBottomComponent(rightBottomPanel);
|
}
|
return rightMainSplitPane;
|
}
|
|
private Map<String, String> dataValueMap = new HashMap<String, String>();
|
public Map<String, String> getDataValueMap() {
|
return dataValueMap;
|
}
|
public void setDataValueMap(Map<String, String> dataValueMap) {
|
this.dataValueMap = dataValueMap;
|
}
|
|
/**
|
* 初始化导航区
|
* @param areaType
|
* @return
|
* @throws Throwable
|
*/
|
private Component initNavigator(IDataNode dataNode, String type, String context, Map<String, String> dataMap,
|
String cntextId) throws Throwable {
|
return initTabPage(dataNode, type, context, dataMap, cntextId, (short)1);
|
}
|
|
/**
|
* 初始化主数据区
|
* @param areaType
|
* @return
|
* @throws Throwable
|
*/
|
private Component initMainDataArea(IDataNode dataNode, String type, String context, Map<String, String> dataMap,
|
String cntextId) throws Throwable {
|
return initTabPage(dataNode, type, context, dataMap, cntextId, (short)2);
|
}
|
|
/**
|
* 初始化页签区
|
* @param areaType
|
* @return
|
* @throws Throwable
|
*/
|
private Component initTabArea(IDataNode dataNode, String type, String context, Map<String, String> dataMap,
|
String cntextId) throws Throwable {
|
return initTabPage(dataNode, type, context, dataMap, cntextId, (short)3);
|
}
|
|
/**
|
* 初始哈具体的tab页签
|
* @param areaType
|
* @return
|
* @throws Throwable
|
*/
|
private Component initTabPage(IDataNode dataNode, String type, String context, Map<String, String> dataMap,
|
String contextId, short areaType) throws Throwable {
|
Map<PLTabPage, List<PLDefination>> defMap = new LinkedHashMap<PLTabPage, List<PLDefination>>();
|
Map<PLTabPage, List<PLPageDefination>> pageDefMap = new LinkedHashMap<PLTabPage, List<PLPageDefination>>();
|
if (contextCache.get(contextId + areaType) != null) {
|
defMap = contextCache.get(contextId + areaType);
|
pageDefMap = contextCachePD.get(contextId + areaType);
|
} else {
|
defMap = getTabPage(contextId, areaType, defMap, pageDefMap);
|
contextCache.put(contextId + areaType, defMap);
|
contextCachePD.put(contextId + areaType, pageDefMap);
|
}
|
if (defMap.size() < 1) {
|
return null;
|
} else {
|
return initTabPageDetail(dataNode, type, context, dataMap,
|
areaType, defMap, pageDefMap);
|
}
|
}
|
|
private Map<Integer, PLTabPage> tabPageMap = new LinkedHashMap<Integer, PLTabPage>();
|
private Map<Integer, List<PLPageDefination>> tabPageDefsMap = new LinkedHashMap<Integer, List<PLPageDefination>>();
|
private Map<Integer, List<PLDefination>> tabDefsMap = new LinkedHashMap<Integer, List<PLDefination>>();
|
private Map<Integer, TabPagePanel> componentTabMap = new LinkedHashMap<Integer, TabPagePanel>();
|
private boolean operationAreaNeedShow = false;
|
private Component initTabPageDetail(IDataNode dataNode, String type,
|
String context, Map<String, String> dataMap, final int areaType,
|
Map<PLTabPage, List<PLDefination>> defMap,
|
Map<PLTabPage, List<PLPageDefination>> pageDefMap) {
|
Iterator<PLTabPage> itor = defMap.keySet().iterator();
|
final TabPagePanel tabPanel = new TabPagePanel();
|
List<IDataModel> dataModelsInTabPanel = new ArrayList<IDataModel>();
|
int seq = 0;
|
while (itor.hasNext()) {
|
PLTabPage cPage = itor.next();
|
//判断页签是否有权限
|
if (!verifyComponentHasRight(cPage.plOId)) {
|
continue;
|
}
|
if (tabPanel.checkIsLoad(cPage.plOId)) {
|
continue;
|
}
|
//开始页签界面加载
|
List<Component> compts = new LinkedList<Component>();
|
List<IRegionPanel> regionPanelList = new LinkedList<IRegionPanel>(); //页签内UI控件集合
|
List<IDataModel> innerDataModelsInTabPanel = new ArrayList<IDataModel>();
|
Map<String,IDataModel> innerIndexDataModels = new HashMap<String,IDataModel>();
|
List<PLPageDefination> pageDefinitions = pageDefMap.get(cPage);
|
List<PLDefination> definitions = defMap.get(cPage);
|
IDataModel firstDataModel = null;
|
//VCIJPanel pal = new VCIJPanel(new GridLayout(definitions.size(), 1));
|
IDataModel masterDataModel = null; //每个页签中主控件Model
|
for (int i = 0; i < definitions.size(); i++) {
|
PLDefination definition = definitions.get(i);
|
//判断组件是否有权限
|
if (!verifyComponentHasRight(pageDefinitions.get(i).plOId)) {
|
continue;
|
}
|
IRegionPanel cTabPanel = getDefinationPanel(dataNode, type, context, dataMap, cPage, definition, areaType, pageDefinitions.get(i));
|
if(cTabPanel == null){
|
continue;
|
}
|
if (firstDataModel == null) {
|
firstDataModel = cTabPanel.getDataModel();
|
dataModelsInTabPanel.add(firstDataModel);
|
}
|
if (i > 0) {
|
innerDataModelsInTabPanel.add(cTabPanel.getDataModel());
|
innerIndexDataModels.put(definition.getName(), cTabPanel.getDataModel());
|
}
|
if(areaType == 3){
|
operationAreaNeedShow = true;
|
}
|
regionPanelList.add(cTabPanel);
|
this.regionPanelMap.put((String.valueOf(areaType)).toLowerCase(), cTabPanel);
|
this.regionPanelMap.put((String.valueOf(areaType) + DOT + cPage.plCode).toLowerCase(), cTabPanel);
|
this.regionPanelMap.put((String.valueOf(areaType) + DOT + cPage.plCode + DOT + definition.getId()).toLowerCase(), cTabPanel);//精确缓存
|
Component compt = cTabPanel.getComponentPanel();
|
if (seq == 0 && i < 2) {
|
// seq:当有多个面签时,先只加载第一个
|
//i: 余下的面签通过loadTabPanel实现加载
|
cTabPanel.init(); //初始化组件UI界面及数据加载
|
cTabPanel.getDataModel().setUILayoutModel(layoutModel);
|
cTabPanel.getDataModel().setActive(true);
|
layoutModel.addLayoutModes(areaType, cTabPanel.getDataModel());
|
if(compt != null && definitions.size() > 1){ // 为面签里多个页面分配高度
|
int widht = ClientContextVariable.getFrame().getWidth() - 350;
|
int height = ClientContextVariable.getFrame().getHeight() / 2;
|
compt.setPreferredSize(new Dimension(widht, height));
|
}
|
// 标记 第 seq 个页签,已经加载过
|
tabPanel.setLoadList(String.valueOf(seq));
|
if(i == 0){
|
masterDataModel = cTabPanel.getDataModel();//每个页签中主控件Model
|
this.regionPanelMap.put((String.valueOf(areaType)).toLowerCase(), cTabPanel);//每个页签中主控件
|
} else {
|
// 注册同一个面签里,第一个UI刷新其它UI(不能刷其它面签下的UI)
|
this.layoutModel.addAreaInnerNotifyModel(masterDataModel, cTabPanel.getDataModel());
|
}
|
}
|
|
//pal.add(compt);
|
compts.add(compt);
|
// 当且仅当,只有一个页签,且这个页签里只有一个UI组件时,返回这个唯一的一个UI组件
|
if(defMap.size() == 1 && definitions.size() == 1 && cTabPanel != null){
|
return cTabPanel.getComponentPanel();
|
}
|
} // end for loop definition
|
|
if(compts.size() == 1){
|
tabPanel.add(cPage.plName, compts.get(0));
|
}
|
else if(compts.size() == 2){
|
JSplitPane jsp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
|
jsp.setDividerSize(10);
|
jsp.setDividerLocation(300);
|
jsp.setContinuousLayout(true);
|
jsp.setOneTouchExpandable(true);
|
jsp.setTopComponent(compts.get(0));
|
jsp.setRightComponent(compts.get(1));
|
tabPanel.add(cPage.plName, jsp);
|
} else {
|
JSplitPane jsp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
|
jsp.setDividerSize(10);
|
jsp.setDividerLocation(300);
|
jsp.setContinuousLayout(true);
|
jsp.setOneTouchExpandable(true);
|
jsp.setTopComponent(compts.get(0));
|
|
TabPagePanel tpp = new TabPagePanel();
|
for (int j = 1; j < compts.size(); j++) {
|
tpp.addTab(definitions.get(j).getName(), compts.get(j));
|
//tpp.addIndexModel(innerIndexDataModels.get(definitions.get(j).getName())) ;
|
}
|
if(seq == 0) {//注册第一页签的子页签事件
|
addTabPanelActionListener(tpp, areaType, masterDataModel);
|
}
|
jsp.setRightComponent(tpp);
|
if(innerDataModelsInTabPanel != null && innerDataModelsInTabPanel.size() >1){
|
for (IDataModel innerItem : innerDataModelsInTabPanel) {
|
innerItem.setBrotherModels(innerDataModelsInTabPanel);
|
}
|
if (firstDataModel != null) {
|
firstDataModel.setInnerTabModels(innerDataModelsInTabPanel);
|
}
|
}
|
//tabPanel.addIndexModel(firstDataModel);
|
tabPanel.add(cPage.plName, jsp);
|
componentTabMap.put(seq, tpp);
|
}
|
tabPageMap.put(seq, cPage);
|
tabPageDefsMap.put(seq, pageDefinitions);
|
tabDefsMap.put(seq, definitions);
|
// 将第 seq 个页签里的全部UI对应的 IRegionPanel 存储
|
tabPanel.getChildPanelMap().put(seq, regionPanelList);
|
// 标记 plOId 对应的页签,已经加载过
|
tabPanel.setLoadList(cPage.plOId);
|
//dataModelsInTabPanel.add();
|
seq += 1;
|
}// end loop tabpage
|
for (IDataModel iDataModel : dataModelsInTabPanel) {
|
iDataModel.setBrotherModels(dataModelsInTabPanel);
|
}
|
tabPanel.addMouseListener(new MouseAdapter() {
|
public void mouseClicked(MouseEvent arg0) {
|
/**点击选项卡空白处时,仍然触发选项卡事件的处理 Begin**/
|
Point p = arg0.getPoint();
|
int r = tabPanel.indexAtLocation(p.x, p.y);
|
if(r < 0) {
|
return;
|
}
|
/******End*****************************/
|
int n = tabPanel.getSelectedIndex();
|
loadTabPanel(tabPanel, n, areaType);
|
}
|
});
|
return tabPanel;
|
}
|
|
/**
|
* 设置当前上下文各区域影响的刷新区域
|
* @param area
|
* @param context
|
*/
|
private void setReflectArea(PLUILayout context) {
|
String reflectSet = context.plDesc;
|
if (reflectSet == null || reflectSet.trim().equals("")) {
|
return;
|
}
|
String[] rss = reflectSet.split(";");
|
for (String rs : rss) {
|
String[] rsArea = rs.split(":");
|
if (rsArea.length != 2) {
|
continue;
|
}
|
String sArea = rsArea[0];
|
int isArea;
|
try {
|
isArea = Integer.valueOf(sArea).intValue();
|
} catch (Exception e) {
|
continue;
|
}
|
String[] dAreas = rsArea[1].split(",");
|
for (String dArea : dAreas) {
|
int idArea;
|
try {
|
idArea = Integer.valueOf(dArea).intValue();
|
} catch (Exception e) {
|
continue;
|
}
|
layoutModel.setReloadEffectArea(isArea, idArea);
|
}
|
}
|
}
|
|
private boolean verifyComponentHasRight(String compoentId) {
|
String userName = LogonApplication.getUserEntityObject().getUserName();
|
if (RightControlUtil.isDeveloper(userName) || RightControlUtil.isAdmin(userName)) {
|
return true;
|
}
|
RoleRightObject[] roleRightObjects = RightControlUtil.getRoleRightByUserName(userName, LogonApplication.currentUserRoleRights);
|
for (RoleRightObject RoleRightObject : roleRightObjects) {
|
if (RoleRightObject.getFuncId().equals(compoentId)) {
|
return true;
|
}
|
}
|
return false;
|
}
|
|
private void addTabPanelActionListener(final TabPagePanel tpp, final int areaType, final IDataModel cMasterDataModel) {
|
tpp.addMouseListener(new MouseAdapter() {
|
public void mouseClicked(MouseEvent arg0) {
|
//**点击选项卡空白处时,仍然触发选项卡事件的处理 Begin**//*
|
Point p = arg0.getPoint();
|
int r = tpp.indexAtLocation(p.x, p.y);
|
if(r < 0) {
|
return;
|
}
|
//******End*****************************//*
|
int n = tpp.getSelectedIndex();
|
loadComponentPanel(tpp, n, areaType, cMasterDataModel);
|
}
|
});
|
}
|
|
/**
|
* 页签加载
|
*/
|
private void loadTabPanel(TabPagePanel tabPanel, int index,final int areaType) {
|
List<IRegionPanel> regionPanelList = tabPanel.getChildPanelMap().get(index);
|
//IDataModel indexModel = ((IRegionPanel)tabPanel.getSelectedComponent()).getDataModel();
|
//indexModel.setActive(true);//激活当前页签UI add by zhonggy 2015-07
|
/*if (tabPanel.checkIsLoad(String.valueOf(index))) {
|
//indexModel.refreshUI();
|
return;
|
}*/
|
//Component compt = null;
|
//List<Component> compts = new LinkedList<Component>();
|
IDataModel masterDataModel = null;
|
for (int i = 0; i < regionPanelList.size(); i++) {
|
if (i == 2) {
|
break;
|
}
|
IRegionPanel cTabPanel = regionPanelList.get(i);
|
/*if (cTabPanel.isBuilt()) {
|
cTabPanel.getDataModel().refreshUI();
|
continue;
|
}*/
|
IDataNode sourceData = null;
|
if (layoutModel.getAreaSourceDataMap().containsKey(areaType)) {
|
sourceData = layoutModel.getAreaSourceDataMap().get(areaType);
|
}
|
if (sourceData != null) {
|
// cTabPanel.setSourceData(sourceData);
|
cTabPanel.getDataModel().setSourceData(sourceData);
|
}
|
cTabPanel.getDataModel().setActive(true);
|
if (tabPanel.checkIsLoad(String.valueOf(index))) { // by zhonggy 2015-07
|
cTabPanel.getDataModel().refreshUI();
|
continue;
|
}
|
cTabPanel.init(); //初始化UI
|
cTabPanel.getDataModel().setUILayoutModel(layoutModel);
|
layoutModel.addLayoutModes(areaType, cTabPanel.getDataModel());
|
//compt = cTabPanel.getComponentPanel();
|
//compts.add(compt);
|
if (i == 0) {
|
masterDataModel = cTabPanel.getDataModel();
|
} else {
|
// 注册同一个面签里,第一个UI刷新其它UI(不能刷其它面签下的UI)
|
this.layoutModel.addAreaInnerNotifyModel(masterDataModel,
|
cTabPanel.getDataModel());
|
}
|
}
|
// 标记 第 seq 个页签,已经加载过
|
if (!tabPanel.checkIsLoad(String.valueOf(index))) { // by zhonggy 2015-07
|
tabPanel.setLoadList(String.valueOf(String.valueOf(index)));
|
}
|
if (componentTabMap.get(index) == null) {
|
return;
|
}
|
addTabPanelActionListener(componentTabMap.get(index), areaType,
|
masterDataModel);
|
}
|
|
/**
|
* 鼠标点击子页签事件
|
*/
|
private void loadComponentPanel(TabPagePanel tabPanel, int index, final int areaType, IDataModel masterDataModel) {
|
IRegionPanel cPanel = (IRegionPanel)tabPanel.getSelectedComponent();
|
if (masterDataModel.getSelectObjects() != null && masterDataModel.getSelectObjects().length > 0) {
|
IDataNode sourceData = (IDataNode)masterDataModel.getSelectObjects()[0];
|
//cPanel.setSourceData(sourceData);
|
cPanel.getDataModel().setSourceData(sourceData);
|
}
|
if(cPanel.isBuilt()){
|
cPanel.getDataModel().refreshUI();
|
return;
|
}
|
cPanel.getDataModel().setActive(true);
|
cPanel.init();
|
cPanel.getDataModel().setUILayoutModel(layoutModel);
|
layoutModel.addLayoutModes(areaType, cPanel.getDataModel());
|
this.layoutModel.addAreaInnerNotifyModel(masterDataModel, cPanel.getDataModel());
|
PLTabPage cPage = cPanel.getTabPage();
|
PLDefination cDefination = cPanel.getDefination();
|
this.regionPanelMap.put((String.valueOf(areaType) + DOT + cPage.plCode + DOT + cDefination.getId()).toLowerCase(), cPanel);
|
}
|
|
/**
|
* 获取具体definition对应的Panel
|
* @param cPage
|
* @param cDefination
|
* @return
|
*/
|
private IRegionPanel getDefinationPanel(IDataNode dataNode, String type, String context, Map<String, String> dataMap,
|
PLTabPage cPage, PLDefination cDefination, int areaType,
|
PLPageDefination pageDefinition) {
|
IRegionPanel cTabPanel = null;
|
if (cDefination.getTemplateType() == null) {
|
return null;
|
} else if (cDefination.getTemplateType().equals("1")) {//列表
|
String className = "";
|
// 根据UI定义,是否需要使用支持可编辑的TablePanel
|
// 支持可以编辑的TablePanel
|
className = "plm.uif.engine.client.tableArea.editable.EditableTablePanel";
|
// 不支持编辑的TablePanel
|
//className = "plm.uif.engine.client.tableArea.TablePanel.TablePanel";
|
// 从UI定义中取
|
//className = cDefination.getTableImplement();
|
cTabPanel = createTablePanelInstanceObject(className);
|
} else if (cDefination.getTemplateType().equals("2")) {//自定义
|
cTabPanel = initCustomPanel(cDefination);
|
} else if (cDefination.getTemplateType().equals("3")) {//树表
|
cTabPanel = new TreeTablePanel(dataNode,type,context,cDefination);
|
} else if (cDefination.getTemplateType().equals("4")) {//主Form
|
MainDataFormPanel mdfm = new MainDataFormPanel();
|
mdfm.setFromDataMap(getDataValueMap());
|
cTabPanel = mdfm;
|
} else if (cDefination.getTemplateType().equals("5")) {//树
|
cTabPanel = new TreePanel();
|
if (dataNode == null) {
|
dataNode = construstRootFolder(cDefination); //特殊参照树根节点?by zhonggy
|
}
|
} else {
|
return null;
|
}
|
if(cTabPanel == null) return null;
|
cTabPanel.preInit(type, context); //这些数据建议都存放到model中 by zhonggy
|
cTabPanel.setDefination(cDefination);
|
cTabPanel.setTabId(cPage.plOId);
|
cTabPanel.setTab(cPage);
|
|
cTabPanel.setPageDefinition(pageDefinition);
|
cTabPanel.setFromDataMap(dataMap);
|
cTabPanel.setBaseLayoutPanel(this);
|
// 设置源数据对象
|
//cTabPanel.setSourceData(dataNode);
|
if (cTabPanel.getDataModel() == null) {
|
Component tabPanel = cTabPanel.getComponentPanel();
|
if (tabPanel instanceof VCIJPanel) { //Add ZhongGY 2015-07-02?
|
((VCIJPanel)tabPanel).removeAll();
|
JTextArea errortxt = new JTextArea();
|
((VCIJPanel)tabPanel).setLayout(new BorderLayout(0, 0));
|
((VCIJPanel)tabPanel).add(errortxt,BorderLayout.CENTER);
|
errortxt.setLineWrap(true);
|
errortxt.setForeground(Color.RED);
|
errortxt.setEditable(false);
|
Class<?> cls = cTabPanel.getClass();
|
String errorContent = "UI组件[" + cls.getName() + "]实例化化异常,在组件实例化过程中没有有效实例化其[IDataModel]对象,请将该问题提交开发人员!";
|
errortxt.setText(errorContent);
|
errortxt.setToolTipText(errorContent);
|
}
|
}else {
|
if (dataNode != null) {
|
cTabPanel.getDataModel().setSourceData(dataNode); //ZhongGY 2015-07-02?
|
}
|
}
|
// cTabPanel.setSourceData(this.getSelectDataNode());
|
return cTabPanel;
|
}
|
|
private IRegionPanel createTablePanelInstanceObject(String className){
|
IRegionPanel cTabPanel = null;
|
boolean isSingleCheckManager = false;
|
if (this.paramters != null
|
&& this.paramters.containsKey("tableRowSelectType")) {
|
if (this.paramters.get("tableRowSelectType").equals("singleSelect")) {
|
isSingleCheckManager = true;
|
}
|
}
|
if(UIFUtils.isNullOrEmpty(className)){
|
cTabPanel = new TablePanel(isSingleCheckManager);
|
} else {
|
Object obj = createObjectInstance(className);
|
if(obj != null && obj instanceof IRegionPanel){
|
cTabPanel = (IRegionPanel)obj;
|
} else {
|
cTabPanel = new TablePanel(isSingleCheckManager);
|
}
|
}
|
return cTabPanel;
|
}
|
private IDataNode construstRootFolder(PLDefination cDefination) {
|
String linkType = cDefination.getLinkType();
|
if (linkType != null && !linkType.equals("")) {
|
return null;
|
}
|
String linkStr = cDefination.getShowLinkAbs();
|
String separator = cDefination.getSeparator();
|
String[] linkArray = linkStr.split(separator);
|
if (linkArray.length < 2) {
|
return null;
|
}
|
IDataNode dataNode = new DefaultTableNode();
|
dataNode.setMasterObject(linkArray[1]);
|
|
return dataNode;
|
}
|
|
private IRegionPanel initCustomPanel(PLDefination cDefination) {
|
try {
|
String className = cDefination.getControlPath();
|
IRegionPanel customPanel = (IRegionPanel) createObjectInstance(className);
|
return customPanel;
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
private Object createObjectInstance(String className){
|
Object res = null;
|
try {
|
Class<?> cls = Class.forName(className);
|
res = cls.newInstance();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return res;
|
}
|
|
|
/**
|
* 获取当前context的详细信息
|
* @return
|
* @throws Throwable
|
* @throws Exception
|
*/
|
private PLUILayout getContext(String type, String context) throws Exception, Throwable {
|
DataModelFactory factory = new DataModelFactory();
|
PLUILayout contextDef = factory.getContextDefination(type, context);
|
if (contextDef == null || contextDef.plOId.equals("")) {
|
BtmItem item = BtmProvider.getBtmItemByName(type);
|
if (item.fName == null || item.fName.equals("")) {
|
return null;
|
}
|
return getContext(item.fName, item.fName);
|
}
|
return contextDef;
|
}
|
// /**
|
// * 获得当前上下文的所有tab page definiton
|
// * @return
|
// * @throws Throwable
|
// */
|
// private Map<PLTabPage, List<PLPageDefination>> getTabPageDefintion(String contextOid, int areaType) throws Throwable {
|
// PLTabPage[] tabs = Tool.getService().getTabPagesByContextIdAndType(contextOid, areaType);
|
// Map<PLTabPage, List<PLPageDefination>> defMap = new LinkedHashMap<PLTabPage, List<PLPageDefination>>();
|
// for (int i = 0; i < tabs.length; i++) {
|
// if(tabs[i].plIsOpen == 0) {
|
// continue;
|
// }
|
// PLPageDefination[] pageDefinitions = Tool.getService().getPLPageDefinationsByPageContextOId(tabs[i].plOId);
|
// if (pageDefinitions != null && pageDefinitions.length < 1) {
|
// continue;
|
// }
|
// List<PLPageDefination> list = new LinkedList<PLPageDefination>();
|
// for(PLPageDefination pageDefinition : pageDefinitions){
|
// list.add(pageDefinition);
|
// }
|
// defMap.put(tabs[i], list);
|
// }
|
// return defMap;
|
// }
|
/**
|
* 获得当前上下文的所有tab page
|
* @return
|
* @throws Throwable
|
*/
|
private Map<PLTabPage, List<PLDefination>> getTabPage(String contextOid, short areaType,
|
Map<PLTabPage, List<PLDefination>> defMap,
|
Map<PLTabPage, List<PLPageDefination>> pageDefMap) throws Throwable {
|
PLTabPage[] tabs = UITools.getService().getTabPagesByContextIdAndType(contextOid, areaType);
|
for (int i = 0; i < tabs.length; i++) {
|
if(tabs[i].plIsOpen == 0) {
|
continue;
|
}
|
PLPageDefination[] pageDefinitions = UITools.getService().getPLPageDefinationsByPageContextOId(tabs[i].plOId);
|
if (pageDefinitions != null && pageDefinitions.length < 1) {
|
continue;
|
}
|
|
List<PLPageDefination> list = new LinkedList<PLPageDefination>();
|
List<PLDefination> definitions = new LinkedList<PLDefination>();
|
for(PLPageDefination pageDefinition : pageDefinitions){
|
list.add(pageDefinition);
|
|
PLDefination defination = UITools.getPLDefination(pageDefinition.plDefination);
|
defination.setName(pageDefinition.name);
|
defination.setDescription(pageDefinition.desc);
|
defination.setId(String.valueOf(pageDefinition.seq));
|
definitions.add(defination);
|
}
|
pageDefMap.put(tabs[i], list);
|
defMap.put(tabs[i], definitions);
|
}
|
return defMap;
|
}
|
|
@Override
|
public void reinitRightPanel(IDataNode dataNode) {
|
reinitRightPanel(dataNode, context);
|
}
|
|
/**
|
* 重新绘制右侧界面
|
* @param bo
|
*/
|
@Override
|
public void reinitRightPanel(IDataNode dataNode, String context) {
|
String cType = getBusinessObjectType(dataNode);
|
reinitRightPanel(dataNode, cType, context);
|
}
|
|
@Override
|
public void reinitRightPanel(IDataNode dataNode, String type, String context) {
|
if(navigatorPanel == null){
|
this.regionPanelMap.clear();
|
} else {
|
// 移除非导航区对应的regionpanel
|
Iterator<String> its = this.regionPanelMap.keySet().iterator();
|
while(its.hasNext()){
|
String key = its.next();
|
if(key.startsWith("1.")) {
|
continue;
|
} else {
|
its.remove();
|
}
|
}
|
}
|
this.setSelectDataNode(dataNode);
|
// add by xchao 2016.09.29 begin
|
// 优先从传入参数中取type,
|
// 如果该传入参数type为空,则 执行
|
// cType = getBusinessObjectType(dataNode) 以保证向之前的处理逻辑兼容
|
String cType = type;
|
if(type == null || "".equals(type)){
|
cType = getBusinessObjectType(dataNode);
|
}
|
// add by xchao 2016.09.29 end
|
try {
|
PLUILayout cContext = null;
|
if (contextDefMap.containsKey(context)) {
|
cContext = contextDefMap.get(context);
|
} else {
|
cContext = this.getContext(cType, context);
|
contextDefMap.put(context, cContext);
|
}
|
int divSize = mainSplitPane.getDividerSize();
|
Component rightComponent = mainSplitPane.getRightComponent();
|
if (rightComponent != null) {
|
mainSplitPane.remove(rightComponent);
|
}
|
layoutModel.removeAreaModels(2);
|
layoutModel.removeAreaModels(3);
|
layoutModel.getAreaSourceDataMap().remove(2);
|
layoutModel.getAreaSourceDataMap().remove(3);
|
layoutModel.cleanReloadEffectArea();
|
setReflectArea(cContext);
|
if (cContext != null) {
|
if (cType.equals(type)) {
|
if (cContext.plIsShowForm == 1) {
|
this.rightTopPanel = this.initMainDataArea(dataNode, cType, context, this.getDataValueMap(), cContext.plOId);
|
} else {
|
this.rightTopPanel = null;
|
}
|
if (cContext.plIsShowTab == 1) {
|
this.rightBottomPanel = this.initTabArea(dataNode, cType, context, this.getDataValueMap(), cContext.plOId);
|
} else {
|
this.rightBottomPanel = null;
|
}
|
} else {
|
if (cContext.plIsShowForm == 1) {
|
this.rightTopPanel = this.initMainDataArea(dataNode, cType, context, null, cContext.plOId);
|
} else {
|
this.rightTopPanel = null;
|
}
|
if (cContext.plIsShowTab == 1) {
|
this.rightBottomPanel = this.initTabArea(dataNode, cType, context, null, cContext.plOId);
|
} else {
|
this.rightBottomPanel = null;
|
}
|
}
|
rightComponent = this.initRightPanel(cContext);
|
mainSplitPane.setRightComponent(rightComponent);
|
} else {
|
mainSplitPane.setRightComponent(new JPanel());
|
}
|
mainSplitPane.setDividerSize(divSize);
|
mainSplitPane.updateUI();
|
} catch (VCIError e) {
|
e.printStackTrace();
|
} catch (Throwable e) {
|
e.printStackTrace();
|
}
|
}
|
|
public JSplitPane getMainSplitPane(){
|
return mainSplitPane;
|
}
|
|
public Component getNavigatorPanel() {
|
return navigatorPanel;
|
}
|
|
public Component getMainDataPanel() {
|
return rightTopPanel;
|
}
|
|
public Component getTabPanel() {
|
return rightBottomPanel;
|
}
|
|
public Map<String, IRegionPanel> getRegionPanelMap() {
|
return regionPanelMap;
|
}
|
|
public void setRegionPanelMap(Map<String, IRegionPanel> regionPanelMap) {
|
this.regionPanelMap = regionPanelMap;
|
}
|
|
public Object getObject(String key){
|
Object res = null;
|
return res;
|
}
|
|
/**
|
* 根据指定的key,从UILayoutPanel及其三大区域中获取sourcedata、selectdata的数据
|
* <p>==================================== UILayoutPanel =====================================</p>
|
* <p>u.inputdata. 选择的那条数据对象。(如图1中的产品型号列表中选择的产品)</p>
|
* <p></p>
|
* <p>sourcedata. 从选择的那条数据对象中取出oid,经合按钮参数中定义的type,将此oid对应数据重新加载出来,作为此UILayoutPanel的sourcedata
|
* <p></p>
|
* <p></p>
|
* <p></p>
|
* <p>==================================== 导航区 =====================================</p>
|
* <p>u.n.sourcedata. 导航区的sourcedata(实际上与 u.sourcedata是同一个对象)</p>
|
* <p>u.n.selectdata. 导航区中最后最后点击的数据对象(树上多选时,是第一个点击的对象)</p>
|
* <p>u.n.selectdata[0-N]. 导航区中,多选时对应的数据对象(索引从0开始,小于等于 树节点选择数据的长度 – 1),如 u.n.selectdata0.xxx、 u.n.selectdata1.xxx</p>
|
* <p></p>
|
* <p>u.n.tabpagecode1. 导航区里编码为tabpagecode1的tabpage(导航区当前暂未实现加载多个面签)</p>
|
* <p>u.n.tabpagecode1.sourcedata. </p>
|
* <p>u.n.tabpagecode1. selectdata. </p>
|
* <p>u.n.tabpagecode1. selectdata[0-N]. </p>
|
* <p>…</p>
|
* <p>u.n.tabpagecodeN. 导航区里编码为tabpagecodeN的tabpage(导航区当前暂未实现加载多个面签)</p>
|
* <p>u.n.tabpagecodeN.sourcedata. </p>
|
* <p>u.n.tabpagecodeN. selectdata. </p>
|
* <p>u.n.tabpagecodeN. selectdata[0-N]. </p>
|
* <p></p>
|
* <p>u.n.tabpagecode1.1. 导航区里编码为tabpagecode1的tabpage里编号为1的defination(form\table\tree\treetable\custom)</p>
|
* <p>u.n.tabpagecode1.1.sourcedata. </p>
|
* <p>u.n.tabpagecode1.1.selectdata. </p>
|
* <p>u.n.tabpagecode1.1.selectdata[0-N]. </p>
|
* <p>…</p>
|
* <p>u.n.tabpagecode1.N.sourcedata. 导航区里编码为tabpagecode1的tabpage里编号为N的defination(form\table\tree\treetable\custom)</p>
|
* <p>u.n.tabpagecode1.N.sourcedata. </p>
|
* <p>u.n.tabpagecode1.N.selectdata. </p>
|
* <p>u.n.tabpagecode1.N.selectdata[0-N]. </p>
|
* <p></p>
|
* <p></p>
|
* <p></p>
|
* <p>==================================== 控制区 =====================================</p>
|
* <p>u.c.</p>
|
* <p>u.c.sourcedata. 导航区的sourcedata(实际上与 u.sourcedata是同一个对象)</p>
|
* <p>u.c.selectdata. 导航区中最后最后点击的数据对象(树上多选时,是第一个点击的对象)</p>
|
* <p>u.c.selectdata[0-N]. 导航区中,多选时对应的数据对象(索引从0开始,小于等于 树节点选择数据的长度 – 1),如 u.n.selectdata0.xxx、 u.n.selectdata1.xxx</p>
|
* <p></p>
|
* <p>u.c.tabpagecode1. 导航区里编码为tabpagecode1的tabpage(导航区当前暂未实现加载多个面签)</p>
|
* <p>u.c.tabpagecode1.sourcedata. </p>
|
* <p>u.c.tabpagecode1. selectdata. </p>
|
* <p>u.c.tabpagecode1. selectdata[0-N]. </p>
|
* <p>…</p>
|
* <p>u.c.tabpagecodeN. 导航区里编码为tabpagecodeN的tabpage(导航区当前暂未实现加载多个面签)</p>
|
* <p>u.c.tabpagecodeN.sourcedata. </p>
|
* <p>u.c.tabpagecodeN. selectdata. </p>
|
* <p>u.c.tabpagecodeN. selectdata[0-N]. </p>
|
* <p></p>
|
* <p>u.c.tabpagecode1.1. 导航区里编码为tabpagecode1的tabpage里编号为1的defination(form\table\tree\treetable\custom)</p>
|
* <p>u.c.tabpagecode1.1.sourcedata. </p>
|
* <p>u.c.tabpagecode1.1.selectdata. </p>
|
* <p>u.c.tabpagecode1.1.selectdata[0-N]. </p>
|
* <p>…</p>
|
* <p>u.c.tabpagecode1.N.sourcedata. 导航区里编码为tabpagecode1的tabpage里编号为N的defination(form\table\tree\treetable\custom)</p>
|
* <p>u.c.tabpagecode1.N.sourcedata. </p>
|
* <p>u.c.tabpagecode1.N.selectdata. </p>
|
* <p>u.c.tabpagecode1.N.selectdata[0-N]. </p>
|
* <p></p>
|
* <p></p>
|
* <p></p>
|
* <p>==================================== 操作区 =====================================</p>
|
* <p>u.o. 操作区里第一个加载的tabpage对象</p>
|
* <p>u.o.sourcedata. 操作区的sourcedata</p>
|
* <p>u.o.selectdata. 操作区选择的数据对象(实际上与 u.o.sourcedata是同一个对象)</p>
|
* <p>u.o.selectdata[0-N]. 操作区中,多选时对应的数据对象(索引从0开始,小于等于 树节点选择数据的长度 – 1),如 u.o.selectdata0.xxx、 u.o.selectdata1.xxx</p>
|
* <p></p>
|
* <p>u.o.tabpagecode1. 操作区里编码为tabpagecode1的tabpage</p>
|
* <p>u.o.tabpagecode1.sourcedata. </p>
|
* <p>u.o.tabpagecodd1.selectdata. </p>
|
* <p>u.o.tabpagecode1.selectdata[0-N]. </p>
|
* <p>…</p>
|
* <p>u.o.tabpagecodeN.sourcedata. 操作区里编码为tabpagecodeN的tabpage</p>
|
* <p>u.o.tabpagecodeN.selectdata. </p>
|
* <p>u.o.tabpagecoddN.selectdata[0-N]. </p>
|
* <p></p>
|
* <p>u.o.tabpagecode1.1.sourcedata. 操作区里编码为tabpagecode1的tabpage里编号为1的defination(form\table\tree\treetable\custom)</p>
|
* <p>u.o.tabpagecode1.1.selectdata. </p>
|
* <p>u.o.tabpagecode1.1.selectdata[0- N] </p>
|
* <p>…</p>
|
* <p>u.o.tabpagecode1.N.sourcedata. 操作区里编码为tabpagecode1的tabpage里编号为N的defination(form\table\tree\treetable\custom)</p>
|
* <p>u.o.tabpagecode1.N.selectdata. </p>
|
* <p>u.o.tabpagecode1.N.selectdata[0-N]. </p>
|
*/
|
@Override
|
public String getValue(String key){
|
//${u.inputdata.xxx}-${u.inputdata.yyy}
|
//不區分大小學,要求在配置的時候全部是小寫字母
|
//key = key.toLowerCase();
|
String res = key;
|
if(isFreemarkTemplateContent(key)){
|
Map<String, String> valueMap = new HashMap<String, String>();
|
appendToValueMap(key, valueMap);
|
Map<String, FreemarkerParamObject> rootMap = convertValueMapToFPOMap(valueMap);
|
if(isExistInMap(key, valueMap)){
|
res = FreeMarkerCommon.getValueByTempRule(rootMap, key.replace(".", "_"));
|
} else {
|
res = key;
|
}
|
} else {
|
res = getValueSingle(key);
|
}
|
return res;
|
}
|
/**
|
* 检查要替换的字段KEY是否全部存在于valueMap中
|
* @param replaceField 查询模板中替换值的查询属性值
|
* @param valueMap dataSource.getValueMap()
|
* @return
|
*/
|
private boolean isExistInMap(String replaceField, Map<String, String> valueMap){
|
boolean res = true;
|
String field = replaceField;
|
int begin = field.indexOf("${");
|
int end = field.indexOf("}");
|
int len = field.length();
|
String key = "";
|
while(!"".equals(field) && begin >= 0 && end < len){
|
key = field.substring(begin + 2, end);
|
if(!valueMap.containsKey(key)){
|
System.out.println("变量:" + key + " 在 sourceData.getValueMap() 中不存在。");
|
return false;
|
}
|
field = field.substring(end + 1);
|
begin = field.indexOf("${");
|
end = field.indexOf("}");
|
len = field.length();
|
res = true;
|
}
|
return res;
|
}
|
|
private Map<String, String> appendToValueMap(String replaceField, Map<String, String> valueMap){
|
String field = replaceField;
|
int begin = field.indexOf("${");
|
int end = field.indexOf("}");
|
int len = field.length();
|
String key = "";
|
while(!"".equals(field) && begin >= 0 && end < len){
|
key = field.substring(begin + 2, end);
|
if(!valueMap.containsKey(key)){
|
valueMap.put(key, key);
|
}
|
field = field.substring(end + 1);
|
begin = field.indexOf("${");
|
end = field.indexOf("}");
|
len = field.length();
|
}
|
return valueMap;
|
}
|
private Map<String, FreemarkerParamObject> convertValueMapToFPOMap(Map<String, String> map){
|
Map<String, FreemarkerParamObject> rootMap = new LinkedHashMap<String, FreemarkerParamObject>();
|
Iterator<String> it = map.keySet().iterator();
|
while(it.hasNext()){
|
String key = it.next();
|
String value = map.get(key);
|
String valueFromUILayout = getValueSingle(key);
|
if(!valueFromUILayout.equals(key)){
|
value = valueFromUILayout;
|
}
|
if(value == null){
|
value = "";
|
}
|
String newKey = key.replace(".", "_");
|
FreemarkerParamObject fpo = new FreemarkerParamObject(newKey, value);
|
rootMap.put(newKey, fpo);
|
}
|
return rootMap;
|
}
|
private boolean isFreemarkTemplateContent(String itemValue){
|
int startPos = itemValue.indexOf("${");
|
int endPos = itemValue.indexOf("}");
|
return (startPos >= 0 && endPos >= 0 && startPos < endPos);
|
}
|
private String getValueSingle(String key){
|
String res = key;
|
if(key.startsWith(UILAYOUT_INPUTDATA_PREFIX)){
|
res = getValueByContextInputData(key);
|
}else if(key.startsWith(UILAYOUT_SOURCEDATA_PREFIX)){
|
res = getValueByContextSourceData(key);
|
}else if(key.startsWith(UILAYOUT_NAVIGATOR_PREFIX) && navigatorPanel != null) {
|
res = getValueByContextNavigator(key);
|
} else if(key.startsWith(UILAYOUT_CONTROL_PREFIX) && rightTopPanel != null){
|
res = getValueByContextControl(key);
|
} else if(key.startsWith(UILAYOUT_OPEATION_PREFIX) && rightBottomPanel != null){
|
res = getValueByContextOperation(key);
|
}
|
return res;
|
}
|
|
/**
|
* 返回 传入的数据对象的valueMap中指定 key 的值
|
* @param originKey u.inputdata.xxx
|
* @return
|
*/
|
private String getValueByContextInputData(String originKey){
|
String key = originKey;
|
String res = key;
|
key = key.replace(UILAYOUT_INPUTDATA_PREFIX, "");
|
res = getValueFromIDataNode(getInputData(), key, originKey);
|
return res;
|
}
|
|
/**
|
* 返回 传入的SourceData对象的valueMap中指定 key 的值
|
* @param originKey u.sourcedata.xxx
|
* @return
|
*/
|
private String getValueByContextSourceData(String originKey){
|
String key = originKey;
|
String res = key;
|
key = key.replace(UILAYOUT_SOURCEDATA_PREFIX, "");
|
res = getValueFromIDataNode(getSourceDataNode(), key, originKey);
|
return res;
|
}
|
private String getValueByContextNavigator(String originKey){
|
String key = originKey;
|
String res = key;
|
key = key.replace(UILAYOUT_NAVIGATOR_PREFIX, "");
|
IRegionPanel regionPanel = null;
|
regionPanel = (IRegionPanel)navigatorPanel;
|
if(regionPanel == null){
|
return res;
|
}
|
if(key.toLowerCase().startsWith(UILAYOUT_SOURCEDATA)
|
|| key.toLowerCase().startsWith(UILAYOUT_SELECTDATA)){
|
res = getValueFromRegionPanel(regionPanel, key, originKey);
|
} else{
|
//TODO 导航区,指定面签里的数据
|
key = "1" + DOT + key;
|
String[] keys = key.split("\\.");
|
String keyInMap = keys[0] + DOT + keys[1];
|
key = "";
|
for(int i = 2; i < keys.length ; i++){
|
key += keys[i];
|
if(i != keys.length - 1){
|
key += DOT;
|
}
|
}
|
if(key.toLowerCase().startsWith(UILAYOUT_SOURCEDATA)
|
|| key.toLowerCase().startsWith(UILAYOUT_SELECTDATA)){
|
regionPanel = regionPanelMap.get(keyInMap);
|
res = getValueFromRegionPanel(regionPanel, key, originKey);
|
} else {
|
keys = key.split("\\.");
|
keyInMap = keyInMap + DOT + keys[0];
|
regionPanel = regionPanelMap.get(keyInMap);
|
key = key.substring(key.toLowerCase().indexOf(".") + 1);
|
res = getValueFromRegionPanel(regionPanel, key, originKey);
|
}
|
}
|
if(res == null || "".equals(res.trim())){
|
res = originKey;
|
}
|
return res;
|
}
|
private Pattern ptnNum = Pattern.compile("[0-9]+");
|
private boolean isNnmber(String str){
|
return ptnNum.matcher(str).matches();
|
}
|
|
private String getValueByContextControl(String originKey){
|
String key = originKey;
|
String res = key;
|
key = key.replace(UILAYOUT_CONTROL_PREFIX, "");
|
IRegionPanel regionPanel = null;
|
if(rightTopPanel instanceof IRegionPanel){
|
regionPanel = (IRegionPanel)rightTopPanel;
|
} else if(rightTopPanel instanceof TabPagePanel){
|
// there's nothing in here
|
// TabPagePanel tpp = (TabPagePanel)regionPanel;
|
}
|
if(key.toLowerCase().startsWith(UILAYOUT_SOURCEDATA)
|
|| key.toLowerCase().startsWith(UILAYOUT_SELECTDATA)){
|
key = "2" + DOT + key;
|
String[] keys = key.split("\\.");
|
String keyInMap = keys[0];
|
regionPanel = regionPanelMap.get(keyInMap);
|
} else {
|
key = "2" + DOT + key;
|
String[] keys = key.split("\\.");
|
String keyInMap = keys[0] + DOT + keys[1];
|
if(keys.length >= 3){
|
keyInMap = keys[0] + DOT + keys[1] + DOT + keys[2];
|
}
|
regionPanel = regionPanelMap.get(keyInMap);
|
}
|
if(regionPanel == null){
|
return res;
|
}
|
if(key.toLowerCase().startsWith(UILAYOUT_SOURCEDATA)
|
|| key.toLowerCase().startsWith(UILAYOUT_SELECTDATA)){
|
res = getValueFromRegionPanel(regionPanel, key, originKey);
|
} else {
|
//TODO 控制区,指定面签里的数据
|
String[] keys = key.split("\\.");
|
key = "";
|
for(int i = 3; i < keys.length ; i++){
|
key += keys[i];
|
if(i != keys.length - 1){
|
key += DOT;
|
}
|
}
|
if(key.toLowerCase().startsWith(UILAYOUT_SOURCEDATA)
|
|| key.toLowerCase().startsWith(UILAYOUT_SELECTDATA)){
|
res = getValueFromRegionPanel(regionPanel, key, originKey);
|
} else {
|
keys = key.split("\\.");
|
key = key.substring(key.toLowerCase().indexOf(".") + 1);
|
res = getValueFromRegionPanel(regionPanel, key, originKey);
|
}
|
}
|
return res;
|
}
|
|
|
private String getValueByContextOperation(String originKey){
|
String key = originKey;
|
String res = key;
|
key = key.replace(UILAYOUT_OPEATION_PREFIX, "");
|
IRegionPanel regionPanel = null;
|
if(key.toLowerCase().startsWith(UILAYOUT_SOURCEDATA)
|
|| key.toLowerCase().startsWith(UILAYOUT_SELECTDATA)){
|
// u.o.sourcedata、u.o.selectdata 取的对象为 操作区第一个iregionpanel
|
if(regionPanelMap.containsKey("3")){
|
regionPanel = regionPanelMap.get("3");
|
res = getValueFromRegionPanel(regionPanel, key, originKey);
|
}
|
} else{
|
//TODO 操作区,指定面签里的数据
|
res = getValueFromRegionPanelTabpage(3, key, originKey);
|
}
|
return res;
|
}
|
|
private String getValueFromRegionPanelTabpage(int areaType, String key, String originKey){
|
String res = originKey;
|
key = String.valueOf(areaType) + DOT + key;
|
String[] keys = key.split("\\.");
|
String keyInMap = keys[0] + DOT + keys[1];
|
key = "";
|
for(int i = 2; i < keys.length ; i++){
|
key += keys[i];
|
if(i != keys.length - 1){
|
key += DOT;
|
}
|
}
|
IRegionPanel regionPanel = null;
|
if(key.toLowerCase().startsWith(UILAYOUT_SOURCEDATA)
|
|| key.toLowerCase().startsWith(UILAYOUT_SELECTDATA)){
|
regionPanel = regionPanelMap.get(keyInMap);
|
res = getValueFromRegionPanel(regionPanel, key, originKey);
|
} else {
|
keys = key.split("\\.");
|
keyInMap = keyInMap + DOT + keys[0];
|
regionPanel = regionPanelMap.get(keyInMap);
|
key = key.substring(key.toLowerCase().indexOf(".") + 1);
|
res = getValueFromRegionPanel(regionPanel, key, originKey);
|
}
|
return res;
|
}
|
|
/**
|
* 从 IRegionPanel中获取数据
|
* @param regionPanel
|
* @param key
|
* @return
|
*/
|
private String getValueFromRegionPanel(IRegionPanel regionPanel, String key, String originKey){
|
String res = originKey;
|
if(regionPanel == null){
|
return res;
|
}
|
if(key.toLowerCase().startsWith(UILAYOUT_SOURCEDATA_PREFIX)){
|
key = key.substring(key.toLowerCase().indexOf(".") + 1);
|
res = getValueFromIDataNode(regionPanel.getSourceData(), key, originKey);
|
} else if(key.toLowerCase().startsWith(UILAYOUT_SELECTDATA_PREFIX)){
|
key = key.substring(key.toLowerCase().indexOf(".") + 1);
|
// TODO 如果选择的数据为多条,则 selectdata 按 第 0 条算
|
Object[] secObjs = regionPanel.getDataModel().getSelectObjects();
|
if(secObjs != null && secObjs.length != 0 && secObjs[0] instanceof IDataNode){
|
res = getValueFromIDataNode((IDataNode)secObjs[0], key, originKey);
|
}
|
} else if(key.toLowerCase().startsWith(UILAYOUT_SELECTDATA)){
|
key = key.replace(UILAYOUT_SELECTDATA, "");
|
String indexString = key.split("\\.")[0];
|
if(isNnmber(indexString)){
|
Object[] secObjs = regionPanel.getDataModel().getSelectObjects();
|
int index = Integer.valueOf(indexString);
|
if(secObjs != null && index < secObjs.length){
|
key = key.substring(key.toLowerCase().indexOf(".") + 1);
|
if(secObjs != null && secObjs.length != 0 && secObjs[index] instanceof IDataNode){
|
res = getValueFromIDataNode((IDataNode)secObjs[index], key, originKey);
|
}
|
}
|
}
|
}
|
return res;
|
}
|
|
private String getValueFromIDataNode(IDataNode dataNode, String key, String originKey){
|
String res = key;
|
if(dataNode == null) return res;
|
Map<String, String> valueMap = dataNode.getValueMap();
|
res = valueMap.get(key);
|
if(res == null || res.trim().equals("")){
|
res = originKey;
|
}
|
return res;
|
}
|
|
/**
|
* key 前缀
|
* regionType
|
* regionType.tabCode
|
* regionType.tabCode.formOrListFlagNum
|
*
|
* value:IRegionPanel实例
|
*/
|
private Map<String, IRegionPanel> regionPanelMap = new LinkedHashMap<String, IRegionPanel>();
|
private final String DOT = ".";
|
private final String UILAYOUT = "u";
|
private final String UILAYOUT_INPUTDATA_PREFIX = UILAYOUT + DOT + "inputdata" + DOT;
|
private final String UILAYOUT_NAVIGATOR_PREFIX = UILAYOUT + DOT + "n" + DOT;
|
private final String UILAYOUT_CONTROL_PREFIX = UILAYOUT + DOT + "c" + DOT;
|
private final String UILAYOUT_OPEATION_PREFIX = UILAYOUT + DOT + "o" + DOT;
|
private final String UILAYOUT_SOURCEDATA = "sourcedata";
|
private final String UILAYOUT_SOURCEDATA_PREFIX = UILAYOUT_SOURCEDATA + DOT;
|
private final String UILAYOUT_SELECTDATA = "selectdata";
|
private final String UILAYOUT_SELECTDATA_PREFIX = UILAYOUT_SELECTDATA + DOT;
|
|
}
|