package com.vci.client.tool.dialog;
|
|
|
import java.awt.BorderLayout;
|
import java.awt.Dialog;
|
import java.awt.FlowLayout;
|
import java.awt.Frame;
|
import java.awt.GridBagConstraints;
|
import java.awt.GridBagLayout;
|
import java.awt.Insets;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
import java.util.HashMap;
|
import java.util.LinkedList;
|
import java.util.List;
|
import java.util.Map;
|
|
import javax.swing.DefaultCellEditor;
|
import javax.swing.DefaultComboBoxModel;
|
import javax.swing.table.TableColumn;
|
import javax.swing.table.TableColumnModel;
|
|
import com.vci.corba.portal.data.PLCommandParameter;
|
import com.vci.corba.portal.data.PLPageDefination;
|
import com.vci.corba.portal.data.PLUILayout;
|
import com.vci.corba.portal.data.PLTabButton;
|
import com.vci.corba.portal.data.PLTabPage;
|
import com.vci.corba.portal.data.PortalVI;
|
import com.vci.corba.omd.atm.AttribItem;
|
import com.vci.corba.omd.qtm.QTInfo;
|
import com.vci.mw.ClientContextVariable;
|
import com.vci.client.common.providers.ServiceProvider;
|
import com.vci.client.omd.btm.wrapper.BtmItemWrapper;
|
import com.vci.client.omd.linktype.LinkTypeWrapper;
|
import com.vci.client.oq.QTClient;
|
import com.vci.client.oq.QTDClient;
|
import com.vci.client.portal.utility.PLDefination;
|
import com.vci.client.portal.utility.PRM;
|
import com.vci.client.portal.utility.PRMItem;
|
import com.vci.client.portal.utility.UITools;
|
import com.vci.client.tool.enums.ChangeableProperty;
|
import com.vci.client.tool.panel.BtmItemAttrTablePanel;
|
import com.vci.client.tool.panel.ControlType;
|
import com.vci.client.tool.panel.PRMItemDetailInfoPanel;
|
import com.vci.client.tool.wrapper.AttribItemWrapperEx;
|
import com.vci.client.ui.process.QANProcessBar;
|
import com.vci.client.ui.process.QANProcessBarFrame;
|
import com.vci.client.ui.swing.VCISwingUtil;
|
import com.vci.client.ui.swing.components.VCIJButton;
|
import com.vci.client.ui.swing.components.VCIJCheckBox;
|
import com.vci.client.ui.swing.components.VCIJComboBox;
|
import com.vci.client.ui.swing.components.VCIJDialog;
|
import com.vci.client.ui.swing.components.VCIJLabel;
|
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.table.AbstractVCIJTableDataProvider;
|
import com.vci.client.ui.swing.components.table.VCIJTableNode;
|
import com.vci.client.ui.swing.components.table.VCIJTablePanel;
|
import com.vci.client.uif.actions.client.UIFUtils;
|
import com.vci.client.uif.engine.client.UIHelper;
|
import com.vci.common.utility.ObjectUtility;
|
import com.vci.corba.common.VCIError;
|
|
public class UIContexBuilderWrapperDialog extends VCIJDialog implements ActionListener{
|
|
/**
|
*
|
*/
|
private static final long serialVersionUID = -185227280921216037L;
|
private VCIJButton btnOk = VCISwingUtil.createVCIJButton("ok", "确定", "", "accept.png", this);
|
private VCIJButton btnCancel = VCISwingUtil.createVCIJButton("cancel", "取消", "取消", "cancel.png", this);
|
|
private BtmItemAttrTablePanel btmItemAttrItemTablePanel = null;
|
|
private BtmItemWrapper btmItemWrapper = null;
|
private List<AttribItemWrapperEx> attribItemWrapper = null;
|
|
public UIContexBuilderWrapperDialog(Frame frame){
|
super(frame, true);
|
}
|
|
public UIContexBuilderWrapperDialog(Dialog dialog){
|
super(dialog, true);
|
}
|
|
public void buildDialog(){
|
init();
|
}
|
|
private void init(){
|
initUI();
|
initActionMap();
|
initSizeAndLocation();
|
}
|
private void initUI(){
|
setTitle("上下文/表单生成器");
|
setLayout(new BorderLayout());
|
add(getNorthPanel(), BorderLayout.NORTH);
|
add(getWestPanel(), BorderLayout.WEST);
|
add(getCenterPanl(), BorderLayout.CENTER);
|
add(getEastPanel(), BorderLayout.EAST);
|
add(getSouthPanel(), BorderLayout.SOUTH);
|
}
|
|
final String ADD_FORM_CONTEXT_SUFFIX = "_AddFormContext";
|
final String EDIT_FORM_CONTEX_SUFFIX = "_EditFormContext";
|
final String TABLE_FORM_LIST_CONTEXT_SUFFIX = "_MangementContext";
|
|
final String ADD_FORM_SUFFIX = "_AddForm";
|
final String EDIT_FORM_SUFFIX = "_EditForm";
|
final String TABLE_FORM_SUFFIX = "_TableForm";
|
final String TABLE_FORM_LIST_SUFFIX = "_TableList";
|
|
private VCIJCheckBox chkBoxAddFormCtx = new VCIJCheckBox(ADD_FORM_CONTEXT_SUFFIX, true);
|
private VCIJCheckBox chkBoxEditFormCtx = new VCIJCheckBox(EDIT_FORM_CONTEX_SUFFIX, true);
|
private VCIJCheckBox chkBoxTableListCtx = new VCIJCheckBox(TABLE_FORM_LIST_CONTEXT_SUFFIX, true);
|
|
private VCIJCheckBox chkBoxAddForm = new VCIJCheckBox(ADD_FORM_SUFFIX, true);
|
private VCIJCheckBox chkBoxEditForm = new VCIJCheckBox(EDIT_FORM_SUFFIX, true);
|
private VCIJCheckBox chkBoxTableForm = new VCIJCheckBox(TABLE_FORM_SUFFIX, true);
|
private VCIJCheckBox chkBoxTableList = new VCIJCheckBox(TABLE_FORM_LIST_SUFFIX, true);
|
|
private VCIJTextField txtPrefix = new VCIJTextField(true);
|
private VCIJComboBox comBoxEditFormQTNames = new VCIJComboBox();
|
private VCIJComboBox comBoxTableFormQTNames = new VCIJComboBox();
|
|
private VCIJPanel getNorthPanel(){
|
VCIJPanel pal = new VCIJPanel(new GridBagLayout());
|
int padxy = 1;
|
int anchor = GridBagConstraints.NORTHWEST;
|
int fill = GridBagConstraints.BOTH;
|
int gridx = 0;
|
int gridy = 0;
|
|
pal.add(new VCIJLabel("是否生成默认上下文:"), getGBC(gridx++, gridy, 1, 1, 0, 0, anchor, fill, padxy));
|
VCIJPanel rbtnPal = new VCIJPanel(new FlowLayout(FlowLayout.LEADING));
|
rbtnPal.add(chkBoxAddFormCtx);rbtnPal.add(chkBoxEditFormCtx);rbtnPal.add(chkBoxTableListCtx);
|
ActionListener al = new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
checkBoxControl(e.getActionCommand());
|
}
|
};
|
chkBoxAddFormCtx.addActionListener(al);
|
chkBoxEditFormCtx.addActionListener(al);
|
chkBoxTableListCtx.addActionListener(al);
|
checkBoxControl("");
|
pal.add(rbtnPal , getGBC(gridx++, gridy, 2, 1, 1.0, 0, anchor, fill, padxy));
|
|
gridx = 0;
|
gridy += 1;
|
pal.add(new VCIJLabel("生成表单:"), getGBC(gridx++, gridy, 1, 1, 0, 0, anchor, fill, padxy));
|
VCIJPanel chkBoxPal = new VCIJPanel(new FlowLayout(FlowLayout.LEADING));
|
chkBoxPal.add(chkBoxAddForm);chkBoxPal.add(chkBoxEditForm);
|
chkBoxPal.add(chkBoxTableForm);chkBoxPal.add(chkBoxTableList);
|
pal.add(chkBoxPal , getGBC(gridx++, gridy, 2, 1, 1.0, 0, anchor, fill, padxy));
|
|
gridx = 0;
|
gridy += 1;
|
pal.add(new VCIJLabel("上下文&表单前缀:"), getGBC(gridx++, gridy, 1, 1, 0, 0, anchor, fill, padxy));
|
pal.add(txtPrefix , getGBC(gridx++, gridy, 1, 1, 1.0, 0, anchor, fill, padxy));
|
pal.add(new VCIJLabel("_Add/EditFormContext&_Add/EditForm"), getGBC(gridx++, gridy, 1, 1, 0, 0, anchor, fill, padxy));
|
|
gridx = 0;
|
gridy += 1;
|
pal.add(new VCIJLabel("EditForm使用的查询模板名称:"), getGBC(gridx++, gridy, 1, 1, 0, 0, anchor, fill, padxy));
|
pal.add(comBoxEditFormQTNames , getGBC(gridx++, gridy, 2, 1, 1.0, 0, anchor, fill, padxy));
|
|
gridx = 0;
|
gridy += 1;
|
pal.add(new VCIJLabel("TableList使用的查询模板名称:"), getGBC(gridx++, gridy, 1, 1, 0, 0, anchor, fill, padxy));
|
pal.add(comBoxTableFormQTNames , getGBC(gridx++, gridy, 2, 1, 1.0, 0, anchor, fill, padxy));
|
|
setQTNameComboBoxData();
|
|
return pal;
|
}
|
|
private void checkBoxControl(String actionCommand){
|
chkBoxAddForm.setSelected(chkBoxAddFormCtx.isSelected());
|
chkBoxAddForm.setEnabled(!chkBoxAddFormCtx.isSelected());
|
|
chkBoxEditForm.setSelected(chkBoxEditFormCtx.isSelected());
|
chkBoxEditForm.setEnabled(!chkBoxEditFormCtx.isSelected());
|
|
chkBoxTableForm.setSelected(chkBoxTableListCtx.isSelected());
|
chkBoxTableForm.setEnabled(!chkBoxTableListCtx.isSelected());
|
chkBoxTableList.setSelected(chkBoxTableListCtx.isSelected());
|
chkBoxTableList.setEnabled(!chkBoxTableListCtx.isSelected());
|
}
|
class QTWrapperEx {
|
private QTInfo qTWrapper = null;
|
public QTWrapperEx(QTInfo qtWrapper){
|
this.qTWrapper = qtWrapper;
|
}
|
|
public QTInfo getQTWrapper() {
|
return qTWrapper;
|
}
|
|
public void setQTWrapper(QTInfo qtWrapper) {
|
this.qTWrapper = qtWrapper;
|
}
|
|
@Override
|
public String toString(){
|
return getQTWrapper().qtName;
|
}
|
|
}
|
private void setQTNameComboBoxData(){
|
DefaultComboBoxModel model = new DefaultComboBoxModel();
|
DefaultComboBoxModel model2 = new DefaultComboBoxModel();
|
try {
|
String btmName = getBtmName();
|
QTInfo[] qts = ServiceProvider.getOMDService().getQTDService().getObjTypeQTs(btmName);
|
for(QTInfo qt : qts){
|
model.addElement(new QTWrapperEx(qt));
|
model2.addElement(new QTWrapperEx(qt));
|
}
|
} catch (VCIError e) {
|
e.printStackTrace();
|
}
|
comBoxEditFormQTNames.setModel(model);
|
comBoxTableFormQTNames.setModel(model2);
|
}
|
|
private String getQTName(VCIJComboBox cbx){
|
String res = "";
|
Object obj = cbx.getSelectedItem();
|
if(obj != null && obj instanceof QTWrapperEx){
|
res = ((QTWrapperEx)obj).getQTWrapper().qtName;
|
}
|
return res;
|
}
|
|
private VCIJPanel getWestPanel(){
|
VCIJPanel pal = new VCIJPanel();
|
return pal;
|
}
|
|
class DataProvider extends AbstractVCIJTableDataProvider<AttribItemWrapperEx>{
|
|
int index = 1;
|
@Override
|
public AttribItemWrapperEx[] getDatas(int pageIndex, int pageSize) {
|
index = 1;
|
return attribItemWrapper.toArray(new AttribItemWrapperEx[]{});
|
}
|
@Override
|
public VCIJTableNode<AttribItemWrapperEx> getNewRowNode(AttribItemWrapperEx obj) {
|
VCIJTableNode<AttribItemWrapperEx> node = new VCIJTableNode<AttribItemWrapperEx>(obj);
|
AttribItem ai = obj.getAttribItem();
|
node.setPropertyValue(ChangeableProperty.FIELD, ai.name);
|
node.setPropertyValue(ChangeableProperty.NAME, ai.label);
|
node.setPropertyValue(ChangeableProperty.READONLY, "0");
|
node.setPropertyValue(ChangeableProperty.REQUIRED, "0");
|
node.setPropertyValue(ChangeableProperty.SHOWTYPE, new ControlType("text", "单行文本框"));
|
node.setPropertyValue(ChangeableProperty.DEFVAL, "");
|
node.setPropertyValue(ChangeableProperty.POSTYPE, "1");
|
node.setPropertyValue(ChangeableProperty.FIELD_EXPRESS, "");
|
node.setPropertyValue(ChangeableProperty.READONLY_CONDITION, "");
|
node.setPropertyValue(ChangeableProperty.CONTROL_FIELD, "");
|
node.setPropertyValue(ChangeableProperty.CONTROL_FIELD_CONDITION, "");
|
node.setPropertyValue(ChangeableProperty.SCRIPT_VALIDATE, "");
|
node.setPropertyValue(ChangeableProperty.TIPTEXT, "");
|
node.setPropertyValue(ChangeableProperty.CASCAE_FIELD, "");
|
node.setPropertyValue(ChangeableProperty.CUSTOM_CLASS, "");
|
// node.setPropertyValue(ChangeableProperty.HTTP_PATH, "");
|
// node.setPropertyValue(ChangeableProperty.HTTP_FIELD, "");
|
node.setPropertyValue(ChangeableProperty.REFERENCE_FIRST, "");
|
node.setPropertyValue(ChangeableProperty.REFERENCE_SECOND, "");
|
node.setPropertyValue(ChangeableProperty.REFENENCE_FIELD, "");
|
node.setPropertyValue(ChangeableProperty.OTHER, "");
|
return node;
|
}
|
@Override
|
public String[] getSpecialColumns() {
|
return new String[]{
|
ChangeableProperty.FIELD,
|
ChangeableProperty.NAME,
|
ChangeableProperty.READONLY,
|
ChangeableProperty.REQUIRED,
|
ChangeableProperty.SHOWTYPE,
|
ChangeableProperty.DEFVAL,
|
ChangeableProperty.POSTYPE,
|
ChangeableProperty.FIELD_EXPRESS,
|
ChangeableProperty.READONLY_CONDITION,
|
ChangeableProperty.CONTROL_FIELD,
|
ChangeableProperty.CONTROL_FIELD_CONDITION,
|
ChangeableProperty.SCRIPT_VALIDATE,
|
ChangeableProperty.TIPTEXT,
|
ChangeableProperty.CASCAE_FIELD,
|
ChangeableProperty.CUSTOM_CLASS,
|
// ChangeableProperty.HTTP_PATH,
|
// ChangeableProperty.HTTP_FIELD,
|
ChangeableProperty.REFERENCE_FIRST,
|
ChangeableProperty.REFERENCE_SECOND,
|
ChangeableProperty.REFENENCE_FIELD,
|
ChangeableProperty.OTHER
|
};
|
}
|
@Override
|
public int getTotal() {
|
return 0;
|
}
|
}
|
private VCIJTablePanel<AttribItemWrapperEx> tablePanel = null;
|
private VCIJPanel getCenterPanl(){
|
VCIJPanel pal = new VCIJPanel(new BorderLayout());
|
tablePanel = new VCIJTablePanel<AttribItemWrapperEx>(new DataProvider());
|
List<Integer> editabColumnList = new LinkedList<Integer>();
|
for(int i = 2; i <= tablePanel.getDataProvider().getSpecialColumns().length;i++){
|
editabColumnList.add(i);
|
}
|
tablePanel.setEdiableColumnList(editabColumnList);
|
tablePanel.setShowPaging(false);
|
tablePanel.setShowColumnSetting(false);
|
|
tablePanel.setCellEditable(true);
|
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
|
map.put(4, 60);map.put(5, 60);map.put(6, 100);map.put(7, 60);
|
tablePanel.setColumnWidthMaps(map);
|
tablePanel.setColumnDefaultWidth(150);
|
tablePanel.buildTablePanel();
|
|
TableColumnModel tcm = tablePanel.getTable().getColumnModel();
|
TableColumn tc = tcm.getColumn(6);
|
tc.setCellEditor(new DefaultCellEditor(PRMItemDetailInfoPanel.getControlTypeComboBox()));
|
|
tablePanel.refreshTableData();
|
|
pal.add(tablePanel);
|
return pal;
|
}
|
private VCIJPanel getEastPanel(){
|
VCIJPanel pal = new VCIJPanel();
|
return pal;
|
}
|
private VCIJPanel getSouthPanel(){
|
VCIJPanel pal = new VCIJPanel();
|
pal.add(btnOk);
|
pal.add(btnCancel);
|
return pal;
|
}
|
private void initSizeAndLocation(){
|
setSize(UIHelper.DIALOG_DEFAULT_WIDTH, UIHelper.DIALOG_DEFAULT_HEIGHT);
|
setLocationRelativeTo(getOwner());
|
}
|
|
private GridBagConstraints getGBC(int gridx, int gridy, int gridwidth,
|
int gridheight, double weightx, double weighty, int anchor,
|
int fill, int padxy) {
|
return new GridBagConstraints(gridx, gridy, gridwidth, gridheight,
|
weightx, weighty, anchor, fill, new Insets(padxy, padxy, padxy,
|
padxy), padxy, padxy);
|
}
|
|
private Map<String, Runnable> actionMap = new HashMap<String, Runnable>();
|
private void initActionMap(){
|
actionMap.put(btnOk.getActionCommand(), new Runnable() {
|
@Override
|
public void run() {
|
ok();
|
}
|
});
|
actionMap.put(btnCancel.getActionCommand(), new Runnable() {
|
@Override
|
public void run() {
|
cancel();
|
}
|
});
|
}
|
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
String actionCommand = e.getActionCommand();
|
if(actionMap.containsKey(actionCommand)){
|
actionMap.get(actionCommand).run();
|
}
|
}
|
|
private boolean isSelectedAnyForm(){
|
boolean res = false;
|
res = (chkBoxAddForm.isSelected() || chkBoxEditForm.isSelected()
|
|| chkBoxTableForm.isSelected() || chkBoxTableList.isSelected());
|
return res;
|
}
|
private boolean isCanGenerate(){
|
boolean res = false;
|
Map<String, PortalVI> viMap = getAllPortalVIMap();
|
StringBuffer sb = new StringBuffer();
|
sb = checkVINameIsExist(chkBoxAddForm, ADD_FORM_SUFFIX, viMap, sb);
|
sb = checkVINameIsExist(chkBoxEditForm, EDIT_FORM_SUFFIX, viMap, sb);
|
sb = checkVINameIsExist(chkBoxTableForm, TABLE_FORM_SUFFIX, viMap, sb);
|
sb = checkVINameIsExist(chkBoxTableList, TABLE_FORM_LIST_SUFFIX, viMap, sb);
|
String message = sb.toString();
|
res = (message.length() <= 0);
|
if(!res){
|
VCIJOptionPane.showMessage(this, message);
|
}
|
return res;
|
}
|
|
private StringBuffer checkVINameIsExist(VCIJCheckBox cbx, String viNameSuffix,
|
Map<String, PortalVI> map, StringBuffer sb){
|
String viname = getVIName(viNameSuffix);
|
if(cbx.isSelected() && map.containsKey(viname)){
|
sb.append("\n 将生成的表单名称‘" + viname + "’在当前业务类型下已经存在!");
|
}
|
return sb;
|
}
|
|
private Map<String, PortalVI> getAllPortalVIMap(){
|
Map<String, PortalVI> map = new HashMap<String, PortalVI>();
|
try{
|
PortalVI[] vis = UITools.getService().getPortalVIArrayByTypeName(getBtmName());
|
for(PortalVI vi : vis){
|
map.put(vi.viName, vi);
|
}
|
}catch(Throwable e){
|
e.printStackTrace();
|
}
|
return map;
|
}
|
|
private void ok() {
|
if(!isSelectedAnyForm()){
|
VCIJOptionPane.showMessage(this, "请至少选择一要生成的表单!");
|
return;
|
}
|
if("".equals(txtPrefix.getText().trim())){
|
txtPrefix.requestFocus();
|
VCIJOptionPane.showMessage(this, "前缀不能为空!");
|
return;
|
}
|
if(!isCanGenerate()){
|
return;
|
}
|
final QANProcessBarFrame frame = new QANProcessBarFrame();
|
final Thread thread = new Thread() {
|
public void run() {
|
try {
|
frame.setContent("");
|
generateForm(frame);
|
close(DialogResult.OK);
|
} catch (VCIError e) {
|
UIFUtils.showErrorMessage(ClientContextVariable.getFrame(), e);
|
} catch(Exception e){
|
e.printStackTrace();
|
UIFUtils.showErrorMessage(ClientContextVariable.getFrame(), e);
|
} catch (Throwable e) {
|
e.printStackTrace();
|
VCIJOptionPane.showError(UIContexBuilderWrapperDialog.this, "创建表单或上下文时发生错误!\n" + e.getMessage());
|
}finally {
|
frame.setProcessBarCancel(true);
|
}
|
}
|
};
|
QANProcessBar bar = new QANProcessBar(thread, frame, frame, "表单&上下文生成器", false);
|
bar.setVisible(true);
|
}
|
private void generateForm(QANProcessBarFrame frame) throws Throwable{
|
frame.setContent("正在生成表单");
|
// 构建四个Form
|
PortalVI addForm = getNewFormPortalVI(getAddVIName());
|
PortalVI editForm = getNewFormPortalVI(getEditVIName());
|
PortalVI tableForm = getNewFormPortalVI(getTableFormVIName());
|
PortalVI tableList = getNewTablePortalVI(getTableListVIName());
|
|
List<PRMItem> prmItemList = getNewPRMItemList();
|
PRM prm = new PRM();
|
prm.setPrmItemList(prmItemList);
|
prm.setShowCols("3");
|
prm.setFormQtName("");
|
|
String prmText = UITools.getPRMText(prm);
|
addForm.prm = prmText;
|
// 设置tableForm的查询模板名称
|
prm.setFormQtName(getQTName(comBoxEditFormQTNames));
|
prmText = UITools.getPRMText(prm);
|
editForm.prm = prmText;
|
tableForm.prm = prmText;
|
tableList.prm = UITools.getPRMText(getNewPRMItemListFormTable(tableForm));
|
if(chkBoxAddForm.isSelected()){
|
UITools.getService().savePortalVI(addForm);
|
}
|
if(chkBoxEditForm.isSelected()){
|
UITools.getService().savePortalVI(editForm);
|
}
|
if(chkBoxTableForm.isSelected()){
|
UITools.getService().savePortalVI(tableForm);
|
}
|
if(chkBoxTableList.isSelected()){
|
UITools.getService().savePortalVI(tableList);
|
}
|
generateContext(frame);
|
getBtmItemAttrItemTablePanel().getOwnedPanel().refreshPortalVI();
|
}
|
|
private String getAddVIName(){
|
return txtPrefix.getText().trim() + ADD_FORM_SUFFIX;
|
}
|
private String getEditVIName(){
|
return txtPrefix.getText().trim() + EDIT_FORM_SUFFIX;
|
}
|
private String getTableFormVIName(){
|
return txtPrefix.getText().trim() + TABLE_FORM_SUFFIX;
|
}
|
private String getTableListVIName(){
|
return txtPrefix.getText().trim() + TABLE_FORM_LIST_SUFFIX;
|
}
|
private String getVIName(String suffix){
|
return txtPrefix.getText().trim() + suffix;
|
}
|
|
private PRM getNewPRMItemListFormTable(PortalVI tableFormVI){
|
List<PRMItem> list = new LinkedList<PRMItem>();
|
StringBuffer sbFieldWidths = new StringBuffer();// 各列默认宽度
|
StringBuffer sbItemKeys = new StringBuffer(); // 搜索条件
|
StringBuffer sbOutField = new StringBuffer();
|
StringBuffer sbSeniorQueryCols = new StringBuffer(); // 高级查询属性
|
StringBuffer sbSeniorQueryColsCounts = new StringBuffer(); // 高级查询属性个数
|
|
int size = tablePanel.getTableModel().getList().size();
|
for (int i = 0; i < size; i++) {
|
VCIJTableNode<AttribItemWrapperEx> tableNode = tablePanel.getTableModel().getList().get(i);
|
AttribItemWrapperEx aiWrapper = tableNode.getObject();
|
AttribItem ai = aiWrapper.getAttribItem();
|
sbFieldWidths.append("250").append(",");
|
if(i < 6){
|
sbItemKeys.append(ai.name).append(",");
|
}
|
sbOutField.append(ai.name).append(",");
|
sbSeniorQueryCols.append(ai.name).append(",");
|
sbSeniorQueryColsCounts.append("1").append(",");
|
}
|
PRMItem prmItem = new PRMItem();
|
prmItem.setItemPageSize("50,100#50");
|
prmItem.setItemImgWH("50,50");
|
prmItem.setItemDbl("3");
|
prmItem.setItemIsNavigatorExpand("false");
|
prmItem.setItemIsShowFolder("false");
|
|
String qtName = getQTName(comBoxTableFormQTNames);
|
prmItem.setItemFieldWidth(getStringBufferString(sbFieldWidths));
|
prmItem.setItemKeyFields(getStringBufferString(sbItemKeys));
|
prmItem.setItemOutFields(getStringBufferString(sbOutField));
|
prmItem.setItemQtName(qtName);
|
prmItem.setItemSeniorQueryCols(getStringBufferString(sbSeniorQueryCols));
|
prmItem.setItemSeniorQueryColsCounts(getStringBufferString(sbSeniorQueryColsCounts));
|
prmItem.setItemInObj(tableFormVI.id);
|
list.add(prmItem);
|
|
PRM prm = new PRM();
|
prm.setFormQtName(qtName);
|
prm.setPrmItemList(list);
|
return prm;
|
}
|
|
|
private String getStringBufferString(StringBuffer sb){
|
String res = sb.toString();
|
if(res.endsWith(",")){
|
res = res.substring(0, res.length() - 1);
|
}
|
return res;
|
}
|
|
|
private List<PRMItem> getNewPRMItemList(){
|
List<PRMItem> list = new LinkedList<PRMItem>();
|
for(VCIJTableNode<AttribItemWrapperEx> tableNode : tablePanel.getTableModel().getList()){
|
list.add(getPRMItemFromTableNode(tableNode));
|
}
|
return list;
|
}
|
|
private PRMItem getPRMItemFromTableNode(VCIJTableNode<AttribItemWrapperEx> tableNode){
|
PRMItem prmItem = new PRMItem();
|
String[] headers = tablePanel.getDataProvider().getSpecialColumns();
|
for(String header : headers){
|
Object objVal = tableNode.getPropertyValue(header);
|
String newValue = objVal.toString();
|
if(objVal instanceof ControlType){
|
newValue = ((ControlType)objVal).getValue();
|
}
|
if(newValue == null){
|
newValue = "";
|
}
|
prmItem = getBtmItemAttrItemTablePanel().getOwnedPanel()
|
.setPRMItemAttrValue(prmItem, header, newValue);
|
}
|
return prmItem;
|
}
|
|
private PortalVI getNewTablePortalVI(String suffix){
|
PortalVI vi = getNewFormPortalVI(suffix);
|
vi.viType = 0;
|
return vi;
|
}
|
private PortalVI getNewFormPortalVI(String viName){
|
String typeName = getBtmName();
|
PortalVI vi = getNewPortalVI(typeName, viName, true);
|
return vi;
|
}
|
|
private PortalVI getNewPortalVI(String typeName, String viName, boolean isForm){
|
PortalVI vi = new PortalVI();
|
vi.id = ObjectUtility.getNewObjectID36();
|
vi.typeName = typeName;
|
vi.viName = viName;
|
vi.viType = (short)(isForm ? 1 : 0); // 1:表单 0:表格
|
vi.typeFlag = 0; // 1:链接类型表单 0:业务类型表单
|
if(!isBtmType()){
|
vi.typeFlag = 1;
|
LinkTypeWrapper lt = this.getBtmItemAttrItemTablePanel().getLinkTypeWrapper();
|
String linkType = lt.linkType.name;
|
vi.typeName = linkType;
|
}
|
return vi;
|
}
|
|
private boolean isBtmType(){
|
return this.getBtmItemAttrItemTablePanel().getOwnedPanel().isBtmType();
|
}
|
|
private String getBtmName() {
|
String btmName = "";
|
if(isBtmType()){
|
btmName = getBtmItemWrapper().btmItem.name;
|
} else {
|
btmName = this.getBtmItemAttrItemTablePanel().getLinkTypeWrapper().linkType.name;
|
}
|
|
return btmName;
|
}
|
|
private void generateContext(QANProcessBarFrame frame) throws Throwable{
|
frame.setContent("正在生成上下文");
|
String addContext = "";
|
String editContext = "";
|
if(chkBoxAddFormCtx.isSelected()){
|
PLUILayout addFormCtx = generateAddFormCtx();
|
addContext = addFormCtx.plCode;
|
}
|
if(chkBoxEditFormCtx.isSelected()){
|
PLUILayout editFormCtx = generateEditFormCtx();
|
editContext = editFormCtx.plCode;
|
}
|
if(chkBoxTableListCtx.isSelected()){
|
PLUILayout mgrCtx = generateManagementCtx(addContext, editContext);
|
}
|
}
|
|
private PLUILayout generateAddFormCtx() throws Throwable{
|
// 上下文
|
PLUILayout pld = null;
|
if(isBtmType()){
|
pld = getNewPagelayoutDefinition();
|
pld.plIsShowForm = 1;
|
pld.plCode = txtPrefix.getText() + ADD_FORM_CONTEXT_SUFFIX;
|
pld.plName = pld.plCode;
|
|
// 页签
|
PLTabPage ptp = getNewFormTabPage("AddFormWindow", "数据添加窗口", pld.plOId);
|
|
// 页签明细定义
|
PLPageDefination pd = getNewPageDefinition(ptp, "数据添加");
|
pd.plType = 2; // 面签属性控制区
|
PLDefination d = getNewAddOrEditFormDefinition();
|
d.setTemplateId(getAddVIName());
|
pd.plDefination = UITools.getPLDefinationText(d);
|
|
// 按钮Button
|
PLTabButton btnSave = getNewAddSaveButton(pd.plOId);
|
PLTabButton btnCancel = getNewCancelButton(pd.plOId);
|
|
// 保存数据
|
UITools.getService().savePLUILayout(pld);
|
UITools.getService().savePLTabPage(ptp);
|
UITools.getService().savePLPageDefination(pd);
|
UITools.getService().savePLTabButton(btnSave);
|
UITools.getService().savePLTabButton(btnCancel);
|
}else{
|
pld = generateAddFormCtxForLinkType();
|
}
|
return pld;
|
}
|
|
private PLUILayout generateAddFormCtxForLinkType() throws Throwable{
|
String showType = getBtmItemAttrItemTablePanel().getShowType();
|
String linkType = getBtmName();
|
// 上下文
|
PLUILayout pld = getNewPagelayoutDefinition();
|
pld.plRelatedType = showType;
|
|
pld.plIsShowForm = 1;
|
pld.plCode = txtPrefix.getText() + ADD_FORM_CONTEXT_SUFFIX;
|
pld.plName = pld.plCode;
|
|
// 页签
|
PLTabPage ptp = getNewFormTabPage("AddFormWindow", "数据添加窗口", pld.plOId);
|
|
// 页签明细定义
|
PLPageDefination pd = getNewPageDefinition(ptp, "数据添加");
|
pd.plType = 2; // 面签属性控制区
|
PLDefination d = getNewAddOrEditFormDefinition();
|
d.setTemplateId(getAddVIName());
|
|
// 重新设置为table类型的 definition
|
d.setSearchTarger("2");// 1:本对象搜索 2:链接对象类搜索
|
d.setShowType(showType);
|
d.setLinkType(linkType);
|
|
pd.plDefination = UITools.getPLDefinationText(d);
|
|
// 按钮Button
|
PLTabButton btnChoose = getNewButton("3C3F9506-4DAB-47C6-383A-AC0CD76D2B21", pd.plOId, "选择", "选择", (short)1);
|
PLTabButton btnSave = getNewButton("9DB40166-8426-8EF2-3ADB-6B69E476D642", pd.plOId, "保存", "保存", (short)2);
|
PLTabButton btnCancel = getNewButton("242E9941-BA60-C52F-79C0-4146E2C333A3", pd.plOId, "取消", "取消", (short)3);
|
|
// 按钮参数
|
List<PLCommandParameter> cmdPars = new LinkedList<PLCommandParameter>();
|
cmdPars.add(getNewCommandParameter(btnChoose.plOId, "type", showType));
|
cmdPars.add(getNewCommandParameter(btnChoose.plOId, "context", "${在弹出窗口中选择‘" + showType + "'的上下文}"));
|
|
cmdPars.add(getNewCommandParameter(btnSave.plOId, "linktype", linkType));
|
|
// 保存数据
|
UITools.getService().savePLUILayout(pld);
|
UITools.getService().savePLTabPage(ptp);
|
UITools.getService().savePLPageDefination(pd);
|
|
UITools.getService().savePLTabButton(btnChoose);
|
UITools.getService().savePLTabButton(btnSave);
|
UITools.getService().savePLTabButton(btnCancel);
|
|
for(PLCommandParameter cmdPar : cmdPars){
|
UITools.getService().savePLCommandParameter(cmdPar);
|
}
|
|
return pld;
|
}
|
|
private PLUILayout generateEditFormCtx() throws Throwable{
|
// 上下文
|
PLUILayout pld = null;
|
if(isBtmType()){
|
pld = getNewPagelayoutDefinition();
|
pld.plIsShowForm = 1;
|
pld.plCode = txtPrefix.getText() + EDIT_FORM_CONTEX_SUFFIX;
|
pld.plName = pld.plCode;
|
|
// 页签
|
PLTabPage ptp = getNewFormTabPage("EditFormWindow", "数据修改窗口", pld.plOId);
|
|
PLPageDefination pd = getNewPageDefinition(ptp, "数据修改");
|
pd.plType = 2; // 面签属性控制区
|
PLDefination d = getNewAddOrEditFormDefinition();
|
d.setTemplateId(getEditVIName());
|
pd.plDefination = UITools.getPLDefinationText(d);
|
|
// 按钮Button
|
PLTabButton btnSave = getNewEditSaveButton(pd.plOId);
|
PLTabButton btnCancel = getNewCancelButton(pd.plOId);
|
|
// 保存数据
|
UITools.getService().savePLUILayout(pld);
|
UITools.getService().savePLTabPage(ptp);
|
UITools.getService().savePLPageDefination(pd);
|
UITools.getService().savePLTabButton(btnSave);
|
UITools.getService().savePLTabButton(btnCancel);
|
}else{
|
pld = generateEditFormCtxForLinkType();
|
}
|
return pld;
|
}
|
|
private PLUILayout generateEditFormCtxForLinkType() throws Throwable{
|
String showType = getBtmItemAttrItemTablePanel().getShowType();
|
String linkType = getBtmName();
|
// 上下文
|
PLUILayout pld = getNewPagelayoutDefinition();
|
pld.plRelatedType = showType;
|
pld.plIsShowForm = 1;
|
pld.plCode = txtPrefix.getText() + EDIT_FORM_CONTEX_SUFFIX;
|
pld.plName = pld.plCode;
|
|
// 页签
|
PLTabPage ptp = getNewFormTabPage("EditFormWindow", "数据修改窗口", pld.plOId);
|
|
PLPageDefination pd = getNewPageDefinition(ptp, "数据修改");
|
pd.plType = 2; // 面签属性控制区
|
PLDefination d = getNewAddOrEditFormDefinition();
|
|
// 重新设置为table类型的 definition
|
d.setTemplateId(getEditVIName());
|
|
d.setSearchTarger("2");// 1:本对象搜索 2:链接对象类搜索
|
d.setShowType(showType);
|
d.setLinkType(linkType);
|
|
pd.plDefination = UITools.getPLDefinationText(d);
|
|
// 按钮Button
|
PLTabButton btnSave = getNewButton("3C49CD14-1E14-3957-D2D7-C968E0299FAB", pd.plOId, "保存", "保存", (short)1);
|
PLTabButton btnCancel = getNewButton("242E9941-BA60-C52F-79C0-4146E2C333A3", pd.plOId, "取消", "取消", (short)2);
|
|
// 按钮参数
|
List<PLCommandParameter> cmdPars = new LinkedList<PLCommandParameter>();
|
|
// 保存数据
|
UITools.getService().savePLUILayout(pld);
|
UITools.getService().savePLTabPage(ptp);
|
UITools.getService().savePLPageDefination(pd);
|
|
UITools.getService().savePLTabButton(btnSave);
|
UITools.getService().savePLTabButton(btnCancel);
|
|
return pld;
|
}
|
|
private PLUILayout generateManagementCtx(String addContext, String editContext) throws Throwable{
|
// 上下文
|
PLUILayout pld = null;
|
if(isBtmType()){
|
pld = getNewPagelayoutDefinition();
|
pld.plIsShowTab = 1;
|
pld.plCode = txtPrefix.getText() + TABLE_FORM_LIST_CONTEXT_SUFFIX;
|
pld.plName = pld.plCode;
|
|
// 页签
|
PLTabPage ptp = getNewFormTabPage("ManagementData", "数据管理窗口", pld.plOId);
|
ptp.plAreaType = 3;
|
|
// 页签明细定义
|
PLPageDefination pd = getNewPageDefinition(ptp, "数据管理");
|
pd.plType = 3;
|
PLDefination d = getNewAddOrEditFormDefinition();
|
// 重新设置为table类型的 definition
|
d.setTemplateType("1");// 1:Table 2:Custom 3:TreeTable 4:Form 5:Tree
|
d.setTemplateId(getTableListVIName());
|
pd.plDefination = UITools.getPLDefinationText(d);
|
|
// 按钮Button
|
PLTabButton btnAdd = getNewButton("65274704-5557-231C-E3EA-0B32B9BD5A0B", pd.plOId, "添加", "添加", (short)1);
|
PLTabButton btnEdit = getNewButton("F8534EFE-130B-0CB3-D477-2AC7B19B7DC4", pd.plOId, "修改", "修改", (short)2);
|
PLTabButton btnDelete = getNewButton("2655E9F0-014B-DFEC-6F92-A6D1C51FDA19", pd.plOId, "删除", "删除", (short)3);
|
|
// 按钮参数
|
List<PLCommandParameter> cmdPars = new LinkedList<PLCommandParameter>();
|
cmdPars.add(getNewCommandParameter(btnAdd.plOId, "type", getBtmName()));
|
cmdPars.add(getNewCommandParameter(btnAdd.plOId, "context", addContext));
|
|
cmdPars.add(getNewCommandParameter(btnEdit.plOId, "type", getBtmName()));
|
cmdPars.add(getNewCommandParameter(btnEdit.plOId, "context", editContext));
|
|
// 保存数据
|
UITools.getService().savePLUILayout(pld);
|
UITools.getService().savePLTabPage(ptp);
|
UITools.getService().savePLPageDefination(pd);
|
|
UITools.getService().savePLTabButton(btnAdd);
|
UITools.getService().savePLTabButton(btnEdit);
|
UITools.getService().savePLTabButton(btnDelete);
|
|
for(PLCommandParameter cmdPar : cmdPars){
|
UITools.getService().savePLCommandParameter(cmdPar);
|
}
|
|
} else {
|
pld = generateManagementCtxForLinkType(addContext, editContext);
|
}
|
return pld;
|
}
|
|
private PLUILayout generateManagementCtxForLinkType(String addContext, String editContext) throws Throwable{
|
String showType = getBtmItemAttrItemTablePanel().getShowType();
|
String linkType = getBtmName();
|
// 上下文
|
PLUILayout pld = getNewPagelayoutDefinition();
|
pld.plRelatedType = showType;
|
pld.plIsShowTab = 1;
|
pld.plCode = txtPrefix.getText() + TABLE_FORM_LIST_CONTEXT_SUFFIX;
|
pld.plName = pld.plCode;
|
|
// 页签
|
PLTabPage ptp = getNewFormTabPage("ManagementData", "数据管理窗口", pld.plOId);
|
ptp.plAreaType = 3; // 操作区
|
|
// 页签明细定义
|
PLPageDefination pd = getNewPageDefinition(ptp, "数据管理");
|
pd.plType = 3; // 操作区的页面
|
PLDefination d = getNewAddOrEditFormDefinition();
|
// 重新设置为table类型的 definition
|
d.setTemplateType("1");// 1:Table 2:Custom 3:TreeTable 4:Form 5:Tree
|
d.setTemplateId(getTableListVIName());
|
|
d.setSearchTarger("2");// 1:本对象搜索 2:链接对象类搜索
|
d.setShowType(showType);
|
d.setLinkType(linkType);
|
|
pd.plDefination = UITools.getPLDefinationText(d);
|
|
// 按钮Button
|
PLTabButton btnAdd = getNewButton("D26FCC6A-E669-DEDD-5C71-B98E8F1F6CB7", pd.plOId, "选择添加", "选择添加", (short)1);
|
PLTabButton btnEdit = getNewButton("832BC4EA-159F-C817-A4A2-603528F2872F", pd.plOId, "新建添加", "新建添加", (short)2);
|
PLTabButton btnDelete = getNewButton("3690D997-0EE6-FE39-0ACB-7919C1F27680", pd.plOId, "修改", "修改", (short)3);
|
|
// 按钮参数
|
List<PLCommandParameter> cmdPars = new LinkedList<PLCommandParameter>();
|
cmdPars.add(getNewCommandParameter(btnAdd.plOId, "type", showType));
|
cmdPars.add(getNewCommandParameter(btnAdd.plOId, "context", addContext));
|
cmdPars.add(getNewCommandParameter(btnAdd.plOId, "linktype", linkType));
|
|
cmdPars.add(getNewCommandParameter(btnEdit.plOId, "type", showType));
|
cmdPars.add(getNewCommandParameter(btnEdit.plOId, "context", editContext));
|
cmdPars.add(getNewCommandParameter(btnEdit.plOId, "linktype", linkType));
|
cmdPars.add(getNewCommandParameter(btnEdit.plOId, "needselect", "false"));
|
|
cmdPars.add(getNewCommandParameter(btnDelete.plOId, "type", showType));
|
cmdPars.add(getNewCommandParameter(btnDelete.plOId, "context", editContext));
|
cmdPars.add(getNewCommandParameter(btnDelete.plOId, "linktype", linkType));
|
cmdPars.add(getNewCommandParameter(btnDelete.plOId, "tmapping", "edit"));
|
|
// 保存数据
|
UITools.getService().savePLUILayout(pld);
|
UITools.getService().savePLTabPage(ptp);
|
UITools.getService().savePLPageDefination(pd);
|
|
UITools.getService().savePLTabButton(btnAdd);
|
UITools.getService().savePLTabButton(btnAdd);
|
UITools.getService().savePLTabButton(btnEdit);
|
UITools.getService().savePLTabButton(btnDelete);
|
|
for(PLCommandParameter cmdPar : cmdPars){
|
UITools.getService().savePLCommandParameter(cmdPar);
|
}
|
return pld;
|
}
|
|
private PLPageDefination getNewPageDefinition(PLTabPage ptp, String name) {
|
PLPageDefination pd = new PLPageDefination();
|
pd.plOId = ObjectUtility.getNewObjectID36();
|
pd.plTabPageOId = ptp.plOId;
|
pd.name = name;
|
pd.seq = 1;
|
pd.desc = "";
|
return pd;
|
}
|
|
private PLDefination getNewAddOrEditFormDefinition(){
|
PLDefination d = new PLDefination();
|
d.setTemplateType("4");// 1:Table 2:Custom 3:TreeTable 4:Form 5:Tree
|
d.setSearchTarger("1");// 1:本对象搜索 2:链接对象类搜索
|
d.setNavigatorType("1");
|
if(!isBtmType()){
|
d.setLinkType(getBtmName());
|
d.setShowType(getBtmItemAttrItemTablePanel().getShowType());
|
} else {
|
d.setShowType(getBtmName());
|
}
|
d.setTemplateId("");
|
d.setEventKey("");
|
d.setEventValue("");
|
return d;
|
}
|
|
private PLUILayout getNewPagelayoutDefinition(){
|
PLUILayout pld = new PLUILayout();
|
String userName = getNewUserName();
|
pld.plOId = ObjectUtility.getNewObjectID36();
|
pld.plCreateUser = userName;
|
pld.plModifyUser = userName;
|
pld.plIsShowNavigator = 0;
|
pld.plIsShowForm = 0;
|
pld.plIsShowTab = 0;
|
pld.plRelatedType = getBtmName();
|
return pld;
|
}
|
|
private PLTabButton getNewAddSaveButton(String pageOid){
|
PLTabButton tb = getNewButton("2AAFDEE1-B760-A0AD-6C2A-CB2C0C3407A3", pageOid, "保存", "保存", (short)1);
|
return tb;
|
}
|
|
private PLTabButton getNewEditSaveButton(String pageOid){
|
PLTabButton tb = getNewButton("B38BAB02-F2B2-D35A-CD12-F98248A18B33", pageOid, "保存", "保存", (short)1);
|
return tb;
|
}
|
|
private PLTabButton getNewCancelButton(String pageOid){
|
PLTabButton tb = getNewButton("242E9941-BA60-C52F-79C0-4146E2C333A3", pageOid, "取消", "取消", (short)2);
|
return tb;
|
}
|
|
private PLTabButton getNewButton(String actionOid, String pageOid, String label, String desc, short seq){
|
PLTabButton tb = getNewTabButton(pageOid);
|
tb.plActionOId = actionOid;
|
tb.plLabel = label;
|
tb.plDesc = desc;
|
tb.plSeq = seq;
|
return tb;
|
}
|
|
private PLTabButton getNewTabButton(String pageOid){
|
PLTabButton tb = new PLTabButton();
|
tb.plTableOId = pageOid;
|
tb.plAreaType = "tab";
|
tb.plOId = ObjectUtility.getNewObjectID36();
|
String userName = getNewUserName();
|
tb.plCreateUser = userName;
|
tb.plModifyUser = userName;
|
tb.show = "0";
|
return tb;
|
}
|
|
private PLCommandParameter getNewCommandParameter(String buttonOid, String key, String value){
|
PLCommandParameter cp = new PLCommandParameter();
|
cp.plOId = ObjectUtility.getNewObjectID36();
|
cp.plCommandOId = buttonOid;
|
cp.plKey = key;
|
cp.plValue = value;
|
String userName = getNewUserName();
|
cp.plCreateUser = userName;
|
cp.plModifyUser = userName;
|
return cp;
|
}
|
|
|
private String getNewUserName(){
|
return ClientContextVariable.getInvocationInfo().userName;
|
}
|
|
private PLTabPage getNewFormTabPage(String code, String name, String pageLaoutDefinitionOid){
|
PLTabPage ptp = new PLTabPage();
|
ptp.plOId = ObjectUtility.getNewObjectID36();
|
ptp.plContextOId = pageLaoutDefinitionOid;
|
String userName = getNewUserName();
|
ptp.plCreateUser = userName;
|
ptp.plModifyUser = userName;
|
|
ptp.plCode = code;
|
ptp.plName = name;
|
ptp.plSeq = 1;
|
ptp.plIsOpen = 1;
|
ptp.plOpenExpression = "";
|
ptp.plLabel = "";
|
ptp.plDesc = "";
|
ptp.plAreaType = 2;
|
return ptp;
|
}
|
|
|
private void cancel(){
|
close(DialogResult.CANCEL);
|
}
|
private void close(DialogResult dialogResult){
|
setDialogResult(dialogResult);
|
close();
|
}
|
private void close(){
|
dispose();
|
setVisible(false);
|
}
|
|
public BtmItemAttrTablePanel getBtmItemAttrItemTablePanel() {
|
return btmItemAttrItemTablePanel;
|
}
|
public void setBtmItemAttrItemTablePanel(
|
BtmItemAttrTablePanel btmItemAttrItemTablePanel) {
|
this.btmItemAttrItemTablePanel = btmItemAttrItemTablePanel;
|
}
|
public BtmItemWrapper getBtmItemWrapper() {
|
return btmItemWrapper;
|
}
|
public void setBtmItemWrapper(BtmItemWrapper btmItemWrapper) {
|
this.btmItemWrapper = btmItemWrapper;
|
}
|
public List<AttribItemWrapperEx> getAttribItemWrapper() {
|
return attribItemWrapper;
|
}
|
public void setAttribItemWrapper(List<AttribItemWrapperEx> attribItemWrapper) {
|
this.attribItemWrapper = attribItemWrapper;
|
}
|
}
|