[ui.behavior] fixed inheritance computation + fixed inherited
bendpoints

Change-Id: Ie4c464031bd3f5819ab0d505d1ad1b561d2c832e
diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/AbstractFSMProviderDispatcher.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/AbstractFSMProviderDispatcher.java
index 44c3e4b..1b231a1 100644
--- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/AbstractFSMProviderDispatcher.java
+++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/AbstractFSMProviderDispatcher.java
@@ -27,27 +27,35 @@
 import org.eclipse.etrice.ui.behavior.fsm.provider.IInjectorProvider;
 import org.eclipse.etrice.ui.common.base.support.CantDeleteFeature;
 import org.eclipse.etrice.ui.common.base.support.CantRemoveFeature;
-import org.eclipse.etrice.ui.common.base.support.RemoveBendpointsFeature;
 import org.eclipse.graphiti.dt.IDiagramTypeProvider;
+import org.eclipse.graphiti.features.IAddBendpointFeature;
 import org.eclipse.graphiti.features.IAddFeature;
 import org.eclipse.graphiti.features.ICreateConnectionFeature;
 import org.eclipse.graphiti.features.ICreateFeature;
 import org.eclipse.graphiti.features.IDeleteFeature;
 import org.eclipse.graphiti.features.IFeatureProvider;
 import org.eclipse.graphiti.features.ILayoutFeature;
+import org.eclipse.graphiti.features.IMoveBendpointFeature;
+import org.eclipse.graphiti.features.IMoveConnectionDecoratorFeature;
 import org.eclipse.graphiti.features.IMoveShapeFeature;
 import org.eclipse.graphiti.features.IReconnectionFeature;
+import org.eclipse.graphiti.features.IRemoveBendpointFeature;
 import org.eclipse.graphiti.features.IRemoveFeature;
 import org.eclipse.graphiti.features.IResizeShapeFeature;
 import org.eclipse.graphiti.features.IUpdateFeature;
+import org.eclipse.graphiti.features.context.IAddBendpointContext;
 import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.features.context.IBendpointContext;
 import org.eclipse.graphiti.features.context.ICustomContext;
 import org.eclipse.graphiti.features.context.IDeleteContext;
 import org.eclipse.graphiti.features.context.IDoubleClickContext;
 import org.eclipse.graphiti.features.context.ILayoutContext;
+import org.eclipse.graphiti.features.context.IMoveBendpointContext;
+import org.eclipse.graphiti.features.context.IMoveConnectionDecoratorContext;
 import org.eclipse.graphiti.features.context.IMoveShapeContext;
 import org.eclipse.graphiti.features.context.IPictogramElementContext;
 import org.eclipse.graphiti.features.context.IReconnectionContext;
+import org.eclipse.graphiti.features.context.IRemoveBendpointContext;
 import org.eclipse.graphiti.features.context.IRemoveContext;
 import org.eclipse.graphiti.features.context.IResizeShapeContext;
 import org.eclipse.graphiti.features.context.IUpdateContext;
@@ -57,7 +65,6 @@
 import org.eclipse.graphiti.mm.pictograms.ConnectionDecorator;
 import org.eclipse.graphiti.mm.pictograms.ContainerShape;
 import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.graphiti.mm.pictograms.FreeFormConnection;
 import org.eclipse.graphiti.mm.pictograms.PictogramElement;
 import org.eclipse.graphiti.mm.pictograms.Shape;
 import org.eclipse.graphiti.tb.DefaultToolBehaviorProvider;
@@ -328,6 +335,43 @@
 		}
 		
 		@Override
