-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
+/*******************************************************************************
+ * Copyright (c) 2019 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Semantum Oy - initial API and implementation
+ *******************************************************************************/
+package org.simantics.document.swt.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Device;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbenchSite;
+import org.simantics.db.common.utils.Logger;
+import org.simantics.document.server.IEventCommand;
+import org.simantics.document.server.JSONObject;
+import org.simantics.document.server.client.DocumentClient;
+import org.simantics.document.server.client.WidgetData;
+import org.simantics.document.server.client.WidgetMapping;
+import org.simantics.document.server.io.AbstractEventHandler;
+import org.simantics.document.server.io.CommandContext;
+import org.simantics.document.server.io.CommandContextMutable;
+import org.simantics.document.server.io.ICommand;
+import org.simantics.document.swt.core.base.WidgetContainer;
+import org.simantics.document.swt.core.widget.FillComposite;
+import org.simantics.ui.colors.Colors;
+import org.simantics.ui.fonts.Fonts;
+import org.simantics.utils.datastructures.Pair;
+import org.simantics.utils.threads.IThreadWorkQueue;
+import org.simantics.utils.threads.SWTThread;
+
+public class SWTDocumentClient extends DocumentClient implements SWTDocument {
+
+ private Composite container;
+ private IWorkbenchSite site;
+ private ISelectionProvider selectionProvider;
+ private Device device;
+ private IThreadWorkQueue thread;
+ private Map<org.simantics.datatypes.literal.RGB.Integer, Color> colors = new HashMap<org.simantics.datatypes.literal.RGB.Integer, Color>();
+ private Map<org.simantics.datatypes.literal.Font, Font> fonts = new HashMap<org.simantics.datatypes.literal.Font, Font>();
+
+ private boolean requireLayout=false;
+
+ public SWTDocumentClient(WidgetMapping mapping, ISelectionProvider selectionProvider, IWorkbenchSite site, Composite container) {
+
+ super(mapping, SWTViews.getCommandMapping());
+
+ this.container = container;
+ this.site = site;
+ this.selectionProvider = selectionProvider;
+ this.device = container.getDisplay();
+ this.thread = SWTThread.getThreadAccess(container);
+
+ JSONObject rootObject = new JSONObject("root");
+ rootObject.addJSONField("type", "Root");
+ FillComposite mgr = new FillComposite();
+ WidgetContainer<?> wc = mgr.createWidget(rootObject);
+ wc.createControl(this, container, rootObject);
+
+ GridDataFactory.fillDefaults().grab(true, true).minSize(1, 1).applyTo((Control)wc.getControl());
+ GridLayoutFactory.fillDefaults().applyTo((Composite)wc.getControl());
+
+ widgetData.put("root", new WidgetData(this, wc, rootObject));
+
+ }
+
+ @Override
+ public IThreadWorkQueue thread() {
+ return thread;
+ }
+
+ @Override
+ public Color getColor(org.simantics.datatypes.literal.RGB.Integer descriptor) {
+ Color color = colors.get(descriptor);
+ if(color == null) {
+ color = Colors.swt(device, descriptor);
+ colors.put(descriptor, color);
+ }
+ return color;
+ }
+
+ @Override
+ public Font getFont(org.simantics.datatypes.literal.Font descriptor) {
+ Font font = fonts.get(descriptor);
+ if(font == null) {
+ font = Fonts.swt(device, descriptor);
+ fonts.put(descriptor, font);
+ }
+ return font;
+ }
+
+ @Override
+ public ISelectionProvider getSelectionProvider() {
+ return selectionProvider;
+ }
+
+ @Override
+ public IWorkbenchSite getSite() {
+ return site;
+ }
+
+ @Override
+ public void post(AbstractEventHandler handler, CommandContextMutable parameters) {
+ handler.handle(parameters);
+ }
+
+
+ @Override
+ protected void updateDocument(Collection<JSONObject> objects) {
+ assert thread.currentThreadAccess();
+ super.updateDocument(objects);
+ if(requireLayout) {
+ container.layout(true, true);
+ requireLayout = false;
+ }
+ }
+
+ @Override
+ protected void updateTree(HashSet<WidgetData> updates) {
+
+ if(updates.isEmpty()) return;
+
+ for(WidgetData data : updates) {
+ WidgetContainer<?> container = (WidgetContainer<?>)data.widget;
+ Control ctrl = container.getControl();
+ if (ctrl == null || ctrl.isDisposed())
+ continue;
+ if(ctrl instanceof Composite) {
+ Composite composite = (Composite)ctrl;
+ for(Control c : composite.getChildren()) {
+ c.dispose();
+ }
+ }
+ }
+
+ super.updateTree(updates);
+
+ for(WidgetData data : widgetData.values()) {
+ WidgetContainer<?> container = (WidgetContainer<?>)data.widget;
+ if(container != null)
+ container.getOrCreateControl(this, data.object);
+ }
+
+ }
+
+ @Override
+ public CommandContext handleCommands(List<Pair<WidgetData, ICommand>> data, CommandContextMutable context, Object component) {
+
+ // Build a linked list of commands
+
+ ArrayList<IEventCommand> commands = new ArrayList<>();
+ for(Pair<WidgetData, ICommand> pair : data) {
+ WidgetData d = pair.first;
+
+ ICommand c = pair.second;
+ IEventCommand p = d.eventCommand(c, null);
+// if(component != null && p != null)
+// p.setTrigger(component);
+ if(p != null) {
+ if(!commands.isEmpty())
+ commands.get(commands.size()-1).setNext(p);
+ commands.add(p);
+ }
+ }
+
+ // Execute the first command, the linked list handles the rest of them
+ if(!commands.isEmpty()) {
+ try {
+ commands.get(0).handleCommand(context);
+ } finally {
+ }
+ }
+ return context;
+ }
+
+ @Override
+ public void layout() {
+ requireLayout = true;
+ }
+
+ @Override
+ public HashMap<String, WidgetData> getWidgetData() {
+ return widgetData;
+ }
+
+ public void displayError(String error) {
+ Logger.defaultLogError(error);
+ }
+
+}