/* * (c) 2011 - 2013 University of Mannheim: Software Engineering Group */ package de.uni_mannheim.informatik.swt.models.plm.diagram.part; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IWorkspaceRoot; 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.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.emf.common.ui.URIEditorInput; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.emf.workspace.util.WorkspaceSynchronizer; import org.eclipse.gef.Tool; import org.eclipse.gef.palette.PaletteDrawer; import org.eclipse.gef.palette.PaletteRoot; import org.eclipse.gef.palette.ToolEntry; import org.eclipse.gef.ui.palette.PaletteViewer; import org.eclipse.gmf.runtime.common.ui.services.marker.MarkerNavigationService; import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint; import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument; import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument; import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider; import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor; import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeConnectionTool; import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeCreationTool; import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil; import org.eclipse.gmf.runtime.emf.type.core.IElementType; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorMatchingStrategy; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.SaveAsDialog; import org.eclipse.ui.ide.IGotoMarker; import org.eclipse.ui.navigator.resources.ProjectExplorer; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.part.IShowInTargetList; import org.eclipse.ui.part.ShowInContext; /** * @generated */ public class PLMDiagramEditor extends DiagramDocumentEditor implements IGotoMarker { /** * @generated */ public static final String ID = "de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditorID"; //$NON-NLS-1$ /** * @generated */ public static final String CONTEXT_ID = "de.uni_mannheim.informatik.swt.models.plm.diagram.ui.diagramContext"; //$NON-NLS-1$ /** * @generated */ public PLMDiagramEditor() { super(true); } /** * @generated */ protected String getContextID() { return CONTEXT_ID; } /** * @generated */ protected PaletteRoot createPaletteRoot(PaletteRoot existingPaletteRoot) { PaletteRoot root = super.createPaletteRoot(existingPaletteRoot); new de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMPaletteFactory() .fillPalette(root); return root; } /** * @generated */ protected PreferencesHint getPreferencesHint() { return de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT; } /** * @generated */ public String getContributorId() { return de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditorPlugin.ID; } /** * @generated */ @SuppressWarnings("rawtypes") public Object getAdapter(Class type) { if (type == IShowInTargetList.class) { return new IShowInTargetList() { public String[] getShowInTargetIds() { return new String[] { ProjectExplorer.VIEW_ID }; } }; } return super.getAdapter(type); } /** * @generated */ protected IDocumentProvider getDocumentProvider(IEditorInput input) { if (input instanceof IFileEditorInput || input instanceof URIEditorInput) { return de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditorPlugin .getInstance().getDocumentProvider(); } return super.getDocumentProvider(input); } /** * @generated */ public TransactionalEditingDomain getEditingDomain() { IDocument document = getEditorInput() != null ? getDocumentProvider() .getDocument(getEditorInput()) : null; if (document instanceof IDiagramDocument) { return ((IDiagramDocument) document).getEditingDomain(); } return super.getEditingDomain(); } /** * @generated */ protected void setDocumentProvider(IEditorInput input) { if (input instanceof IFileEditorInput || input instanceof URIEditorInput) { setDocumentProvider(de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditorPlugin .getInstance().getDocumentProvider()); } else { super.setDocumentProvider(input); } } /** * @generated */ public void gotoMarker(IMarker marker) { MarkerNavigationService.getInstance().gotoMarker(this, marker); } /** * @generated */ public boolean isSaveAsAllowed() { return true; } /** * @generated */ public void doSaveAs() { de.uni_mannheim.informatik.swt.models.plm.diagram.part.ValidateAction .runValidation(this.getDiagram()); performSaveAs(new NullProgressMonitor()); } /** * @generated */ protected void performSaveAs(IProgressMonitor progressMonitor) { Shell shell = getSite().getShell(); IEditorInput input = getEditorInput(); SaveAsDialog dialog = new SaveAsDialog(shell); IFile original = input instanceof IFileEditorInput ? ((IFileEditorInput) input) .getFile() : null; if (original != null) { dialog.setOriginalFile(original); } dialog.create(); IDocumentProvider provider = getDocumentProvider(); if (provider == null) { // editor has been programmatically closed while the dialog was open return; } if (provider.isDeleted(input) && original != null) { String message = NLS .bind(de.uni_mannheim.informatik.swt.models.plm.diagram.part.Messages.PLMDiagramEditor_SavingDeletedFile, original.getName()); dialog.setErrorMessage(null); dialog.setMessage(message, IMessageProvider.WARNING); } if (dialog.open() == Window.CANCEL) { if (progressMonitor != null) { progressMonitor.setCanceled(true); } return; } IPath filePath = dialog.getResult(); if (filePath == null) { if (progressMonitor != null) { progressMonitor.setCanceled(true); } return; } IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); IFile file = workspaceRoot.getFile(filePath); final IEditorInput newInput = new FileEditorInput(file); // Check if the editor is already open IEditorMatchingStrategy matchingStrategy = getEditorDescriptor() .getEditorMatchingStrategy(); IEditorReference[] editorRefs = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getActivePage() .getEditorReferences(); for (int i = 0; i < editorRefs.length; i++) { if (matchingStrategy.matches(editorRefs[i], newInput)) { MessageDialog .openWarning( shell, de.uni_mannheim.informatik.swt.models.plm.diagram.part.Messages.PLMDiagramEditor_SaveAsErrorTitle, de.uni_mannheim.informatik.swt.models.plm.diagram.part.Messages.PLMDiagramEditor_SaveAsErrorMessage); return; } } boolean success = false; try { provider.aboutToChange(newInput); getDocumentProvider(newInput).saveDocument(progressMonitor, newInput, getDocumentProvider().getDocument(getEditorInput()), true); success = true; } catch (CoreException x) { IStatus status = x.getStatus(); if (status == null || status.getSeverity() != IStatus.CANCEL) { ErrorDialog .openError( shell, de.uni_mannheim.informatik.swt.models.plm.diagram.part.Messages.PLMDiagramEditor_SaveErrorTitle, de.uni_mannheim.informatik.swt.models.plm.diagram.part.Messages.PLMDiagramEditor_SaveErrorMessage, x.getStatus()); } } finally { provider.changed(newInput); if (success) { setInput(newInput); } } if (progressMonitor != null) { progressMonitor.setCanceled(!success); } } /** * @generated */ public ShowInContext getShowInContext() { return new ShowInContext(getEditorInput(), getNavigatorSelection()); } /** * @generated */ private ISelection getNavigatorSelection() { IDiagramDocument document = getDiagramDocument(); if (document == null) { return StructuredSelection.EMPTY; } Diagram diagram = document.getDiagram(); if (diagram == null || diagram.eResource() == null) { return StructuredSelection.EMPTY; } IFile file = WorkspaceSynchronizer.getFile(diagram.eResource()); if (file != null) { de.uni_mannheim.informatik.swt.models.plm.diagram.navigator.PLMNavigatorItem item = new de.uni_mannheim.informatik.swt.models.plm.diagram.navigator.PLMNavigatorItem( diagram, file, false); return new StructuredSelection(item); } return StructuredSelection.EMPTY; } /** * @generated */ protected void configureGraphicalViewer() { super.configureGraphicalViewer(); de.uni_mannheim.informatik.swt.models.plm.diagram.part.DiagramEditorContextMenuProvider provider = new de.uni_mannheim.informatik.swt.models.plm.diagram.part.DiagramEditorContextMenuProvider( this, getDiagramGraphicalViewer()); getDiagramGraphicalViewer().setContextMenu(provider); getSite().registerContextMenu(ActionIds.DIAGRAM_EDITOR_CONTEXT_MENU, provider, getDiagramGraphicalViewer()); } /** * @generated */ private ISelectionListener selectionListener = new ISelectionListener() { @Override public void selectionChanged(IWorkbenchPart part, ISelection selection) { if ( //Happens on startup PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getActivePage() != null && part instanceof de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor && selection instanceof StructuredSelection && ((IStructuredSelection) selection).getFirstElement() instanceof IGraphicalEditPart) { IGraphicalEditPart editPart = (IGraphicalEditPart) ((IStructuredSelection) selection) .getFirstElement(); //Model validation on selection change //ValidateAction.runValidation((org.eclipse.gmf.runtime.notation.View)org.eclipse.emf.ecore.util.EcoreUtil.getRootContainer(editPart.getNotationView())); //Debugcode //System.out.println("Selected : " + editPart.getClass().getName()); if (editPart.resolveSemanticElement() instanceof de.uni_mannheim.informatik.swt.models.plm.PLM.Element) managePalette((de.uni_mannheim.informatik.swt.models.plm.PLM.Element) editPart .resolveSemanticElement()); } } }; /** * @generated */ @Override protected void startListening() { super.startListening(); PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getSelectionService() .addPostSelectionListener(selectionListener); } /** * @generated */ @Override protected void stopListening() { super.stopListening(); //Can be null if exiting Eclipse with diagram open if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getSelectionService() .removePostSelectionListener(selectionListener); } /** * @generated */ @Override public void doSave(IProgressMonitor progressMonitor) { de.uni_mannheim.informatik.swt.models.plm.diagram.part.ValidateAction .runValidation(this.getDiagram()); super.doSave(progressMonitor); } /** * @generated */ public PaletteViewer getPalette() { return getEditDomain().getPaletteViewer(); } /** * @generated */ private PaletteDrawer dslElementsGroup = null; /** * @generated */ /** * @generated */ private void managePalette( de.uni_mannheim.informatik.swt.models.plm.PLM.Element selectedElement) { //Does the DSL Elements group alread exist? => Create it if (dslElementsGroup == null) { PaletteRoot root = getEditDomain().getPaletteViewer() .getPaletteRoot(); dslElementsGroup = new PaletteDrawer("DSL Elements"); dslElementsGroup.setId("dslElementsGroup"); root.add(dslElementsGroup); } dslElementsGroup.getChildren().clear(); //An ontology offers no context from which we can retrieve the DSL Elements if (selectedElement instanceof de.uni_mannheim.informatik.swt.models.plm.PLM.Ontology) { dslElementsGroup.setVisible(false); return; } EObject container = selectedElement; //Find the containing model while (container != null && !(container instanceof de.uni_mannheim.informatik.swt.models.plm.PLM.Model)) container = container.eContainer(); //No model found.. if (container == null) { dslElementsGroup.setVisible(false); return; } // search for the next higher level de.uni_mannheim.informatik.swt.models.plm.PLM.Ontology o = (de.uni_mannheim.informatik.swt.models.plm.PLM.Ontology) container .eContainer(); //We are at the highest level if (o.getContent().indexOf(container) == 0) { dslElementsGroup.setVisible(false); return; } else dslElementsGroup.setVisible(true); de.uni_mannheim.informatik.swt.models.plm.PLM.Model higherModel = o .getContent().get(o.getContent().indexOf(container) - 1); LinkedList<ToolEntry> entries = new LinkedList<ToolEntry>(); //Fill the palette for (de.uni_mannheim.informatik.swt.models.plm.PLM.Element e : higherModel .getContent()) { //For entities we simply create the entry if (e instanceof de.uni_mannheim.informatik.swt.models.plm.PLM.Entity && ((de.uni_mannheim.informatik.swt.models.plm.PLM.Clabject) e) .isInstantiable() && ((de.uni_mannheim.informatik.swt.models.plm.PLM.Clabject) e) .getPotency() != 0) { List<IElementType> types = new ArrayList<IElementType>(2); types.add(de.uni_mannheim.informatik.swt.models.plm.diagram.providers.PLMElementTypes.Entity_3085); types.add(de.uni_mannheim.informatik.swt.models.plm.diagram.providers.PLMElementTypes.Entity_3069); de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.NodeToolEntry entry = new de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.NodeToolEntry( e.getName(), "Creates a new " + e.getName(), types); entry.setId("dsl." + EMFCoreUtil.getProxyID(e) + ".CreationTool"); entry.setSmallIcon(de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditorPlugin .findImageDescriptor("/de.uni_mannheim.informatik.swt.models.gmf/icons/clabject16.gif")); //$NON-NLS-1$ entry.setLargeIcon(de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditorPlugin .findImageDescriptor("/de.uni_mannheim.informatik.swt.models.gmf/icons/clabject16.gif")); entries.add(entry); } } //Connections are instantiated via context menu. de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.LinkToolEntry entry = new de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.LinkToolEntry( "Instantiate Connection", "Instantiates / Creates a new connection.", Collections .singletonList(de.uni_mannheim.informatik.swt.models.plm.diagram.providers.PLMElementTypes.Participation_4025)); //No leading "dsl." to apply dsl specific commands entry.setId("connection.CreationTool"); entry.setSmallIcon(de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditorPlugin .findImageDescriptor("/de.uni_mannheim.informatik.swt.models.gmf/icons/connection16.gif")); entry.setLargeIcon(de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditorPlugin .findImageDescriptor("/de.uni_mannheim.informatik.swt.models.gmf/icons/connection16.gif")); entries.add(entry); Collections.sort(entries, new Comparator<ToolEntry>() { @Override public int compare(ToolEntry o1, ToolEntry o2) { //All Entities need to go to the top if (o1 instanceof de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.NodeToolEntry && ((de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.NodeToolEntry) o1).elementTypes .contains(de.uni_mannheim.informatik.swt.models.plm.diagram.providers.PLMElementTypes.Entity_3069)) { //We compare to a connection node or link entry -> We want to be first if (o2 instanceof de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.NodeToolEntry && !((de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.NodeToolEntry) o2).elementTypes .contains(de.uni_mannheim.informatik.swt.models.plm.diagram.providers.PLMElementTypes.Entity_3069) || o2 instanceof de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.LinkToolEntry) return -1; //We are two Entities -> Sort by name else return (o1.getLabel().compareToIgnoreCase(o2.getLabel())); } else if (o1 instanceof de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.NodeToolEntry && !((de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.NodeToolEntry) o1).elementTypes .contains(de.uni_mannheim.informatik.swt.models.plm.diagram.providers.PLMElementTypes.Entity_3069) || o1 instanceof de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.LinkToolEntry) { //We compare to a connection node or link entry -> We want to be first if (o2 instanceof de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.NodeToolEntry && ((de.uni_mannheim.informatik.swt.models.plm.diagram.part.PLMDiagramEditor.NodeToolEntry) o2).elementTypes .contains(de.uni_mannheim.informatik.swt.models.plm.diagram.providers.PLMElementTypes.Entity_3069)) return 1; //We are two Connections -> Sort by name else { if ((o1.getLabel() == null || o1.getLabel().length() == 0) && (o2.getLabel() == null || o2.getLabel() .length() == 0)) return 0; else if ((o1.getLabel() == null || o1.getLabel() .length() == 0) && (o2.getLabel() != null || o2.getLabel() .length() != 0)) return 1; else if ((o1.getLabel() != null || o1.getLabel() .length() != 0) && (o2.getLabel() == null || o2.getLabel() .length() == 0)) return -1; else //In order to get the entry tools sorted next to their connection tool //their leading <<.*>> must be removed for comparison return o1 .getLabel() .replaceAll("<<.*?>>", "") .compareToIgnoreCase( o2.getLabel().replaceAll("<<.*?>>", "")); } } return 0; } }); dslElementsGroup.addAll(entries); if (dslElementsGroup.getChildren().size() == 0) dslElementsGroup.setVisible(false); } /** * @generated */ private static class NodeToolEntry extends ToolEntry { /** * @generated */ private final List<IElementType> elementTypes; /** * @generated */ private NodeToolEntry(String title, String description, List<IElementType> elementTypes) { super(title, description, null, null); this.elementTypes = elementTypes; } /** * @generated */ public Tool createTool() { Tool tool = new UnspecifiedTypeCreationTool(elementTypes); tool.setProperties(getToolProperties()); return tool; } } /** * @generated */ private static class LinkToolEntry extends ToolEntry { /** * @generated */ private final List<IElementType> relationshipTypes; /** * @generated */ private LinkToolEntry(String title, String description, List<IElementType> relationshipTypes) { super(title, description, null, null); this.relationshipTypes = relationshipTypes; } /** * @generated */ public Tool createTool() { Tool tool = new UnspecifiedTypeConnectionTool(relationshipTypes); tool.setProperties(getToolProperties()); return tool; } } /** * @generated */ @Override public void createPartControl(Composite parent) { super.createPartControl(parent); try { de.uni_mannheim.informatik.swt.mlm.workbench.ExtensionPointService .Instance().getActiveEmendationService() .startListening(getDiagram().getElement()); } catch (CoreException e) { e.printStackTrace(); } } }