package org.eclipse.etrice.ui.behavior.support;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.etrice.core.room.ActorClass;
import org.eclipse.etrice.core.room.RefinedState;
import org.eclipse.etrice.core.room.State;
import org.eclipse.etrice.core.room.StateGraph;
import org.eclipse.graphiti.mm.pictograms.Connection;
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.Shape;
import org.eclipse.graphiti.services.Graphiti;
public class ContextSwitcher {
public static void goUp(Diagram diagram, StateGraph sg) {
if (sg.eContainer() instanceof State) {
State s = (State) sg.eContainer();
// we follow the chain of base states
while (s instanceof RefinedState)
s = ((RefinedState)s).getBase();
// and finally go up
StateGraph superSG = (StateGraph) s.eContainer();
ContextSwitcher.switchTo(diagram, superSG);
}
}
public static void switchTop(Diagram diagram) {
EObject bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(diagram);
if (bo instanceof ActorClass) {
switchTo(diagram, ((ActorClass) bo).getStateMachine());
}
}
public static void switchTo(Diagram diagram, StateGraph sg) {
for (Shape ctxShape : diagram.getChildren()) {
EObject bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(ctxShape);
assert(bo instanceof StateGraph): "expected state graph";
if (bo instanceof StateGraph && bo==sg)
activateContext(ctxShape, true);
else
activateContext(ctxShape, false);
}
activateTransitions(diagram);
}
public static ContainerShape getContext(Diagram diagram, StateGraph sg) {
for (Shape ctxShape : diagram.getChildren()) {
EObject bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(ctxShape);
assert(bo instanceof StateGraph): "expected state graph";
if (bo instanceof StateGraph && bo==sg)
return (ContainerShape) ctxShape;
}
return null;
}
private static void activateTransitions(Diagram diagram) {
for (Connection conn : diagram.getConnections()) {
boolean visible = conn.getStart().getParent().isVisible();
conn.setVisible(visible);
for (ConnectionDecorator dec : conn.getConnectionDecorators()) {
dec.setVisible(visible);
}
}
}
private static void activateContext(Shape ctxShape, boolean activate) {
ctxShape.setVisible(activate);
TreeIterator<EObject> it = ctxShape.eAllContents();
while (it.hasNext()) {
EObject obj = it.next();
if (obj instanceof Shape) {
((Shape) obj).setVisible(activate);
}
}
}
}