]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictDiagramViewer.java
Trying to get map background coloring to work
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / DistrictDiagramViewer.java
1 package org.simantics.district.network.ui;
2
3 import java.awt.Color;
4 import java.util.concurrent.TimeUnit;
5 import java.util.function.Consumer;
6 import java.util.function.Supplier;
7
8 import org.simantics.datatypes.literal.RGB;
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.procedure.Listener;
14 import org.simantics.diagram.ui.DiagramModelHints;
15 import org.simantics.district.network.DistrictNetworkUtil;
16 import org.simantics.district.network.ui.participants.DNPointerInteractor;
17 import org.simantics.district.network.ui.participants.MapRulerPainter;
18 import org.simantics.g2d.canvas.ICanvasContext;
19 import org.simantics.g2d.canvas.impl.CanvasContext;
20 import org.simantics.g2d.diagram.handler.PickRequest.PickFilter;
21 import org.simantics.g2d.diagram.participant.DelayedBatchElementPainter;
22 import org.simantics.g2d.diagram.participant.ElementPainter;
23 import org.simantics.g2d.diagram.participant.Selection;
24 import org.simantics.g2d.diagram.participant.ZOrderHandler;
25 import org.simantics.g2d.participant.BackgroundPainter;
26 import org.simantics.g2d.participant.GridPainter;
27 import org.simantics.g2d.participant.PanZoomRotateHandler;
28 import org.simantics.g2d.participant.RenderingQualityInteractor;
29 import org.simantics.g2d.participant.ZoomToAreaHandler;
30 import org.simantics.maps.MapScalingTransform;
31 import org.simantics.maps.eclipse.MapPainter;
32 import org.simantics.maps.sg.commands.MapCommands;
33 import org.simantics.modeling.ui.diagramEditor.DiagramViewer;
34 import org.simantics.scenegraph.g2d.events.command.CommandEvent;
35 import org.simantics.scenegraph.g2d.events.command.Commands;
36 import org.simantics.utils.datastructures.hints.IHintContext;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40 public class DistrictDiagramViewer extends DiagramViewer {
41
42     private static final Logger LOGGER = LoggerFactory.getLogger(DistrictDiagramViewer.class);
43
44     @Override
45     protected void addDiagramParticipants(ICanvasContext ctx) {
46         ctx.add(new ZOrderHandler());
47         ctx.add(new Selection());
48         ctx.add(new ElementPainter());
49         ctx.add(new DNPointerInteractor());
50         
51         ctx.add(new MapPainter(MapScalingTransform.INSTANCE));
52         
53         ctx.add(new NetworkDrawingParticipant(MapScalingTransform.INSTANCE));
54     }
55     
56     protected String getPopupId() {
57         return "#DistrictDiagramPopup";
58     }
59     
60     @Override
61     public void initializeCanvasContext(CanvasContext ctx) {
62         super.initializeCanvasContext(ctx);
63         IHintContext h = ctx.getDefaultHintContext();
64         h.setHint(PanZoomRotateHandler.KEY_ZOOM_IN_LIMIT, 10000.0);
65         h.setHint(PanZoomRotateHandler.KEY_ZOOM_OUT_LIMIT, 0.01);
66         h.setHint(DiagramModelHints.KEY_DIAGRAM_RESOURCE, diagramResource);
67     }
68
69     @Override
70     protected void addPainterParticipants(ICanvasContext ctx) {
71         ctx.add(new RenderingQualityInteractor());
72         ctx.add(new DelayedBatchElementPainter(PickFilter.FILTER_MONITORS, 500, TimeUnit.MILLISECONDS));
73     }
74     
75     @Override
76     protected void addGridRulerBackgroundParticipants(CanvasContext ctx) {
77         ctx.add(new GridPainter());
78         ctx.add(new MapRulerPainter());
79         ctx.add(new BackgroundPainter());
80     }
81     
82     protected void addViewManipulationParticipants(CanvasContext ctx) {
83         ctx.add(new DistrictPanZoomRotateHandler());
84         //ctx.add(new MousePanZoomInteractor());
85         //ctx.add(new MultitouchPanZoomRotateInteractor());
86         // ctx.add( new OrientationRestorer() );
87         ctx.add(new ZoomToAreaHandler());
88     }
89
90     @Override
91     protected void loadPageSettings(ICanvasContext ctx) {
92         super.loadPageSettings(ctx);
93         // this might be the wrong place to start such listening but at least
94         // super.loadPageSettings() does async-db-operations
95         setupDrawMapEnabled();
96         setupBackgroundColor();
97     }
98     
99     private void setupDrawMapEnabled() {
100         sessionContext.getSession().asyncRequest(new DrawMapEnabledRequest(getInputResource()), new DrawMapEnabledListener(
101                 result -> canvasContext.getEventQueue().queueEvent(new CommandEvent(canvasContext, System.currentTimeMillis(), result ? Commands.MAP_ENABLE : Commands.MAP_DISABLE)),
102                 () -> DistrictDiagramViewer.this.isDisposed()));
103     }
104
105     private void setupBackgroundColor() {
106         sessionContext.getSession().asyncRequest(new MapBackgroundColorRequest(getInputResource()), new MapBackgroundColorListener(
107                 result -> queueBackgroundColorChangeEvent(result),
108                 () -> DistrictDiagramViewer.this.isDisposed()));
109     }
110     
111     private void queueBackgroundColorChangeEvent(RGB.Integer result) {
112         if (result != null) {
113             Color backgroundColor = new Color(result.red, result.green, result.blue);
114             canvasContext.getDefaultHintContext().setHint(MapCommands.KEY_MAP_BACKGROUND_COLOR, backgroundColor);
115             canvasContext.getEventQueue().queueEvent(new CommandEvent(canvasContext, System.currentTimeMillis(), MapCommands.MAP_BACKGROUND_COLOR_CHANGE));
116         }
117     }
118
119     private static class DrawMapEnabledRequest extends UnaryRead<Resource, Boolean> {
120
121         public DrawMapEnabledRequest(Resource diagram) {
122             super(diagram);
123         }
124
125         @Override
126         public Boolean perform(ReadGraph graph) throws DatabaseException {
127             return DistrictNetworkUtil.drawMapEnabled(graph, parameter);
128         }
129     }
130
131     private static class DrawMapEnabledListener implements Listener<Boolean> {
132
133         private static final Logger LOGGER = LoggerFactory.getLogger(DrawMapEnabledListener.class);
134
135         private Consumer<Boolean> callback;
136         private Supplier<Boolean> isDisposed;
137
138         public DrawMapEnabledListener(Consumer<Boolean> callback, Supplier<Boolean> isDisposed) {
139             this.callback = callback;
140             this.isDisposed = isDisposed;
141         }
142
143         @Override
144         public void execute(Boolean result) {
145             callback.accept(result);
146         }
147
148         @Override
149         public void exception(Throwable t) {
150             LOGGER.error("Could not listen if draw map is enabled", t);
151         }
152
153         @Override
154         public boolean isDisposed() {
155             return isDisposed.get();
156         }
157     }
158     
159     private static class MapBackgroundColorRequest extends UnaryRead<Resource, RGB.Integer> {
160
161         public MapBackgroundColorRequest(Resource diagram) {
162             super(diagram);
163         }
164
165         @Override
166         public RGB.Integer perform(ReadGraph graph) throws DatabaseException {
167             return DistrictNetworkUtil.backgroundColor(graph, parameter);
168         }
169     }
170
171     private static class MapBackgroundColorListener implements Listener<RGB.Integer> {
172
173         private static final Logger LOGGER = LoggerFactory.getLogger(DrawMapEnabledListener.class);
174
175         private Consumer<RGB.Integer> callback;
176         private Supplier<Boolean> isDisposed;
177
178         public MapBackgroundColorListener(Consumer<RGB.Integer> callback, Supplier<Boolean> isDisposed) {
179             this.callback = callback;
180             this.isDisposed = isDisposed;
181         }
182
183         @Override
184         public void execute(RGB.Integer result) {
185             callback.accept(result);
186         }
187
188         @Override
189         public void exception(Throwable t) {
190             LOGGER.error("Could not listen map background color", t);
191         }
192
193         @Override
194         public boolean isDisposed() {
195             return isDisposed.get();
196         }
197     }
198 }