Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramMergeViewer.java')
-rw-r--r--plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramMergeViewer.java439
1 files changed, 181 insertions, 258 deletions
diff --git a/plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramMergeViewer.java b/plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramMergeViewer.java
index 2ca90cc4a..e65769499 100644
--- a/plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramMergeViewer.java
+++ b/plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramMergeViewer.java
@@ -10,155 +10,210 @@
*******************************************************************************/
package org.eclipse.emf.compare.diagram.ide.ui.internal.contentmergeviewer.diagram;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.compare.Diff;
-import org.eclipse.emf.compare.DifferenceKind;
-import org.eclipse.emf.compare.diagram.DiagramDiff;
-import org.eclipse.emf.compare.diagram.EdgeChange;
-import org.eclipse.emf.compare.diagram.Hide;
-import org.eclipse.emf.compare.diagram.LabelChange;
-import org.eclipse.emf.compare.diagram.NodeChange;
-import org.eclipse.emf.compare.diagram.Show;
-import org.eclipse.emf.compare.diagram.ide.ui.AbstractGraphicalMergeViewer;
-import org.eclipse.emf.compare.diagram.ide.ui.decoration.DiffDecorationEditPolicy;
-import org.eclipse.emf.compare.diagram.ide.ui.decoration.provider.DiffDecoratorProvider;
-import org.eclipse.emf.compare.diagram.ide.ui.decoration.provider.SelectedDiffAdapter;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.emf.compare.diagram.ide.ui.internal.AbstractGraphicalMergeViewer;
+import org.eclipse.emf.compare.diagram.ide.ui.internal.accessor.IDiagramDiffAccessor;
import org.eclipse.emf.compare.diagram.ide.ui.internal.accessor.IDiagramNodeAccessor;
-import org.eclipse.emf.compare.diagram.util.DiagramCompareSwitch;
-import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
-import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gef.EditDomain;
import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.MouseWheelHandler;
import org.eclipse.gef.MouseWheelZoomHandler;
+import org.eclipse.gef.SelectionManager;
import org.eclipse.gef.editparts.ZoomManager;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
+import org.eclipse.gef.ui.parts.DomainEventDispatcher;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramRootEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramCommandStack;
+import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain;
import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramGraphicalViewer;
import org.eclipse.gmf.runtime.diagram.ui.services.editpart.EditPartService;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/**
+ * The graphical viewer on each side of the compare viewer.
+ *
* @author <a href="mailto:cedric.notot@obeo.fr">Cedric Notot</a>
*/
class DiagramMergeViewer extends AbstractGraphicalMergeViewer {
- private IDiagramNodeAccessor fInput;
+ /**
+ * Selection manager to forbid manual selections on graphical objects.
+ *
+ * @author <a href="mailto:cedric.notot@obeo.fr">Cedric Notot</a>
+ */
+ protected class NonEditingManager extends SelectionManager {
+
+ @Override
+ public void appendSelection(EditPart editpart) {
+ // needed to disable manual selection on every objects.
+ }
+ }
+
+ /**
+ * Event dispatcher to forbid external mouse actions on diagrams.
+ *
+ * @author <a href="mailto:cedric.notot@obeo.fr">Cedric Notot</a>
+ */
+ protected class NonEditingEventDispatcher extends DomainEventDispatcher {
+
+ /**
+ * Constructor.
+ *
+ * @param d
+ * The edit domain.
+ * @param v
+ * The edit part viewer.
+ */
+ public NonEditingEventDispatcher(EditDomain d, EditPartViewer v) {
+ super(d, v);
+ }
+
+ @Override
+ public void dispatchMousePressed(MouseEvent me) {
+ // needed not to get a change of the cursor releasing from a connector.
+ }
+
+ @Override
+ public void dispatchMouseReleased(MouseEvent me) {
+ // needed not to get a change of the cursor releasing from a connector.
+ }
- private DiagramGraphicalViewer fGraphicalViewer;
+ @Override
+ public void dispatchMouseDoubleClicked(MouseEvent me) {
+ // needed not to get a change of the cursor double-clicking on a connector.
+ }
+
+ @Override
+ public void dispatchMouseHover(MouseEvent me) {
+ // needed not to get a change of the cursor hovering a connector.
+ }
+
+ @Override
+ public void dispatchMouseMoved(MouseEvent me) {
+ // needed not to get a change of the cursor hovering a connector.
+ }
+
+ }
/** the zoom factor of displayed diagrams. */
private static final double ZOOM_FACTOR = 1;
+ /** The graphical viewer. */
+ private DiagramGraphicalViewerForCompare fGraphicalViewer;
+
/** the current diagram used. */
private Diagram currentDiag;
+ /** The diagram edit domain. */
+ private DiagramEditDomain editDomain;
+
/**
+ * Constructor.
+ *
* @param parent
+ * The parent composite.
+ * @param side
+ * The side having to be managed by this viewer.
*/
public DiagramMergeViewer(Composite parent, MergeViewerSide side) {
super(parent, side);
+ ((FigureCanvas)fGraphicalViewer.getControl()).getLightweightSystem().setEventDispatcher(
+ new NonEditingEventDispatcher(editDomain, fGraphicalViewer));
}
/**
* {@inheritDoc}
*
- * @see org.eclipse.emf.compare.rcp.ui.mergeviewer.MergeViewer#createControl(org.eclipse.swt.widgets.Composite)
+ * @see org.eclipse.emf.compare.diagram.ide.ui.internal.AbstractGraphicalMergeViewer#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public Control createControl(Composite parent) {
+ editDomain = new DiagramEditDomain(null);
+ editDomain.setCommandStack(new DiagramCommandStack(editDomain));
createDiagramGraphicalViewer(parent);
return fGraphicalViewer.getControl();
}
+ /**
+ * It creates and initialize the graphical viewer.
+ *
+ * @param composite
+ * The composite.
+ */
private void createDiagramGraphicalViewer(Composite composite) {
- fGraphicalViewer = new DiagramGraphicalViewer();
+ fGraphicalViewer = new DiagramGraphicalViewerForCompare();
fGraphicalViewer.createControl(composite);
fGraphicalViewer.setEditDomain(editDomain);
fGraphicalViewer.setEditPartFactory(EditPartService.getInstance());
fGraphicalViewer.getControl().setBackground(ColorConstants.listBackground);
fGraphicalViewer.setProperty(MouseWheelHandler.KeyGenerator.getKey(SWT.CTRL),
MouseWheelZoomHandler.SINGLETON);
+
+ fGraphicalViewer.setSelectionManager(new NonEditingManager());
}
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.diagram.ide.ui.internal.AbstractGraphicalMergeViewer#getGraphicalViewer()
+ */
@Override
- public DiagramGraphicalViewer getGraphicalViewer() {
+ public DiagramGraphicalViewerForCompare getGraphicalViewer() {
return fGraphicalViewer;
}
- private void installDecoratorPolicy(EditPart editPart) {
- editPart.removeEditPolicy(EditPolicyRoles.DECORATION_ROLE);
- editPart.installEditPolicy(EditPolicyRoles.DECORATION_ROLE, new DiffDecorationEditPolicy());
- }
-
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.diagram.ide.ui.AbstractEditPartMergeViewer#setInput(java.lang.Object)
+ */
@Override
public void setInput(final Object input) {
if (input instanceof IDiagramNodeAccessor) {
- fInput = (IDiagramNodeAccessor)input;
Diagram diagram = ((IDiagramNodeAccessor)input).getOwnedDiagram();
- View view = ((IDiagramNodeAccessor)input).getOwnedView();
-
initEditingDomain(diagram);
-
- if (diagram != null) {
- Iterator<EObject> contents = diagram.eAllContents();
- while (contents.hasNext()) {
- EObject obj = contents.next();
- if (obj instanceof View) {
- for (Diff diff : ((IDiagramNodeAccessor)input).getComparison().getDifferences(obj)) {
- if (diff instanceof DiagramDiff) {
- if (diff.getKind() != DifferenceKind.DELETE) {
- obj.eAdapters().add(new SelectedDiffAdapter((DiagramDiff)diff));
- EditPart editPart = getEditPart((View)obj);
- if (editPart != null) {
- installDecoratorPolicy(editPart);
- editPart.refresh();
- }
- }
- }
- }
- }
- }
+ EditPart editPart = null;
+ View view = ((IDiagramNodeAccessor)input).getOwnedView();
+ if (view != null) {
+ editPart = getEditPart(view);
}
-
- // Selection
fGraphicalViewer.deselectAll();
- if (view != null) {
-
- EditPart viewPart = getEditPart(view);
-
- if (viewPart != null) {
-
- while (!viewPart.isSelectable()) {
- viewPart = viewPart.getParent();
- }
-
- setSelection(new StructuredSelection(viewPart));
- getGraphicalViewer().reveal(viewPart);
-
+ // Selection only on matches.
+ if (!(input instanceof IDiagramDiffAccessor) && editPart != null) {
+ while (editPart != null && !editPart.isSelectable()) {
+ editPart = editPart.getParent();
}
+ if (editPart != null) {
+ setSelection(new StructuredSelection(editPart));
+ fGraphicalViewer.reveal(editPart);
+ }
}
+
}
}
+ /**
+ * It creates an editing domain for this diagram.
+ *
+ * @param diagram
+ * The diagram.
+ */
private void initEditingDomain(Diagram diagram) {
ResourceSet resourceSet = null;
if (diagram != null) {
@@ -170,23 +225,21 @@ class DiagramMergeViewer extends AbstractGraphicalMergeViewer {
}
}
- public Object getInput() {
- return fInput;
- }
-
- public EditPart findObjectAtExcluding(Point location, Collection exclusionSet, Conditional conditional) {
- // TODO Auto-generated method stub
- return null;
- }
-
- public EditPart getEditPart(final View view) {
+ /**
+ * Get the editpart from the given view.
+ *
+ * @param view
+ * The view.
+ * @return The editpart.
+ */
+ public EditPart getEditPart(final EObject view) {
final EditPart editPart = (EditPart)fGraphicalViewer.getEditPartRegistry().get(view);
if (editPart == null) {
Diagram diagram = null;
if (view instanceof Diagram) {
diagram = (Diagram)view;
- } else {
- diagram = view.getDiagram();
+ } else if (view instanceof View) {
+ diagram = ((View)view).getDiagram();
}
if (diagram != null && !diagram.equals(currentDiag)) {
currentDiag = diagram;
@@ -194,206 +247,76 @@ class DiagramMergeViewer extends AbstractGraphicalMergeViewer {
final DiagramRootEditPart rootEditPart = new DiagramRootEditPart(diagram.getMeasurementUnit());
fGraphicalViewer.setRootEditPart(rootEditPart);
fGraphicalViewer.setContents(diagram);
- disableEditMode((DiagramEditPart)fGraphicalViewer.getContents());
rootEditPart.getZoomManager().setZoomAnimationStyle(ZoomManager.ANIMATE_NEVER);
rootEditPart.getZoomManager().setZoom(ZOOM_FACTOR);
+
}
}
return (EditPart)fGraphicalViewer.getEditPartRegistry().get(view);
}
- public EditPart findEditPart(final EObject eobj) {
- // check viewer
- if (eobj instanceof View) {
- final Diagram d = ((View)eobj).getDiagram();
- checkAndDisplayDiagram(d);
- }
- return (EditPart)fGraphicalViewer.getEditPartRegistry().get(eobj);
- }
-
- private void checkAndDisplayDiagram(final Diagram d) {
- if (d != null && !d.equals(currentDiag)) {
- currentDiag = d;
- displayDiagram(d);
- }
- }
-
- protected final void displayDiagram(final Diagram diag) {
- if (diag == null) {
- return;
- }
- currentDiag = diag;
- // be sure the viewer will be correctly refreshed ( connections )
- fGraphicalViewer.getEditPartRegistry().clear();
- final DiagramRootEditPart rootEditPart = new DiagramRootEditPart(diag.getMeasurementUnit());
- fGraphicalViewer.setRootEditPart(rootEditPart);
- fGraphicalViewer.setContents(diag);
- disableEditMode((DiagramEditPart)fGraphicalViewer.getContents());
- rootEditPart.getZoomManager().setZoomAnimationStyle(ZoomManager.ANIMATE_NEVER);
- rootEditPart.getZoomManager().setZoom(ZOOM_FACTOR);
- }
-
- private void disableEditMode(DiagramEditPart diagEditPart) {
- diagEditPart.disableEditMode();
- for (Object obj : diagEditPart.getPrimaryEditParts()) {
- if (obj instanceof IGraphicalEditPart) {
- disableEditMode((IGraphicalEditPart)obj);
- }
- }
- }
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.jface.viewers.Viewer#refresh()
+ */
+ @Override
+ public void refresh() {
- private void disableEditMode(IGraphicalEditPart obj) {
- obj.disableEditMode();
- obj.removeEditPolicy(EditPolicyRoles.OPEN_ROLE);
- for (Object child : obj.getChildren()) {
- if (child instanceof IGraphicalEditPart) {
- disableEditMode((IGraphicalEditPart)child);
- }
- }
}
/**
- * Inner class for visit dagramDiffs.
+ * {@link DiagramGraphicalViewer} which enables to make a reveal on a given figure, without editpart.
*
- * @author <a href="mailto:stephane.bouchet@obeo.fr">Stephane Bouchet</a>
+ * @author <a href="mailto:cedric.notot@obeo.fr">Cedric Notot</a>
*/
- private class DiagramdiffSwitchVisitor extends DiagramCompareSwitch<IStatus> {
-
- private View view;
-
- private boolean annotate;
-
- public DiagramdiffSwitchVisitor(View view, boolean annotate) {
- this.view = view;
- this.annotate = annotate;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.diagram.diagramdiff.util.DiagramdiffSwitch#caseDiagramLabelChange(org.eclipse.emf.compare.diagram.diagramdiff.DiagramLabelChange)
- */
- @Override
- public IStatus caseLabelChange(LabelChange diff) {
- return checkResult(annotateNotation(view, DiffDecoratorProvider.DIFF_LABEL_MODIFIED));
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.diagram.diagramdiff.util.DiagramdiffSwitch#caseDiagramShowElement(org.eclipse.emf.compare.diagram.diagramdiff.DiagramShowElement)
- */
- @Override
- public IStatus caseShow(Show diff) {
- return checkResult(annotateNotation(view, DiffDecoratorProvider.DIFF_SHOWED));
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.diagram.diagramdiff.util.DiagramdiffSwitch#caseDiagramHideElement(org.eclipse.emf.compare.diagram.diagramdiff.DiagramHideElement)
- */
- @Override
- public IStatus caseHide(Hide diff) {
- return checkResult(annotateNotation(view, DiffDecoratorProvider.DIFF_SHOWED));
- }
+ public class DiagramGraphicalViewerForCompare extends DiagramGraphicalViewer {
/**
- * {@inheritDoc}
+ * It reveals the given figure. It is a partial copy of
+ * {@link DiagramGraphicalViewer#reveal(EditPart)}.<br>
+ * FIXME: Find a better solution to make the reveal.
*
- * @see org.eclipse.emf.compare.diagram.diagramdiff.util.DiagramdiffSwitch#caseDiagramMoveNode(org.eclipse.emf.compare.diagram.diagramdiff.DiagramMoveNode)
+ * @param figure
+ * The figure.
*/
- @Override
- public IStatus caseNodeChange(NodeChange diff) {
- boolean result = true;
- if (diff.getKind() == DifferenceKind.MOVE) {
- return checkResult(annotateNotation(view, DiffDecoratorProvider.DIFF_MOVED));
- } else if (diff.getKind() == DifferenceKind.ADD) {
- return checkResult(annotateNotation(view, DiffDecoratorProvider.DIFF_ADDED));
- } else if (diff.getKind() == DifferenceKind.DELETE) {
- return checkResult(annotateNotation(view, DiffDecoratorProvider.DIFF_REMOVED));
+ public void reveal(IFigure figure) {
+ IFigure target = figure;
+ Viewport port = getFigureCanvas().getViewport();
+ Rectangle exposeRegion = target.getBounds().getCopy();
+ target = target.getParent();
+ while (target != null && target != port) {
+ target.translateToParent(exposeRegion);
+ target = target.getParent();
}
- return checkResult(result);
- }
+ exposeRegion.expand(5, 5);
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.diagram.diagramdiff.util.DiagramdiffSwitch#caseDiagramEdgeChange(org.eclipse.emf.compare.diagram.diagramdiff.DiagramEdgeChange)
- */
- @Override
- public IStatus caseEdgeChange(EdgeChange diff) {
- return checkResult(annotateNotation(view, DiffDecoratorProvider.DIFF_MOVED));
- }
+ Dimension viewportSize = port.getClientArea().getSize();
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.diagram.diagramdiff.util.DiagramdiffSwitch#defaultCase(org.eclipse.emf.ecore.EObject)
- */
- @Override
- public IStatus defaultCase(EObject diff) {
- // we don't care about generic diffs
- return Status.OK_STATUS;
- }
-
- /**
- * Set the given annotation to the given notation element.
- *
- * @param element
- * the notation element to annotate
- * @param annotation
- * the diff annotation
- * @return true if annotation has been added to the view
- */
- protected boolean annotateNotation(View element, String annotation) {
- boolean result = false;
- if (annotate) {
- EAnnotation diffAnnotation = null;
- if (element.getEAnnotation(DiffDecoratorProvider.DIFF) == null) {
- diffAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
- diffAnnotation.setSource(DiffDecoratorProvider.DIFF);
- result = element.getEAnnotations().add(diffAnnotation);
- } else {
- diffAnnotation = element.getEAnnotation(DiffDecoratorProvider.DIFF);
- }
- // FIXME should this string be externalized?
- diffAnnotation.getDetails().put(annotation, "diffDetail"); //$NON-NLS-1$
- result = true;
+ Point topLeft = exposeRegion.getTopLeft();
+ Point bottomRight = exposeRegion.getBottomRight().translate(viewportSize.getNegated());
+ Point finalLocation = new Point();
+ if (viewportSize.width < exposeRegion.width) {
+ finalLocation.x = Math.min(bottomRight.x, Math.max(topLeft.x, port.getViewLocation().x));
} else {
- if (element.getEAnnotation(DiffDecoratorProvider.DIFF) != null) {
- final EAnnotation diffAnnotation = element.getEAnnotation(DiffDecoratorProvider.DIFF);
- result = element.getEAnnotations().remove(diffAnnotation);
- }
+ finalLocation.x = Math.min(topLeft.x, Math.max(bottomRight.x, port.getViewLocation().x));
}
- return result;
- }
- /**
- * Utility method to transform a boolean result into status.
- *
- * @param ok
- * the boolean state
- * @return a status corresponding to the state of the boolean
- */
- protected IStatus checkResult(boolean ok) {
- if (ok) {
- return Status.OK_STATUS;
+ if (viewportSize.height < exposeRegion.height) {
+ finalLocation.y = Math.min(bottomRight.y, Math.max(topLeft.y, port.getViewLocation().y));
+ } else {
+ finalLocation.y = Math.min(topLeft.y, Math.max(bottomRight.y, port.getViewLocation().y));
}
- return Status.CANCEL_STATUS;
- }
- }
+ getFigureCanvas().scrollSmoothTo(finalLocation.x, finalLocation.y);
- private boolean hasSelectedDiffAdapter(View view) {
- Iterator<Adapter> adapters = view.eAdapters().iterator();
- while (adapters.hasNext()) {
- Adapter adapter = adapters.next();
- if (adapter.isAdapterForType(DiagramDiff.class)) {
- return true;
- }
}
- return false;
+
+ @Override
+ protected DomainEventDispatcher getEventDispatcher() {
+ return new NonEditingEventDispatcher(editDomain, this);
+ }
+
}
}

Back to the top