+		public IAddBendpointFeature getAddBendpointFeature(IAddBendpointContext context) {
+			IFeatureProvider fp = getFeatureProvider(context);
+			if (fp!=null)
+				return fp.getAddBendpointFeature(context);
+			else
+				return super.getAddBendpointFeature(context);
+		}
+		
+		@Override
+		public IMoveBendpointFeature getMoveBendpointFeature(IMoveBendpointContext context) {
+			IFeatureProvider fp = getFeatureProvider(context);
+			if (fp!=null)
+				return fp.getMoveBendpointFeature(context);
+			else
+				return super.getMoveBendpointFeature(context);
+		}
+		
+		@Override
+		public IRemoveBendpointFeature getRemoveBendpointFeature(IRemoveBendpointContext context) {
+			IFeatureProvider fp = getFeatureProvider(context);
+			if (fp!=null)
+				return fp.getRemoveBendpointFeature(context);
+			else
+				return super.getRemoveBendpointFeature(context);
+		}
+		
+		@Override
+		public IMoveConnectionDecoratorFeature getMoveConnectionDecoratorFeature(IMoveConnectionDecoratorContext context) {
+			IFeatureProvider fp = getFeatureProvider(context);
+			if (fp!=null)
+				return fp.getMoveConnectionDecoratorFeature(context);
+			else
+				return super.getMoveConnectionDecoratorFeature(context);
+		}
+		
+		
+		@Override
 		public ICustomFeature[] getCustomFeatures(ICustomContext context) {
 			ArrayList<ICustomFeature> result = new ArrayList<ICustomFeature>();
 			
@@ -342,15 +386,6 @@
 				result.add(cust);
 			}
 			
-			boolean allFreeForm = true;
-			PictogramElement[] pes = context.getPictogramElements();
-			for (PictogramElement pe : pes) {
-				if (!(pe instanceof FreeFormConnection))
-					allFreeForm = false;
-			}
-			if (allFreeForm)
-				result.add(new RemoveBendpointsFeature(fp));
-			
 			ICustomFeature features[] = new ICustomFeature[result.size()];
 			return result.toArray(features);
 		}
@@ -388,6 +423,14 @@
 		private IFeatureProvider getFeatureProvider(IReconnectionContext context) {
 			return featureSwitch.doSwitch((EObject) getBusinessObjectForPictogramElement(context.getConnection()));
 		}
