1 package org.simantics.document.swt.core;
\r
3 import java.util.Collection;
\r
4 import java.util.HashMap;
\r
5 import java.util.HashSet;
\r
6 import java.util.Map;
\r
8 import org.eclipse.jface.layout.GridDataFactory;
\r
9 import org.eclipse.jface.layout.GridLayoutFactory;
\r
10 import org.eclipse.jface.viewers.ISelectionProvider;
\r
11 import org.eclipse.swt.graphics.Color;
\r
12 import org.eclipse.swt.graphics.Device;
\r
13 import org.eclipse.swt.graphics.Font;
\r
14 import org.eclipse.swt.widgets.Composite;
\r
15 import org.eclipse.swt.widgets.Control;
\r
16 import org.eclipse.ui.IWorkbenchSite;
\r
17 import org.simantics.db.common.utils.Logger;
\r
18 import org.simantics.document.server.JSONObject;
\r
19 import org.simantics.document.server.client.DocumentClient;
\r
20 import org.simantics.document.server.client.WidgetData;
\r
21 import org.simantics.document.server.client.WidgetMapping;
\r
22 import org.simantics.document.server.handler.AbstractEventHandler;
\r
23 import org.simantics.document.server.io.CommandContext;
\r
24 import org.simantics.document.swt.core.base.WidgetContainer;
\r
25 import org.simantics.document.swt.core.widget.FillComposite;
\r
26 import org.simantics.ui.colors.Colors;
\r
27 import org.simantics.ui.fonts.Fonts;
\r
28 import org.simantics.utils.threads.IThreadWorkQueue;
\r
29 import org.simantics.utils.threads.SWTThread;
\r
31 public class SWTDocumentClient extends DocumentClient implements SWTDocument {
\r
33 private Composite container;
\r
34 private IWorkbenchSite site;
\r
35 private ISelectionProvider selectionProvider;
\r
36 private Device device;
\r
37 private IThreadWorkQueue thread;
\r
38 private Map<org.simantics.datatypes.literal.RGB.Integer, Color> colors = new HashMap<org.simantics.datatypes.literal.RGB.Integer, Color>();
\r
39 private Map<org.simantics.datatypes.literal.Font, Font> fonts = new HashMap<org.simantics.datatypes.literal.Font, Font>();
\r
41 private boolean requireLayout=false;
\r
43 public SWTDocumentClient(WidgetMapping mapping, ISelectionProvider selectionProvider, IWorkbenchSite site, Composite container) {
\r
45 super(mapping, SWTViews.getCommandMapping());
\r
47 this.container = container;
\r
49 this.selectionProvider = selectionProvider;
\r
50 this.device = container.getDisplay();
\r
51 this.thread = SWTThread.getThreadAccess(container);
\r
53 JSONObject rootObject = new JSONObject("root");
\r
54 rootObject.addJSONField("type", "Root");
\r
55 FillComposite mgr = new FillComposite();
\r
56 WidgetContainer<?> wc = mgr.createWidget(rootObject);
\r
57 wc.createControl(this, container, rootObject);
\r
59 GridDataFactory.fillDefaults().grab(true, true).minSize(1, 1).applyTo((Control)wc.getControl());
\r
60 GridLayoutFactory.fillDefaults().applyTo((Composite)wc.getControl());
\r
62 widgetData.put("root", new WidgetData(this, wc, rootObject));
\r
67 public IThreadWorkQueue thread() {
\r
72 public Color getColor(org.simantics.datatypes.literal.RGB.Integer descriptor) {
\r
73 Color color = colors.get(descriptor);
\r
75 color = Colors.swt(device, descriptor);
\r
76 colors.put(descriptor, color);
\r
82 public Font getFont(org.simantics.datatypes.literal.Font descriptor) {
\r
83 Font font = fonts.get(descriptor);
\r
85 font = Fonts.swt(device, descriptor);
\r
86 fonts.put(descriptor, font);
\r
92 public ISelectionProvider getSelectionProvider() {
\r
93 return selectionProvider;
\r
97 public IWorkbenchSite getSite() {
\r
102 public void post(final AbstractEventHandler handler, CommandContext parameters) {
\r
103 handler.handle(parameters);
\r
107 protected void updateDocument(Collection<JSONObject> objects) {
\r
108 assert thread.currentThreadAccess();
\r
109 super.updateDocument(objects);
\r
110 if(requireLayout) {
\r
111 container.layout(true, true);
\r
112 requireLayout = false;
\r
117 protected void updateTree(HashSet<WidgetData> updates) {
\r
119 if(updates.isEmpty()) return;
\r
121 for(WidgetData data : updates) {
\r
122 WidgetContainer<?> container = (WidgetContainer<?>)data.widget;
\r
123 Control ctrl = container.getControl();
\r
124 if (ctrl == null || ctrl.isDisposed())
\r
126 if(ctrl instanceof Composite) {
\r
127 Composite composite = (Composite)ctrl;
\r
128 for(Control c : composite.getChildren()) {
\r
134 super.updateTree(updates);
\r
136 for(WidgetData data : widgetData.values()) {
\r
137 WidgetContainer<?> container = (WidgetContainer<?>)data.widget;
\r
138 if(container != null)
\r
139 container.getOrCreateControl(this, data.object);
\r
145 public void layout() {
\r
146 requireLayout = true;
\r
150 public HashMap<String, WidgetData> getWidgetData() {
\r
154 public void displayError(String error) {
\r
155 Logger.defaultLogError(error);
\r