]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagram/monitor/MonitorComposite.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagram / monitor / MonitorComposite.java
1 package org.simantics.modeling.ui.diagram.monitor;\r
2 \r
3 import java.util.Arrays;\r
4 \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
55 \r
56 public class MonitorComposite extends ConfigurationComposite {\r
57 \r
58     private static final String DATA_CURRENT_COLOR = "COLOR";\r
59 \r
60     public void create(final Composite body, IWorkbenchSite site, final ISessionContext context, final WidgetSupport support) {\r
61         final Display display = body.getDisplay();\r
62 \r
63         body.setBackground(display.getSystemColor(SWT.COLOR_WHITE));\r
64 \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
69 \r
70         LocalResourceManager resourceManager = new LocalResourceManager(JFaceResources.getResources(), buttonComposite);\r
71         support.setParameter(WidgetSupport.RESOURCE_MANAGER, resourceManager);\r
72 \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
78 \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
84 \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
89             @Override\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
99                 }\r
100             }\r
101         });\r
102         GridDataFactory.fillDefaults().grab(false, false).applyTo(setDefaultButton.getWidget());\r
103 \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
107             @Override\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
116             }\r
117         });\r
118 \r
119         GridDataFactory.fillDefaults().grab(false, false).applyTo(resetButton.getWidget());\r
120 \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
126 \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
132 \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
138 \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
144 \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
150 \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
156 \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
161 \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
167 \r
168         Bundle iconBundle = Platform.getBundle("com.famfamfam.silk");\r
169 \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
174 \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
180 \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
186 \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
192 \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
197 \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
204     }\r
205 \r
206     static class StyleEditWidget implements Widget, SelectionListener {\r
207 \r
208         Control control;\r
209         Object input;\r
210 \r
211         public StyleEditWidget(Control control) {\r
212             this.control = control;\r
213         }\r
214 \r
215         @Override\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
225                 }\r
226                 RGB rgb = dialog.open();\r
227                 if (rgb != null) {\r
228                     setColor(resources, rgb);\r
229                 }\r
230             }\r
231         }\r
232 \r
233         @Override\r
234         public void widgetDefaultSelected(SelectionEvent e) {\r
235             widgetSelected(e);\r
236         }\r
237 \r
238         @Override\r
239         public void setInput(ISessionContext context, Object input) {\r
240             this.input = input;\r
241         }\r
242 \r
243     }\r
244 \r
245     static class AlignmentSelectedFactory extends ReadFactoryImpl<Resource, Boolean> {\r
246         private String alignmentURI;\r
247 \r
248         public AlignmentSelectedFactory(String alignmentURI) {\r
249             this.alignmentURI = alignmentURI;\r
250         }\r
251 \r
252         @Override\r
253         public Object getIdentity(Object inputContents) {\r
254             return new Triple<Object, Object, Class<?>>(inputContents, alignmentURI, getClass());\r
255         }\r
256 \r
257         @Override\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
263         }\r
264     }\r
265 \r
266     static class AlignmentSelectionListener extends SelectionListenerImpl<Resource> {\r
267         private String alignmentURI;\r
268 \r
269         public AlignmentSelectionListener(ISessionContext context, String alignmentURI) {\r
270             super(context);\r
271             this.alignmentURI = alignmentURI;\r
272         }\r
273 \r
274         @Override\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
281         }\r
282     }\r
283 \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
287         try {\r
288             Simantics.sync(new WriteRequest() {\r
289                 @Override\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
300                         }\r
301                         graph.claimLiteral(realizedColor, DIA.RealizedColor_HasRGB, L0.DoubleArray, color, Bindings.DOUBLE_ARRAY);\r
302                     }\r
303                     CommentMetadata cm = graph.getMetadata(CommentMetadata.class);\r
304                     graph.addMetadata(cm.add("Set color to " + rgb + " for resources " + Arrays.toString(resources)));\r
305                 }\r
306             });\r
307         } catch (DatabaseException e) {\r
308             ErrorLogger.defaultLogError(e);\r
309         }\r
310     }\r
311 \r
312     private static class CurrentColorImageFactory extends ReadFactoryImpl<Resource, ImageDescriptor> {\r
313 \r
314         Control control;\r
315         String colorKey;\r
316 \r
317         public CurrentColorImageFactory(Control control, String colorKey) {\r
318             this.control = control;\r
319             this.colorKey = colorKey;\r
320         }\r
321 \r
322         @Override\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
326             if (c == null)\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
331                     @Override\r
332                     public void run() {\r
333                         if (!control.isDisposed())\r
334                             control.setData(colorKey, color);\r
335                     }\r
336                 });\r
337             }\r
338             RGB rgb = Colors.rgb(color);\r
339             return new ColorImageDescriptor(rgb.red, rgb.green, rgb.blue, 16, 16, false);\r
340         }\r
341 \r
342     }\r
343 \r
344 }\r