+		
+		private IFeatureProvider getFeatureProvider(IBendpointContext context) {
+			return featureSwitch.doSwitch((EObject) getBusinessObjectForPictogramElement(context.getConnection()));
+		}
+		
+		private IFeatureProvider getFeatureProvider(IMoveConnectionDecoratorContext context) {
+			return featureSwitch.doSwitch((EObject) getBusinessObjectForPictogramElement(context.getConnectionDecorator().getConnection()));
+		}
 
 		/* (non-Javadoc)
 		 * @see org.eclipse.etrice.ui.behavior.fsm.provider.IInjectorProvider#getInjector()
diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/ChoicePointSupport.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/ChoicePointSupport.java
index b666977..d95e237 100644
--- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/ChoicePointSupport.java
+++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/ChoicePointSupport.java
@@ -182,7 +182,7 @@
 			public PictogramElement add(IAddContext context) {
 				ChoicePoint cp = (ChoicePoint) context.getNewObject();
 				ContainerShape sgShape = context.getTargetContainer();
-				boolean inherited = FSMSupportUtil.getInstance().isInherited(cp, sgShape);
+				boolean inherited = FSMSupportUtil.getInstance().isInherited(getDiagram(), cp);
 	
 				// CONTAINER SHAPE WITH RECTANGLE
 				IPeCreateService peCreateService = Graphiti.getPeCreateService();
@@ -249,8 +249,7 @@
 					if (bo instanceof ChoicePoint) {
 						ChoicePoint cp = (ChoicePoint) bo;
 						
-						ContainerShape acShape = context.getTargetContainer();
-						if (FSMSupportUtil.getInstance().isInherited(cp, acShape))
+						if (FSMSupportUtil.getInstance().isInherited(getDiagram(), cp))
 							return false;
 						
 						return true;
@@ -355,7 +354,7 @@
 				}
 				ChoicePoint cp = (ChoicePoint) bo;
 				
-				boolean inherited = FSMSupportUtil.getInstance().isInherited(cp, (ContainerShape)containerShape.eContainer());
+				boolean inherited = FSMSupportUtil.getInstance().isInherited(getDiagram(), cp);
 				
 				Color dark = manageColor(inherited? INHERITED_COLOR:DARK_COLOR);
 				updateFigure(cp, containerShape, dark, manageColor(BRIGHT_COLOR));
diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/FSMSupportUtil.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/FSMSupportUtil.java
index 6eba573..12ba3d7 100644
--- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/FSMSupportUtil.java
+++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/FSMSupportUtil.java
@@ -34,6 +34,7 @@
 import org.eclipse.etrice.core.fsm.fSM.ModelComponent;
 import org.eclipse.etrice.core.fsm.fSM.NonInitialTransition;
 import org.eclipse.etrice.core.fsm.fSM.RefinedState;
+import org.eclipse.etrice.core.fsm.fSM.RefinedTransition;
 import org.eclipse.etrice.core.fsm.fSM.State;
 import org.eclipse.etrice.core.fsm.fSM.StateGraph;
 import org.eclipse.etrice.core.fsm.fSM.StateGraphItem;
@@ -147,27 +148,11 @@
 		return own;
 	}
 
-	public boolean isInherited(StateGraphItem item, ContainerShape cs) {
-		EObject container = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(cs);
-		if (container instanceof StateGraph) {
-			StateGraph sg = (StateGraph) container;
-			return item.eContainer()!=sg;
-		}
-		else if (container instanceof State) {
-			assert(item instanceof EntryPoint || item instanceof ExitPoint): "this MUST be an entry or exit point";
-			
-			// have to check whether the State is inherited
-			State s = (State) container;
-			ContainerShape sCont = cs.getContainer();
-			EObject cls = sCont.getLink().getBusinessObjects().get(0);
-			return s.eContainer()!=cls;
-		}
-	
-		return false;
-	}
-
 	public boolean isInherited(Diagram diag, EObject obj) {
-		return fsmHelpers.getModelComponent(obj)!=getModelComponent(diag);
+		if(obj instanceof StateGraph)
+			obj = obj.eContainer();
+		
+		return  obj instanceof RefinedState || obj instanceof RefinedTransition || !EcoreUtil.isAncestor(getModelComponent(diag), obj);
 	}
 
 	public boolean showAsInherited(Diagram diag, State obj) {
diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/TrPointSupport.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/TrPointSupport.java
index 6a6814e..4ae0dbd 100644
--- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/TrPointSupport.java
+++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/TrPointSupport.java
@@ -226,7 +226,7 @@
 				ContainerShape parentShape = context.getTargetContainer();
 				Object bo = getBusinessObjectForPictogramElement(parentShape);
 				boolean subtp = (bo instanceof State);
-				boolean inherited = subtp?FSMSupportUtil.getInstance().isInherited(getDiagram(), (State)bo):FSMSupportUtil.getInstance().isInherited(tp, parentShape);
+				boolean inherited = FSMSupportUtil.getInstance().isInherited(getDiagram(), tp);
 	
 				int margin = subtp?MARGIN_SMALL:MARGIN;
 				int size = subtp?ITEM_SIZE_SMALL:ITEM_SIZE;
diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/TransitionSupport.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/TransitionSupport.java
index a161b21..db28e50 100644
--- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/TransitionSupport.java
+++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/TransitionSupport.java
@@ -47,23 +47,32 @@
 import org.eclipse.etrice.ui.common.base.support.ChangeAwareCreateConnectionFeature;
 import org.eclipse.etrice.ui.common.base.support.ChangeAwareCustomFeature;
 import org.eclipse.etrice.ui.common.base.support.DeleteWithoutConfirmFeature;
+import org.eclipse.etrice.ui.common.base.support.RemoveBendpointsFeature;
 import org.eclipse.graphiti.datatypes.ILocation;
 import org.eclipse.graphiti.dt.IDiagramTypeProvider;
+import org.eclipse.graphiti.features.IAddBendpointFeature;
 import org.eclipse.graphiti.features.IAddFeature;
 import org.eclipse.graphiti.features.ICreateConnectionFeature;
 import org.eclipse.graphiti.features.IDeleteFeature;
 import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IMoveBendpointFeature;
+import org.eclipse.graphiti.features.IMoveConnectionDecoratorFeature;
 import org.eclipse.graphiti.features.IReason;
 import org.eclipse.graphiti.features.IReconnectionFeature;
+import org.eclipse.graphiti.features.IRemoveBendpointFeature;
 import org.eclipse.graphiti.features.IRemoveFeature;
 import org.eclipse.graphiti.features.IUpdateFeature;
+import org.eclipse.graphiti.features.context.IAddBendpointContext;
 import org.eclipse.graphiti.features.context.IAddConnectionContext;
 import org.eclipse.graphiti.features.context.IAddContext;
 import org.eclipse.graphiti.features.context.ICreateConnectionContext;
 import org.eclipse.graphiti.features.context.ICustomContext;
 import org.eclipse.graphiti.features.context.IDeleteContext;
 import org.eclipse.graphiti.features.context.IDoubleClickContext;
+import org.eclipse.graphiti.features.context.IMoveBendpointContext;
+import org.eclipse.graphiti.features.context.IMoveConnectionDecoratorContext;
 import org.eclipse.graphiti.features.context.IReconnectionContext;
+import org.eclipse.graphiti.features.context.IRemoveBendpointContext;
 import org.eclipse.graphiti.features.context.IRemoveContext;
 import org.eclipse.graphiti.features.context.IUpdateContext;
 import org.eclipse.graphiti.features.context.impl.AddConnectionContext;
@@ -73,7 +82,11 @@
 import org.eclipse.graphiti.features.custom.ICustomFeature;
 import org.eclipse.graphiti.features.impl.AbstractAddFeature;
 import org.eclipse.graphiti.features.impl.AbstractUpdateFeature;
+import org.eclipse.graphiti.features.impl.DefaultAddBendpointFeature;
+import org.eclipse.graphiti.features.impl.DefaultMoveBendpointFeature;
+import org.eclipse.graphiti.features.impl.DefaultMoveConnectionDecoratorFeature;
 import org.eclipse.graphiti.features.impl.DefaultReconnectionFeature;
+import org.eclipse.graphiti.features.impl.DefaultRemoveBendpointFeature;
 import org.eclipse.graphiti.features.impl.Reason;
 import org.eclipse.graphiti.mm.GraphicsAlgorithmContainer;
 import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
@@ -301,7 +314,7 @@
 				Object bo = getBusinessObjectForPictogramElement(container);
 				if (!(bo instanceof StateGraph))
 					container = container.getContainer();
-				boolean inherited = FSMSupportUtil.getInstance().isInherited(trans, container);
+				boolean inherited = FSMSupportUtil.getInstance().isInherited(getDiagram(), trans);
 				
 				IPeCreateService peCreateService = Graphiti.getPeCreateService();
 				FreeFormConnection connection = peCreateService.createFreeFormConnection(getDiagram());
@@ -825,6 +838,50 @@
 		}
 		
 		@Override
+		public IAddBendpointFeature getAddBendpointFeature(IAddBendpointContext context) {
+			return new DefaultAddBendpointFeature(fp){
+				@Override
+				public boolean canAddBendpoint(IAddBendpointContext context) {
+					Transition trans = (Transition) getBusinessObjectForPictogramElement(context.getConnection());
+					return !FSMSupportUtil.getInstance().isInherited(getDiagram(), trans);
+				}
+			};
+		}
+		
+		@Override
+		public IRemoveBendpointFeature getRemoveBendpointFeature(IRemoveBendpointContext context) {
+			return new DefaultRemoveBendpointFeature(fp){
+				@Override
+				public boolean canRemoveBendpoint(IRemoveBendpointContext context) {
+					Transition trans = (Transition) getBusinessObjectForPictogramElement(context.getConnection());
+					return !FSMSupportUtil.getInstance().isInherited(getDiagram(), trans);
+				}
+			};
+		}
+		
+		@Override
+		public IMoveBendpointFeature getMoveBendpointFeature(IMoveBendpointContext context) {
+			return new DefaultMoveBendpointFeature(fp){				
+				@Override
+				public boolean canMoveBendpoint(IMoveBendpointContext context) {
+					Transition trans = (Transition) getBusinessObjectForPictogramElement(context.getConnection());
+					return !FSMSupportUtil.getInstance().isInherited(getDiagram(), trans);
+				}
+			};
+		}
+		
+		@Override
+		public IMoveConnectionDecoratorFeature getMoveConnectionDecoratorFeature(IMoveConnectionDecoratorContext context) {
+			return new DefaultMoveConnectionDecoratorFeature(fp){
+				@Override
+				public boolean canMoveConnectionDecorator(IMoveConnectionDecoratorContext context) {
+					Transition trans = (Transition) getBusinessObjectForPictogramElement(context.getConnectionDecorator().getConnection());
+					return !FSMSupportUtil.getInstance().isInherited(getDiagram(), trans);
+				}
+			};
+		}
+		
+		@Override
 		public ICustomFeature[] getCustomFeatures(ICustomContext context) {
 			PictogramElement pe = context.getPictogramElements()[0];
 			if (pe instanceof ConnectionDecorator)
@@ -852,6 +909,15 @@
 				
 				if (!editable)
 					result.add(new RefineTransitionFeature(fp));
+				
+				RemoveBendpointsFeature removeAllBendpoints = new RemoveBendpointsFeature(fp){
+					@Override
+					public boolean canExecute(ICustomContext context) {
+						Object bo = getBusinessObjectForPictogramElement(context.getPictogramElements()[0]);
+						return !FSMSupportUtil.getInstance().isInherited(getDiagram(), (Transition) bo);
+					}
+				};
+				result.add(removeAllBendpoints);
 			}
 
 			// Provide quick fix feature only for those edit parts which have
diff --git a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/RemoveBendpointsFeature.java b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/RemoveBendpointsFeature.java
index cf50e80..214c872 100644
--- a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/RemoveBendpointsFeature.java
+++ b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/support/RemoveBendpointsFeature.java
@@ -13,6 +13,7 @@
 package org.eclipse.etrice.ui.common.base.support;
 
 import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.IContext;
 import org.eclipse.graphiti.features.context.ICustomContext;
 import org.eclipse.graphiti.features.custom.AbstractCustomFeature;
 import org.eclipse.graphiti.mm.pictograms.FreeFormConnection;
@@ -40,14 +41,22 @@
 	public String getDescription() {
 		return "remove all bend points of the selected connection(s)";
 	}
-
-	public boolean canExecute(ICustomContext context) {
-		return true;
+	
+	@Override
+	public boolean isAvailable(IContext context) {
+		if(!(context instanceof ICustomContext))
+			return false;
+		
+		boolean allFreeForm = true;
+		PictogramElement[] pes = ((ICustomContext)context).getPictogramElements();
+		for (PictogramElement pe : pes) {
+			if (!(pe instanceof FreeFormConnection))
+				allFreeForm = false;
+		}
+		
+		return allFreeForm;
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.graphiti.features.custom.ICustomFeature#execute(org.eclipse.graphiti.features.context.ICustomContext)
-	 */
 	@Override
 	public void execute(ICustomContext context) {
 		for (PictogramElement pe : context.getPictogramElements()) {