1 package org.simantics.modeling.ui.diagram.monitor;
\r
3 import java.util.Arrays;
\r
5 import org.eclipse.core.runtime.Platform;
\r
6 import org.eclipse.jface.layout.GridDataFactory;
\r
7 import org.eclipse.jface.layout.GridLayoutFactory;
\r
8 import org.eclipse.jface.resource.ImageDescriptor;
\r
9 import org.eclipse.jface.resource.JFaceResources;
\r
10 import org.eclipse.jface.resource.LocalResourceManager;
\r
11 import org.eclipse.swt.SWT;
\r
12 import org.eclipse.swt.events.SelectionEvent;
\r
13 import org.eclipse.swt.events.SelectionListener;
\r
14 import org.eclipse.swt.graphics.Image;
\r
15 import org.eclipse.swt.graphics.RGB;
\r
16 import org.eclipse.swt.widgets.ColorDialog;
\r
17 import org.eclipse.swt.widgets.Composite;
\r
18 import org.eclipse.swt.widgets.Control;
\r
19 import org.eclipse.swt.widgets.Display;
\r
20 import org.eclipse.ui.IWorkbenchSite;
\r
21 import org.osgi.framework.Bundle;
\r
22 import org.simantics.Simantics;
\r
23 import org.simantics.browsing.ui.swt.widgets.Button;
\r
24 import org.simantics.browsing.ui.swt.widgets.Combo;
\r
25 import org.simantics.browsing.ui.swt.widgets.Label;
\r
26 import org.simantics.browsing.ui.swt.widgets.impl.ReadFactoryImpl;
\r
27 import org.simantics.browsing.ui.swt.widgets.impl.SelectionListenerImpl;
\r
28 import org.simantics.browsing.ui.swt.widgets.impl.Widget;
\r
29 import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport;
\r
30 import org.simantics.common.color.Color;
\r
31 import org.simantics.databoard.Bindings;
\r
32 import org.simantics.databoard.util.ObjectUtils;
\r
33 import org.simantics.db.ReadGraph;
\r
34 import org.simantics.db.Resource;
\r
35 import org.simantics.db.WriteGraph;
\r
36 import org.simantics.db.common.CommentMetadata;
\r
37 import org.simantics.db.common.request.PossibleIndexRoot;
\r
38 import org.simantics.db.common.request.PossibleObjectWithType;
\r
39 import org.simantics.db.common.request.WriteRequest;
\r
40 import org.simantics.db.exception.DatabaseException;
\r
41 import org.simantics.db.management.ISessionContext;
\r
42 import org.simantics.diagram.stubs.DiagramResource;
\r
43 import org.simantics.diagram.stubs.G2DResource;
\r
44 import org.simantics.layer0.Layer0;
\r
45 import org.simantics.operation.Layer0X;
\r
46 import org.simantics.selectionview.ConfigurationComposite;
\r
47 import org.simantics.ui.colors.Colors;
\r
48 import org.simantics.ui.utils.ResourceAdaptionUtils;
\r
49 import org.simantics.utils.datastructures.Triple;
\r
50 import org.simantics.utils.ui.BundleUtils;
\r
51 import org.simantics.utils.ui.ErrorLogger;
\r
52 import org.simantics.utils.ui.SWTUtils;
\r
53 import org.simantics.utils.ui.gfx.ColorImageDescriptor;
\r
54 import org.simantics.utils.ui.workbench.WorkbenchUtils;
\r
56 public class MonitorComposite extends ConfigurationComposite {
\r
58 private static final String DATA_CURRENT_COLOR = "COLOR";
\r
60 public void create(final Composite body, IWorkbenchSite site, final ISessionContext context, final WidgetSupport support) {
\r
61 final Display display = body.getDisplay();
\r
63 body.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
65 Composite buttonComposite = new Composite(body, SWT.NONE);
\r
66 buttonComposite.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
67 GridDataFactory.fillDefaults().span(2, 1).grab(true, false).applyTo(buttonComposite);
\r
68 GridLayoutFactory.fillDefaults().equalWidth(false).numColumns(4).extendedMargins(5,5,5,5).applyTo(buttonComposite);
\r
70 LocalResourceManager resourceManager = new LocalResourceManager(JFaceResources.getResources(), buttonComposite);
\r
71 support.setParameter(WidgetSupport.RESOURCE_MANAGER, resourceManager);
\r
73 Label templateHeader = new Label(buttonComposite, support, 0);
\r
74 templateHeader.setText("Template");
\r
75 //templateHeader.setFont(smallFont);
\r
76 templateHeader.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
77 GridDataFactory.fillDefaults().grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(templateHeader.getWidget());
\r
79 Combo templateCombo = new Combo(buttonComposite, support, SWT.NONE | SWT.READ_ONLY);
\r
80 templateCombo.setItemFactory(new AvailableTemplateFactory());
\r
81 templateCombo.setSelectionFactory(new CurrentTemplateFactory());
\r
82 templateCombo.addModifyListener(new TemplateModifier());
\r
83 GridDataFactory.fillDefaults().grab(true, false).applyTo(templateCombo.getWidget());
\r
85 Button setDefaultButton = new Button(buttonComposite, support, SWT.NONE | SWT.READ_ONLY);
\r
86 setDefaultButton.setText("Set As Default");
\r
87 setDefaultButton.setTooltipText("Set As Default for Newly Created Monitors");
\r
88 setDefaultButton.addSelectionListener(new SelectionListenerImpl<Resource>(context) {
\r
90 public void apply(WriteGraph graph, Resource monitor) throws DatabaseException {
\r
91 graph.markUndoPoint();
\r
92 Layer0X L0X = Layer0X.getInstance(graph);
\r
93 DiagramResource DIA = DiagramResource.getInstance(graph);
\r
94 Resource root = graph.syncRequest(new PossibleIndexRoot(monitor));
\r
95 Resource currentTemplate = graph.getPossibleObject(monitor, L0X.ObtainsProperty);
\r
96 if (root != null && !graph.isImmutable(root) && currentTemplate != null) {
\r
97 graph.deny(root, DIA.HasDefaultMonitorTemplate);
\r
98 graph.claim(root, DIA.HasDefaultMonitorTemplate, currentTemplate);
\r
102 GridDataFactory.fillDefaults().grab(false, false).applyTo(setDefaultButton.getWidget());
\r
104 Button resetButton = new Button(buttonComposite, support, SWT.NONE | SWT.READ_ONLY);
\r
105 resetButton.setText("Reset Local Changes");
\r
106 resetButton.addSelectionListener(new SelectionListenerImpl<Resource>(context) {
\r
108 public void apply(WriteGraph graph, Resource monitor) throws DatabaseException {
\r
109 graph.markUndoPoint();
\r
110 Layer0X L0X = Layer0X.getInstance(graph);
\r
111 DiagramResource DIA = DiagramResource.getInstance(graph);
\r
112 if(graph.hasStatement(monitor, DIA.HasFont)) graph.deny(monitor, DIA.HasFont);
\r
113 if(graph.hasStatement(monitor, DIA.HasFormatter)) graph.deny(monitor, DIA.HasFormatter);
\r
114 if(graph.hasStatement(monitor, DIA.HasColor)) graph.deny(monitor, DIA.HasColor);
\r
115 if(graph.hasStatement(monitor, L0X.HasExpression)) graph.deny(monitor, L0X.HasExpression);
\r
119 GridDataFactory.fillDefaults().grab(false, false).applyTo(resetButton.getWidget());
\r
121 Label fontHeader = new Label(buttonComposite, support, 0);
\r
122 fontHeader.setText("Font Family");
\r
123 //fontHeader.setFont(smallFont);
\r
124 fontHeader.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
125 GridDataFactory.fillDefaults().grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(fontHeader.getWidget());
\r
127 Combo fontCombo = new Combo(buttonComposite, support, SWT.NONE | SWT.READ_ONLY);
\r
128 fontCombo.setItemFactory2(new AvailableFontFactory());
\r
129 fontCombo.setSelectionFactory(new CurrentFontFactory());
\r
130 fontCombo.addModifyListener(new FontModifier());
\r
131 GridDataFactory.fillDefaults().grab(true, false).span(3,1).applyTo(fontCombo.getWidget());
\r
133 Label sizeHeader = new Label(buttonComposite, support, 0);
\r
134 sizeHeader.setText("Font Size");
\r
135 //sizeHeader.setFont(smallFont);
\r
136 sizeHeader.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
137 GridDataFactory.fillDefaults().grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(sizeHeader.getWidget());
\r
139 Combo sizeCombo = new Combo(buttonComposite, support, SWT.NONE | SWT.READ_ONLY);
\r
140 sizeCombo.setItemFactory2(new AvailableFontSizeFactory());
\r
141 sizeCombo.setSelectionFactory(new CurrentFontSizeFactory());
\r
142 sizeCombo.addModifyListener(new FontSizeModifier());
\r
143 GridDataFactory.fillDefaults().grab(false, false).span(3,1).minSize(50, 0).applyTo(sizeCombo.getWidget());
\r
145 Label formatterHeader = new Label(buttonComposite, support, 0);
\r
146 formatterHeader.setText("Formatting");
\r
147 //formatterHeader.setFont(smallFont);
\r
148 formatterHeader.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
149 GridDataFactory.fillDefaults().grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(formatterHeader.getWidget());
\r
151 Combo formatCombo = new Combo(buttonComposite, support, SWT.NONE | SWT.READ_ONLY);
\r
152 formatCombo.setItemFactory(new AvailableFormatFactory());
\r
153 formatCombo.setSelectionFactory(new CurrentFormatFactory());
\r
154 formatCombo.addModifyListener(new FormatModifier());
\r
155 GridDataFactory.fillDefaults().grab(true, false).span(3,1).applyTo(formatCombo.getWidget());
\r
157 Composite rowComposite = new Composite(buttonComposite, SWT.NONE);
\r
158 rowComposite.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
159 GridDataFactory.fillDefaults().span(3, 1).grab(true, false).applyTo(rowComposite);
\r
160 GridLayoutFactory.fillDefaults().equalWidth(false).numColumns(4).extendedMargins(5,5,5,5).applyTo(rowComposite);
\r
162 Label alignHeader = new Label(rowComposite, support, 0);
\r
163 alignHeader.setText("Alignment");
\r
164 //alignHeader.setFont(smallFont);
\r
165 alignHeader.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
166 GridDataFactory.fillDefaults().grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(alignHeader.getWidget());
\r
168 Bundle iconBundle = Platform.getBundle("com.famfamfam.silk");
\r
170 Composite alignComposite = new Composite(rowComposite, SWT.NONE);
\r
171 alignComposite.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
172 GridDataFactory.fillDefaults().span(1, 1).grab(false, false).applyTo(alignComposite);
\r
173 GridLayoutFactory.fillDefaults().equalWidth(false).numColumns(4).extendedMargins(5,5,5,5).applyTo(alignComposite);
\r
175 Button leadButton = new Button(alignComposite, support, SWT.TOGGLE);
\r
176 leadButton.setTooltipText("Left Alignment");
\r
177 leadButton.setImage((Image) resourceManager.get(BundleUtils.getImageDescriptorFromBundle(iconBundle, "icons/text_align_left.png")));
\r
178 leadButton.setSelectionFactory(new AlignmentSelectedFactory(G2DResource.URIs.Alignment_Leading));
\r
179 leadButton.addSelectionListener(new AlignmentSelectionListener(context, G2DResource.URIs.Alignment_Leading));
\r
181 Button centerButton = new Button(alignComposite, support, SWT.TOGGLE);
\r
182 centerButton.setTooltipText("Center Alignment");
\r
183 centerButton.setImage((Image) resourceManager.get(BundleUtils.getImageDescriptorFromBundle(iconBundle, "icons/text_align_center.png")));
\r
184 centerButton.setSelectionFactory(new AlignmentSelectedFactory(G2DResource.URIs.Alignment_Center));
\r
185 centerButton.addSelectionListener(new AlignmentSelectionListener(context, G2DResource.URIs.Alignment_Center));
\r
187 Button trailButton = new Button(alignComposite, support, SWT.TOGGLE);
\r
188 trailButton.setTooltipText("Right Alignment");
\r
189 trailButton.setImage((Image) resourceManager.get(BundleUtils.getImageDescriptorFromBundle(iconBundle, "icons/text_align_right.png")));
\r
190 trailButton.setSelectionFactory(new AlignmentSelectedFactory(G2DResource.URIs.Alignment_Trailing));
\r
191 trailButton.addSelectionListener(new AlignmentSelectionListener(context, G2DResource.URIs.Alignment_Trailing));
\r
193 Label colorHeader = new Label(rowComposite, support, 0);
\r
194 colorHeader.setText("Color");
\r
195 colorHeader.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
\r
196 GridDataFactory.fillDefaults().indent(20, 0).grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(colorHeader.getWidget());
\r
198 Button colorButton = new Button(rowComposite, support, SWT.PUSH);
\r
199 colorButton.setImageFactory( new CurrentColorImageFactory(colorButton.getWidget(), DATA_CURRENT_COLOR) );
\r
200 GridDataFactory.fillDefaults().indent(0, 0).grab(false, false).span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(colorButton.getWidget());
\r
201 StyleEditWidget colorWidget = new StyleEditWidget(colorButton.getWidget());
\r
202 colorButton.addSelectionListener(colorWidget);
\r
203 support.register(colorWidget);
\r
206 static class StyleEditWidget implements Widget, SelectionListener {
\r
211 public StyleEditWidget(Control control) {
\r
212 this.control = control;
\r
216 public void widgetSelected(SelectionEvent e) {
\r
217 final Resource[] resources = ResourceAdaptionUtils.toResources(input);
\r
218 if (resources.length != 0) {
\r
219 ColorDialog dialog = new ColorDialog(WorkbenchUtils.getActiveWorkbenchWindowShell(), SWT.NONE);
\r
220 dialog.setText("Set Monitor Color");
\r
221 Color oldColor = (Color) control.getData(DATA_CURRENT_COLOR);
\r
222 if (oldColor != null) {
\r
223 RGB oldRgb = Colors.rgb(oldColor);
\r
224 dialog.setRGB(oldRgb);
\r
226 RGB rgb = dialog.open();
\r
228 setColor(resources, rgb);
\r
234 public void widgetDefaultSelected(SelectionEvent e) {
\r
239 public void setInput(ISessionContext context, Object input) {
\r
240 this.input = input;
\r
245 static class AlignmentSelectedFactory extends ReadFactoryImpl<Resource, Boolean> {
\r
246 private String alignmentURI;
\r
248 public AlignmentSelectedFactory(String alignmentURI) {
\r
249 this.alignmentURI = alignmentURI;
\r
253 public Object getIdentity(Object inputContents) {
\r
254 return new Triple<Object, Object, Class<?>>(inputContents, alignmentURI, getClass());
\r
258 public Boolean perform(ReadGraph graph, Resource monitor) throws DatabaseException {
\r
259 G2DResource G2D = G2DResource.getInstance(graph);
\r
260 Resource expectedAlignment = graph.getResource(alignmentURI);
\r
261 Resource alignment = graph.getPossibleObject(monitor, G2D.HasHorizontalAlignment);
\r
262 return ObjectUtils.objectEquals(expectedAlignment, alignment);
\r
266 static class AlignmentSelectionListener extends SelectionListenerImpl<Resource> {
\r
267 private String alignmentURI;
\r
269 public AlignmentSelectionListener(ISessionContext context, String alignmentURI) {
\r
271 this.alignmentURI = alignmentURI;
\r
275 public void apply(WriteGraph graph, Resource monitor) throws DatabaseException {
\r
276 graph.markUndoPoint();
\r
277 G2DResource G2D = G2DResource.getInstance(graph);
\r
278 Resource alignment = graph.getResource(alignmentURI);
\r
279 graph.deny(monitor, G2D.HasHorizontalAlignment);
\r
280 graph.claim(monitor, G2D.HasHorizontalAlignment, null, alignment);
\r
284 private static void setColor(final Resource[] resources, final RGB rgb) {
\r
285 Color c = Colors.irgb(rgb);
\r
286 final double[] color = new double[] { c.getR(), c.getG(), c.getB() };
\r
288 Simantics.sync(new WriteRequest() {
\r
290 public void perform(WriteGraph graph) throws DatabaseException {
\r
291 graph.markUndoPoint();
\r
292 Layer0 L0 = Layer0.getInstance(graph);
\r
293 DiagramResource DIA = DiagramResource.getInstance(graph);
\r
294 for (Resource r : resources) {
\r
295 Resource realizedColor = graph.syncRequest(new PossibleObjectWithType(r, DIA.HasColor, DIA.RealizedColor));
\r
296 if (realizedColor == null) {
\r
297 realizedColor = graph.newResource();
\r
298 graph.claim(realizedColor, L0.InstanceOf, null, DIA.RealizedColor);
\r
299 graph.claim(r, DIA.HasColor, realizedColor);
\r
301 graph.claimLiteral(realizedColor, DIA.RealizedColor_HasRGB, L0.DoubleArray, color, Bindings.DOUBLE_ARRAY);
\r
303 CommentMetadata cm = graph.getMetadata(CommentMetadata.class);
\r
304 graph.addMetadata(cm.add("Set color to " + rgb + " for resources " + Arrays.toString(resources)));
\r
307 } catch (DatabaseException e) {
\r
308 ErrorLogger.defaultLogError(e);
\r
312 private static class CurrentColorImageFactory extends ReadFactoryImpl<Resource, ImageDescriptor> {
\r
317 public CurrentColorImageFactory(Control control, String colorKey) {
\r
318 this.control = control;
\r
319 this.colorKey = colorKey;
\r
323 public ImageDescriptor perform(ReadGraph graph, Resource monitor) throws DatabaseException {
\r
324 DiagramResource DIA = DiagramResource.getInstance(graph);
\r
325 Color c = graph.getPossibleRelatedAdapter(monitor, DIA.HasColor, Color.class);
\r
327 c = new org.simantics.datatypes.literal.RGB.Integer(0, 0, 0);
\r
328 final Color color = c;
\r
329 if (control != null) {
\r
330 SWTUtils.asyncExec(control, new Runnable() {
\r
332 public void run() {
\r
333 if (!control.isDisposed())
\r
334 control.setData(colorKey, color);
\r
338 RGB rgb = Colors.rgb(color);
\r
339 return new ColorImageDescriptor(rgb.red, rgb.green, rgb.blue, 16, 16, false);
\r