Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.dawn.gmf/src/org/eclipse/emf/cdo/dawn/gmf/util/DawnDiagramUpdater.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.dawn.gmf/src/org/eclipse/emf/cdo/dawn/gmf/util/DawnDiagramUpdater.java397
1 files changed, 397 insertions, 0 deletions
diff --git a/plugins/org.eclipse.emf.cdo.dawn.gmf/src/org/eclipse/emf/cdo/dawn/gmf/util/DawnDiagramUpdater.java b/plugins/org.eclipse.emf.cdo.dawn.gmf/src/org/eclipse/emf/cdo/dawn/gmf/util/DawnDiagramUpdater.java
new file mode 100644
index 0000000000..471d0c86bc
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.dawn.gmf/src/org/eclipse/emf/cdo/dawn/gmf/util/DawnDiagramUpdater.java
@@ -0,0 +1,397 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2011 Eike Stepper (Berlin, Germany) 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:
+ * Martin Fluegge - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.emf.cdo.dawn.gmf.util;
+
+import org.eclipse.emf.cdo.dawn.internal.util.bundle.OM;
+
+import org.eclipse.net4j.util.om.trace.ContextTracer;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;
+import org.eclipse.gmf.runtime.diagram.ui.services.editpart.EditPartService;
+import org.eclipse.gmf.runtime.emf.core.util.CrossReferenceAdapter;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.PlatformUI;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author Martin Fluegge
+ */
+public class DawnDiagramUpdater
+{
+ private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, DawnDiagramUpdater.class);
+
+ public static void refresh(final IGraphicalEditPart editPart)
+ {
+ TransactionalEditingDomain editingDomain = editPart.getEditingDomain();
+ editingDomain.getCommandStack().execute(new RecordingCommand(editingDomain)
+ {
+ @Override
+ public void doExecute()
+ {
+ editPart.refresh();
+
+ if (editPart instanceof ConnectionEditPart)
+ {
+ DawnDiagramUpdater.refresh((IGraphicalEditPart)((ConnectionEditPart)editPart).getTarget());
+ DawnDiagramUpdater.refresh((IGraphicalEditPart)((ConnectionEditPart)editPart).getSource());
+ }
+ }
+ });
+ }
+
+ public static void refreshEditPart(EditPart editPart)
+ {
+ refeshEditpartInternal(editPart);
+ }
+
+ public static void refreshEditPart(final EditPart editPart, DiagramDocumentEditor editor)
+ {
+ try
+ {
+ editor.getEditingDomain().runExclusive(new Runnable()
+ {
+ public void run()
+ {
+ DawnDiagramUpdater.refreshEditPart(editPart);
+ }
+ });
+ }
+ catch (InterruptedException ex)
+ {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ public static void refreshEditCurrentSelected(TransactionalEditingDomain editingDomain)
+ {
+ editingDomain.getCommandStack().execute(new RecordingCommand(editingDomain)
+ {
+
+ @Override
+ protected void doExecute()
+ {
+ // ((ExamplediagramDocumentProvider)getDocumentProvider()).changed(getEditorInput());
+ ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService()
+ .getSelection();
+ if (selection instanceof IStructuredSelection)
+ {
+ IStructuredSelection structuredSelection = (IStructuredSelection)selection;
+ if (structuredSelection.size() != 1)
+ {
+ return;
+ }
+ if (structuredSelection.getFirstElement() instanceof EditPart
+ && ((EditPart)structuredSelection.getFirstElement()).getModel() instanceof View)
+ {
+ EObject modelElement = ((View)((EditPart)structuredSelection.getFirstElement()).getModel()).getElement();
+ List<?> editPolicies = CanonicalEditPolicy.getRegisteredEditPolicies(modelElement);
+ for (Iterator<?> it = editPolicies.iterator(); it.hasNext();)
+ {
+ CanonicalEditPolicy nextEditPolicy = (CanonicalEditPolicy)it.next();
+ nextEditPolicy.refresh();
+ }
+ }
+ }
+ }
+ });
+ }
+
+ private static void refeshEditpartInternal(EditPart editPart)
+ {
+ if (editPart != null)
+ {
+ try
+ {
+
+ // EObject modelElement = ((View)(editPart).getModel()).getElement();
+ // List editPolicies = CanonicalEditPolicy.getRegisteredEditPolicies(modelElement);
+ // for (Iterator it = editPolicies.iterator(); it.hasNext();)
+ // {
+ // CanonicalEditPolicy nextEditPolicy = (CanonicalEditPolicy)it.next();
+ // nextEditPolicy.refresh();
+ // }
+
+ editPart.refresh();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+
+ if (editPart instanceof DiagramEditPart)
+ {
+ for (Object connectionEditPart : ((DiagramEditPart)editPart).getConnections())
+ {
+ if (connectionEditPart instanceof EditPart)
+ {
+ if (((Edge)((EditPart)connectionEditPart).getModel()).getBendpoints() != null)
+ {
+ refeshEditpartInternal((EditPart)connectionEditPart);
+ }
+ }
+ }
+ }
+
+ for (Object childEditPart : editPart.getChildren())
+ {
+ if (childEditPart instanceof EditPart)
+ {
+ refeshEditpartInternal((EditPart)childEditPart);
+ }
+ }
+ }
+ }
+
+ public static View findViewByContainer(EObject element)
+ {
+ if (element instanceof View)
+ {
+ return (View)element;
+ }
+
+ if (element.eContainer() == null)
+ {
+ return null;
+ }
+
+ if (element.eContainer() instanceof View)
+ {
+ return (View)element.eContainer();
+ }
+
+ return findViewByContainer(element.eContainer());
+ }
+
+ public static View findViewForModel(EObject object, DiagramDocumentEditor editor)
+ {
+ if (object == null)
+ {
+ return null;
+ }
+ for (EObject e : editor.getDiagram().eContents())
+ {
+ if (e instanceof View)
+ {
+ View view = (View)e;
+ if (object.equals(view.getElement()))
+ {
+ if (TRACER.isEnabled())
+ {
+ TRACER.format("FOUND View: {0} for view obj: {1} ", e, object); //$NON-NLS-1$
+ }
+ }
+ return (View)e;
+ }
+ }
+ return null;
+ }
+
+ public static View getViewFromObject(EObject element, DiagramDocumentEditor editor)
+ {
+ View view;
+
+ if (element instanceof Diagram)
+ {
+ view = ViewUtil.getViewContainer(element);
+ return view;
+ }
+
+ if (element instanceof View)
+ {
+ view = (View)element;
+ }
+ else
+ {
+ view = DawnDiagramUpdater.findViewByContainer(element); // something which is not view (Edge or Node)
+ if (view == null)
+ {
+ view = DawnDiagramUpdater.findViewForModel(element, editor);
+ }
+ }
+ return view;
+ }
+
+ public static EditPart createOrFindEditPartIfViewExists(View view, DiagramDocumentEditor editor)
+ {
+ EditPart editPart = findEditPart(view, editor.getDiagramEditPart());
+
+ if (view != null)
+ {
+ if (editPart == null) // does not exist?
+ {
+ if (TRACER.isEnabled())
+ {
+ TRACER.format("EditPart does not exist for view {0} ", view); //$NON-NLS-1$
+ }
+ editPart = EditPartService.getInstance().createGraphicEditPart(view);
+ setParentEditPart(editor, view, editPart);
+ }
+ }
+ if (TRACER.isEnabled())
+ {
+ TRACER.format("Found EditPart: {0} ", editPart); //$NON-NLS-1$
+ }
+ return editPart;
+ }
+
+ public static void setParentEditPart(final DiagramDocumentEditor editor, View view, EditPart editPart)
+ {
+ View viewParent = (View)view.eContainer();
+ EditPart parentEditPart = findEditPart(viewParent, editor);
+ if (parentEditPart == null)
+ {
+ parentEditPart = editor.getDiagramEditPart();
+ }
+ editPart.setParent(parentEditPart);
+ }
+
+ public static EditPart findEditPart(View view, DiagramDocumentEditor dawnDiagramEditor)
+ {
+ DiagramEditPart diagramEditPart = dawnDiagramEditor.getDiagramEditPart();
+
+ for (Object e : diagramEditPart.getChildren())
+ {
+ EditPart ep = (EditPart)e;
+ if (ep.getModel().equals(view))
+ {
+ return ep;
+ }
+ }
+
+ for (Object e : diagramEditPart.getConnections())
+ {
+ EditPart ep = (EditPart)e;
+ if (ep.getModel().equals(view))
+ {
+ return ep;
+ }
+ }
+ return null;
+ }
+
+ public static EditPart findEditPart(View view, EditPart editPart)
+ {
+ EditPart ret;
+
+ if (editPart.getModel().equals(view))
+ {
+ return editPart;
+ }
+
+ for (Object o : editPart.getChildren())
+ {
+ EditPart child = (EditPart)o;
+ ret = findEditPart(view, child);
+ if (ret != null)
+ {
+ return ret;
+ }
+ }
+
+ if (editPart instanceof DiagramEditPart)
+ {
+ for (Object o : ((DiagramEditPart)editPart).getConnections())
+ {
+ EditPart child = (EditPart)o;
+ ret = findEditPart(view, child);
+ if (ret != null)
+ {
+ return ret;
+ }
+ }
+ }
+ return null;
+ }
+
+ public static EditPart findEditPart(View view, EditPartViewer viewer)
+ {
+ return (EditPart)viewer.getEditPartRegistry().get(view);
+ }
+
+ /**
+ * In a normal GMF environment the diagram is loaded from a xml resource. In this scenario the XMLHelper sets "null"
+ * to the element of edge. Thus the value is 'set' with a null value. We do not have this in our case because the
+ * element is carefully loaded from the CDO repository. But if the value is not set a getElement() call fills the
+ * element with the eContainer. See <b>org.eclipse.gmf.runtime.notation.impl.ViewImpl.isSetElement()</b>. This happens
+ * when the ConnectionEditPart is activated and the model registered. See
+ * <b>org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart.registerModel()</b>
+ * <p>
+ * In our scenario the Edges will be wrongly connected to the diagram itself, which makes the CanonicalEditingPolicy
+ * to remove and restore the edge. Long, short story, we must 'touch' the elements here to have the element set.
+ *
+ * @param diagram
+ */
+ public static void initializeElement(Diagram diagram)
+ {
+ for (Object obj : diagram.getEdges())
+ {
+ Edge edge = (Edge)obj;
+ if (!edge.isSetElement())
+ {
+ boolean eDeliver = edge.eDeliver();
+ edge.eSetDeliver(false);
+ edge.setElement(null);
+ edge.eSetDeliver(eDeliver);
+ }
+ }
+ }
+
+ public static View findViewFromCrossReferences(EObject element)
+ {
+ CrossReferenceAdapter crossreferenceAdapter = (CrossReferenceAdapter)ECrossReferenceAdapter
+ .getCrossReferenceAdapter(element);// getCrossReferenceAdapter(element);
+ if (crossreferenceAdapter != null)
+ {
+ Collection<?> iinverseReferences = crossreferenceAdapter.getInverseReferencers(element,
+ NotationPackage.eINSTANCE.getView_Element(), null);
+
+ for (Object f : iinverseReferences)
+ {
+ if (f instanceof View)
+ {
+ return (View)f;
+ }
+ }
+ }
+ return null;
+ }
+
+ public static View findView(EObject element)
+ {
+ View view = DawnDiagramUpdater.findViewByContainer(element);
+
+ if (view == null)
+ {
+ view = DawnDiagramUpdater.findViewFromCrossReferences(element);
+ }
+ return view;
+ }
+}

Back to the top