--- /dev/null
+package org.simantics.document.swt.core;\r
+\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.Map;\r
+\r
+import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.jface.layout.GridLayoutFactory;\r
+import org.eclipse.jface.viewers.ISelectionProvider;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.Device;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.ui.IWorkbenchSite;\r
+import org.simantics.db.common.utils.Logger;\r
+import org.simantics.document.server.JSONObject;\r
+import org.simantics.document.server.client.DocumentClient;\r
+import org.simantics.document.server.client.WidgetData;\r
+import org.simantics.document.server.client.WidgetMapping;\r
+import org.simantics.document.server.handler.AbstractEventHandler;\r
+import org.simantics.document.server.io.CommandContext;\r
+import org.simantics.document.swt.core.base.WidgetContainer;\r
+import org.simantics.document.swt.core.widget.FillComposite;\r
+import org.simantics.ui.colors.Colors;\r
+import org.simantics.ui.fonts.Fonts;\r
+import org.simantics.utils.threads.IThreadWorkQueue;\r
+import org.simantics.utils.threads.SWTThread;\r
+\r
+public class SWTDocumentClient extends DocumentClient implements SWTDocument {\r
+\r
+ private Composite container;\r
+ private IWorkbenchSite site;\r
+ private ISelectionProvider selectionProvider;\r
+ private Device device;\r
+ private IThreadWorkQueue thread;\r
+ private Map<org.simantics.datatypes.literal.RGB.Integer, Color> colors = new HashMap<org.simantics.datatypes.literal.RGB.Integer, Color>();\r
+ private Map<org.simantics.datatypes.literal.Font, Font> fonts = new HashMap<org.simantics.datatypes.literal.Font, Font>();\r
+\r
+ private boolean requireLayout=false;\r
+\r
+ public SWTDocumentClient(WidgetMapping mapping, ISelectionProvider selectionProvider, IWorkbenchSite site, Composite container) {\r
+ \r
+ super(mapping, SWTViews.getCommandMapping());\r
+ \r
+ this.container = container;\r
+ this.site = site;\r
+ this.selectionProvider = selectionProvider;\r
+ this.device = container.getDisplay();\r
+ this.thread = SWTThread.getThreadAccess(container);\r
+\r
+ JSONObject rootObject = new JSONObject("root");\r
+ rootObject.addJSONField("type", "Root");\r
+ FillComposite mgr = new FillComposite();\r
+ WidgetContainer<?> wc = mgr.createWidget(rootObject); \r
+ wc.createControl(this, container, rootObject);\r
+ \r
+ GridDataFactory.fillDefaults().grab(true, true).minSize(1, 1).applyTo((Control)wc.getControl());\r
+ GridLayoutFactory.fillDefaults().applyTo((Composite)wc.getControl());\r
+ \r
+ widgetData.put("root", new WidgetData(this, wc, rootObject));\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public IThreadWorkQueue thread() {\r
+ return thread;\r
+ }\r
+ \r
+ @Override\r
+ public Color getColor(org.simantics.datatypes.literal.RGB.Integer descriptor) {\r
+ Color color = colors.get(descriptor);\r
+ if(color == null) {\r
+ color = Colors.swt(device, descriptor);\r
+ colors.put(descriptor, color);\r
+ }\r
+ return color;\r
+ }\r
+ \r
+ @Override\r
+ public Font getFont(org.simantics.datatypes.literal.Font descriptor) {\r
+ Font font = fonts.get(descriptor);\r
+ if(font == null) {\r
+ font = Fonts.swt(device, descriptor);\r
+ fonts.put(descriptor, font);\r
+ }\r
+ return font;\r
+ }\r
+ \r
+ @Override\r
+ public ISelectionProvider getSelectionProvider() {\r
+ return selectionProvider;\r
+ }\r
+ \r
+ @Override\r
+ public IWorkbenchSite getSite() {\r
+ return site;\r
+ }\r
+ \r
+ @Override\r
+ public void post(final AbstractEventHandler handler, CommandContext parameters) {\r
+ handler.handle(parameters);\r
+ }\r
+\r
+ @Override\r
+ protected void updateDocument(Collection<JSONObject> objects) {\r
+ assert thread.currentThreadAccess();\r
+ super.updateDocument(objects);\r
+ if(requireLayout) {\r
+ container.layout(true, true);\r
+ requireLayout = false;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected void updateTree(HashSet<WidgetData> updates) {\r
+ \r
+ if(updates.isEmpty()) return;\r
+ \r
+ for(WidgetData data : updates) {\r
+ WidgetContainer<?> container = (WidgetContainer<?>)data.widget;\r
+ Control ctrl = container.getControl();\r
+ if (ctrl == null || ctrl.isDisposed())\r
+ continue;\r
+ if(ctrl instanceof Composite) {\r
+ Composite composite = (Composite)ctrl;\r
+ for(Control c : composite.getChildren()) {\r
+ c.dispose();\r
+ }\r
+ }\r
+ }\r
+ \r
+ super.updateTree(updates);\r
+ \r
+ for(WidgetData data : widgetData.values()) {\r
+ WidgetContainer<?> container = (WidgetContainer<?>)data.widget;\r
+ if(container != null)\r
+ container.getOrCreateControl(this, data.object);\r
+ }\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void layout() {\r
+ requireLayout = true;\r
+ }\r
+ \r
+ @Override\r
+ public HashMap<String, WidgetData> getWidgetData() {\r
+ return widgetData;\r
+ }\r
+ \r
+ public void displayError(String error) {\r
+ Logger.defaultLogError(error);\r
+ }\r
+ \r
+}\r