package net.ms.designer.editors.workflow.ui; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Date; import java.util.EventObject; import java.util.Iterator; import java.util.List; import net.ms.designer.core.MsEditorInput; import net.ms.designer.core.MsProject; import net.ms.designer.core.IOStreams; import net.ms.designer.editors.componentdetail.models.Container; import net.ms.designer.editors.workflow.Constants; import net.ms.designer.editors.workflow.actions.WorkflowPropertyAction; import net.ms.designer.editors.workflow.dnd.WorkflowTemplateTransferDropTargetListener; import net.ms.designer.editors.workflow.editparts.PartFactory; import net.ms.designer.editors.workflow.editparts.TreePartFactory; import net.ms.designer.editors.workflow.models.ParameterEntire; import net.ms.designer.editors.workflow.models.SubFlowActivity; import net.ms.designer.editors.workflow.models.WorkflowBaseActivity; import net.ms.designer.editors.workflow.models.WorkflowDiagram; import net.ms.designer.editors.workflow.tools.WorkflowContextMenuProvider; import net.ms.designer.editors.workflow.tools.WorkflowPaletteFactory; import net.ms.designer.editors.workflow.xmlparse.ReadFromApplicationXML; import net.ms.designer.editors.workflow.xmlparse.ReadSubflowFromProjectXML; import net.ms.designer.editors.workflow.xmlparse.WriteToWorkflowXML; import net.ms.designer.ui.view.MsTreeView; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.gef.ContextMenuProvider; import org.eclipse.gef.DefaultEditDomain; import org.eclipse.gef.dnd.TemplateTransferDragSourceListener; import org.eclipse.gef.editparts.ScalableFreeformRootEditPart; import org.eclipse.gef.palette.PaletteRoot; import org.eclipse.gef.ui.actions.ActionRegistry; import org.eclipse.gef.ui.parts.ContentOutlinePage; import org.eclipse.gef.ui.parts.GraphicalEditorWithPalette; import org.eclipse.gef.ui.parts.TreeViewer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.internal.UIPlugin; import org.eclipse.ui.part.IPageSite; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; public class WorkflowEditor extends GraphicalEditorWithPalette implements ISelectionChangedListener { private WorkflowDiagram diagram = null; private WorkflowDiagram sfDiagram = null; private MsProject project ; private IOStreams stream ,compStream,sfStream; private String filePath; private Container container; private List allAppList,allSubflowList; private MsEditorInput input; private PaletteRoot paletteRoot; public WorkflowDiagram getDiagram() { return this.diagram; } public WorkflowEditor() { setEditDomain(new DefaultEditDomain(this)); stream = new IOStreams(); compStream = new IOStreams(); sfStream = new IOStreams(); } protected void configureGraphicalViewer() { super.configureGraphicalViewer(); getGraphicalViewer().setRootEditPart(new ScalableFreeformRootEditPart()); getGraphicalViewer().setEditPartFactory(new PartFactory()); ContextMenuProvider provider = new WorkflowContextMenuProvider(getGraphicalViewer(), getActionRegistry()); getGraphicalViewer().setContextMenu(provider); getGraphicalViewer().addSelectionChangedListener(this); getSite().registerContextMenu(provider, getGraphicalViewer()); updateActions(getSelectionActions()); } public Object getAdapter(Class type) { if (type == IContentOutlinePage.class) return new OutlinePage(); return super.getAdapter(type); } protected PaletteRoot getPaletteRoot() { // TODO Auto-generated method stub if (this.paletteRoot == null) { this.paletteRoot = WorkflowPaletteFactory.createPalette(); } return this.paletteRoot; } public void setInput(IEditorInput input) { superSetInput(input); project = ((net.ms.designer.core.MsEditorInput)getEditorInput()).getProject(); this.allSubflowList = project.getSubflowList(); if(project.getApplicationList() == null || project.getApplicationList().size()<1) { allAppList = new ArrayList(); ReadFromApplicationXML read = new ReadFromApplicationXML(); try { allAppList = read.readFromApplicationXML(ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString()+"\\applications.xml"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } project.setApplicationList(allAppList); } if(project.getSubflowList() == null || project.getSubflowList().size()<1) { ReadSubflowFromProjectXML read2 = new ReadSubflowFromProjectXML(project); this.allSubflowList = new ArrayList(); try { allSubflowList = read2.readSubflowFromProjectXML(project.getConfigPath()+"\\project.xml"); project.setSubflowList(allSubflowList); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } container = (((net.ms.designer.core.MsEditorInput)getEditorInput())).getContainer(); this.input = (net.ms.designer.core.MsEditorInput)getEditorInput(); if(this.input.getIsSubflow() == false) { this.diagram = new WorkflowDiagram(); this.diagram.setIsSubflow(this.input.getIsSubflow()); } else { this.sfDiagram = new WorkflowDiagram(); this.sfDiagram.setIsSubflow(this.input.getIsSubflow()); } // this.diagram.setProject(project); // this.diagram.setContainer(container); // this.diagram.setWfName(project.getWorkflowName()); // this.diagram.setWfDesc(""); // this.diagram.setWorkflowId(project.getWorkflowId()); // this.diagram.setStatus(Constants.DRAFT); } protected void superSetInput(IEditorInput input) { super.setInput(input); } protected void initializeGraphicalViewer() { try { input.setName(project.getWorkflowName()); // this.setPartName(input.getName()); // get configure directory path String path = project.getConfigPath(); StringBuffer sb = new StringBuffer(path); sb.append(project.getWorkflowName()); sb.append(".wf"); filePath = sb.toString(); File file = new File(filePath); StringBuffer comp = new StringBuffer(path); comp.append(project.getComponentName()); comp.append(".cde"); String compPath = comp.toString(); File compFile = new File(compPath); if(file.exists() && compFile.exists()) //���ڹ������������е� { diagram = (WorkflowDiagram)stream.inputs(filePath); container = (Container)compStream.inputs(compPath); if(this.input.getIsSubflow() == false) //�򿪵������� { this.project = diagram.getProject(); if(this.project.getApplicationList() == null || this.project.getApplicationList().size()<1) { this.project.setApplicationList(this.allAppList); diagram.setProject(this.project); } if(this.project.getSubflowList() == null || this.project.getSubflowList().size()<1) { this.project.setSubflowList(this.allSubflowList); diagram.setProject(this.project); } if(diagram != null) { getGraphicalViewer().setContents(this.diagram); } } else //�򿪵������� { StringBuffer subflowBuffer = new StringBuffer(path); subflowBuffer.append(this.project.getSubflowId()); subflowBuffer.append(".sf"); File subflowFile = new File(subflowBuffer.toString()); if(subflowFile.exists()) //���������� { sfDiagram = (WorkflowDiagram)sfStream.inputs(subflowBuffer.toString()); this.project = sfDiagram.getProject(); if(sfDiagram != null) { getGraphicalViewer().setContents(this.sfDiagram); } } else //�½����� { } // diagram = new WorkflowDiagram(); // // List paraList = new ArrayList(); // ParameterEntire bean = new ParameterEntire(); // bean.setParaName("bean"); // bean.setParaType(Constants.WF_PARA_TYPE_BUSINESS_BEAN); // ParameterEntire entityid = new ParameterEntire(); // entityid.setParaName("entityid"); // entityid.setParaType(Constants.WF_PARA_TYPE_INT); // ParameterEntire infor = new ParameterEntire(); // infor.setParaName("infor"); // infor.setParaType(Constants.WF_PARA_TYPE_STRING); // paraList.add(bean); // paraList.add(entityid); // paraList.add(infor); // diagram.setParaList(paraList); // // diagram.setProject(this.project); // diagram.setWfId(this.project.getWorkflowId()); // diagram.setIsSubflow(false); // // getGraphicalViewer().setContents(this.diagram); } } else //�����µĹ����� { diagram = new WorkflowDiagram(); // List paraList = new ArrayList(); // ParameterEntire bean = new ParameterEntire(); // bean.setParaName("bean"); // bean.setParaType(Constants.WF_PARA_TYPE_BUSINESS_BEAN); // ParameterEntire entityid = new ParameterEntire(); // entityid.setParaName("entityid"); // entityid.setParaType(Constants.WF_PARA_TYPE_INT); // ParameterEntire infor = new ParameterEntire(); // infor.setParaName("infor"); // infor.setParaType(Constants.WF_PARA_TYPE_STRING); // paraList.add(bean); // paraList.add(entityid); // paraList.add(infor); // diagram.setParaList(paraList); diagram.setProject(this.project); diagram.setWfId(this.project.getWorkflowId()); diagram.setIsSubflow(false); getGraphicalViewer().setContents(this.diagram); } // String subflowName = null; // SubFlowActivity subflow = null; // // this.setPartName(input.getName()); // String path = project.getConfigPath(); // // StringBuffer comp = new StringBuffer(path); // comp.append(project.getComponentName()); // comp.append(".cde"); // StringBuffer wf = new StringBuffer(path); // wf.append(project.getWorkflowName()); // wf.append(".wf"); // File wfFile = new File(wf.toString()); // String compPath = comp.toString(); // File compFile = new File(compPath); // if(compFile.exists() && wfFile.exists()) // { // StringBuffer sb = new StringBuffer(path); // sb.append(project.getSubflowId()); // sb.append(".sf"); // filePath = sb.toString(); // File file = new File(filePath); // // if(file.exists()) // { // // sfDiagram = (WorkflowDiagram)sfStream.inputs(filePath); //// this.project.setSubflowList(this.allSubflowList); //// sfDiagram.setProject(this.project); // // diagram = (WorkflowDiagram)stream.inputs(filePath); // container = (Container)compStream.inputs(compPath); // // this.project.setSubflowId(diagram.getProject().getSubflowId()); // this.project.setSubflowList(diagram.getProject().getSubflowList()); // this.project.setSubflowName(diagram.getProject().getSubflowName()); // sfDiagram.setProject(this.project); // // if(project.getSubflowList() != null && project.getSubflowList().size()>0) // { // for(int j = 0; j<project.getSubflowList().size();j++) // { // if(((SubFlowActivity)project.getSubflowList().get(j)).getSubflowId().equals(project.getSubflowId())) // { // subflow = ((SubFlowActivity)project.getSubflowList().get(j)); // } // } // } // input.setName(project.getSubflowName()); // // if(sfDiagram != null) // { // getGraphicalViewer().setContents(this.sfDiagram); // } // } // else // { // sfDiagram = new WorkflowDiagram(); // // List paraList = new ArrayList(); // ParameterEntire bean = new ParameterEntire(); // bean.setParaName("bean"); // bean.setParaType(Constants.WF_PARA_TYPE_BUSINESS_BEAN); // ParameterEntire entityid = new ParameterEntire(); // entityid.setParaName("entityid"); // entityid.setParaType(Constants.WF_PARA_TYPE_INT); // ParameterEntire infor = new ParameterEntire(); // infor.setParaName("infor"); // infor.setParaType(Constants.WF_PARA_TYPE_STRING); // paraList.add(bean); // paraList.add(entityid); // paraList.add(infor); // sfDiagram.setParaList(paraList); // // sfDiagram.setProject(this.project); // sfDiagram.setWfDesc(""+subflow.getActivity_desc()); // sfDiagram.setWfName(subflow.getName()); // sfDiagram.setIsSubflow(true); // sfDiagram.setWfId(this.project.getSubflowId()); // // // subflow.setSubflowDiagram(sfDiagram); // // getGraphicalViewer().setContents(this.sfDiagram); // } // } // } } catch(Exception e) { e.printStackTrace(); } getGraphicalViewer().addDropTargetListener(new WorkflowTemplateTransferDropTargetListener(getGraphicalViewer())); } public void doSave(IProgressMonitor monitor) { // TODO Auto-generated method stub List children; if(this.input.getIsSubflow() == false) { children = diagram.getChildren(); } else { children = sfDiagram.getChildren(); } for(int i = 0; i<children.size(); i++) { WorkflowBaseActivity node = (WorkflowBaseActivity)children.get(i); for(int j = i+1; j<children.size(); j++) { if(((WorkflowBaseActivity)children.get(j)).getName().equals(node.getName())) { MessageDialog.openConfirm(UIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(),"���������","�����������"); return; } } } try { if(this.input.getIsSubflow() == false) { String path0 = project.getConfigPath(); StringBuffer sb0 = new StringBuffer(path0); // sb.append(project.getProjectName()); // sb.append("\\configure"); sb0.append(project.getWorkflowName()); sb0.append(".wf"); filePath = sb0.toString(); stream.outputs(diagram,filePath); // project = diagram.getProject(); WriteToWorkflowXML writer = new WriteToWorkflowXML(project, diagram); // get directory of the xml file to save String path = project.getConfigPath(); //get the xml file name StringBuffer sb = new StringBuffer(path); //get full file path sb.append("project.xml"); writer.writeProjectXMLFile(sb.toString()); StringBuffer sb1 = new StringBuffer(path); sb1.append(project.getProjectName()+"."+project.getPackageName()+"."+project.getComponentName()+"."+project.getWorkflowId()); sb1.append(".xml"); writer.writeWorkflowXMLFile(sb1.toString()); } else { Iterator itSub = project.getSubflowList().iterator(); List partSubflowList = new ArrayList(); while(itSub.hasNext()) { SubFlowActivity sub = (SubFlowActivity)itSub.next(); if(!sub.getSubflowId().equals(project.getSubflowId())) { partSubflowList.add(sub); } } if(partSubflowList != null && partSubflowList.size()>0) { for(int i = 0; i<partSubflowList.size(); i++) { if(((SubFlowActivity)partSubflowList.get(i)).getName().equals(project.getSubflowName())) { MessageDialog.openConfirm(UIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(), "���������ظ�", "���������ظ�"); return; } } } String path0 = project.getConfigPath(); StringBuffer sb0 = new StringBuffer(path0); // sb.append(project.getProjectName()); // sb.append("\\configure"); sb0.append(project.getSubflowId()); sb0.append(".sf"); filePath = sb0.toString(); stream.outputs(sfDiagram,filePath); // project = diagram.getProject(); WriteToWorkflowXML writer = new WriteToWorkflowXML(project, sfDiagram); // get directory of the xml file to save String path = project.getConfigPath(); //get the xml file name StringBuffer sb = new StringBuffer(path); //get full file path sb.append("project.xml"); writer.writeProjectXMLFile(sb.toString()); StringBuffer sb1 = new StringBuffer(path); sb1.append(project.getProjectName()+"."+project.getPackageName()+"."+project.getComponentName()+"."+project.getSubflowId()); sb1.append(".xml"); writer.writeWorkflowXMLFile(sb1.toString()); } } catch(Exception e) { e.printStackTrace(); } ((MsTreeView)UIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow() .getActivePage().findView("net.ms.designer.ui.view.MsTreeView")).refresh(); getCommandStack().markSaveLocation(); } public void commandStackChanged(EventObject event) { if (isDirty()) { firePropertyChange(IEditorPart.PROP_DIRTY); } else { firePropertyChange(IEditorPart.PROP_DIRTY); } super.commandStackChanged(event); } public void doSaveAs() { } public boolean isDirty() { return getCommandStack().isDirty(); } public boolean isSaveAsAllowed() { return true; } protected void initializePaletteViewer() { super.initializePaletteViewer(); getPaletteViewer().addDragSourceListener(new TemplateTransferDragSourceListener(getPaletteViewer())); } protected void closeEditor(boolean save) { getSite().getPage().closeEditor(WorkflowEditor.this, save); } public void createActions() { super.createActions(); ActionRegistry registry = getActionRegistry(); IAction action; action = new WorkflowPropertyAction(this); registry.registerAction(action); getSelectionActions().add(action.getId()); } class OutlinePage extends ContentOutlinePage { // private PageBook pageBook; private Control outline; public OutlinePage() { super(new TreeViewer()); } public void init(IPageSite pageSite) { super.init(pageSite); ActionRegistry registry = getActionRegistry(); IActionBars bars = pageSite.getActionBars(); String id = IWorkbenchActionConstants.UNDO; bars.setGlobalActionHandler(id, registry.getAction(id)); id = IWorkbenchActionConstants.REDO; bars.setGlobalActionHandler(id, registry.getAction(id)); id = IWorkbenchActionConstants.DELETE; bars.setGlobalActionHandler(id, registry.getAction(id)); bars.updateActionBars(); } public void createControl(Composite parent) { // pageBook = new PageBook(parent, SWT.NONE); // outline = getViewer().createControl(pageBook); // pageBook.showPage(outline); outline = getViewer().createControl(parent); getSelectionSynchronizer().addViewer(getViewer()); getViewer().setEditDomain(getEditDomain()); getViewer().setEditPartFactory(new TreePartFactory()); // getViewer().setKeyHandler(getCommonKeyHandler()); getViewer().setContents(getDiagram()); // //System.out.println("diagramOutline:"+getDiagram().getChildren().size()); } public Control getControl() { // return pageBook; return outline; } public void dispose() { getSelectionSynchronizer().removeViewer(getViewer()); super.dispose(); } } public void selectionChanged(SelectionChangedEvent event) { // TODO Auto-generated method stub updateActions(getSelectionActions()); } public MsProject getProject() { return this.project; } public void setProject(MsProject project) { this.project = project; } public void setContainer(Container container) { this.container = container; } public Container getContainer() { return this.container; } }