Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/cdo/bundles/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/editors/DawnGraphicalEditorSupport.java')
-rwxr-xr-xplugins/cdo/bundles/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/editors/DawnGraphicalEditorSupport.java245
1 files changed, 245 insertions, 0 deletions
diff --git a/plugins/cdo/bundles/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/editors/DawnGraphicalEditorSupport.java b/plugins/cdo/bundles/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/editors/DawnGraphicalEditorSupport.java
new file mode 100755
index 00000000..ad87ea8b
--- /dev/null
+++ b/plugins/cdo/bundles/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/editors/DawnGraphicalEditorSupport.java
@@ -0,0 +1,245 @@
+/*****************************************************************************
+ * Copyright (c) 2013, 2017 CEA LIST.
+ *
+ * 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:
+ * CEA LIST - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.cdo.internal.ui.editors;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.dawn.gmf.editors.impl.DawnGMFEditorSupport;
+import org.eclipse.emf.cdo.dawn.gmf.synchronize.DawnConflictHelper;
+import org.eclipse.emf.cdo.dawn.gmf.util.DawnDiagramUpdater;
+import org.eclipse.emf.cdo.dawn.spi.DawnState;
+import org.eclipse.emf.cdo.util.CDOUtil;
+import org.eclipse.emf.cdo.view.CDOView;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.ui.parts.GraphicalEditor;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramDropTargetListener;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.TransferDropTargetListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.papyrus.cdo.core.resource.CDOAwareModelSet;
+import org.eclipse.papyrus.cdo.internal.core.CDOUtils;
+import org.eclipse.papyrus.cdo.internal.ui.Activator;
+import org.eclipse.papyrus.cdo.internal.ui.decorators.CDOStateAdapter;
+import org.eclipse.papyrus.cdo.internal.ui.dnd.CDOResourceURITransferData;
+import org.eclipse.papyrus.cdo.internal.ui.dnd.ResourceDropActionDelegate;
+import org.eclipse.papyrus.cdo.internal.ui.util.UIUtil;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
+import org.eclipse.papyrus.infra.gmfdiag.common.DefaultGraphicalEditorSupport;
+import org.eclipse.papyrus.infra.gmfdiag.common.editpart.IConflictingEditPartFilter;
+import org.eclipse.papyrus.infra.gmfdiag.common.editpart.PapyrusDiagramEditPart;
+import org.eclipse.ui.part.PluginTransfer;
+import org.eclipse.ui.part.PluginTransferData;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+
+/**
+ * This is the DawnGraphicalEditorSupport type. Enjoy.
+ */
+public class DawnGraphicalEditorSupport extends DefaultGraphicalEditorSupport {
+
+ private final ServicesRegistry registry;
+
+ public DawnGraphicalEditorSupport(ServicesRegistry registry) {
+ super();
+
+ this.registry = registry;
+ }
+
+ @Override
+ public void initialize(GraphicalEditor editor) {
+ if (editor instanceof DiagramDocumentEditor) {
+ DiagramDocumentEditor diagramEditor = (DiagramDocumentEditor) editor;
+
+ CDOView view = getCDOView();
+ if (view != null) {
+ initialize(diagramEditor, view);
+ }
+
+ initializeCDOResourceDropSupport(diagramEditor);
+ }
+
+ super.initialize(editor);
+ }
+
+ protected void initialize(final DiagramDocumentEditor diagramEditor, CDOView view) {
+ DawnEditorAdapter adapter = new DawnEditorAdapter(diagramEditor);
+ final DawnGMFEditorSupport dawnSupport = new PapyrusGMFEditorSupport(adapter);
+
+ adapter.setEditorSupport(dawnSupport);
+ adapter.setView(getCDOView());
+ dawnSupport.setView(adapter.getView());
+
+ // after the root edit part has been created, inject a conflicting edit
+ // part filter
+ UIUtil.later(new Runnable() {
+
+ @Override
+ public void run() {
+ DiagramEditPart diagramEP = diagramEditor.getDiagramEditPart();
+ if (diagramEP instanceof PapyrusDiagramEditPart) {
+ ((PapyrusDiagramEditPart) diagramEP).setConflictingEditPartFilter(createConflictingEditPartFilter());
+ }
+ }
+ });
+
+ dawnSupport.registerListeners();
+
+ // find and process objects locked remotely
+ final Map<Object, DawnState> remoteLocks = getRemoteLocks(diagramEditor);
+ if (!remoteLocks.isEmpty()) {
+ // post for later because the editor isn't yet connected to its
+ // editor site in the workbench
+ UIUtil.later(new Runnable() {
+
+ @Override
+ public void run() {
+ dawnSupport.handleRemoteLockChanges(remoteLocks);
+
+ for (Object next : remoteLocks.keySet()) {
+ final EObject element = CDOUtil.getEObject((CDOObject) next);
+ View view = DawnDiagramUpdater.findViewByContainer(element);
+
+ CDOStateAdapter.setState(view, remoteLocks.get(next));
+ }
+ }
+ });
+ }
+ }
+
+ CDOView getCDOView() {
+ CDOView result = null;
+
+ try {
+ ModelSet modelSet = registry.getService(ModelSet.class);
+ if (modelSet instanceof CDOAwareModelSet) {
+ result = ((CDOAwareModelSet) modelSet).getCDOView();
+ }
+ } catch (ServiceException e) {
+ Activator.log.error(e);
+ }
+
+ return result;
+ }
+
+ private Map<Object, DawnState> getRemoteLocks(DiagramDocumentEditor diagramEditor) {
+
+ Map<Object, DawnState> result = Maps.newHashMap();
+
+ Diagram diagram = diagramEditor.getDiagram();
+ if (diagram != null) {
+ Iterator<EObject> iter = EcoreUtil.getAllProperContents(Collections.singleton(diagram), false);
+
+ while (iter.hasNext()) {
+ CDOObject next = CDOUtils.getCDOObject(iter.next());
+ if ((next != null) && CDOUtils.isLocked(next, true)) {
+ result.put(next, DawnState.LOCKED_REMOTELY);
+ }
+ }
+ }
+
+ return result;
+ }
+
+ private IConflictingEditPartFilter createConflictingEditPartFilter() {
+ return new IConflictingEditPartFilter() {
+
+ @Override
+ public boolean isConflicting(EditPart editPart) {
+ Object model = editPart.getModel();
+ return (model instanceof EObject) && DawnConflictHelper.isConflicted((EObject) model);
+ }
+ };
+ }
+
+ protected void initializeCDOResourceDropSupport(final DiagramDocumentEditor diagramEditor) {
+ // after the root edit part has been created, inject drop-target listener for dropping hyperlinks to CDO resources by URI
+ UIUtil.later(new Runnable() {
+
+ @Override
+ public void run() {
+ EditPartViewer viewer = diagramEditor.getDiagramGraphicalViewer();
+ viewer.addDropTargetListener(createCDOResourceURIDropTargetListener(viewer));
+ }
+ });
+ }
+
+ private TransferDropTargetListener createCDOResourceURIDropTargetListener(EditPartViewer viewer) {
+ return new DiagramDropTargetListener(viewer, PluginTransfer.getInstance()) {
+
+ @Override
+ protected boolean isDataTransfered() {
+ // I only have my data when the actual transfer data carrying my URIs is available
+ return getCurrentEvent().data != null;
+ }
+
+ @Override
+ protected List<EObject> getObjectsBeingDropped() {
+ List<EObject> result = null;
+ CDOResourceURITransferData uriData = null;
+
+ if (PluginTransfer.getInstance().isSupportedType(getCurrentEvent().currentDataType) && !localTransferHasObjectFromThisRepo()) {
+ Object data = getCurrentEvent().data;
+ if (data instanceof PluginTransferData) {
+ PluginTransferData ptData = (PluginTransferData) data;
+ if (ResourceDropActionDelegate.DROP_ACTION_ID.equals(ptData.getExtensionId())) {
+ uriData = CDOResourceURITransferData.deserialize(ptData.getData());
+ }
+ }
+ }
+
+ if (uriData == null) {
+ result = Collections.emptyList();
+ } else {
+ // convert the URI transfer data to an EObject so that the drag-and-drop
+ // system doesn't bomb on ClassCastExceptions
+ result = Collections.singletonList(uriData.asEObject());
+ }
+
+ return result;
+ }
+ };
+ }
+
+ boolean localTransferHasObjectFromThisRepo() {
+ boolean result = false;
+
+ CDOView view = getCDOView();
+ if (view != null) {
+ IStructuredSelection sel = CDOUtils.tryCast(LocalSelectionTransfer.getTransfer().getSelection(), IStructuredSelection.class);
+ if ((sel != null) && !sel.isEmpty()) {
+ for (EObject next : Iterables.filter(sel.toList(), EObject.class)) {
+ CDOObject cdo = CDOUtils.getCDOObject(next);
+ if ((cdo != null) && (cdo.cdoView().getSession() == view.getSession())) {
+ result = true;
+ break;
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+}

Back to the top