1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2011 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.trend;
\r
14 import java.awt.Color;
\r
15 import java.util.concurrent.Executor;
\r
17 import org.simantics.g2d.canvas.Hints;
\r
18 import org.simantics.g2d.canvas.ICanvasContext;
\r
19 import org.simantics.g2d.canvas.impl.CanvasContext;
\r
20 import org.simantics.g2d.participant.BackgroundPainter;
\r
21 import org.simantics.g2d.participant.CanvasBoundsParticipant;
\r
22 import org.simantics.g2d.participant.CanvasGrab;
\r
23 import org.simantics.g2d.participant.KeyToCommand;
\r
24 import org.simantics.g2d.participant.KeyUtil;
\r
25 import org.simantics.g2d.participant.MouseUtil;
\r
26 import org.simantics.g2d.participant.PanZoomRotateHandler;
\r
27 import org.simantics.g2d.participant.PointerPainter;
\r
28 import org.simantics.g2d.participant.RulerPainter;
\r
29 import org.simantics.g2d.participant.SymbolUtil;
\r
30 import org.simantics.g2d.participant.TimeParticipant;
\r
31 import org.simantics.g2d.participant.TransformUtil;
\r
32 import org.simantics.g2d.tooltip.TooltipParticipant;
\r
33 import org.simantics.history.Collector;
\r
34 import org.simantics.history.HistoryManager;
\r
35 import org.simantics.scenegraph.g2d.events.command.CommandKeyBinding;
\r
36 import org.simantics.simulation.data.Datasource;
\r
37 import org.simantics.simulation.data.Datasource.DatasourceListener;
\r
38 import org.simantics.trend.configuration.TrendSpec;
\r
39 import org.simantics.trend.impl.TrendNode;
\r
40 import org.simantics.trend.impl.TrendParticipant;
\r
41 import org.simantics.utils.datastructures.disposable.IDisposable;
\r
42 import org.simantics.utils.datastructures.disposable.IDisposeListener;
\r
43 import org.simantics.utils.datastructures.hints.IHintContext;
\r
44 import org.simantics.utils.threads.IThreadWorkQueue;
\r
46 public class TrendInitializer {
\r
48 public static CanvasContext defaultInitializeCanvas(CanvasContext cvsCtx, HistoryManager historian, Collector collector, final Datasource simulation, TrendSpec trendSpec)
\r
50 // Create canvas context and a layer of interactors
\r
51 IHintContext h = cvsCtx.getDefaultHintContext();
\r
53 h.setHint(PanZoomRotateHandler.KEY_ADAPT_VIEWPORT_TO_RESIZED_CONTROL, false);
\r
54 h.setHint(PanZoomRotateHandler.KEY_DISABLE_PAN, true);
\r
55 h.setHint(PanZoomRotateHandler.KEY_DISABLE_ZOOM, true);
\r
56 cvsCtx.add( new PanZoomRotateHandler( false ) ); // Must be before TransformUtil
\r
58 // Support & Util Participants
\r
59 cvsCtx.add( new TransformUtil() );
\r
60 cvsCtx.add( new MouseUtil() );
\r
61 cvsCtx.add( new KeyUtil() );
\r
62 cvsCtx.add( new CanvasGrab() );
\r
63 cvsCtx.add( new SymbolUtil() );
\r
64 cvsCtx.add( new TimeParticipant() );
\r
65 cvsCtx.add( new CanvasBoundsParticipant() );
\r
68 TrendNode trendNode = cvsCtx.getSceneGraph().addNode(TrendNode.class);
\r
69 trendNode.setHistorian( historian, collector );
\r
70 trendNode.setTrendSpec( trendSpec );
\r
72 // Add trend participant/interactor
\r
73 TrendParticipant tp = new TrendParticipant();
\r
74 tp.setTrend( trendNode );
\r
77 if (simulation != null)
\r
78 attachStepListener(simulation, cvsCtx, tp);
\r
80 // Debug participant(s)
\r
81 //canvasContext.add( new PointerPainter() );
\r
82 // canvasContext.add( new HandPainter() );
\r
83 h.setHint(PointerPainter.KEY_PAINT_POINTER, true);
\r
85 // Pan & Zoom & Rotate
\r
86 //canvasContext.add( new MousePanZoomInteractor() );
\r
87 //canvasContext.add( new MultitouchPanZoomRotateInteractor() );
\r
88 //canvasContext.add( new OrientationRestorer() );
\r
90 // Grid & Ruler & Background
\r
91 //cvsCtx.add( new GridPainter() );
\r
92 //cvsCtx.add( new RulerPainter() );
\r
93 cvsCtx.add( new BackgroundPainter() );
\r
95 h.setHint(Hints.KEY_GRID_COLOR, new Color(0.95f, 0.95f, 0.95f));
\r
96 h.setHint(Hints.KEY_BACKGROUND_COLOR, Color.WHITE);
\r
97 h.setHint(RulerPainter.KEY_RULER_BACKGROUND_COLOR, new Color(0.9f, 0.9f, 0.9f, 0.75f));
\r
98 h.setHint(RulerPainter.KEY_RULER_TEXT_COLOR, Color.BLACK);
\r
99 h.setHint(TimeParticipant.KEY_TIME_PULSE_INTERVAL, 50L);
\r
100 h.setHint(TimeParticipant.KEY_TIMER_ENABLED, true);
\r
101 h.setHint(TrendParticipant.KEY_TREND_DRAW_INTERVAL, 100L);
\r
104 cvsCtx.add( new KeyToCommand( CommandKeyBinding.DEFAULT_BINDINGS ) );
\r
106 ////// Diagram Participants //////
\r
108 cvsCtx.add( new TooltipParticipant());
\r
110 h.setHint(Hints.KEY_TOOL, Hints.POINTERTOOL);
\r
112 //NodeUtil.printSceneGraph( cvsCtx.getSceneGraph() );
\r
114 cvsCtx.assertParticipantDependencies();
\r
119 public static TrendNode getTrendNode(CanvasContext ctx)
\r
121 TrendParticipant tp = ctx.getSingleItem( TrendParticipant.class );
\r
122 return tp.getTrend();
\r
125 public static void attachStepListener(final Datasource datasource, ICanvasContext context, TrendParticipant tp) {
\r
126 // Add simulation listener - Note listener must be removed when trend is closed
\r
127 final DatasourceListener stepListener = new StepListener( tp );
\r
128 datasource.addListener( stepListener );
\r
129 context.addDisposeListener(new IDisposeListener() {
\r
131 public void onDisposed(IDisposable sender) {
\r
132 datasource.removeListener(stepListener);
\r
140 public static class StepListener implements DatasourceListener {
\r
141 private final TrendParticipant trendParticipant;
\r
143 public StepListener(TrendParticipant trendParticipant) {
\r
144 this.trendParticipant = trendParticipant;
\r
148 public void onStep(Datasource source) {
\r
149 TrendNode node = trendParticipant.getTrend();
\r
150 if (!node.allPast()) node.datadirty = true;
\r
154 public Executor getExecutor() {
\r
159 public static CanvasContext createDefaultCanvas(IThreadWorkQueue threadAccess, HistoryManager historian, Collector collector, Datasource simulation, TrendSpec trendSpec) {
\r
160 return defaultInitializeCanvas(new CanvasContext(threadAccess), historian, collector, simulation, trendSpec);
\r