blob: c056dd18e5ef0cb6564e992209ffbb071da9fb03 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2014, 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:
* Patrick Tessier (CEA LIST) patrick.tessier@cea.fr - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.revision.tool.ui;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.DifferenceKind;
import org.eclipse.emf.compare.ReferenceChange;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
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.GraphicalEditPart;
import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx;
import org.eclipse.papyrus.infra.core.services.ServiceException;
import org.eclipse.papyrus.infra.ui.editor.IMultiDiagramEditor;
import org.eclipse.papyrus.revision.tool.core.ReviewResourceManager;
import org.eclipse.papyrus.uml.diagram.common.part.UmlGmfDiagramEditor;
/**
* This class is used to add figures in current diagrams for remove add or set during the revision mode.
*
*/
public class RevisonDiagLayer {
/**
* constructor
* @param reviewResourceManager
*/
public void run(ReviewResourceManager reviewResourceManager){
IMultiDiagramEditor multiDiagramEditor=null;
try {
multiDiagramEditor = reviewResourceManager.getServiceRegistry().getService(IMultiDiagramEditor.class);
} catch (ServiceException e) {
e.printStackTrace();
}
UmlGmfDiagramEditor diagramEditor = (UmlGmfDiagramEditor)multiDiagramEditor.getActiveEditor();
DiagramEditPart diagramEditPart = (DiagramEditPart)diagramEditor.getAdapter(DiagramEditPart.class);
updateEditpart(reviewResourceManager, diagramEditPart);
}
/**
* update edipart
* @param reviewResourceManager
* @param editPart
*/
protected void updateEditpart(ReviewResourceManager reviewResourceManager,
EditPart editPart) {
for (Object subEditPart : editPart.getChildren()) {
if( subEditPart instanceof GraphicalEditPart){
EObject semanticEObject=((GraphicalEditPart)subEditPart).resolveSemanticElement();
IFigure fig=((GraphicalEditPart) subEditPart).getFigure();
if( !(subEditPart instanceof CompartmentEditPart)){
updateFigures(reviewResourceManager, subEditPart, semanticEObject,fig);
}
updateEditpart(reviewResourceManager,(GraphicalEditPart) subEditPart);
}
}
if( editPart instanceof DiagramEditPart){
for (Object connetionEditPart :((DiagramEditPart) editPart).getConnections()) {
if( connetionEditPart instanceof ConnectionEditPart){
EObject semanticEObject=((ConnectionEditPart)connetionEditPart).resolveSemanticElement();
IFigure fig=((ConnectionEditPart) connetionEditPart).getFigure();
updateFigures(reviewResourceManager, connetionEditPart, semanticEObject, fig);
}
}
}
}
protected void updateFigures(ReviewResourceManager reviewResourceManager,
Object editPart, EObject semanticEObject, IFigure fig) {
Comparison comparison=reviewResourceManager.getDiffModel();
RemovedFig removedFig=null;
AddingFig addingFig=null;
SetFig setFig=null;
for (Object subFig : fig.getChildren()) {
if(subFig instanceof RemovedFig){
removedFig=(RemovedFig)subFig;
}
if(subFig instanceof AddingFig){
addingFig=(AddingFig)subFig;
}
if(subFig instanceof SetFig){
setFig=(SetFig)subFig;
}
}
if(comparison.getMatch(semanticEObject)!=null){
if(setFig==null){
setFig= new SetFig("Bob");
fig.add(setFig);
}
setFigurePosition(editPart, fig, setFig);
}
else{
if(setFig!=null){
fig.remove(setFig);
}
}
if(comparison.getDifferences(semanticEObject).size()>0){
Diff diff=comparison.getDifferences(semanticEObject).get(0);
if(diff.getKind().equals(DifferenceKind.DELETE)&&isChangeAboutContaiment(comparison, semanticEObject)){
if(removedFig==null){
removedFig= new RemovedFig();
fig.add(removedFig);
}
setFigurePosition(editPart, fig, removedFig);
}
else if(diff.getKind().equals(DifferenceKind.ADD)&& isChangeAboutContaiment(comparison, semanticEObject)){
if(addingFig==null){
addingFig= new AddingFig();
fig.add(addingFig);
}
setFigurePosition(editPart, fig, addingFig);
}
else{
if(removedFig!=null){
fig.remove(removedFig);
}
if(addingFig!=null){
fig.remove(addingFig);
}
}
}
else{
if(removedFig!=null){
fig.remove(removedFig);
}
if(addingFig!=null){
fig.remove(addingFig);
}
}
}
protected boolean isChangeAboutContaiment(Comparison comparison, EObject element){
if(comparison.getDifferences(element).get(0) instanceof ReferenceChange){
ReferenceChange refChange=(ReferenceChange)comparison.getDifferences(element).get(0);
if( refChange.getReference().isContainment()){
return true;
}
}
return false;
}
protected void setFigurePosition(Object editPart, IFigure fig, IFigure addingFig) {
if(fig instanceof PolylineConnectionEx){
Rectangle rect = new Rectangle(((PolylineConnectionEx)fig).getPoints().getFirstPoint(), ((PolylineConnectionEx)fig).getPoints().getLastPoint());
if(rect.x==0 &&rect.y==0){
if(editPart instanceof ConnectionEditPart){
rect=((GraphicalEditPart)((ConnectionEditPart)editPart).getSource()).getFigure().getBounds().getCopy();
rect=rect.getUnion(((GraphicalEditPart)((ConnectionEditPart)editPart).getTarget()).getFigure().getBounds());
}
}
addingFig.setBounds(rect);
}
else{
addingFig.setBounds(fig.getBounds());}
}
}