package com.vci.client.workflow.template; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Frame; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.LinkedHashMap; import java.util.Map; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import com.vci.client.LogonApplication; import com.vci.client.logon.base.BaseJDialog; import com.vci.client.ui.exception.VCIException; import com.vci.client.ui.swing.KJButton; import com.vci.client.ui.swing.VCIOptionPane; import com.vci.client.ui.tree.VCIBaseTree; import com.vci.client.ui.tree.VCIBaseTreeModel; import com.vci.client.ui.tree.VCIBaseTreeNode; import com.vci.client.workflow.commom.ClientHelper; import com.vci.client.workflow.delegate.ProcessCustomClientDelegate; import com.vci.client.workflow.template.ProcessCategoryTreeCellRender; import com.vci.client.workflow.template.object.NodeHideObject; import com.vci.client.workflow.template.object.ProcessCategoryObject; import com.vci.client.workflow.template.object.ProcessDefinitionObject; import com.vci.corba.common.VCIError; public class AssignProcessDialog extends BaseJDialog { private static final long serialVersionUID = 4257732186259993713L; private VCIBaseTree leftTree = null; private VCIBaseTreeModel treeModel = null; private VCIBaseTreeNode rootNode = null; private KJButton okBtn = new KJButton(this.getI18nString("btnOk"), "ok.gif"); private KJButton cancelBtn = new KJButton(this.getI18nString("btnCancel"), "cancel.gif"); private ProcessDefinitionObject processDefinitionObject; private boolean isOk = false; public AssignProcessDialog(Frame parent) { super(parent, true); setTitle(getI18nString("selectProcess")); initUI(); addListener(); setSize(280, 320); centerToScreen(); } private void initUI() { JPanel assignPanel = new JPanel(new BorderLayout()); JScrollPane leftScrPane = new JScrollPane(); initLeftPanel(leftScrPane); assignPanel.add(leftScrPane); JPanel btnPanel = new JPanel(); btnPanel.add(okBtn); btnPanel.add(cancelBtn); getContentPane().add(assignPanel); getContentPane().add(btnPanel, BorderLayout.SOUTH); } private void initLeftPanel(JScrollPane leftJsp) { String rootObj = "root"; rootNode = new VCIBaseTreeNode(this.getI18nString("treeRootNodeName"), rootObj); treeModel = new VCIBaseTreeModel(rootNode); leftTree = new VCIBaseTree(treeModel, new ProcessCategoryTreeCellRender()); leftTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); leftTree.addTreeExpansionListener(new TreeExpansionListener() { public void treeExpanded(TreeExpansionEvent event) { TreePath treePath = event.getPath(); VCIBaseTreeNode selectNode = (VCIBaseTreeNode) treePath.getLastPathComponent(); if(!selectNode.isExpand()){ selectNode.removeAllChildren(); getExpandTreeData(selectNode); } } public void treeCollapsed(TreeExpansionEvent event) { } }); leftJsp.getViewport().add(leftTree); initLeftTree(rootNode); } private void getExpandTreeData(VCIBaseTreeNode treeNode) { try{ String processCategoryId = ""; Object nodeObject = treeNode.getObj(); if(nodeObject instanceof String && nodeObject.toString().equals("root")){ initLeftTree(rootNode); }else{ if (nodeObject instanceof ProcessCategoryObject) { processCategoryId = ((ProcessCategoryObject)nodeObject).getId(); } //refresh tree from db ProcessCategoryObject[] processCategories = new ProcessCustomClientDelegate(LogonApplication.getUserEntityObject()).getProcessCategories(processCategoryId); for (ProcessCategoryObject obj : processCategories) { VCIBaseTreeNode node = new VCIBaseTreeNode(obj.getName(), obj); treeModel.insertNodeInto(node, treeNode, treeNode.getChildCount()); treeNode.setExpand(true); } ProcessDefinitionObject[] processDefinitions = new ProcessCustomClientDelegate(LogonApplication.getUserEntityObject()).getProcessDefinitions(processCategoryId); Map hideMap = getHideNodeMap(); /** * 为模板配置流程时,隐藏的流程模板不显示 * 2012-11-28 wangxl */ for (ProcessDefinitionObject processDefinitionObject : processDefinitions) { if(!hideMap.containsKey(processDefinitionObject.getJbpmDeploymentId())) { String nodeName = processDefinitionObject.toString(); VCIBaseTreeNode node = new VCIBaseTreeNode(nodeName, processDefinitionObject); treeModel.insertNodeInto(node, treeNode, treeNode.getChildCount()); treeNode.setExpand(true); } } } }catch(VCIException ex){ VCIOptionPane.showError(LogonApplication.frame, "RMIPRm", ex); } } private Map getHideNodeMap() { Map map = new LinkedHashMap(); ProcessCustomClientDelegate pccd = new ProcessCustomClientDelegate(LogonApplication.getUserEntityObject()); try { NodeHideObject[] nh = pccd.getNodeHideDeploymentId(); for(NodeHideObject node : nh) { map.put(node.getDeploymentId(), "Y"); } } catch (VCIError e) { e.printStackTrace(); } return map; } private void initLeftTree(VCIBaseTreeNode treeNode) { try{ ProcessCustomClientDelegate delSrv = new ProcessCustomClientDelegate(LogonApplication.getUserEntityObject()); ProcessCategoryObject[] processCategories = delSrv.getProcessCategories("root"); treeNode.removeAllChildren(); for(ProcessCategoryObject obj : processCategories){ VCIBaseTreeNode node = new VCIBaseTreeNode(obj.getName(), obj); treeNode.add(node); } this.leftTree.setSelectionPath(new TreePath(treeNode)); this.leftTree.updateUI(); } catch (VCIException e) { VCIOptionPane.showError(LogonApplication.frame, "RMIPRm", e); return; } } private void addListener() { okBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ok(); } }); cancelBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { close(); } }); } private ProcessDefinitionObject getSelectProcessDefinition() { ProcessDefinitionObject result = null; Object node = leftTree.getLastSelectedPathComponent(); if(node != null) { Object obj = ((VCIBaseTreeNode)node).getObj(); if(obj instanceof ProcessDefinitionObject) { result = (ProcessDefinitionObject) obj; } } return result; } private void ok() { processDefinitionObject = getSelectProcessDefinition(); if(processDefinitionObject == null){ JOptionPane.showMessageDialog(this, getI18nString("plsSelectProcessDefinition")); return; } isOk = true; close(); } private void close() { this.dispose(); this.setVisible(false); } public ProcessDefinitionObject getProcessDefinitionObject() { return processDefinitionObject; } private void centerToScreen() { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension componentSize = getSize(); if (componentSize.height > screenSize.height) { componentSize.height = screenSize.height; } if (componentSize.width > screenSize.width) { componentSize.width = screenSize.width; } this.setLocation((screenSize.width - componentSize.width) / 2, (screenSize.height - componentSize.height) / 2); } public boolean isOk() { return isOk; } private String getI18nString(String code){ return ClientHelper.getI18nStringForWorkflow(this.getClass().getName() + "." + code, this.getLocale()); } }