/*
* (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();
}
}
}