blob: 0fecee1a1ca2e23bc12d551edac06990fe4db8dd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018, 2020 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.compare.diagram.ide.ui.sirius.internal;
import java.util.LinkedHashSet;
import java.util.Optional;
import java.util.Set;
import org.eclipse.emf.compare.diagram.ide.ui.internal.accessor.IDiagramNodeAccessor;
import org.eclipse.emf.compare.diagram.ide.ui.internal.contentmergeviewer.diagram.DiagramContentMergeViewer;
import org.eclipse.emf.compare.diagram.ide.ui.sirius.internal.tools.actions.SiriusComparisonAsImageFileAction;
import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.sirius.diagram.DDiagram;
import org.eclipse.sirius.diagram.business.api.componentization.DiagramDescriptionMappingsManager;
import org.eclipse.sirius.diagram.business.api.componentization.DiagramDescriptionMappingsRegistry;
import org.eclipse.sirius.diagram.business.api.componentization.DiagramMappingsManager;
import org.eclipse.sirius.diagram.business.api.componentization.DiagramMappingsManagerRegistry;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.widgets.Composite;
/**
* Specialized {@link org.eclipse.compare.contentmergeviewer.ContentMergeViewer} used to display Sirius
* diagram comparison.
*
* @author <a href="mailto:laurent.goubet@obeo.fr">Laurent Goubet</a>
*/
public class SiriusContentMergeViewer extends DiagramContentMergeViewer {
private Set<DiagramMappingsManager> siriusMappingManagers = new LinkedHashSet<>();
private Set<DiagramDescriptionMappingsManager> siriusDescriptionMappingManagers = new LinkedHashSet<>();
/**
* Default constructor.
*
* @see org.eclipse.emf.compare.diagram.ide.ui.internal.contentmergeviewer.diagram.DiagramContentMergeViewer#DiagramContentMergeViewer(Composite,
* EMFCompareConfiguration)
* @param parent
* the parent composite to build the UI in.
* @param config
* the {@link EMFCompareConfiguration}.
*/
public SiriusContentMergeViewer(Composite parent, EMFCompareConfiguration config) {
super(parent, config);
}
/**
* {@inheritDoc}
*/
@Override
protected void updateContent(Object ancestor, Object left, Object right) {
super.updateContent(ancestor, left, right);
getSiriusDiagram(ancestor).ifPresent(this::storeManagers);
getSiriusDiagram(left).ifPresent(this::storeManagers);
getSiriusDiagram(right).ifPresent(this::storeManagers);
}
/**
* {@inheritDoc}
*/
@Override
protected void handleDispose(DisposeEvent event) {
super.handleDispose(event);
for (DiagramMappingsManager manager : siriusMappingManagers) {
DiagramMappingsManagerRegistry.INSTANCE.removeDiagramMappingsManagers(manager);
}
for (DiagramDescriptionMappingsManager manager : siriusDescriptionMappingManagers) {
manager.dispose();
}
siriusMappingManagers.clear();
siriusDescriptionMappingManagers.clear();
}
private Optional<DDiagram> getSiriusDiagram(Object accessor) {
if (accessor instanceof IDiagramNodeAccessor) {
Diagram gmfDiagram = ((IDiagramNodeAccessor)accessor).getOwnedDiagram();
if (gmfDiagram != null) {
return Optional.ofNullable((DDiagram)gmfDiagram.getElement());
}
}
return Optional.empty();
}
private void storeManagers(DDiagram diagram) {
siriusMappingManagers
.add(DiagramMappingsManagerRegistry.INSTANCE.getDiagramMappingsManager(null, diagram));
siriusDescriptionMappingManagers.add(DiagramDescriptionMappingsRegistry.INSTANCE
.getDiagramDescriptionMappingsManager(null, diagram.getDescription()));
}
/**
* {@inheritDoc}
*/
@Override
protected void createToolItems(ToolBarManager toolBarManager) {
super.createToolItems(toolBarManager);
SiriusComparisonAsImageFileAction saveAsImageFileAction = new SiriusComparisonAsImageFileAction(this);
toolBarManager.insert(0, new ActionContributionItem(saveAsImageFileAction));
}
}