1 package org.simantics.district.network.ui;
3 import java.util.Arrays;
4 import java.util.Collection;
5 import java.util.function.Consumer;
7 import org.eclipse.jface.viewers.ISelection;
8 import org.eclipse.ui.IEditorPart;
9 import org.simantics.db.ReadGraph;
10 import org.simantics.db.Resource;
11 import org.simantics.db.common.request.UnaryRead;
12 import org.simantics.db.exception.DatabaseException;
13 import org.simantics.db.layer0.request.PossibleModel;
14 import org.simantics.db.layer0.variable.RVI;
15 import org.simantics.db.layer0.variable.Variable;
16 import org.simantics.db.layer0.variable.Variables;
17 import org.simantics.district.network.DistrictNetworkUtil;
18 import org.simantics.g2d.canvas.ICanvasContext;
19 import org.simantics.g2d.diagram.DiagramHints;
20 import org.simantics.layer0.Layer0;
21 import org.simantics.modeling.ModelingResources;
22 import org.simantics.modeling.actions.NavigateToTarget;
23 import org.simantics.scl.runtime.tuple.Tuple4;
24 import org.simantics.ui.selection.WorkbenchSelectionUtils;
25 import org.simantics.utils.threads.ThreadUtils;
26 import org.simantics.utils.ui.ISelectionUtils;
29 * @author Tuukka Lehtonen
32 public class DistrictNetworkUIUtil {
34 public static Resource getInputResource(ReadGraph graph, Object input) throws DatabaseException {
35 if (input instanceof Resource) {
36 return (Resource) input;
37 } else if (input instanceof Variable) {
38 return ((Variable) input).getPossibleRepresents(graph);
39 } else if (input instanceof ISelection) {
40 return ISelectionUtils.filterSingleSelection((ISelection) input, Resource.class);
42 return WorkbenchSelectionUtils.getPossibleResource(graph, input);
46 public static class GetInputResource extends UnaryRead<Object, Resource> {
48 public GetInputResource(Object input) {
53 public Resource perform(ReadGraph graph) throws DatabaseException {
54 return getInputResource(graph, parameter);
59 public static class Input extends Tuple4 {
60 public Input(Resource model, Resource diagram, Resource element, RVI diagramCompositeRvi) {
61 super(model, diagram, element, diagramCompositeRvi);
63 public Resource model() {
64 return (Resource) get(0);
66 public Resource diagram() {
67 return (Resource) get(1);
69 public Resource element() {
70 return (Resource) get(2);
77 public static class FindMappedDNElement extends UnaryRead<Object, Input> {
79 public FindMappedDNElement(Object parameter) {
84 public Input perform(ReadGraph graph) throws DatabaseException {
85 Resource e = DistrictNetworkUtil.getMappedDNElement(graph,
86 DistrictNetworkUtil.getDiagramElement(graph,
87 getInputResource(graph, parameter)));
88 return e != null ? graph.syncRequest(new ElementToInput(e)) : null;
93 public static class FindMappedComponent extends UnaryRead<Object, Input> {
95 public FindMappedComponent(Object parameter) {
100 public Input perform(ReadGraph graph) throws DatabaseException {
101 Resource e = DistrictNetworkUtil.getMappedElement(graph,
102 getInputResource(graph, parameter));
103 return e != null ? graph.syncRequest(new ElementToInput(e)) : null;
108 public static class ElementToInput extends UnaryRead<Resource, Input> {
110 public ElementToInput(Resource element) {
115 public Input perform(ReadGraph graph) throws DatabaseException {
116 Layer0 L0 = Layer0.getInstance(graph);
117 Resource diagram = graph.getPossibleObject(parameter, L0.PartOf);
121 Resource model = graph.syncRequest(new PossibleModel(diagram));
125 RVI rvi = getDiagramCompositeRvi(graph, diagram);
129 return new Input(model, diagram, parameter, rvi);
132 private static RVI getDiagramCompositeRvi(ReadGraph graph, Resource diagram) throws DatabaseException {
133 ModelingResources MOD = ModelingResources.getInstance(graph);
134 Resource composite = graph.getPossibleObject(diagram, MOD.DiagramToComposite);
135 if (composite == null)
137 Variable v = Variables.getPossibleVariable(graph, composite);
138 return v != null ? v.getPossibleRVI(graph) : null;
143 public static Consumer<IEditorPart> editorActivationCallback(final Collection<? extends Object> selectedObjects) {
145 final ICanvasContext openedCanvas = (ICanvasContext) part.getAdapter(ICanvasContext.class);
146 assert openedCanvas != null;
147 // CanvasContext-wide denial of initial zoom-to-fit on diagram open.
148 openedCanvas.getDefaultHintContext().setHint(DiagramHints.KEY_INITIAL_ZOOM_TO_FIT, Boolean.FALSE);
149 ThreadUtils.asyncExec(openedCanvas.getThreadAccess(),
150 NavigateToTarget.elementSelectorZoomer(openedCanvas, selectedObjects, false));
154 public static void openEditorWithSelection(String editorId, Input input, Object... selection) {
155 NavigateToTarget.editorActivator(
160 DistrictNetworkUIUtil.editorActivationCallback(Arrays.asList(selection)))
164 public static void openDNDiagramEditorWithSelection(Input input, Object... selection) {
165 openEditorWithSelection(DistrictDiagramEditor.ID, input, selection);