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