/*******************************************************************************
* Copyright (c) 2010-2015 Henshin developers. 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:
* TU Berlin, University of Luxembourg, SES S.A.
*******************************************************************************/
package de.tub.tfs.henshin.tggeditor.editparts.rule;
import java.util.ArrayList;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.henshin.model.Edge;
import org.eclipse.emf.henshin.model.HenshinPackage;
import org.eclipse.gef.EditPolicy;
import org.eclipse.swt.graphics.Color;
import de.tub.tfs.henshin.tgg.TEdge;
import de.tub.tfs.henshin.tgg.TggPackage;
import de.tub.tfs.henshin.tgg.interpreter.util.RuleUtil;
import de.tub.tfs.henshin.tggeditor.editparts.graphical.EdgeEditPart;
import de.tub.tfs.henshin.tggeditor.editparts.graphical.RuleObjectTextWithMarker;
import de.tub.tfs.henshin.tggeditor.editpolicies.graphical.EdgeEndpointEditPartPolicy;
import de.tub.tfs.henshin.tggeditor.editpolicies.rule.RuleEdgeComponentEditPolicy;
import de.tub.tfs.henshin.tggeditor.editpolicies.rule.RuleEdgeXYLayoutEditPolicy;
import de.tub.tfs.henshin.tggeditor.ui.TGGEditorConstants;
import de.tub.tfs.henshin.tggeditor.util.EdgeUtil;
import de.tub.tfs.muvitor.commands.SimpleDeleteEObjectCommand;
/**
* The EdgeEditPart class of rules.
*/
public class RuleEdgeEditPart extends EdgeEditPart {
// /** the layout model of edge */
// private EdgeLayout layoutModel;
/** The edge of the RHS. */
protected Edge rhsEdge;
protected Color markerBG_Color= new Color(null,232,250,238);
/**
* Instantiates a new rule edge edit part.
*
* @param model the model
*/
public RuleEdgeEditPart(Edge model) {
super(model);
EdgeUtil.refreshIsMarked(model);
rhsEdge = model;
cleanUpRule();
}
@Override
protected void createMarker() {
labelWithMarker=new RuleObjectTextWithMarker(TGGEditorConstants.FG_STANDARD_COLOR);
}
@Override
public void notifyChanged(Notification notification) {
if (!this.isActive())
return;
if (notification.getNotifier() instanceof Edge) {
int featureId = notification.getFeatureID(HenshinPackage.class);
switch (featureId) {
case -1:
refreshSourceAnchor();
refreshTargetAnchor();
refreshSourceConnections();
refreshTargetConnections();
refreshVisuals();
return;
case HenshinPackage.EDGE__TARGET:
case HenshinPackage.EDGE__SOURCE:
case HenshinPackage.EDGE__TYPE:
case HenshinPackage.EDGE__GRAPH:
refreshVisuals();
return;
case TggPackage.TEDGE__MARKER_TYPE: // is always triggered by above case
refreshVisuals();
return;
}
if (featureId == 7)
refreshVisuals();
}
}
@Override
protected void createEditPolicies() {
installEditPolicy(EditPolicy.CONNECTION_ROLE, new RuleEdgeComponentEditPolicy());
installEditPolicy(EditPolicy.LAYOUT_ROLE, new RuleEdgeXYLayoutEditPolicy());
installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new EdgeEndpointEditPartPolicy());
}
@Override
protected void performOpen() {
// TODO Auto-generated method stub
//super.performOpen();
}
private void cleanUpRule() {
// remove edge duplicates in LHS
ArrayList<Edge> lhsEdgesList = RuleUtil
.getAllLHSEdges(rhsEdge);
// remove duplicates
while (lhsEdgesList.size() > 1) {
Edge lhsEdge = lhsEdgesList.get(0);
lhsEdgesList.remove(0);
// If getGraph is null (i.e., no parent reference available), then SimpleDeleteEObjectCommand
// can't execute and throws and ugly exception...
if(lhsEdge.getGraph()!=null)
{
SimpleDeleteEObjectCommand cmd = new SimpleDeleteEObjectCommand(lhsEdge);
cmd.execute();
}
else // ...in that case remove the edge directly.
{
rhsEdge.getGraph().getRule().getLhs().getEdges().remove(lhsEdge);
}
}
// remove lhs edge, if rule creates the edge
if( ((TEdge) rhsEdge).getMarkerType()!=null
&& ((TEdge) rhsEdge).getMarkerType().equals(RuleUtil.NEW)){
if (lhsEdgesList.size()==1)
{
Edge lhsEdge = lhsEdgesList.get(0);
lhsEdgesList.remove(0);
if(lhsEdge.getGraph()!=null){
SimpleDeleteEObjectCommand cmd = new SimpleDeleteEObjectCommand(lhsEdge);
cmd.execute();
}
else {// parent reference of node is missing, thus remove it directly
rhsEdge.getGraph().getRule().getLhs().getEdges().remove(lhsEdge);
}
}
}
}
}