Skip to content

Commit

Permalink
Add visualization of current state in diagrams - Task #1044
Browse files Browse the repository at this point in the history
  • Loading branch information
pchrszon-dlr committed Aug 28, 2023
1 parent fed080e commit f371f94
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,29 @@
import org.eclipse.graphiti.dt.IDiagramTypeProvider;
import org.eclipse.graphiti.features.context.IDoubleClickContext;
import org.eclipse.graphiti.features.custom.ICustomFeature;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.tb.ColorDecorator;
import org.eclipse.graphiti.tb.DefaultToolBehaviorProvider;
import org.eclipse.graphiti.tb.IDecorator;
import org.eclipse.graphiti.tb.IToolBehaviorProvider;
import org.eclipse.graphiti.util.ColorConstant;
import org.eclipse.graphiti.util.IColorConstant;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.PlatformUI;

import de.dlr.sc.virsat.model.extension.statemachines.model.State;
import de.dlr.sc.virsat.model.extension.statemachines.statespace.TraceState;
import de.dlr.sc.virsat.model.extension.statemachines.ui.diagram.features.StateMachineDoubleClickFeature;
import de.dlr.sc.virsat.model.extension.statemachines.ui.views.SimulatorView;

/**
* Implements the tool behavior provider to catch double click events
*
*/
public class StateMachineDiagramToolBehaviorProvider extends DefaultToolBehaviorProvider implements IToolBehaviorProvider {

private static final IColorConstant SELECTED_STATE_BACKGROUND = new ColorConstant(255, 255, 255);

/**
* @param diagramTypeProvider
*/
Expand All @@ -39,4 +51,32 @@ public ICustomFeature getDoubleClickFeature(IDoubleClickContext context) {
return super.getDoubleClickFeature(context);
}

@Override
public IDecorator[] getDecorators(PictogramElement pe) {
var activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();

if (activeWorkbenchWindow.getActivePage().findView(SimulatorView.ID) != null) {
var selectionService = activeWorkbenchWindow.getSelectionService();
var selection = selectionService.getSelection(SimulatorView.ID);

if (selection != null && selection instanceof StructuredSelection) {
var featureProvider = getFeatureProvider();
var bo = featureProvider.getBusinessObjectForPictogramElement(pe);
var selectedElement = ((StructuredSelection) selection).getFirstElement();

if (bo instanceof State && selectedElement instanceof TraceState) {
var state = (State) bo;
var localStates = ((TraceState) selectedElement).getSystemState().getLocalStates();

if (localStates.contains(state)) {
var decorator = new ColorDecorator();
decorator.setBackgroundColor(SELECTED_STATE_BACKGROUND);
return new IDecorator[] { decorator };
}
}
}
}

return super.getDecorators(pe);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,75 @@
package de.dlr.sc.virsat.model.extension.statemachines.ui.diagram.editor;

import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;

import de.dlr.sc.virsat.graphiti.ui.diagram.editor.VirsatDiagramEditor;
import de.dlr.sc.virsat.graphiti.util.DiagramHelper;
import de.dlr.sc.virsat.model.dvlm.structural.StructuralElementInstance;
import de.dlr.sc.virsat.model.extension.statemachines.statespace.TraceState;
import de.dlr.sc.virsat.model.extension.statemachines.ui.views.SimulatorView;

/**
* Diagram editor for State Machine diagrams.
*
*/
public class StateMachineDiagramEditor extends VirsatDiagramEditor {

private ISelectionListener selectionListener;
private IPartListener partListener;

@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
super.init(site, input);

selectionListener = new ISelectionListener() {
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (!(selection instanceof StructuredSelection)) {
return;
}

if (((StructuredSelection) selection).getFirstElement() instanceof TraceState) {
getDiagramTypeProvider().getDiagramBehavior().refresh();
}
}
};
site.getPage().addSelectionListener(selectionListener);

partListener = new IPartListener() {
@Override
public void partOpened(IWorkbenchPart part) {
}

@Override
public void partDeactivated(IWorkbenchPart part) {
}

@Override
public void partClosed(IWorkbenchPart part) {
if (part.getSite().getId().equals(SimulatorView.ID)) {
getDiagramTypeProvider().getDiagramBehavior().refresh();
}
}

@Override
public void partBroughtToTop(IWorkbenchPart part) {
}

@Override
public void partActivated(IWorkbenchPart part) {
}
};
site.getPage().addPartListener(partListener);
}

@Override
public void refreshTitle() {
Diagram diagram = getDiagramTypeProvider().getDiagram();
Expand All @@ -29,6 +87,17 @@ public void refreshTitle() {

setPartName(partName);
}

@Override
public void dispose() {
if (selectionListener != null) {
getEditorSite().getPage().removeSelectionListener(selectionListener);
}

if (partListener != null) {
getEditorSite().getPage().removePartListener(partListener);
}
}
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@
*/
public class SimulatorView extends ViewPart {

public static final String ID = "de.dlr.sc.virsat.model.extension.statemachines.ui.views.simulator";

private static final int TIME_COLUMN_WIDTH = 30;
private static final int STATE_VIEWER_COLUMN_WIDTH = 200;
private static final int TRANSITION_VIEWER_COLUMN_WIDTH = 200;
Expand Down Expand Up @@ -116,6 +118,8 @@ public void createPartControl(final Composite parent) {
createActions();
createActionBar();
addListeners();

getSite().setSelectionProvider(traceViewer);
}

@Override
Expand Down

0 comments on commit f371f94

Please sign in to comment.