]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/SWTDocumentClient.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.swt.core / src / org / simantics / document / swt / core / SWTDocumentClient.java
diff --git a/bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/SWTDocumentClient.java b/bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/SWTDocumentClient.java
new file mode 100644 (file)
index 0000000..99cbf6c
--- /dev/null
@@ -0,0 +1,158 @@
+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