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.modeling.ui.chart.property;
\r
14 import org.eclipse.core.runtime.IStatus;
\r
15 import org.eclipse.core.runtime.Status;
\r
16 import org.eclipse.jface.dialogs.IInputValidator;
\r
17 import org.eclipse.jface.layout.GridDataFactory;
\r
18 import org.eclipse.jface.layout.GridLayoutFactory;
\r
19 import org.eclipse.jface.viewers.ISelection;
\r
20 import org.eclipse.swt.SWT;
\r
21 import org.eclipse.swt.events.SelectionAdapter;
\r
22 import org.eclipse.swt.events.SelectionEvent;
\r
23 import org.eclipse.swt.widgets.Composite;
\r
24 import org.eclipse.swt.widgets.Display;
\r
25 import org.eclipse.ui.IWorkbenchSite;
\r
26 import org.simantics.NameLabelUtil;
\r
27 import org.simantics.Simantics;
\r
28 import org.simantics.browsing.ui.swt.widgets.Button;
\r
29 import org.simantics.browsing.ui.swt.widgets.Combo;
\r
30 import org.simantics.browsing.ui.swt.widgets.Label;
\r
31 import org.simantics.browsing.ui.swt.widgets.Scale;
\r
32 import org.simantics.browsing.ui.swt.widgets.TrackedText;
\r
33 import org.simantics.browsing.ui.swt.widgets.impl.SelectionListenerImpl;
\r
34 import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport;
\r
35 import org.simantics.charts.ontology.ChartResource;
\r
36 import org.simantics.databoard.Bindings;
\r
37 import org.simantics.db.ReadGraph;
\r
38 import org.simantics.db.Resource;
\r
39 import org.simantics.db.WriteGraph;
\r
40 import org.simantics.db.common.request.WriteRequest;
\r
41 import org.simantics.db.exception.DatabaseException;
\r
42 import org.simantics.db.management.ISessionContext;
\r
43 import org.simantics.db.request.Read;
\r
44 import org.simantics.modeling.ui.Activator;
\r
45 import org.simantics.selectionview.ConfigurationComposite;
\r
46 import org.simantics.ui.utils.ResourceAdaptionUtils;
\r
47 import org.simantics.utils.ui.ISelectionUtils;
\r
50 * @author Tuukka Lehtonen
\r
52 public class ChartComposite extends ConfigurationComposite {
\r
54 public static final TimeInputValidator LENGTH_VALIDATOR = new TimeInputValidator(1.0);
\r
55 public static final TimeInputValidator START_VALIDATOR = new TimeInputValidator(-Double.MAX_VALUE);
\r
57 public static Read<String> getPartTitleRequest(final ISelection selection) {
\r
58 return new Read<String>() {
\r
60 public String perform(ReadGraph graph) throws DatabaseException {
\r
61 Resource r = ResourceAdaptionUtils.toSingleResource(selection);
\r
64 return NameLabelUtil.modalName(graph, r);
\r
70 public Read<String> getPartNameReadRequest(ISelection forSelection) {
\r
71 return getPartTitleRequest(forSelection);
\r
74 public void create(final Composite body, IWorkbenchSite site, final ISessionContext context, final WidgetSupport support) {
\r
75 final Display display = body.getDisplay();
\r
77 body.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
79 /* Composite buttonComposite = new Composite(body, SWT.NONE);
\r
80 buttonComposite.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
81 GridDataFactory.fillDefaults().span(2, 1).grab(true, false).applyTo(buttonComposite);
\r
82 GridLayoutFactory.fillDefaults().equalWidth(false).numColumns(4).extendedMargins(5,5,5,5).applyTo(buttonComposite);
\r
84 Label nameHeader = new Label(buttonComposite, support, 0);
\r
85 nameHeader.setText("Name");
\r
86 //nameHeader.setFont(smallFont);
\r
87 nameHeader.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
88 GridDataFactory.fillDefaults().grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(nameHeader.getWidget());
\r
90 TrackedText nameText = new TrackedText(buttonComposite, support, SWT.BORDER | SWT.FLAT);
\r
91 nameText.setTextFactory(new StringPropertyFactory(Layer0.URIs.HasName, ""));
\r
92 nameText.addModifyListener(new StringPropertyModifier(context, Layer0.URIs.HasName));
\r
93 GridDataFactory.fillDefaults().grab(true, false).span(3, 1).applyTo(nameText.getWidget());
\r
95 Label autoscrollLabel = new Label(body, support, 0);
\r
96 autoscrollLabel.setText("Auto-scroll settings:");
\r
97 autoscrollLabel.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
98 GridDataFactory.fillDefaults().grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(autoscrollLabel.getControl());
\r
100 Composite templateComposite = new Composite(body, SWT.NONE);
\r
101 templateComposite.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
102 GridDataFactory.fillDefaults().span(2, 1).grab(true, false).applyTo(templateComposite);
\r
103 GridLayoutFactory.fillDefaults().equalWidth(false).numColumns(3).extendedMargins(5,5,5,5).applyTo(templateComposite);
\r
105 Label templateHeader = new Label(templateComposite, support, 0);
\r
106 templateHeader.setText("Template");
\r
107 //templateHeader.setFont(smallFont);
\r
108 templateHeader.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
109 GridDataFactory.fillDefaults().grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(templateHeader.getWidget());
\r
111 Combo templateCombo = new Combo(templateComposite, support, SWT.NONE | SWT.READ_ONLY);
\r
112 templateCombo.setItemFactory(new AvailableTemplateFactory());
\r
113 templateCombo.setSelectionFactory(new CurrentTemplateFactory());
\r
114 templateCombo.addModifyListener(new TemplateModifier());
\r
115 GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(templateCombo.getWidget());
\r
117 Button resetButton = new Button(templateComposite, support, SWT.NONE | SWT.READ_ONLY);
\r
118 resetButton.setText("Apply");
\r
119 resetButton.addSelectionListener(new SelectionListenerImpl<Resource>(context) {
\r
121 public void apply(WriteGraph graph, Resource monitor) throws DatabaseException {
\r
122 graph.markUndoPoint();
\r
123 ChartResource CHART = ChartResource.getInstance(graph);
\r
124 if (graph.hasStatement(monitor, CHART.Chart_TimeWindowStart))
\r
125 graph.deny(monitor, CHART.Chart_TimeWindowStart);
\r
126 if (graph.hasStatement(monitor, CHART.Chart_TimeWindowLength))
\r
127 graph.deny(monitor, CHART.Chart_TimeWindowLength);
\r
128 if (graph.hasStatement(monitor, CHART.Chart_TimeWindowIncrement))
\r
129 graph.deny(monitor, CHART.Chart_TimeWindowIncrement);
\r
132 GridDataFactory.fillDefaults().grab(false, false).span(1, 1).applyTo(resetButton.getWidget());
\r
134 Composite buttonComposite = new Composite(body, SWT.NONE);
\r
135 buttonComposite.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
136 GridDataFactory.fillDefaults().span(2, 1).grab(true, false).applyTo(buttonComposite);
\r
137 GridLayoutFactory.fillDefaults().equalWidth(false).numColumns(4).extendedMargins(5,5,5,5).applyTo(buttonComposite);
\r
139 Label startHeader = new Label(buttonComposite, support, 0);
\r
140 startHeader.setText("Start time");
\r
141 //startHeader.setFont(smallFont);
\r
142 startHeader.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
143 GridDataFactory.fillDefaults().grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(startHeader.getWidget());
\r
145 TrackedText timeWindowStart = new TrackedText(buttonComposite, support, SWT.BORDER | SWT.FLAT);
\r
146 timeWindowStart.getWidget().setToolTipText("Chart Window Fixed Start Time in Seconds or Yy Dd HH:mm:ss.ddd");
\r
147 timeWindowStart.setTextFactory(new TimePropertyFactory(ChartResource.URIs.Chart_TimeWindowStart));
\r
148 timeWindowStart.addModifyListener(new TimePropertyModifier(context, ChartResource.URIs.Chart_TimeWindowStart, START_VALIDATOR));
\r
149 timeWindowStart.setInputValidator( START_VALIDATOR );
\r
150 GridDataFactory.fillDefaults().grab(true, false).span(3, 1).applyTo(timeWindowStart.getWidget());
\r
152 // Label l1 = new Label(buttonComposite, support, 0);
\r
153 // l1.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
154 // l1.setText("seconds");
\r
156 Label sizeHeader = new Label(buttonComposite, support, 0);
\r
157 sizeHeader.setText("Length");
\r
158 //sizeHeader.setFont(smallFont);
\r
159 sizeHeader.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
160 GridDataFactory.fillDefaults().grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(sizeHeader.getWidget());
\r
162 TrackedText timeWindowLength = new TrackedText(buttonComposite, support, SWT.BORDER | SWT.FLAT);
\r
163 timeWindowLength.getWidget().setToolTipText("Chart Window Fixed Time Axis Length in Seconds or Yy Dd HH:mm:ss.ddd");
\r
164 timeWindowLength.setTextFactory(new TimePropertyFactory(ChartResource.URIs.Chart_TimeWindowLength));
\r
165 timeWindowLength.addModifyListener(new TimePropertyModifier(context, ChartResource.URIs.Chart_TimeWindowLength, LENGTH_VALIDATOR));
\r
166 timeWindowLength.setInputValidator( LENGTH_VALIDATOR );
\r
167 GridDataFactory.fillDefaults().grab(true, false).span(3, 1).applyTo(timeWindowLength.getWidget());
\r
169 // Label l2 = new Label(buttonComposite, support, 0);
\r
170 // l2.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
171 // l2.setText("seconds");
\r
173 Label incrementHeader = new Label(buttonComposite, support, 0);
\r
174 incrementHeader.setText("Scroll increment");
\r
175 //incrementHeader.setFont(smallFont);
\r
176 incrementHeader.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
177 GridDataFactory.fillDefaults().grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(incrementHeader.getWidget());
\r
179 Scale timeWindowIncrement = new Scale(buttonComposite, support, SWT.READ_ONLY);
\r
180 timeWindowIncrement.getWidget().setMinimum(1);
\r
181 timeWindowIncrement.getWidget().setMaximum(100);
\r
182 timeWindowIncrement.getWidget().setIncrement(10);
\r
183 timeWindowIncrement.getWidget().setPageIncrement(10);
\r
184 timeWindowIncrement.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
185 timeWindowIncrement.setSelectionFactory(new DoubleToIntegerPropertyFactory(ChartResource.URIs.Chart_TimeWindowIncrement));
\r
186 timeWindowIncrement.addSelectionListener(new DelayedIntegerToDoublePropertyModifier(timeWindowIncrement, context, ChartResource.URIs.Chart_TimeWindowIncrement));
\r
187 GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(timeWindowIncrement.getWidget());
\r
189 TrackedText timeWindowIncrementText = new TrackedText(buttonComposite, support, SWT.BORDER | SWT.FLAT);
\r
190 timeWindowIncrementText.setTextFactory(new DoublePropertyFactory(ChartResource.URIs.Chart_TimeWindowIncrement));
\r
191 timeWindowIncrementText.addModifyListener(new DoublePropertyModifier(context, ChartResource.URIs.Chart_TimeWindowIncrement));
\r
192 timeWindowIncrementText.setInputValidator(new IInputValidator() {
\r
194 public String isValid(String newText) {
\r
195 if (newText.trim().isEmpty())
\r
198 Double d = Double.parseDouble(newText);
\r
199 if (d < 1 || d > 100)
\r
200 return "Increment must be between 1..100";
\r
202 } catch (NumberFormatException e) {
\r
203 return e.getMessage();
\r
207 GridDataFactory.fillDefaults().grab(false, false).align(SWT.LEAD, SWT.CENTER).span(1, 1).applyTo(timeWindowIncrementText.getWidget());
\r
209 Label l3 = new Label(buttonComposite, support, 0);
\r
210 l3.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
213 Composite checkboxComposite = new Composite(buttonComposite, SWT.NONE);
\r
214 checkboxComposite.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
215 GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(checkboxComposite);
\r
216 GridLayoutFactory.fillDefaults().equalWidth(false).numColumns(2).applyTo(checkboxComposite);
\r
218 final Button showMilestones = new Button(checkboxComposite, support, SWT.CHECK);
\r
219 showMilestones.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
220 showMilestones.setText("Show &Milestones");
\r
221 GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(showMilestones.getWidget());
\r
222 showMilestones.setSelectionFactory(new BooleanPropertyFactory(ChartResource.URIs.Chart_ShowMilestones));
\r
223 showMilestones.addSelectionListener(new SelectionAdapter() {
\r
225 public void widgetSelected(SelectionEvent e) {
\r
227 final Resource r = ISelectionUtils.filterSingleSelection(support.getInput(), Resource.class);
\r
230 final Boolean show = showMilestones.getWidget().getSelection();
\r
231 Simantics.getSession().syncRequest(new WriteRequest() {
\r
233 public void perform(WriteGraph graph) throws DatabaseException {
\r
234 graph.markUndoPoint();
\r
235 graph.claimLiteral(r, ChartResource.getInstance(graph).Chart_ShowMilestones, show, Bindings.BOOLEAN);
\r
238 } catch (DatabaseException e1) {
\r
239 Activator.getDefault().getLog().log(
\r
240 new Status(IStatus.ERROR, Activator.PLUGIN_ID,
\r
241 "Failed to set Show Milestones", e1));
\r
246 final Button trackExperimentTime = new Button(checkboxComposite, support, SWT.CHECK);
\r
247 trackExperimentTime.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
248 trackExperimentTime.setText("Hairline &Tracks Experiment Time");
\r
249 trackExperimentTime.setTooltipText("Value Tip Hairline Tracks Experiment Time During Simulation");
\r
250 GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(trackExperimentTime.getWidget());
\r
251 trackExperimentTime.setSelectionFactory(new BooleanPropertyFactory(ChartResource.URIs.Chart_trackExperimentTime));
\r
252 trackExperimentTime.addSelectionListener(new SelectionAdapter() {
\r
254 public void widgetSelected(SelectionEvent e) {
\r
256 final Resource r = ISelectionUtils.filterSingleSelection(support.getInput(), Resource.class);
\r
259 final Boolean track = trackExperimentTime.getWidget().getSelection();
\r
260 Simantics.getSession().syncRequest(new WriteRequest() {
\r
262 public void perform(WriteGraph graph) throws DatabaseException {
\r
263 graph.markUndoPoint();
\r
264 graph.claimLiteral(r, ChartResource.getInstance(graph).Chart_trackExperimentTime, track, Bindings.BOOLEAN);
\r
267 } catch (DatabaseException e1) {
\r
268 Activator.getDefault().getLog().log(
\r
269 new Status(IStatus.ERROR, Activator.PLUGIN_ID,
\r
270 "Failed to set Track Experiment Time", e1));
\r