/******************************************************************************* * Copyright (c) 2008 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.smooks.graphical.editors; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collection; import java.util.EventObject; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.draw2d.IFigure; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CommandWrapper; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.emf.edit.command.DeleteCommand; import org.eclipse.emf.edit.command.RemoveCommand; import org.eclipse.emf.edit.command.SetCommand; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IEditorActionBarContributor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.PartInitException; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.IMessage; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.ScrolledPageBook; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.part.MultiPageEditorActionBarContributor; import org.eclipse.zest.core.viewers.GraphViewer; import org.eclipse.zest.core.widgets.CGraphNode; import org.eclipse.zest.core.widgets.Graph; import org.eclipse.zest.core.widgets.GraphItem; import org.eclipse.zest.core.widgets.ZestStyles; import org.eclipse.zest.layouts.LayoutStyles; import org.eclipse.zest.layouts.algorithms.HorizontalTreeLayoutAlgorithm; import org.jboss.tools.smooks.SmooksModelUtils; import org.jboss.tools.smooks.configuration.editors.GraphicsConstants; import org.jboss.tools.smooks.configuration.editors.IFieldMarker; import org.jboss.tools.smooks.configuration.editors.SelectorCreationDialog; import org.jboss.tools.smooks.configuration.editors.SmooksReaderFormPage; import org.jboss.tools.smooks.configuration.editors.input.InputType; import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils; import org.jboss.tools.smooks.configuration.validate.ISmooksModelValidateListener; import org.jboss.tools.smooks.editor.AbstractSmooksFormEditor; import org.jboss.tools.smooks.editor.ISmooksModelProvider; import org.jboss.tools.smooks.editor.ISourceSynchronizeListener; import org.jboss.tools.smooks.gef.common.SmooksGraphicalMenuContextProvider; import org.jboss.tools.smooks.graphical.actions.AbstractProcessGraphAction; import org.jboss.tools.smooks.graphical.actions.AddNextTaskNodeAction; import org.jboss.tools.smooks.graphical.actions.DeleteTaskNodeAction; import org.jboss.tools.smooks.graphical.actions.ISmooksActionProvider; import org.jboss.tools.smooks.graphical.editors.TaskTypeManager.TaskTypeDescriptor; import org.jboss.tools.smooks.graphical.editors.process.IProcessProvider; import org.jboss.tools.smooks.graphical.editors.process.ProcessFactory; import org.jboss.tools.smooks.graphical.editors.process.ProcessGraphicalViewerLabelProvider; import org.jboss.tools.smooks.graphical.editors.process.ProcessTaskAnalyzer; import org.jboss.tools.smooks.graphical.editors.process.ProcessType; import org.jboss.tools.smooks.graphical.editors.process.TaskNodeFigure; import org.jboss.tools.smooks.graphical.editors.process.TaskType; import org.jboss.tools.smooks.graphical.editors.template.SmooksFreemarkerCSVTemplateGraphicalEditor; import org.jboss.tools.smooks.graphical.editors.template.SmooksFreemarkerTemplateGraphicalEditor; import org.jboss.tools.smooks.model.ModelFilter; import org.jboss.tools.smooks.model.freemarker.Freemarker; import org.jboss.tools.smooks.model.javabean12.BeanType; import org.jboss.tools.smooks.model.smooks.AbstractResourceConfig; import org.jboss.tools.smooks.model.smooks.DocumentRoot; import org.jboss.tools.smooks.model.smooks.SmooksResourceListType; /** * @author Dart * */ public class SmooksProcessGraphicalEditor extends FormPage implements ISelectionChangedListener, ISourceSynchronizeListener, IPropertyListener, ISmooksModelValidateListener, IProcessProvider, PropertyChangeListener, ISmooksEditorInitListener, ISmooksActionProvider { private boolean processMapActived = false; private int currentMessageType = IMessageProvider.NONE; private String currentMessage = null; private boolean processChanged = false; private boolean lockProcessChangeEvent = false; private List<IAction> processPanelActions = new ArrayList<IAction>(); public static final int EXECUTE_COMMAND = 0; public static final int REDO_COMMAND = 1; public static final int UNDO_COMMAND = 2; private Object emptyKey = new Object(); private ISmooksModelProvider smooksModelProvider = null; private GraphViewer processGraphViewer; private ScrolledPageBook pageBook; private Map<String, Object> registedTaskPages = new HashMap<String, Object>(); private MenuManager manager; protected boolean needupdatewhenshow = true; private ProcessType process; private TaskType currentlySelectedTask = null; private Map<Object, String> smooksModelIdMap = new HashMap<Object, String>(); public SmooksProcessGraphicalEditor(FormEditor editor, String id, String title, ISmooksModelProvider provider) { super(editor, id, title); this.smooksModelProvider = provider; } public SmooksProcessGraphicalEditor(String id, String title, ISmooksModelProvider provider) { super(id, title); this.smooksModelProvider = provider; this.getManagedForm(); } /** * @return the process */ public ProcessType getProcess() { return process; } protected void createProcessGraphicalPanel(Composite parent) { processGraphViewer = new GraphViewer(parent, SWT.NONE); processGraphViewer.getControl().dispose(); processGraphViewer.setControl(new Graph(parent, SWT.NONE) { /* * (non-Javadoc) * * @see org.eclipse.zest.core.widgets.Graph#dispose() */ @Override public void dispose() { try { super.dispose(); } catch (Throwable e) { e.printStackTrace(); } } }); // GridData gd = new GridData(GridData.FILL_BOTH); // processGraphViewer.getControl().setLayoutData(gd); // processGraphViewer.setNodeStyle(ZestStyles.NODES_FISHEYE); processGraphViewer.setContentProvider(new ProcessGraphContentProvider()); processGraphViewer.setLabelProvider(new ProcessGraphicalViewerLabelProvider(this)); processGraphViewer.setConnectionStyle(ZestStyles.CONNECTIONS_DIRECTED); HorizontalTreeLayoutAlgorithm layoutAlgorithm = new HorizontalTreeLayoutAlgorithm( LayoutStyles.NO_LAYOUT_NODE_RESIZING); processGraphViewer.setLayoutAlgorithm(layoutAlgorithm, true); if (parent instanceof Section) { ((Section) parent).setClient(processGraphViewer.getControl()); } } protected void initProcessGraphicalViewer() { // SmooksGraphicsExtType ext = // this.smooksModelProvider.getSmooksGraphicsExt(); // if (ext == null) // return; // ProcessesType processes = ext.getProcesses(); boolean disableProcessViewer = false; // if (processes != null) { // ProcessType process = processes.getProcess(); // if (process != null) { // getProcessGraphViewer().getControl().setBackground( // getManagedForm().getToolkit().getColors().getBackground()); // getProcessGraphViewer().getControl().setEnabled(true); // getProcessGraphViewer().setInput(process); // } else { // disableProcessViewer = true; // } // } else { // disableProcessViewer = true; // } if (process == null) { process = ProcessFactory.eINSTANCE.createProcessType(); process.addPropertyChangeListener(this); } ProcessTaskAnalyzer analyzer = new ProcessTaskAnalyzer(); lockProcessChangeEvent = true; analyzer.analyzeTaskNode(process, getSmooksResourceListType()); lockProcessChangeEvent = false; if (getProcessGraphViewer() != null) { getProcessGraphViewer().setInput(process); } if (disableProcessViewer) { getProcessGraphViewer().getControl().setBackground( getManagedForm().getToolkit().getColors().getBorderColor()); getProcessGraphViewer().setInput(null); getProcessGraphViewer().getControl().setEnabled(false); } } protected void hookProcessGraphicalViewer() { getProcessGraphViewer().addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) event.getSelection(); Object firstElement = selection.getFirstElement(); if (firstElement == null) { unhighlightGraphNodes(); } Graph graph = getProcessGraphViewer().getGraphControl(); List<?> nodes = graph.getNodes(); GraphItem item = null; for (Iterator<?> iterator = nodes.iterator(); iterator.hasNext();) { GraphItem graphItem = (GraphItem) iterator.next(); if (graphItem.getData() == firstElement) { item = graphItem; break; } } if (item != null) { unhighlightGraphNodes(); highlightGraphNode(item); } showTaskControl(firstElement); SmooksProcessGraphicalEditor.this.selectionChanged(event); updateGlobalActions(); } }); // when focus change , update the actions in the Eclipse menu via // EditorContributor getProcessGraphViewer().getControl().addFocusListener(new FocusListener() { public void focusLost(FocusEvent e) { processMapActived = false; updateGlobalActions(); } public void focusGained(FocusEvent e) { processMapActived = true; updateGlobalActions(); } }); } private void updateGlobalActions() { IEditorActionBarContributor contributor = getEditorSite().getActionBarContributor(); if (contributor != null && contributor instanceof MultiPageEditorActionBarContributor) { // clean all actions ((MultiPageEditorActionBarContributor) contributor).setActivePage(null); // re-active the page and add all actions ((MultiPageEditorActionBarContributor) contributor).setActivePage(SmooksProcessGraphicalEditor.this); } } protected void unhighlightGraphNodes() { Graph graph = this.getProcessGraphViewer().getGraphControl(); List<?> elements = graph.getNodes(); for (Iterator<?> iterator = elements.iterator(); iterator.hasNext();) { GraphItem graphItem = (GraphItem) iterator.next(); unhighlightGraphNode(graphItem); } } protected void unhighlightGraphNode(GraphItem item) { if (item instanceof CGraphNode) { IFigure figure = ((CGraphNode) item).getFigure(); if (figure instanceof TaskNodeFigure) { ((TaskNodeFigure) figure).unhighlightLabel(); } } } protected void highlightGraphNode(GraphItem item) { if (item instanceof CGraphNode) { IFigure figure = ((CGraphNode) item).getFigure(); if (figure instanceof TaskNodeFigure) { ((TaskNodeFigure) figure).highlightLabel(org.eclipse.draw2d.ColorConstants.darkBlue); } } } protected void configProcessGraphicalViewer() { manager = new MenuManager(); initProcessGraphicalPanelActions(manager); Menu menu = manager.createContextMenu(getProcessGraphViewer().getControl()); getProcessGraphViewer().getControl().setMenu(menu); manager.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { try { manager.removeAll(); if (needupdatewhenshow) { updateProcessActions(processGraphViewer.getSelection()); fillProcessMenu(manager); } else { for (IAction action : processPanelActions) { if (action.isEnabled() && !(action instanceof DeleteTaskNodeAction)) { manager.add(action); } } } needupdatewhenshow = true; } catch (Exception e) { e.printStackTrace(); } needupdatewhenshow = true; } }); } public void fillProcessMenu(IMenuManager manager) { MenuManager addNextTaskMenuManager = new MenuManager(Messages.SmooksProcessGraphicalEditor_AddTaskActionText); manager.add(addNextTaskMenuManager); for (Iterator<?> iterator = processPanelActions.iterator(); iterator.hasNext();) { IAction action = (IAction) iterator.next(); if (action instanceof DeleteTaskNodeAction) { manager.add(action); } else { addNextTaskMenuManager.add(action); } } // MenuManager addPreTaskMenuManager = new // MenuManager("Add Previous Task"); // manager.add(addPreTaskMenuManager); // // fillPreTaskMenu(addPreTaskMenuManager); } /** * @return the needupdatewhenshow */ public boolean isNeedupdatewhenshow() { return needupdatewhenshow; } /** * @param needupdatewhenshow * the needupdatewhenshow to set */ public void setNeedupdatewhenshow(boolean needupdatewhenshow) { this.needupdatewhenshow = needupdatewhenshow; } public void updateProcessActions(ISelection selection) { for (Iterator<?> iterator = processPanelActions.iterator(); iterator.hasNext();) { IAction a = (IAction) iterator.next(); if (a instanceof AbstractProcessGraphAction) { ((AbstractProcessGraphAction) a).selectionChanged(new SelectionChangedEvent(processGraphViewer, selection)); } } manager.update(); } protected void initProcessGraphicalPanelActions(IMenuManager manager) { // AddTaskNodeAction addInputTaskAction = new // AddInputTaskAction(smooksModelProvider); // manager.add(addInputTaskAction); // processPanelActions.add(addInputTaskAction); MenuManager addNextTaskMenuManager = new MenuManager(Messages.SmooksProcessGraphicalEditor_AddTaskActionText); manager.add(addNextTaskMenuManager); generateNextTaskActions(addNextTaskMenuManager); // MenuManager addPreTaskMenuManager = new // MenuManager("Add Previous Task"); // manager.add(addPreTaskMenuManager); // // fillPreTaskMenu(addPreTaskMenuManager); DeleteTaskNodeAction deleteAction = new DeleteTaskNodeAction(this, smooksModelProvider, this); manager.add(deleteAction); this.processPanelActions.add(deleteAction); } private void generateNextTaskActions(MenuManager addNextTaskMenuManager) { List<TaskTypeDescriptor> list = TaskTypeManager.getAllTaskList(); for (Iterator<?> iterator = list.iterator(); iterator.hasNext();) { TaskTypeDescriptor taskTypeDescriptor = (TaskTypeDescriptor) iterator.next(); if(TaskTypeManager.TASK_ID_FREEMARKER_CSV_TEMPLATE.equals(taskTypeDescriptor.getId())) { // Bit of a hack to stop adding of the "Apply Template" action multiple times. // Will have been added for XML, so ignore the CSV... Both actions will trigger // the same wizard anyway.... continue; } AddNextTaskNodeAction addNextInputAction = new AddNextTaskNodeAction(taskTypeDescriptor.getId(), taskTypeDescriptor.getLabel(), smooksModelProvider, this); this.processPanelActions.add(addNextInputAction); addNextTaskMenuManager.add(addNextInputAction); } } // private void fillPreTaskMenu(MenuManager addPreTaskMenuManager) { // List<TaskTypeDescriptor> list = TaskTypeManager.getAllTaskList(); // for (Iterator<?> iterator = list.iterator(); iterator.hasNext();) { // TaskTypeDescriptor taskTypeDescriptor = (TaskTypeDescriptor) // iterator.next(); // AddPreviousTaskNodeAction addNextInputAction = new // AddPreviousTaskNodeAction(taskTypeDescriptor.getId(), // taskTypeDescriptor.getLabel(), smooksModelProvider); // this.processPanelActions.add(addNextInputAction); // addPreTaskMenuManager.add(addNextInputAction); // } // } public void registeTaskDetailsPage(IEditorPart editor, String taskID) { editor.addPropertyListener(this); this.registedTaskPages.put(taskID, editor); } public void removeTaskDetailsPage(IEditorPart editor, String taskID) { editor.removePropertyListener(this); this.registedTaskPages.remove(taskID); } /* * (non-Javadoc) * * @see * org.eclipse.ui.forms.editor.FormPage#createPartControl(org.eclipse.swt * .widgets.Composite) */ @Override public void createPartControl(Composite parent) { super.createPartControl(parent); updateHeaderFormMessage(); } public GraphViewer getProcessGraphViewer() { return processGraphViewer; } protected void createProcessGraphicalSection(FormToolkit toolkit, Composite parent) { Section processGraphSection = toolkit.createSection(parent, Section.TITLE_BAR); processGraphSection.setText(Messages.SmooksProcessGraphicalEditor_TasksMapSectionTitle); Composite processGraphComposite = toolkit.createComposite(processGraphSection); GridLayout processGraphGridLayoutLayout = new GridLayout(); // processGraphFillLayout.marginWidth = 1; // processGraphFillLayout.marginHeight = 1; processGraphComposite.setLayout(processGraphGridLayoutLayout); processGraphSection.setClient(processGraphComposite); GridData gd = new GridData(GridData.FILL_HORIZONTAL); // Composite toolBarComposite = // toolkit.createComposite(processGraphComposite); // FillLayout l = new FillLayout(); // l.marginHeight = 1; // l.marginWidth = 1; // toolBarComposite.setLayout(l); // toolBarComposite.setLayoutData(gd); // // toolBarComposite.setBackground(toolkit.getColors().getBorderColor()); // // createProcessToolBar(toolBarComposite, toolkit); Composite graphMainComposite = toolkit.createComposite(processGraphComposite); FillLayout l1 = new FillLayout(); l1.marginHeight = 1; l1.marginWidth = 1; graphMainComposite.setLayout(l1); gd = new GridData(GridData.FILL_BOTH); graphMainComposite.setLayoutData(gd); graphMainComposite.setBackground(toolkit.getColors().getBorderColor()); createProcessGraphicalPanel(graphMainComposite); hookProcessGraphicalViewer(); configProcessGraphicalViewer(); initProcessGraphicalViewer(); } protected void createTaskDetailsSection(FormToolkit toolkit, Composite parent) { Composite taskDetailsComposite = toolkit.createComposite(parent); FillLayout taskDetailsFillLayout = new FillLayout(); taskDetailsFillLayout.marginWidth = 0; taskDetailsFillLayout.marginHeight = 5; taskDetailsComposite.setLayout(taskDetailsFillLayout); Section section = toolkit.createSection(taskDetailsComposite, Section.TITLE_BAR); section.setText(Messages.SmooksProcessGraphicalEditor_TaskConfigurationSectionTitle); pageBook = new ScrolledPageBook(section); pageBook.setBackground(toolkit.getColors().getBackground()); section.setClient(pageBook); Composite emptyComposite = pageBook.createPage(emptyKey); emptyComposite.setLayout(new FillLayout()); createEmptyTaskPanel(emptyComposite, toolkit); pageBook.showPage(emptyKey); } /* * (non-Javadoc) * * @see * org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui * .forms.IManagedForm) */ @Override protected void createFormContent(IManagedForm managedForm) { super.createFormContent(managedForm); final ScrolledForm form = managedForm.getForm(); FormToolkit toolkit = managedForm.getToolkit(); toolkit.decorateFormHeading(form.getForm()); form.getBody().setLayout(new FillLayout()); form.setText(Messages.SmooksProcessGraphicalEditor_FormText); Composite mainComposite = toolkit.createComposite(form.getBody()); GridLayout mgl = new GridLayout(); mgl.marginHeight = 13; mgl.horizontalSpacing = 20; mainComposite.setLayout(mgl); SashForm sashForm = new SashForm(mainComposite, SWT.VERTICAL); sashForm.SASH_WIDTH = 1; GridData gd = new GridData(GridData.FILL_BOTH); sashForm.setLayoutData(gd); createProcessGraphicalSection(toolkit, sashForm); createTaskDetailsSection(toolkit, sashForm); sashForm.setWeights(new int[] { 2, 8 }); validateEnd(null); } private void handleCommandStack(org.eclipse.emf.common.command.CommandStack commandStack) { commandStack.addCommandStackListener(new org.eclipse.emf.common.command.CommandStackListener() { public void commandStackChanged(EventObject event) { final Command mostRecentCommand = ((org.eclipse.emf.common.command.CommandStack) event.getSource()) .getMostRecentCommand(); getEditorSite().getShell().getDisplay().asyncExec(new Runnable() { public void run() { if (mostRecentCommand != null) { Command rawCommand = mostRecentCommand; while (rawCommand instanceof CommandWrapper) { rawCommand = ((CommandWrapper) rawCommand).getCommand(); } Collection<?> activeModel = rawCommand.getAffectedObjects(); for (Iterator<?> iterator = activeModel.iterator(); iterator.hasNext();) { Object object = (Object) iterator.next(); if (object instanceof TaskType || object instanceof ProcessType) { validateEnd(null); if (getProcessGraphViewer() != null) { getProcessGraphViewer().refresh(); getProcessGraphViewer().applyLayout(); break; } } } if (rawCommand instanceof CompoundCommand) { List<Command> command = ((CompoundCommand) rawCommand).getCommandList(); for (Iterator<?> iterator = command.iterator(); iterator.hasNext();) { Command command2 = (Command) iterator.next(); while (command2 instanceof CommandWrapper) { command2 = ((CommandWrapper) command2).getCommand(); } if (command2 instanceof DeleteCommand || command2 instanceof RemoveCommand) { Collection<?> objs = ((Command) command2).getAffectedObjects(); for (Iterator<?> iterator2 = objs.iterator(); iterator2.hasNext();) { Object object = (Object) iterator2.next(); object = AdapterFactoryEditingDomain.unwrap(object); if (object instanceof TaskType || object instanceof ProcessType) { validateEnd(null); showTaskControl(null); break; } } } if (command2 instanceof AddCommand || command2 instanceof SetCommand) { Collection<?> objs = ((Command) command2).getAffectedObjects(); for (Iterator<?> iterator2 = objs.iterator(); iterator2.hasNext();) { Object object = (Object) iterator2.next(); object = AdapterFactoryEditingDomain.unwrap(object); if (object instanceof TaskType) { validateEnd(null); showTaskControl((TaskType) object); break; } } } } } else { if (rawCommand instanceof DeleteCommand || rawCommand instanceof RemoveCommand) { activeModel = rawCommand.getAffectedObjects(); for (Iterator<?> iterator = activeModel.iterator(); iterator.hasNext();) { Object object = (Object) iterator.next(); object = AdapterFactoryEditingDomain.unwrap(object); if (object instanceof TaskType || object instanceof ProcessType) { if (getProcessGraphViewer() != null) { validateEnd(null); showTaskControl(null); break; } } } } if (rawCommand instanceof AddCommand || rawCommand instanceof SetCommand) { Collection<?> objs = ((Command) rawCommand).getAffectedObjects(); for (Iterator<?> iterator2 = objs.iterator(); iterator2.hasNext();) { Object object = (Object) iterator2.next(); object = AdapterFactoryEditingDomain.unwrap(object); if (object instanceof TaskType) { validateEnd(null); showTaskControl((TaskType) object); break; } } } } } } }); } }); } // public SmooksGraphicsExtType getSmooksGraphicsExtType() { // if (smooksModelProvider != null) { // return smooksModelProvider.getSmooksGraphicsExt(); // } // return null; // } /** * @return the smooksModelProvider */ public ISmooksModelProvider getSmooksModelProvider() { return smooksModelProvider; } /** * @param smooksModelProvider * the smooksModelProvider to set */ public void setSmooksModelProvider(ISmooksModelProvider smooksModelProvider) { this.smooksModelProvider = smooksModelProvider; } public SmooksResourceListType getSmooksResourceList() { if (smooksModelProvider != null) { EObject m = null; EObject smooksModel = smooksModelProvider.getSmooksModel(); if (smooksModel instanceof DocumentRoot) { m = ((DocumentRoot) smooksModel).getSmooksResourceList(); } return (SmooksResourceListType) m; } return null; } public EditingDomain getEditingDomain() { if (smooksModelProvider != null) { return smooksModelProvider.getEditingDomain(); } return null; } @Override public void init(IEditorSite site, IEditorInput input) { super.init(site, input); if (smooksModelProvider != null) { this.handleCommandStack(smooksModelProvider.getEditingDomain().getCommandStack()); } List<TaskTypeDescriptor> tasks = TaskTypeManager.getAllTaskList(); for (Iterator<?> iterator = tasks.iterator(); iterator.hasNext();) { TaskTypeDescriptor taskTypeDescriptor = (TaskTypeDescriptor) iterator.next(); IEditorPart part = createEditorPart(taskTypeDescriptor.getId()); if (part != null && isSingltonEditor(taskTypeDescriptor.getId())) { this.registeTaskDetailsPage(part, taskTypeDescriptor.getId()); } } } protected SmooksResourceListType getSmooksResourceListType() { if (smooksModelProvider != null) { return SmooksUIUtils.getSmooks11ResourceListType(smooksModelProvider.getSmooksModel()); } return null; } protected IEditorPart createEditorPart(String taskID) { if (taskID.equals(TaskTypeManager.TASK_ID_FREEMARKER_CSV_TEMPLATE)) { return new SmooksFreemarkerCSVTemplateGraphicalEditor(smooksModelProvider); } if (taskID.equals(TaskTypeManager.TASK_ID_FREEMARKER_XML_TEMPLATE)) { return new SmooksFreemarkerTemplateGraphicalEditor(smooksModelProvider); } if (taskID.equals(TaskTypeManager.TASK_ID_JAVA_MAPPING)) { return new SmooksJavaMappingGraphicalEditor(smooksModelProvider); } if (taskID.equals(TaskTypeManager.TASK_ID_INPUT)) { return new SmooksReaderFormPage(getEditor(), "input", "input"); //$NON-NLS-1$ //$NON-NLS-2$ } return null; } protected IEditorPart createEditorPart(TaskType taskType) { return createEditorPart(taskType.getId()); } protected boolean isSingltonEditor(Object taskID) { if (taskID.equals(TaskTypeManager.TASK_ID_FREEMARKER_XML_TEMPLATE) || taskID.equals(TaskTypeManager.TASK_ID_FREEMARKER_CSV_TEMPLATE)) { return false; } return true; } @Override public Object getAdapter(Class type) { if (type == ISmooksModelProvider.class) { return this.smooksModelProvider; } if (type == IProcessProvider.class) { return this; } return super.getAdapter(type); } /* * (non-Javadoc) * * @see org.eclipse.ui.forms.editor.FormPage#isDirty() */ @Override public boolean isDirty() { boolean dirty = false; Collection<Object> editors = registedTaskPages.values(); for (Iterator<?> iterator = editors.iterator(); iterator.hasNext();) { Object object = (Object) iterator.next(); if (object instanceof IEditorPart) { dirty = (((IEditorPart) object).isDirty() || dirty); } } return (dirty || processChanged); } /* * (non-Javadoc) * * @seeorg.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime. * IProgressMonitor) */ @Override public void doSave(IProgressMonitor monitor) { Collection<Object> editors = registedTaskPages.values(); for (Iterator<?> iterator = editors.iterator(); iterator.hasNext();) { Object object = (Object) iterator.next(); if (object instanceof IEditorPart) { ((IEditorPart) object).doSave(monitor); } } processChanged = false; firePropertyChange(PROP_DIRTY); } public void selectionChanged(SelectionChangedEvent event) { ISelectionProvider provider = getEditor().getSite().getSelectionProvider(); if (provider != null) { provider.setSelection(event.getSelection()); } } protected Control createTaskPanel(Composite parent, FormToolkit toolkit, String taskID) { // if (taskID == null) // return null; // // if (taskID.equals(TaskTypeManager.TASK_ID_JAVA_MAPPING)) { // return null; // } // // if (taskID.equals(TaskTypeManager.TASK_ID_INPUT)) { // GridLayout gl = new GridLayout(); // gl.numColumns = 2; // parent.setLayout(gl); // toolkit.createLabel(parent, // "Click the link to switch to the \"Input\" tab to configurate the Smooks Input : "); // Hyperlink link = toolkit.createHyperlink(parent, // "Go to the Input page", SWT.NONE); // link.addHyperlinkListener(new IHyperlinkListener() { // // public void linkExited(HyperlinkEvent e) { // // } // // public void linkEntered(HyperlinkEvent e) { // // } // // public void linkActivated(HyperlinkEvent e) { // if (smooksModelProvider instanceof AbstractSmooksFormEditor) { // ((AbstractSmooksFormEditor) // smooksModelProvider).setActivePage("reader_page"); // } // } // }); // // return parent; // } return null; } protected String generateTaskSpecailID(TaskType task) { String taskId = task.getId(); if (taskId.equals(TaskTypeManager.TASK_ID_FREEMARKER_XML_TEMPLATE) || taskId.equals(TaskTypeManager.TASK_ID_FREEMARKER_CSV_TEMPLATE)) { List<AbstractResourceConfig> taskResources = task.getTaskResources(); if (!taskResources.isEmpty() && taskResources.size() == 1) { Object freemarker = taskResources.get(0); String taskID = smooksModelIdMap.get(freemarker); if (taskID == null) { String tempstamp = String.valueOf(System.currentTimeMillis()); taskID = "freemarker" + "_" + tempstamp; //$NON-NLS-1$ //$NON-NLS-2$ this.smooksModelIdMap.put(freemarker, taskID); } return taskID; } } return null; } public Object getActiveEditorPage() { if (pageBook != null) { Control control = pageBook.getCurrentPage(); return control.getData(); } return null; } public void showTaskControl(Object model) { if (pageBook == null) return; if (model == null) pageBook.showEmptyPage(); final Object finalModel = model; pageBook.getShell().getDisplay().syncExec(new Runnable() { /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ public void run() { FormToolkit toolkit = ((AbstractSmooksFormEditor) smooksModelProvider).getToolkit(); if (finalModel instanceof TaskType) { String id = ((TaskType) finalModel).getId(); if (!isSingltonEditor(id)) { String idref = generateTaskSpecailID((TaskType) finalModel); if (idref != null) { // idref = id + "_" + idref; if (getRegisteTaskPage(idref) == null) { IEditorPart editor = createEditorPart((TaskType)finalModel); registeTaskDetailsPage(editor, idref); } id = idref; } else { id = id + "_unknown"; //$NON-NLS-1$ } } if (id != null) { if (!pageBook.hasPage(id)) { Composite parent = pageBook.createPage(id); Object page = getRegisteTaskPage(id); if (page != null && page instanceof IEditorPart) { try { parent.setLayout(new FillLayout()); ITaskNodeProvider nodeProvider = (ITaskNodeProvider) ((IEditorPart) page) .getAdapter(ITaskNodeProvider.class); if (nodeProvider != null) { nodeProvider.setTaskType((TaskType) finalModel); } createTaskPage((IEditorPart) page, parent); pageBook.showPage(id); parent.setData(page); } catch (Throwable e) { e.printStackTrace(); pageBook.removePage(id); pageBook.showPage(emptyKey); } } else { Control control = createTaskPanel(parent, toolkit, id); if (control != null) { pageBook.showPage(id); } else { pageBook.removePage(id); pageBook.showPage(emptyKey); } } } else { Object page = getRegisteTaskPage(id); ITaskNodeProvider nodeProvider = (ITaskNodeProvider) ((IEditorPart) page) .getAdapter(ITaskNodeProvider.class); if (nodeProvider != null) { nodeProvider.setTaskType((TaskType) finalModel); } pageBook.showPage(id); } } currentlySelectedTask = (TaskType) finalModel; } else { // pageBook.showEmptyPage(); } } }); updateGlobalActions(); } public TaskType getCurrentlySelectedTask() { return currentlySelectedTask; } protected IEditorSite createSite(IEditorPart editor) { return new SmooksTaskDetailsEditorSite(this.getEditor(), editor, this); } protected void createTaskPage(IEditorPart editorPart, Composite parent) throws PartInitException { IEditorSite site = createSite(editorPart); editorPart.init(site, getEditorInput()); editorPart.createPartControl(parent); } public Object getRegisteTaskPage(String id) { return registedTaskPages.get(id); } protected Control createEmptyTaskPanel(Composite parent, FormToolkit toolkit) { parent.setLayout(new FillLayout()); return toolkit.createLabel(parent, "Select the task node"); //$NON-NLS-1$ } public void sourceChange(Object model) { if (getProcessGraphViewer() != null) { initProcessGraphicalViewer(); } Collection<Object> editors = registedTaskPages.values(); for (Iterator<?> iterator = editors.iterator(); iterator.hasNext();) { Object object = (Object) iterator.next(); if (object instanceof IEditorPart) { ((IEditorPart) object).removePropertyListener(this); if (((IEditorPart) object).getEditorSite() == null) { continue; } ((IEditorPart) object).dispose(); } } registedTaskPages.clear(); if (pageBook != null) { List<TaskTypeDescriptor> tasks = TaskTypeManager.getAllTaskList(); for (Iterator<?> iterator = tasks.iterator(); iterator.hasNext();) { TaskTypeDescriptor taskTypeDescriptor = (TaskTypeDescriptor) iterator.next(); pageBook.removePage(taskTypeDescriptor.getId(), true); } for (Iterator<String> iterator = smooksModelIdMap.values().iterator(); iterator.hasNext();) { String id = (String) iterator.next(); pageBook.removePage(id, true); } } List<TaskTypeDescriptor> tasks = TaskTypeManager.getAllTaskList(); for (Iterator<?> iterator = tasks.iterator(); iterator.hasNext();) { TaskTypeDescriptor taskTypeDescriptor = (TaskTypeDescriptor) iterator.next(); IEditorPart part = createEditorPart(taskTypeDescriptor.getId()); if (part != null) { this.registeTaskDetailsPage(part, taskTypeDescriptor.getId()); } } // registedTaskPages.clear(); // Collection<Object> editors = registedTaskPages.values(); // for (Iterator<?> iterator = editors.iterator(); iterator.hasNext();) // { // Object object = (Object) iterator.next(); // if (object instanceof ISmooksGraphChangeListener) { // ((ISourceSynchronizeListener) object).sourceChange(model); // } // } } // public void graphChanged(SmooksGraphicsExtType extType) { // Collection<Object> editors = registedTaskPages.values(); // for (Iterator<?> iterator = editors.iterator(); iterator.hasNext();) { // Object object = (Object) iterator.next(); // if (object instanceof ISmooksGraphChangeListener) { // ((ISmooksGraphChangeListener) object).graphChanged(extType); // } // } // } // public void graphPropertyChange(EStructuralFeature featre, Object value) // { // Collection<Object> editors = registedTaskPages.values(); // for (Iterator<?> iterator = editors.iterator(); iterator.hasNext();) { // Object object = (Object) iterator.next(); // if (object instanceof ISmooksGraphChangeListener) { // ((ISmooksGraphChangeListener) object).graphPropertyChange(featre, value); // } // } // } // public void inputTypeChanged(SmooksGraphicsExtType extType) { // Collection<Object> editors = registedTaskPages.values(); // for (Iterator<?> iterator = editors.iterator(); iterator.hasNext();) { // Object object = (Object) iterator.next(); // if (object instanceof ISmooksGraphChangeListener) { // ((ISmooksGraphChangeListener) object).inputTypeChanged(extType); // } // } // } public void propertyChanged(Object source, int propId) { this.firePropertyChange(propId); if (propId == PROP_DIRTY) { this.getManagedForm().dirtyStateChanged(); } } /* * (non-Javadoc) * * @see org.eclipse.ui.forms.editor.FormPage#dispose() */ @Override public void dispose() { Collection<Object> editors = registedTaskPages.values(); for (Iterator<?> iterator = editors.iterator(); iterator.hasNext();) { Object object = (Object) iterator.next(); if (object instanceof IEditorPart) { ((IEditorPart) object).removePropertyListener(this); if (((IEditorPart) object).getEditorSite() == null) { continue; } ((IEditorPart) object).dispose(); } } registedTaskPages.clear(); super.dispose(); } public void validateEnd(List<Diagnostic> diagnosticResult) { Collection<Object> editors = registedTaskPages.values(); for (Iterator<?> iterator = editors.iterator(); iterator.hasNext();) { Object object = (Object) iterator.next(); if (object instanceof ISmooksModelValidateListener) { ((ISmooksModelValidateListener) object).validateEnd(diagnosticResult); } } ProcessType process = this.getProcess(); validateProcess(process); } public void validateStart() { Collection<Object> editors = registedTaskPages.values(); for (Iterator<?> iterator = editors.iterator(); iterator.hasNext();) { Object object = (Object) iterator.next(); if (object instanceof ISmooksModelValidateListener) { ((ISmooksModelValidateListener) object).validateStart(); } } } protected void validateProcess(ProcessType process) { if (process != null) { validateTasks(process.getTask()); GraphViewer viewer = this.getProcessGraphViewer(); if (viewer != null) viewer.refresh(); } } protected void validateTasks(List<TaskType> tasks) { if (tasks == null) return; for (Iterator<?> iterator = tasks.iterator(); iterator.hasNext();) { TaskType taskType = (TaskType) iterator.next(); validateTask(taskType); validateTasks(taskType.getTask()); } } protected void validateTask(TaskType t) { if (t == null) { return; } final TaskType task = t; task.setProblemType(IFieldMarker.TYPE_NONE); task.cleanProblemMessages(); String id = task.getId(); SmooksResourceListType resourceList = getSmooksResourceListType(); if (TaskTypeManager.TASK_ID_INPUT.equals(id)) { // check the input data List<InputType> inputLists = SmooksUIUtils.getInputTypeList(getSmooksResourceListType()); if (inputLists == null || inputLists.isEmpty()) { task.setProblemType(IFieldMarker.TYPE_WARINING); task.addProblemMessage(Messages.SmooksProcessGraphicalEditor_Empty_Input_File); } else { boolean noactived = true; for (Iterator<?> iterator = inputLists.iterator(); iterator.hasNext();) { InputType inputType = (InputType) iterator.next(); if (inputType.isActived()) { noactived = false; break; } } if (noactived) { task.setProblemType(IFieldMarker.TYPE_WARINING); task.addProblemMessage(Messages.SmooksProcessGraphicalEditor_No_Input_File_Active); } else { List<Object> inputs = SelectorCreationDialog.generateInputData(getSmooksResourceListType()); if (inputs == null || inputs.size() == 0) { task.setProblemType(IFieldMarker.TYPE_ERROR); task.addProblemMessage(Messages.SmooksProcessGraphicalEditor_No_Input_Task_Found); } } } } if (TaskTypeManager.TASK_ID_JAVA_MAPPING.equals(id)) { List<Object> inputs = SelectorCreationDialog.generateInputData(getSmooksResourceListType()); if (inputs == null || inputs.size() == 0) { task.setProblemType(IFieldMarker.TYPE_WARINING); task.addProblemMessage(Messages.SmooksProcessGraphicalEditor_No_Input_Specified); } SmooksResourceListType sr = getSmooksResourceListType(); List<AbstractResourceConfig> rcs = sr.getAbstractResourceConfig(); boolean correct = false; for (Iterator<?> iterator = rcs.iterator(); iterator.hasNext();) { AbstractResourceConfig abstractResourceConfig = (AbstractResourceConfig) iterator.next(); if (abstractResourceConfig instanceof BeanType) { correct = true; break; } } if (!correct) { task.setProblemType(IFieldMarker.TYPE_ERROR); task.addProblemMessage(Messages.SmooksProcessGraphicalEditor_Java_Mapping_Not_Found); } } if (TaskTypeManager.TASK_ID_FREEMARKER_XML_TEMPLATE.equals(id) || TaskTypeManager.TASK_ID_FREEMARKER_CSV_TEMPLATE.equals(id)) { Freemarker freeMarker = (Freemarker) task.getTaskResources().get(0); String templateDataProvider = SmooksModelUtils.getParamValue(freeMarker.getParam(), SmooksModelUtils.TEMPLATE_DATA_PROVIDER_PARAM_NAME); SmooksResourceListType sr = getSmooksResourceListType(); List<AbstractResourceConfig> rcs = sr.getAbstractResourceConfig(); if(templateDataProvider == null || templateDataProvider.trim().equals(TaskTypeManager.TASK_ID_JAVA_MAPPING)) { for (AbstractResourceConfig abstractResourceConfig : rcs) { if (abstractResourceConfig instanceof BeanType) { // Found a Java Mapping... we're ok.... return; } } // No Java Mappings in the config... warn... task.setProblemType(IFieldMarker.TYPE_WARINING); task.addProblemMessage(Messages.SmooksProcessGraphicalEditor_Validation_No_Java_Mapping); } else if(templateDataProvider != null && templateDataProvider.trim().equals(TaskTypeManager.TASK_ID_INPUT)) { if(ModelFilter.DomModelCreator.execute(resourceList).isEmpty()) { task.setProblemType(IFieldMarker.TYPE_WARINING); task.addProblemMessage(Messages.SmooksProcessGraphicalEditor_Validation_No_DomModelCreator); } } } } public void propertyChange(PropertyChangeEvent evt) { if (lockProcessChangeEvent) return; String name = evt.getPropertyName(); Object newtask = evt.getNewValue(); Object oldtask = evt.getOldValue(); if (ProcessType.PRO_ADD_CHILD.equals(name) || ProcessType.PRO_REMOVE_CHILD.equals(name)) { if (getProcessGraphViewer() != null) { getProcessGraphViewer().refresh(); getProcessGraphViewer().applyLayout(); } processChanged = true; getManagedForm().dirtyStateChanged(); } if (ProcessType.PRO_ADD_CHILD.equals(name)) { this.showTaskControl(newtask); } if (ProcessType.PRO_REMOVE_CHILD.equals(name)) { this.showTaskControl(null); disposeTaskDetails(oldtask); } validateEnd(null); } private void disposeTaskDetails(Object deleteTask) { final Object finalModel = deleteTask; pageBook.getShell().getDisplay().syncExec(new Runnable() { /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ public void run() { if (finalModel instanceof TaskType) { String id = ((TaskType) finalModel).getId(); if (!isSingltonEditor(id)) { String idref = generateTaskSpecailID((TaskType) finalModel); if (idref != null) { id = idref; } else { id = id + "_unknown"; //$NON-NLS-1$ } if (id != null) { if (pageBook.hasPage(id)) { pageBook.removePage(id); Object registPage = getRegisteTaskPage(id); removeTaskDetailsPage((IEditorPart) registPage, id); } else { } } } } else { // pageBook.showEmptyPage(); } } }); } public void initFailed(int messageType, String message) { this.currentMessage = message; this.currentMessageType = messageType; updateHeaderFormMessage(); } protected void updateHeaderFormMessage() { if (this.getManagedForm() != null) { getManagedForm().getMessageManager().removeAllMessages(); getManagedForm().getMessageManager().update(); getProcessGraphViewer().getControl().setEnabled(true); getProcessGraphViewer().getControl().setBackground( getManagedForm().getToolkit().getColors().getBackground()); } if (currentMessageType != IMessageProvider.NONE && currentMessage != null) { if (this.getProcessGraphViewer() != null) { getProcessGraphViewer().getControl().setBackground(GraphicsConstants.BORDER_CORLOR); getProcessGraphViewer().getControl().setEnabled(false); getProcessGraphViewer().setInput(new Object()); showTaskControl(null); } if (this.getManagedForm() != null) { String[] messages = currentMessage.split("\n"); //$NON-NLS-1$ List<IMessage> messageList = new ArrayList<IMessage>(); for (int i = 0; i < messages.length; i++) { String message = messages[i]; if (message != null) message.trim(); if (message.length() == 0) { continue; } messageList.add(new SmooksMessage(currentMessageType, message)); } String mainMessage = null; if (messageList.isEmpty()) { mainMessage = currentMessage; } else { mainMessage = messageList.get(0).getMessage(); } this.getManagedForm().getForm().getForm().setMessage(mainMessage, currentMessageType, messageList.toArray(new IMessage[] {})); } } } public List<IAction> getProcessPanelActionList(){ return processPanelActions; } public IAction getAction(String actionId) { if (processMapActived) { updateProcessActions(processGraphViewer.getSelection()); if(ActionFactory.DELETE.getId().equals(actionId)){ for (Iterator<?> iterator = processPanelActions.iterator(); iterator.hasNext();) { IAction action = (IAction) iterator.next(); if(action instanceof DeleteTaskNodeAction){ return action; } } } } else { IEditorPart editor = (IEditorPart) getActiveEditorPage(); if (editor != null && editor instanceof SmooksGraphicalEditorPart) { SmooksGraphicalMenuContextProvider provider = (SmooksGraphicalMenuContextProvider) ((SmooksGraphicalEditorPart) editor) .getContextMenuProvider(); return provider.getActionRegistry().getAction(actionId); } } return null; } }