/******************************************************************************* * Copyright (c) 2005, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.ui; import java.text.Collator; import java.util.ArrayList; import java.util.Comparator; import java.util.EventObject; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.TreeSet; import java.util.Vector; import org.eclipse.bpel.common.extension.model.ExtensionMap; import org.eclipse.bpel.common.ui.CommonUIPlugin; import org.eclipse.bpel.common.ui.ICommonUIConstants; import org.eclipse.bpel.common.ui.command.EditModelCommandFramework; import org.eclipse.bpel.common.ui.command.ICommandFramework; import org.eclipse.bpel.common.ui.tray.AdaptingSelectionProvider; import org.eclipse.bpel.common.ui.tray.GraphicalEditorWithPaletteAndTray; import org.eclipse.bpel.common.ui.tray.MultiViewerSelectionProvider; import org.eclipse.bpel.common.ui.tray.TrayComposite; import org.eclipse.bpel.model.Activity; import org.eclipse.bpel.model.Flow; import org.eclipse.bpel.model.Process; import org.eclipse.bpel.ui.actions.AppendNewAction; import org.eclipse.bpel.ui.actions.AutoArrangeFlowsAction; import org.eclipse.bpel.ui.actions.BPELAddChildInTrayAction; import org.eclipse.bpel.ui.actions.BPELCopyAction; import org.eclipse.bpel.ui.actions.BPELCutAction; import org.eclipse.bpel.ui.actions.BPELDeleteAction; import org.eclipse.bpel.ui.actions.BPELDuplicateAction; import org.eclipse.bpel.ui.actions.BPELPasteAction; import org.eclipse.bpel.ui.actions.BPELPrintAction; import org.eclipse.bpel.ui.actions.ChangeTypeAction; import org.eclipse.bpel.ui.actions.InsertNewAction; import org.eclipse.bpel.ui.actions.MakePartner2WayAction; import org.eclipse.bpel.ui.actions.RenameAction; import org.eclipse.bpel.ui.actions.RevertAction; import org.eclipse.bpel.ui.actions.ShowPaletteInPaletteViewAction; import org.eclipse.bpel.ui.actions.ShowPropertiesViewAction; import org.eclipse.bpel.ui.actions.ShowViewAction; import org.eclipse.bpel.ui.actions.ToggleAutoFlowLayout; import org.eclipse.bpel.ui.actions.ToggleLayoutOrientationAction; import org.eclipse.bpel.ui.actions.ToggleShowCompensationHandler; import org.eclipse.bpel.ui.actions.ToggleShowEventHandler; import org.eclipse.bpel.ui.actions.ToggleShowFaultHandler; import org.eclipse.bpel.ui.actions.ToggleShowTerminationHandler; import org.eclipse.bpel.ui.commands.util.ModelAutoUndoRecorder; import org.eclipse.bpel.ui.dnd.BPELTemplateTransferDropTargetListener; import org.eclipse.bpel.ui.dnd.BPELTextTransferDropTargetListener; import org.eclipse.bpel.ui.dnd.FileDropTargetListener; import org.eclipse.bpel.ui.dnd.TextDropTargetListener; import org.eclipse.bpel.ui.editparts.CorrelationSetsEditPart; import org.eclipse.bpel.ui.editparts.FlowEditPart; import org.eclipse.bpel.ui.editparts.MessageExchangesEditPart; import org.eclipse.bpel.ui.editparts.PartnerLinksEditPart; import org.eclipse.bpel.ui.editparts.VariablesEditPart; import org.eclipse.bpel.ui.editparts.util.BPELEditPartFactory; import org.eclipse.bpel.ui.editparts.util.BPELTrayEditPartFactory; import org.eclipse.bpel.ui.factories.AbstractUIObjectFactory; import org.eclipse.bpel.ui.uiextensionmodel.ProcessExtension; import org.eclipse.bpel.ui.util.BPELCreationToolEntry; import org.eclipse.bpel.ui.util.BPELEditModelClient; import org.eclipse.bpel.ui.util.BPELUtil; import org.eclipse.bpel.ui.util.IModelVisitor; import org.eclipse.bpel.ui.util.ModelHelper; import org.eclipse.bpel.ui.util.TransferBuffer; import org.eclipse.bpel.ui.util.WSDLImportHelper; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.draw2d.geometry.Point; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.gef.ContextMenuProvider; import org.eclipse.gef.DefaultEditDomain; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.KeyHandler; import org.eclipse.gef.KeyStroke; import org.eclipse.gef.commands.CommandStack; import org.eclipse.gef.dnd.TemplateTransferDragSourceListener; import org.eclipse.gef.palette.PaletteContainer; import org.eclipse.gef.ui.actions.ActionRegistry; import org.eclipse.gef.ui.actions.PrintAction; import org.eclipse.gef.ui.actions.RedoAction; import org.eclipse.gef.ui.actions.SaveAction; import org.eclipse.gef.ui.actions.SelectAllAction; import org.eclipse.gef.ui.actions.UndoAction; import org.eclipse.gef.ui.actions.ZoomInAction; import org.eclipse.gef.ui.actions.ZoomOutAction; import org.eclipse.gef.ui.palette.PaletteViewer; import org.eclipse.gef.ui.palette.PaletteViewerProvider; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.dialogs.SaveAsDialog; import org.eclipse.ui.part.MultiPageEditorSite; import org.eclipse.wst.wsdl.Definition; import org.eclipse.wst.wsdl.internal.impl.DefinitionImpl; import org.eclipse.wst.wsdl.util.WSDLResourceImpl; /** * BPELEditor is the Eclipse editor part for editing BPEL files. */ public class BPELEditor extends GraphicalEditorWithPaletteAndTray /*, IGotoMarker */{ //FIXME can't move it to MultiPageEditor because of chicken and egg problem // TODO: comment protected BPELEditModelClient editModelClient; protected BPELEditorAdapter editorAdapter; // transfer buffer (clipboard) for graph copies private TransferBuffer transferBuffer; protected BPELMultipageEditorPart multipageEditor; // This records all model changes for automatic undo/redo purposes. private ModelAutoUndoRecorder modelAutoUndoRecorder; // Cached key handler used by both the graphical editor and outline view private KeyHandler keyHandler; // Selection listener on the graphical viewer and tray ISelectionChangedListener selectionChangeListener, traySelectionChangeListener; // This is used by BPELDetailsEditor to implement createDetailsInputCommand() which is used // to support Undo/Redo functionality in the details area protected EditPart lastSelectedEditPart; // The selection provider that maps EditParts to their corresponding model objects private BPELAdaptingSelectionProvider adaptingSelectionProvider; private WeakMultiViewerSelectionProvider weakMultiViewerSelectionProvider; // This is necessary for some EditPart-based actions to work correctly. // private ISelectionProvider filteredEditPartSelectionProvider; // Lists of actions available for context menus, etc. protected Set<IAction> appendNewActions; protected Set<IAction> insertNewActions; protected Set<IAction> changeTypeActions; protected String contributorID; protected ICommandFramework commandFramework; public BPELEditor(DefaultEditDomain ed, BPELMultipageEditorPart multipageEditor) { super(); setEditDomain(ed); this.multipageEditor = multipageEditor; // transferBuffer = new TransferBuffer(); modelAutoUndoRecorder = new ModelAutoUndoRecorder(); } protected class BPELEditorAdapter implements Adapter { public Notifier getTarget() { return null; } public void setTarget(Notifier newTarget) { } public boolean isAdapterForType(Object type) { return (type == BPELEditorAdapter.class); } public void notifyChanged(Notification notification) { } public BPELEditor getBPELEditor() { return BPELEditor.this; } } /** * Given a ResourceSet, this helper identifies the BPELEditor (if any) that created it */ public static BPELEditor getBPELEditor(ResourceSet resourceSet) { Iterator<Adapter> it = resourceSet.eAdapters().iterator(); while (it.hasNext()) { Object next = it.next(); if (next instanceof BPELEditorAdapter) { return ((BPELEditorAdapter)next).getBPELEditor(); } } return null; } public BPELEditModelClient getEditModelClient() { return editModelClient; } public void setEditModelClient(BPELEditModelClient cl) { this.editModelClient = cl; } public ResourceSet getResourceSet() { return getEditModelClient().getEditModel().getResourceSet(); } public Resource getResource() { return getProcess().eResource(); } public ModelAutoUndoRecorder getModelAutoUndoRecorder() { return modelAutoUndoRecorder; } public TransferBuffer getTransferBuffer() { return transferBuffer; } public Set<IAction> getAppendNewActions() { return appendNewActions; } public Set<IAction> getInsertNewActions() { return insertNewActions; } public Set<IAction> getChangeTypeActions() { return changeTypeActions; } /** * @see org.eclipse.gef.ui.parts.GraphicalEditor#configureGraphicalViewer() */ @Override protected void configureGraphicalViewer() { super.configureGraphicalViewer(); GraphicalViewer viewer = getGraphicalViewer(); registerViewer(viewer); GraphicalBPELRootEditPart root = (GraphicalBPELRootEditPart)viewer.getRootEditPart(); ZoomInAction zoomInAction = new ZoomInAction(root.getZoomManager()); zoomInAction.setImageDescriptor(CommonUIPlugin.getDefault().getImageRegistry().getDescriptor(ICommonUIConstants.ICON_ZOOM_IN_TOOL)); getActionRegistry().registerAction(zoomInAction); ZoomOutAction zoomOutAction = new ZoomOutAction(root.getZoomManager()); zoomOutAction.setImageDescriptor(CommonUIPlugin.getDefault().getImageRegistry().getDescriptor(ICommonUIConstants.ICON_ZOOM_OUT_TOOL)); getActionRegistry().registerAction(zoomOutAction); getSite().getKeyBindingService().registerAction(zoomInAction); getSite().getKeyBindingService().registerAction(zoomOutAction); ContextMenuProvider provider = new ProcessContextMenuProvider(this, getActionRegistry()); getGraphicalViewer().setContextMenu(provider); getSite().setSelectionProvider(getAdaptingSelectionProvider()); getSite().registerContextMenu("org.eclipse.bpel.editor.contextmenu", //$NON-NLS-1$ provider, getSite().getSelectionProvider()); getGraphicalViewer().setKeyHandler(new BPELGraphicalKeyHandler(getGraphicalViewer()).setParent(getEditorKeyHandler())); // // Setup the drop target and add our listener to it. // // This will allow us to accept drops from the navigator. // // this.dropTarget = new DropTarget(getGraphicalViewer().getControl(), DND.DROP_NONE | DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK); // // Set transfers to the types that are specified by the helper // // JM // dropTarget.setTransfer(BPELDropTargetListener.getTransferTypes()); // // Create our drop listener and add it to the DropTarget // // JM // this.dropTargetListener = new BPELDropTargetListener(getGraphicalViewer(), this); // dropTarget.addDropListener(dropTargetListener); } // private void createBPELPaletteEntries(PaletteContainer palette) { // BPELPackage bpelPackage = BPELPackage.eINSTANCE; // UIObjectFactoryProvider provider = UIObjectFactoryProvider.getInstance(); // // PaletteCategory basicActionsCategory = new PaletteCategory("Actions"); //$NON-NLS-1$ // String term = BPELTerms.getString("Empty"); //$NON-NLS-1$ // basicActionsCategory.add(new BPELCreationToolEntry(term, term, // provider.getFactoryFor(bpelPackage.getEmpty()))); // basicActionsCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_Invoke_35, // Messages.BPELEditor_Invoke_36, // provider.getFactoryFor(bpelPackage.getInvoke()))); // basicActionsCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_Receive_4, // Messages.BPELEditor_Receive_5, // provider.getFactoryFor(bpelPackage.getReceive()))); // basicActionsCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_Reply_6, // Messages.BPELEditor_Reply_7, // provider.getFactoryFor(bpelPackage.getReply()))); // basicActionsCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_Assign_10, // Messages.BPELEditor_Assign_11, // provider.getFactoryFor(bpelPackage.getAssign()))); // basicActionsCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_Validate_XML_12, // Messages.BPELEditor_Validate_XML_13, // provider.getFactoryFor(bpelPackage.getValidate()))); // palette.add(basicActionsCategory); // // controlCategory = new PaletteCategory("Control"); //$NON-NLS-1$ // switchEntry = new BPELCreationToolEntry( // Messages.BPELEditor_If_17, // Messages.BPELEditor_If_18, // provider.getFactoryFor(bpelPackage.getIf())); // controlCategory.add(switchEntry); // controlCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_Pick_8, // Messages.BPELEditor_Pick_9, // provider.getFactoryFor(bpelPackage.getPick()))); // controlCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_While_19, // Messages.BPELEditor_While_20, // provider.getFactoryFor(bpelPackage.getWhile()))); // controlCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_ForEach_19, // Messages.BPELEditor_ForEach_20, // provider.getFactoryFor(bpelPackage.getForEach()))); // controlCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_Repeat_Until_42, // Messages.BPELEditor_Repeat_Until_43, // provider.getFactoryFor(bpelPackage.getRepeatUntil()))); // controlCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_Wait_21, // Messages.BPELEditor_Wait_22, // provider.getFactoryFor(bpelPackage.getWait()))); // sequenceEntry = new BPELCreationToolEntry( // Messages.BPELEditor_Sequence_23, // Messages.BPELEditor_Sequence_24, // provider.getFactoryFor(bpelPackage.getSequence())); // controlCategory.add(sequenceEntry); // controlCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_Scope_1, // Messages.BPELEditor_Scope_2, // provider.getFactoryFor(bpelPackage.getScope()))); // flowEntry = new BPELCreationToolEntry( // Messages.BPELEditor_Flow_1, // Messages.BPELEditor_Flow_2, // provider.getFactoryFor(bpelPackage.getFlow())); // controlCategory.add(flowEntry); // palette.add(controlCategory); // // PaletteCategory faultCategory = new PaletteCategory("Faults"); //$NON-NLS-1$ // faultCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_Exit_26, // Messages.BPELEditor_Exit_27, // provider.getFactoryFor(bpelPackage.getExit()))); // faultCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_Throw_28, // Messages.BPELEditor_Throw_29, // provider.getFactoryFor(bpelPackage.getThrow()))); // faultCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_ReThrow_1, // Messages.BPELEditor_ReThrow_2, // provider.getFactoryFor(bpelPackage.getRethrow()))); // faultCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_Compensate_1, // Messages.BPELEditor_Compensate_2, // provider.getFactoryFor(bpelPackage.getCompensate()))); // faultCategory.add(new BPELCreationToolEntry( // Messages.BPELEditor_CompensateScope_1, // Messages.BPELEditor_CompensateScope_2, // provider.getFactoryFor(bpelPackage.getCompensateScope()))); // // palette.add(faultCategory); // // } // private void createTopControlPaletteEntries(PaletteRoot root) { // PaletteGroup controlGroup = new PaletteGroup(Messages.BPELEditor_Top_Control_Group_37); // // SelectionToolEntry selectionTool = new SelectionToolEntry(Messages.BPELEditor_Selection_Tool_38); // controlGroup.add(selectionTool); // // MarqueeToolEntry marqueeTool = new MarqueeToolEntry(Messages.BPELEditor_Marquee_Tool); // controlGroup.add(marqueeTool); // // root.add(controlGroup); // root.setDefaultEntry(selectionTool); // } /** * @see org.eclipse.ui.IWorkbenchPart#dispose() */ @Override public void dispose() { if (editModelClient != null) { editModelClient.getEditModel().getResourceSet().eAdapters().remove(getEditorAdapter()); editModelClient.dispose(); editModelClient = null; } if (getGraphicalViewer() != null) { if (selectionChangeListener != null) { getGraphicalViewer().removeSelectionChangedListener(selectionChangeListener); } getGraphicalViewer().setContents(null); if (getGraphicalViewer().getControl() != null && !getGraphicalViewer().getControl().isDisposed()) { getGraphicalViewer().getControl().dispose(); getGraphicalViewer().setControl(null); } } if (getTrayViewer() != null) { getTrayViewer().setContents(null); } if (getEditDomain() != null) { getEditDomain().setPaletteViewer(null); } // if (getPaletteViewer() != null) { // getPaletteViewer().setContents(null); // } if (transferBuffer != null) { transferBuffer.dispose(); } lastSelectedEditPart = null; super.dispose(); // if (dropTarget != null) { // dropTarget.dispose(); // dropTarget = null; // } // ResourceSet resourceSet = getResourceSet(); if (adaptingSelectionProvider != null) { getSite().setSelectionProvider(null); adaptingSelectionProvider = null; } // TODO unhook BPELEditorAdapter from the resource set to avoid unnecessary cyclic garbage. //BPELEditorAdapter bpelEditorAdapter = (BPELEditorAdapter)BPELUtil.adapt( // resourceSet, BPELEditorAdapter.class); //if (bpelEditorAdapter != null) resourceSet.eAdapters().remove(bpelEditorAdapter); if (getEditDomain() != null) { ((BPELEditDomain)getEditDomain()).setProcess(null); } // processResource = null; // if (resourceSet != null) resourceSet.getResources().clear(); // resourceSet = null; // extensionsResource = null; // if (extensionMap != null) extensionMap.clear(); // extensionMap = null; modelAutoUndoRecorder = null; if (getSelectionActions() != null) { getSelectionActions().clear(); } if (getPropertyActions() != null) { getPropertyActions().clear(); } if (getActionRegistry() != null) { getActionRegistry().dispose(); setActionRegistry(null); } // JM: Replace this with lifecycle extensions //cleanupGeneratedFiles(); } // JM: Replace this with lifecycle extensions // /** // * If we don't have references to the generated files anymore we should delete them. // */ // protected void cleanupGeneratedFiles() { // IFile bpelFile = getFileInput(); // if (!bpelFile.exists()) return; // if the bpel file is gone there's nothing to be done // // // force and wait the index handler to run so we don't delete the wrong files // IIndexManager.INSTANCE.addFileToIndex(bpelFile, null); // List candidates = new ArrayList(Arrays.asList(StampHelper.findGeneratedFiles(bpelFile))); // IndexSearcher indexSearcher = new IndexSearcher(); // try { // FileRefInfo[] matches = indexSearcher.findFileReferences(bpelFile, IIndexSearch.ANY_FILE, null, new NullProgressMonitor()); // if (matches.length > 0) { // FileInfo[] infos = matches[0].getReferencedFiles(); // for (int i = 0; i < infos.length; i++) { // FileInfo info = infos[i]; // candidates.remove(info.getFile()); // } // } // } catch (InterruptedException e) { // BPELUIPlugin.log(e); // } // // if (!candidates.isEmpty()) { // try { // ResourcesPlugin.getWorkspace().delete((IFile[]) candidates.toArray(new IFile[candidates.size()]), true, null); // } catch (CoreException e) { // BPELUIPlugin.log(e); // } // } // } /** * @see org.eclipse.ui.IEditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor) */ @Override public void doSave(IProgressMonitor progressMonitor) { getCommandFramework().applyCurrentChange(); removeUnusedExtensions(); // Add all imports and namespaces to the artifacts file before saving. if (getEditModelClient().getArtifactsResourceInfo() != null) { Resource artifactsResource = getEditModelClient().getArtifactsResourceInfo().getResource(); if (artifactsResource instanceof WSDLResourceImpl) { // Add any missing imports/namespaces before saving! if (!artifactsResource.getContents().isEmpty()) { Definition def = (Definition)artifactsResource.getContents().get(0); // --- WDG: temp hack! String TNS = def.getTargetNamespace(); if (TNS == null) { TNS = def.getNamespace("tns"); //$NON-NLS-1$ if (TNS == null) TNS = "UGGH"; def.setTargetNamespace(TNS); } else { def.addNamespace("tns", TNS); //$NON-NLS-1$ } // --- def.getEImports().clear(); WSDLImportHelper.addAllImportsAndNamespaces(def, getEditModelClient().getPrimaryResourceInfo().getFile()); // This doesn't seem to introduce an updateElement automatically, // so do it manually now, so that RolePortTypes (for example) who // are affected by the new namespace will know about it. ((DefinitionImpl)def).updateElement(); } } } try { getExtensionsResource().setModified(false); getEditModelClient().saveAll(progressMonitor); //getModelDirtyTracker().markSaveLocation(); } finally { updateTitle(); } // Put the timestamp of the bpel file into the bpelex file. // Bugzilla 324165 // if the Resource failed to parse then the Process is null. // use the model client to get the IFile resource instead of getting it from Process IFile bpelFile = getEditModelClient().getPrimaryResourceInfo().getFile(); long modificationStamp = bpelFile.getLocalTimeStamp(); ProcessExtension processExtension = (ProcessExtension)ModelHelper.getExtension(getProcess()); if (processExtension!=null) { processExtension.setModificationStamp(modificationStamp); getExtensionsResource().setModified(true); } getEditModelClient().saveAll(progressMonitor); } // Disable our Save As functionality. @Override public boolean isSaveAsAllowed() { return false; } /** * @see org.eclipse.ui.IEditorPart#doSaveAs() */ @Override public void doSaveAs() { getCommandFramework().applyCurrentChange(); performSaveAs(); updateTitle(); } protected boolean performSaveAs() { SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell()); saveAsDialog.setOriginalFile(getFileInput()); saveAsDialog.open(); IPath path = saveAsDialog.getResult(); if (path != null) { return getEditModelClient().savePrimaryResourceAs( ResourcesPlugin.getWorkspace().getRoot().getFile(path), getEditorSite().getActionBars().getStatusLineManager().getProgressMonitor()); } return false; } /** * Overridden to install our own help context for the palette. */ @Override protected PaletteViewerProvider createPaletteViewerProvider() { return new PaletteViewerProvider(getEditDomain()) { @Override protected void configurePaletteViewer(PaletteViewer viewer) { super.configurePaletteViewer(viewer); // viewer.setCustomizer(new LogicPaletteCustomizer()); viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer)); // As the palette has no own help context, install our help context PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), IHelpContextIds.EDITOR_PALETTE); } }; } // protected PaletteRoot createPaletteRoot() { // PaletteRoot paletteRoot = new PaletteRoot(); // createTopControlPaletteEntries(paletteRoot); // createBPELPaletteEntries(paletteRoot); // createBottomControlPaletteEntries(paletteRoot); // return paletteRoot; // } /** * @see org.eclipse.ui.IEditorPart#isDirty() */ /*public boolean isDirty() { return getCommandStack().isDirty(); }*/ /** * @see org.eclipse.gef.ui.parts.GraphicalEditor#initializeGraphicalViewer() */ @Override protected void initializeGraphicalViewer() { ///FIXME moved to multi //initializeFileChangeListener(); //initializeRefactoringListeners(); getGraphicalViewer().setEditPartFactory(new BPELEditPartFactory()); BPELUIPlugin.INSTANCE.getPreferenceStore().setValue(IBPELUIConstants.PREF_SHOW_FREEFORM_FLOW, true); GraphicalViewer viewer = getGraphicalViewer(); viewer.setContents(getProcess()); viewer.addDropTargetListener( new FileDropTargetListener(viewer,this) ); viewer.addDropTargetListener( new TextDropTargetListener(viewer,this) ); viewer.addDropTargetListener( new BPELTextTransferDropTargetListener(viewer, this)); viewer.addDropTargetListener( new BPELTemplateTransferDropTargetListener(viewer)); this.selectionChangeListener = new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { StructuredSelection selection = (StructuredSelection)event.getSelection(); if (selection.isEmpty()) { return; } // if this is a multi-selection we should not present anything on the details area if (selection.size() > 1) { // TODO: This doesn't work // getBPELDetailsEditor().getDetailsArea().setInput(null); } else { final Object o = selection.getFirstElement(); if (o instanceof EditPart) { // CAREFUL: must setInput() on the DetailsArea *before* we remember // the lastSelectedEditPart (because setInput() might execute a pending // command for an IOngoingChange whose wrapper will not execute correctly // unless lastSelectedEditPart has its old value). lastSelectedEditPart = (EditPart)o; } } } }; this.traySelectionChangeListener = new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { StructuredSelection selection = (StructuredSelection)event.getSelection(); if (selection.isEmpty()) { return; } // if this is a multi-selection we should not present anything on the details area if (selection.size() > 1) { // TODO: This doesn't work. // getBPELDetailsEditor().getDetailsArea().setInput(null); } else { final Object o = selection.getFirstElement(); if (o instanceof EditPart) { // CAREFUL: must setInput() on the DetailsArea *before* we remember // the lastSelectedEditPart (because setInput() might execute a pending // command for an IOngoingChange whose wrapper will not execute correctly // unless lastSelectedEditPart has its old value). lastSelectedEditPart = (EditPart)o; } } } }; getGraphicalViewer().addSelectionChangedListener(this.selectionChangeListener); arrangeEditParts(getGraphicalViewer()); } public void arrangeEditParts(GraphicalViewer graphicalViewer) { // Make a list of all FlowEditParts whose children all have no positional metadata List<FlowEditPart> flowsToArrange = new ArrayList<FlowEditPart>(); List<Point> flowChildlocations = new ArrayList<Point>(); for (TreeIterator<EObject> it = getProcess().eAllContents(); it.hasNext(); ) { EObject model = it.next(); if (model instanceof Flow) { boolean missingLoc = false; for (Iterator<Activity> it2 = ((Flow)model).getActivities().iterator(); !missingLoc && it2.hasNext(); ) { Activity child = it2.next(); if (child == null) continue; Point loc = ModelHelper.getLocation(child); if (loc.x == Integer.MIN_VALUE) missingLoc = true; flowChildlocations.add(new Point(loc)); } // Bugzilla 319215 // The problem with the above check for a "missing location" of Flow // children is that the default x & y values are zero if the extension // model is missing. This would be the case if the BPEL process was // imported as text from somewhere. In this case, all x/y coordinates // of all Flow children will be 0, so it suffices to check if two children // have the same x & y coordinates. if (flowChildlocations.size()>1) { for ( int i=0; !missingLoc && i<flowChildlocations.size(); ++i ) { int x = flowChildlocations.get(i).x; int y = flowChildlocations.get(i).y; for ( int j=i+1; !missingLoc && j<flowChildlocations.size(); ++j ) { Point loc = flowChildlocations.get(j); if (loc.x == x && loc.y==y) missingLoc = true; } } } if (missingLoc) { EditPart editPart = (EditPart)graphicalViewer.getEditPartRegistry().get(model); if (editPart instanceof FlowEditPart) flowsToArrange.add((FlowEditPart) editPart); } } } BPELUtil.sortFlowList(flowsToArrange); for (FlowEditPart flowEditPart : flowsToArrange) { flowEditPart.doImmediateAutoLayout(); } } @Override public void commandStackChanged(EventObject event) { firePropertyChange(IEditorPart.PROP_DIRTY); super.commandStackChanged(event); } /** * Returns the KeyHandler with common bindings for both the Outline and Graphical Views. */ protected KeyHandler getKeyHandler(){ if (keyHandler == null) { keyHandler = new KeyHandler(); keyHandler.put(KeyStroke.getPressed(SWT.DEL, 127, 0), getActionRegistry().getAction(ActionFactory.DELETE.getId())); } return keyHandler; } /** * Returns the KeyHandler with common bindings for both the Outline and Graphical Views. */ protected KeyHandler getEditorKeyHandler(){ if (keyHandler == null) { keyHandler = new KeyHandler(); keyHandler.put(KeyStroke.getPressed(SWT.DEL, 127, 0), getActionRegistry().getAction(ActionFactory.DELETE.getId())); keyHandler.put(KeyStroke.getPressed(SWT.PAGE_UP, 0), new Action() { @Override public void run() { ((ScrollingBPELGraphicalViewer)getGraphicalViewer()).scrollVertical(true); } }); keyHandler.put(KeyStroke.getPressed(SWT.PAGE_DOWN, 0), new Action() { @Override public void run() { ((ScrollingBPELGraphicalViewer)getGraphicalViewer()).scrollVertical(false); } }); keyHandler.put(KeyStroke.getPressed(SWT.HOME, 0), new Action() { @Override public void run() { ((ScrollingBPELGraphicalViewer)getGraphicalViewer()).scrollHorizontal(true); } }); keyHandler.put(KeyStroke.getPressed(SWT.END, 0), new Action() { @Override public void run() { ((ScrollingBPELGraphicalViewer)getGraphicalViewer()).scrollHorizontal(false); } }); } return keyHandler; } // /** // * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class) // */ // public Object getAdapter(Class type) { //// if (type == ZoomManager.class) //// return ((ScalableFreeformRootEditPart) getGraphicalViewer().getRootEditPart()) //// .getZoomManager(); // return super.getAdapter(type); // } protected void replaceSelectionAction(ActionRegistry registry, IAction action) { IAction oldAction = registry.getAction(action.getId()); if (oldAction != null) { registry.removeAction(oldAction); getSelectionActions().remove(oldAction.getId()); } registry.registerAction(action); getSelectionActions().add(action.getId()); } /** * @see org.eclipse.gef.ui.parts.GraphicalEditor#createActions() */ @Override protected void createActions() { // super.createActions(); ActionRegistry registry = getActionRegistry(); IAction action; // Oleg: These actions were copy-pasted from GraphicalEditor // Probably we need to remove some of them action = new UndoAction(this); registry.registerAction(action); getStackActions().add(action.getId()); action = new RedoAction(this); registry.registerAction(action); getStackActions().add(action.getId()); action = new SelectAllAction(this); registry.registerAction(action); action = new SaveAction(this); registry.registerAction(action); getPropertyActions().add(action.getId()); registry.registerAction(new PrintAction(this)); // hook up some custom actions that are specialized versions of // the default actions. action = new BPELDeleteAction(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new BPELCutAction(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new BPELCopyAction(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new BPELPasteAction(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new BPELDuplicateAction(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new RevertAction(this); registry.registerAction(action); getPropertyActions().add(action.getId()); action = new RenameAction(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new ToggleAutoFlowLayout(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new ToggleShowFaultHandler(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new ToggleShowCompensationHandler(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new ToggleShowTerminationHandler(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new ToggleShowEventHandler(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new AutoArrangeFlowsAction(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new ToggleLayoutOrientationAction(this); registry.registerAction(action); getSelectionActions().add(action.getId()); // show properties action ShowViewAction showViewAction = new ShowPropertiesViewAction(); showViewAction.setPage( getSite().getPage() ); registry.registerAction(showViewAction); // Show Palette in Palette View action showViewAction = new ShowPaletteInPaletteViewAction(); showViewAction.setPage( getSite().getPage() ); registry.registerAction(showViewAction); action = new BPELPrintAction(this); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new BPELAddChildInTrayAction(this, PartnerLinksEditPart.class, Messages.BPELEditor_addPartnerLink, BPELUIPlugin.INSTANCE.getImageDescriptor(IBPELUIConstants.ICON_PARTNER_IN_16)); registry.registerAction(action); getSelectionActions().add(action.getId()); // action = new BPELAddChildInTrayAction(this, // PartnerLinksEditPart.class, // Messages.BPELEditor_addInterfacePartner, // BPELUIPlugin.getPlugin().getImageDescriptor(IBPELUIConstants.ICON_PARTNER_IN_16)); // registry.registerAction(action); // getSelectionActions().add(action.getId()); // // action = new BPELAddChildInTrayAction(this, // ReferencePartnerLinksEditPart.class, // Messages.BPELEditor_addReferencePartner, // BPELUIPlugin.getPlugin().getImageDescriptor(IBPELUIConstants.ICON_PARTNER_OUT_16)); // registry.registerAction(action); // getSelectionActions().add(action.getId()); action = new BPELAddChildInTrayAction(this, VariablesEditPart.class, Messages.BPELEditor_addVariable, BPELUIPlugin.INSTANCE.getImageDescriptor(IBPELUIConstants.ICON_VARIABLE_16)); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new BPELAddChildInTrayAction(this, CorrelationSetsEditPart.class, Messages.BPELEditor_addCorrelationSet, BPELUIPlugin.INSTANCE.getImageDescriptor(IBPELUIConstants.ICON_CORRELATIONSET_16)); registry.registerAction(action); getSelectionActions().add(action.getId()); action = new BPELAddChildInTrayAction(this, MessageExchangesEditPart.class, Messages.BPELEditor_addMessageExchange, BPELUIPlugin.INSTANCE.getImageDescriptor(IBPELUIConstants.ICON_EXIT_16));//TODO - replace icon with right one registry.registerAction(action); getSelectionActions().add(action.getId()); action = new MakePartner2WayAction(this); registry.registerAction(action); getSelectionActions().add(action.getId()); } /** * Create the Add, Insert and Change Type actions to be used in pop-up menus. * They reflect what is available from the palette. */ protected void createPaletteDependentActions() { Comparator<IAction> actionComparator = new Comparator<IAction>() { Collator collator = Collator.getInstance(); public int compare(IAction o1, IAction o2) { return collator.compare(o1.getText(), o2.getText()); } }; appendNewActions = new TreeSet<IAction>(actionComparator); insertNewActions = new TreeSet<IAction>(actionComparator); changeTypeActions = new TreeSet<IAction>(actionComparator); createPaletteDependentActions(getPaletteRoot()); } protected void createPaletteDependentActions(PaletteContainer container) { ActionRegistry registry = getActionRegistry(); for (Iterator iter = container.getChildren().iterator(); iter.hasNext();) { Object element = iter.next(); if (element instanceof PaletteContainer) { createPaletteDependentActions((PaletteContainer)element); } else if (element instanceof BPELCreationToolEntry) { BPELCreationToolEntry entry = (BPELCreationToolEntry) element; AbstractUIObjectFactory factory = entry.getUIObjectFactory(); // append IAction action = new AppendNewAction(this, factory); appendNewActions.add(action); registry.registerAction(action); getSelectionActions().add(action.getId()); // insert action = new InsertNewAction(this, factory); registry.registerAction(action); insertNewActions.add(action); getSelectionActions().add(action.getId()); // change type action = new ChangeTypeAction(this, factory); registry.registerAction(action); changeTypeActions.add(action); getSelectionActions().add(action.getId()); } } } public Process getProcess() { IWorkbenchPartSite editorSite = getSite(); if (editorSite instanceof MultiPageEditorSite) { return (Process)((org.eclipse.ui.part.MultiPageEditorSite)getSite()).getMultiPageEditor().getAdapter(Process.class); } return null; } public Resource getExtensionsResource (){ IWorkbenchPartSite editorSite = getSite(); if (editorSite instanceof MultiPageEditorSite) { return (Resource)((org.eclipse.ui.part.MultiPageEditorSite)getSite()).getMultiPageEditor().getAdapter(Resource.class); } return null; } public ExtensionMap getExtensionMap (){ IWorkbenchPartSite editorSite = getSite(); if (editorSite instanceof MultiPageEditorSite) { return (ExtensionMap)((org.eclipse.ui.part.MultiPageEditorSite)getSite()).getMultiPageEditor().getAdapter(ExtensionMap.class); } return null; } //FIXME should we kill it and move all the model listener adapter related //things to BPELMultipageEditorPart? public ModelListenerAdapter getModelListenerAdapter() { IWorkbenchPartSite editorSite = getSite(); if (editorSite instanceof MultiPageEditorSite) { return (ModelListenerAdapter)((org.eclipse.ui.part.MultiPageEditorSite)getSite()).getMultiPageEditor().getAdapter(ModelListenerAdapter.class); } return null; } /** * Overriding to use BPELMultipageEditorPart command stack */ @Override public CommandStack getCommandStack() { IWorkbenchPartSite editorSite = getSite(); if (editorSite instanceof MultiPageEditorSite) { return (CommandStack)((org.eclipse.ui.part.MultiPageEditorSite)getSite()).getMultiPageEditor().getAdapter(CommandStack.class); } return null; } public void setAutoFlowLayout(boolean autoLayout) { BPELUIPlugin.INSTANCE.getPreferenceStore().setValue(IBPELUIConstants.PREF_AUTO_FLOW_LAYOUT, autoLayout); } public boolean getAutoFlowLayout() { return BPELUIPlugin.INSTANCE.getPreferenceStore().getBoolean(IBPELUIConstants.PREF_AUTO_FLOW_LAYOUT); } // private void createBottomControlPaletteEntries(PaletteContainer palette) { // PaletteGroup controlGroup = new PaletteGroup(Messages.BPELEditor_Bottom_Control_Group_39); // // ZoominToolEntry zoomIn = new ZoominToolEntry(Messages.BPELEditor_Zoom_In_40); // zoomIn.setSmallIcon(CommonUIPlugin.getDefault().getImageRegistry().getDescriptor(ICommonUIConstants.ICON_ZOOM_IN_TOOL)); // controlGroup.add(zoomIn); // ZoomoutToolEntry zoomOut = new ZoomoutToolEntry(Messages.BPELEditor_Zoom_Out_41); // zoomOut.setSmallIcon(CommonUIPlugin.getDefault().getImageRegistry().getDescriptor(ICommonUIConstants.ICON_ZOOM_OUT_TOOL)); // controlGroup.add(zoomOut); // // palette.add(controlGroup); // } /** * Override createGraphicalViewer. We have to have our own graphical viewer so that * we can put extra layers in the root edit part */ @Override protected void createGraphicalViewer(Composite parent) { GraphicalViewer viewer = new ScrollingBPELGraphicalViewer(); viewer.createControl(parent); setGraphicalViewer(viewer); configureGraphicalViewer(); hookGraphicalViewer(); initializeGraphicalViewer(); PlatformUI.getWorkbench().getHelpSystem().setHelp( parent, IHelpContextIds.EDITOR_CANVAS); } @Override protected void hookGraphicalViewer() { // Do nothing. Don't call super because it will override our // preference for selection provider and synchronizer. } /** * Override to make public. */ @Override public void setGraphicalViewer(GraphicalViewer viewer) { super.setGraphicalViewer(viewer); } public void refreshGraphicalViewer() { BPELUtil.regenerateVisuals(getProcess(), getGraphicalViewer()); } /** * Helper to set canvas selection to a specific model object (e.g. for details area) * @param modelObject */ public void selectModelObject(Object modelObject) { setFocus(); // give focus to the editor so that it can notify the properties view of input change if (modelObject == null) { adaptingSelectionProvider.setSelection(StructuredSelection.EMPTY); } else { adaptingSelectionProvider.setSelection(new StructuredSelection(modelObject)); } } /** * Return the selected model object(s). The debugger will call * this. * @return The selected model objects. */ public ISelection getSelection() { ISelection editPartSelection = getGraphicalViewer().getSelection(); if (editPartSelection == null || !(editPartSelection instanceof StructuredSelection) || editPartSelection.isEmpty()) { return StructuredSelection.EMPTY; } ArrayList<Object> list = new ArrayList<Object>(); Iterator it = ((StructuredSelection)editPartSelection).iterator(); while (it.hasNext()) { Object o = it.next(); if (o instanceof EditPart) { list.add(((EditPart)o).getModel()); } } return new StructuredSelection(list); } public AdaptingSelectionProvider getAdaptingSelectionProvider() { if (adaptingSelectionProvider == null) { adaptingSelectionProvider = new BPELAdaptingSelectionProvider(); } return adaptingSelectionProvider; } private MultiViewerSelectionProvider getMultiViewerSelectionProvider() { if (weakMultiViewerSelectionProvider == null) { weakMultiViewerSelectionProvider = new WeakMultiViewerSelectionProvider() { protected ISelection cachedAdaptingSelection; @Override public ISelection getSelection() { // HACK to fix selection coherency problems: // If the AdaptingSelectionProvider selection has changed, assume ours // has changed as well! if (getAdaptingSelectionProvider().getSelection() != cachedAdaptingSelection) { cachedSelection = null; // force super to recalculate } return super.getSelection(); } }; } return weakMultiViewerSelectionProvider; } // private ISelectionProvider getFilteredEditPartSelectionProvider() { // if (filteredEditPartSelectionProvider == null) { // filteredEditPartSelectionProvider = new ISelectionProvider() { // public void addSelectionChangedListener(ISelectionChangedListener listener) { } // public void removeSelectionChangedListener(ISelectionChangedListener listener) { } // public ISelection getSelection() { // return adaptingSelectionProvider.getEditPartSelection(); // } // public void setSelection(ISelection selection) { } // }; // } // return filteredEditPartSelectionProvider; // } protected BPELEditorAdapter getEditorAdapter() { return editorAdapter; } /** * Override getGraphicalViewer() to make the method public */ @Override public GraphicalViewer getGraphicalViewer() { return super.getGraphicalViewer(); } /** * Cause the edit part for the given model object to refresh its hover help. */ public void refreshHoverHelp(EObject modelObject) { EditPart editPart = (EditPart)getGraphicalViewer().getEditPartRegistry().get(modelObject); if (editPart instanceof IHoverHelperSupport) { ((IHoverHelperSupport)editPart).refreshHoverHelp(); } } /** * Cause all edit parts to refresh their hover help. */ public void refreshHoverHelp() { BPELUtil.visitModelDepthFirst(getProcess(), new IModelVisitor() { public boolean visit(Object modelObject) { EditPart editPart = (EditPart)getGraphicalViewer().getEditPartRegistry().get(modelObject); if (editPart == null) editPart = (EditPart)getTrayViewer().getEditPartRegistry().get(modelObject); if (editPart instanceof IHoverHelperSupport) { ((IHoverHelperSupport)editPart).refreshHoverHelp(); } return true; } }); } @Override public void createPartControl(Composite parent) { super.createPartControl(parent); getTrayComposite().setState(TrayComposite.STATE_EXPANDED); getTrayComposite().setTrayWidth(150); getEditorSite().getKeyBindingService(); selectModelObject(getProcess()); } protected IFile getFileInput() { return (IFile) getEditorInput().getAdapter(IFile.class); } /** * This is called during startup. */ @Override public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException { IFile input = (IFile) editorInput.getAdapter(IFile.class); if (input == null) throw new PartInitException(Messages.BPELEditor_Cant_read_input_file_1); super.init( site, editorInput ); transferBuffer = new TransferBuffer(getSite().getShell().getDisplay()); // remove the listener on the command stack created by the graphical editor getCommandStack().removeCommandStackListener(this); ResourceSet resourceSet = getEditModelClient().getEditModel().getResourceSet(); // TODO: does this stuff have to go? it won't work with shared models.. resourceSet.eAdapters().add(getModelListenerAdapter()); resourceSet.eAdapters().add(editorAdapter = new BPELEditorAdapter()); getModelListenerAdapter().setLinkNotificationAdapter(new LinkNotificationAdapter(this)); getCommandStack().addCommandStackListener(getModelListenerAdapter()); commandFramework = new EditModelCommandFramework(getEditModelClient().getCommandStack()); // add a listener to the shared command stack getCommandStack().addCommandStackListener(this); // Scan the model to see if there are any invalid elements that need to be // removed (there are some elements that if invalid will not appear in // the UI and thus need to be removed automatically). // Do this after the command framework is created and the listener // is added to it. // JM // if (BPELUtil.removeInvalidElements(process)) { // MessageDialog.openInformation(getSite().getShell(), // Messages.getString("validationInfo.dialog.title"), //$NON-NLS-1$ // Messages.getString("validationInfo.invalidElementsRemoved")); //$NON-NLS-1$ // getCommandFramework().execute(new DummyCommand()); // } // // these can only be created after we load the model // since it affects the available items in the palette createPaletteDependentActions(); } // This is for loading the model within the editor // REMINDER: Any changes to this method, consider corresponding changes to // the loadModelWithoutEditModel() method! /*protected void loadModel() { // TODO: This two lines are a workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=72565 EcorePackage instance = EcorePackage.eINSTANCE; instance.eAdapters();*/ /*Resource bpelResource = editModelClient.getPrimaryResourceInfo().getResource(); IFile file = getFileInput(); BPELReader reader = new BPELReader(); reader.read(bpelResource, file, getResourceSet()); this.process = reader.getProcess(); if (getEditDomain() != null) { ((BPELEditDomain)getEditDomain()).setProcess(process); } this.extensionsResource = reader.getExtensionsResource(); this.extensionMap = reader.getExtensionMap(); this.modelListenerAdapter.setExtensionMap(extensionMap);*/ // ProcessExtension processExtension = (ProcessExtension)ModelHelper.getExtension(process); // long stamp = processExtension.getModificationStamp(); // // Be nice if the file is old or doesn't yet have a stamp. // if (stamp != 0) { // long actualStamp = file.getLocalTimeStamp(); // if (stamp != actualStamp) { // // Inform the user that visual information will be discarded, // // and null out the extension map. // // Only inform the user if we actually have a shell; headless clients // // will not be informed. // if (getSite() != null) { // MessageDialog.openWarning(getSite().getShell(), Messages.getString("BPELEditor.Process_Out_Of_Sync_2"), Messages.getString("BPELEditor.Process_has_been_modified_3")); //$NON-NLS-1$ //$NON-NLS-2$ // } // // TODO: Null out and recreate the extension map. Perhaps we need // // to preserve some interesting bits of info about spec compliance // // and implicit sequences. Don't null it out yet until we understand // // all the cases in which this could occur. // //extensionMap = null; // } // } /*}*/ public ICommandFramework getCommandFramework() { return commandFramework; } // Make the method public so the properties sections can access it @Override public ActionRegistry getActionRegistry() { return super.getActionRegistry(); } @Override protected void initializeTrayViewer() { GraphicalViewer viewer = getTrayViewer(); viewer.setEditPartFactory(new BPELTrayEditPartFactory()); viewer.setEditDomain(getEditDomain()); getEditDomain().addViewer(viewer); viewer.addSelectionChangedListener(this.traySelectionChangeListener); registerViewer(viewer); ContextMenuProvider provider = new ProcessContextMenuProvider(this, getActionRegistry()); viewer.setContextMenu(provider); getSite().registerContextMenu("org.eclipse.bpel.editor.tray.contextmenu", //$NON-NLS-1$ provider, getSite().getSelectionProvider()); viewer.setContents(getProcess()); viewer.addDropTargetListener(new FileDropTargetListener(getTrayViewer(), this)); viewer.addDropTargetListener(new TextDropTargetListener(getTrayViewer(), this)); PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), IHelpContextIds.TRAY_DESCRIPTION); } // Register a viewer with the selection providers protected void registerViewer(EditPartViewer viewer) { getAdaptingSelectionProvider().addViewer(viewer); getMultiViewerSelectionProvider().addViewer(viewer); } /** * The editor part name should be the same as the one appearing in the logical view. */ //FIXME should be moved to multi or even removed at all protected void updateTitle() { setPartName(getProcess().getName()); } // protected boolean updateInputFile(IPath filePath) { // if (filePath == null) { // return false; // } // // IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath); // if (file == null) { // return false; // } // // // WDG: changed setInput to setInputWithNotify here. is updateTitle still needed? // setInputWithNotify(new FileEditorInput(file)); // updateTitle(); // return true; // } /** * because our extensions are managed independently of the model and stored in a separate map, we have to make sure * that any extensions that are not used are removed before we serialize * * the easiest way to do that is to make sure that all extensions have eResource attributes set and thus * we know that the extension is mapped to a model object. * * TODO: this is bogus though because it will mess up undo/redo! A better solution * would be to create a second map and save that one, leaving the original unchanged. */ protected void removeUnusedExtensions() { ExtensionMap map = getExtensionMap(); Set<EObject> keyset = map.keySet(); Vector<EObject> deleted = new Vector<EObject>(); for (Iterator<EObject> i = keyset.iterator(); i.hasNext(); ) { EObject model = i.next(); try { if (model.eResource() == null) deleted.add(model); } catch (Exception e) { // object is definitely not valid; deleted.add(model); } } for (int j = 0; j < deleted.size(); j++) map.remove(deleted.get(j)); } /** * @return the artifacts definition model. */ public Definition getArtifactsDefinition() { // TODO: handle the case where resource doesn't exist or is empty Resource artifactsResource = getEditModelClient().getArtifactsResourceInfo().getResource(); return (Definition)artifactsResource.getContents().get(0); } @Override protected String getPaletteAdditionsContributorId() { return IBPELUIConstants.BPEL_EDITOR_ID; } public boolean isHorizontalLayout(){ boolean result = false; IFile file = (IFile)getEditorInput().getAdapter(IFile.class); try { result = Boolean.valueOf(file.getPersistentProperty(IBPELUIConstants.HORIZONTAL_LAYOUT_PROPERTY)); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; } public void setHorizontalLayout(boolean horizontal){ IFile file = (IFile)getEditorInput().getAdapter(IFile.class); try { file.setPersistentProperty(IBPELUIConstants.HORIZONTAL_LAYOUT_PROPERTY, Boolean.toString(horizontal)); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public BPELMultipageEditorPart getMultipageEditor() { return multipageEditor; } }