1 package org.simantics.document.swt.core;
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.HashMap;
6 import java.util.HashSet;
10 import org.eclipse.jface.layout.GridDataFactory;
11 import org.eclipse.jface.layout.GridLayoutFactory;
12 import org.eclipse.jface.viewers.ISelectionProvider;
13 import org.eclipse.swt.graphics.Color;
14 import org.eclipse.swt.graphics.Device;
15 import org.eclipse.swt.graphics.Font;
16 import org.eclipse.swt.widgets.Composite;
17 import org.eclipse.swt.widgets.Control;
18 import org.eclipse.ui.IWorkbenchSite;
19 import org.simantics.db.common.utils.Logger;
20 import org.simantics.document.server.IEventCommand;
21 import org.simantics.document.server.JSONObject;
22 import org.simantics.document.server.client.DocumentClient;
23 import org.simantics.document.server.client.WidgetData;
24 import org.simantics.document.server.client.WidgetMapping;
25 import org.simantics.document.server.io.AbstractEventHandler;
26 import org.simantics.document.server.io.CommandContext;
27 import org.simantics.document.server.io.CommandContextMutable;
28 import org.simantics.document.server.io.ICommand;
29 import org.simantics.document.server.io.JSONObjectUtils;
30 import org.simantics.document.swt.core.base.WidgetContainer;
31 import org.simantics.document.swt.core.widget.FillComposite;
32 import org.simantics.ui.colors.Colors;
33 import org.simantics.ui.fonts.Fonts;
34 import org.simantics.utils.datastructures.Pair;
35 import org.simantics.utils.threads.IThreadWorkQueue;
36 import org.simantics.utils.threads.SWTThread;
38 public class SWTDocumentClient extends DocumentClient implements SWTDocument {
40 private Composite container;
41 private IWorkbenchSite site;
42 private ISelectionProvider selectionProvider;
43 private Device device;
44 private IThreadWorkQueue thread;
45 private Map<org.simantics.datatypes.literal.RGB.Integer, Color> colors = new HashMap<org.simantics.datatypes.literal.RGB.Integer, Color>();
46 private Map<org.simantics.datatypes.literal.Font, Font> fonts = new HashMap<org.simantics.datatypes.literal.Font, Font>();
48 private boolean requireLayout=false;
50 public SWTDocumentClient(WidgetMapping mapping, ISelectionProvider selectionProvider, IWorkbenchSite site, Composite container) {
52 super(mapping, SWTViews.getCommandMapping());
54 this.container = container;
56 this.selectionProvider = selectionProvider;
57 this.device = container.getDisplay();
58 this.thread = SWTThread.getThreadAccess(container);
60 JSONObject rootObject = new JSONObject("root");
61 rootObject.addJSONField("type", "Root");
62 FillComposite mgr = new FillComposite();
63 WidgetContainer<?> wc = mgr.createWidget(rootObject);
64 wc.createControl(this, container, rootObject);
66 GridDataFactory.fillDefaults().grab(true, true).minSize(1, 1).applyTo((Control)wc.getControl());
67 GridLayoutFactory.fillDefaults().applyTo((Composite)wc.getControl());
69 widgetData.put("root", new WidgetData(this, wc, rootObject));
74 public IThreadWorkQueue thread() {
79 public Color getColor(org.simantics.datatypes.literal.RGB.Integer descriptor) {
80 Color color = colors.get(descriptor);
82 color = Colors.swt(device, descriptor);
83 colors.put(descriptor, color);
89 public Font getFont(org.simantics.datatypes.literal.Font descriptor) {
90 Font font = fonts.get(descriptor);
92 font = Fonts.swt(device, descriptor);
93 fonts.put(descriptor, font);
99 public ISelectionProvider getSelectionProvider() {
100 return selectionProvider;
104 public IWorkbenchSite getSite() {
109 public void post(AbstractEventHandler handler, CommandContextMutable parameters) {
110 handler.handle(parameters);
115 protected void updateDocument(Collection<JSONObject> objects) {
116 assert thread.currentThreadAccess();
117 super.updateDocument(objects);
119 container.layout(true, true);
120 requireLayout = false;
125 protected void updateTree(HashSet<WidgetData> updates) {
127 if(updates.isEmpty()) return;
129 for(WidgetData data : updates) {
130 WidgetContainer<?> container = (WidgetContainer<?>)data.widget;
131 Control ctrl = container.getControl();
132 if (ctrl == null || ctrl.isDisposed())
134 if(ctrl instanceof Composite) {
135 Composite composite = (Composite)ctrl;
136 for(Control c : composite.getChildren()) {
142 super.updateTree(updates);
144 for(WidgetData data : widgetData.values()) {
145 WidgetContainer<?> container = (WidgetContainer<?>)data.widget;
146 if(container != null)
147 container.getOrCreateControl(this, data.object);
153 public CommandContext handleCommands(List<Pair<WidgetData, ICommand>> data, CommandContextMutable context, Object component) {
155 // Build a linked list of commands
157 ArrayList<IEventCommand> commands = new ArrayList<IEventCommand>();
158 for(Pair<WidgetData, ICommand> pair : data) {
159 WidgetData d = pair.first;
161 ICommand c = pair.second;
162 IEventCommand p = d.eventCommand(c, null);
163 // if(component != null && p != null)
164 // p.setTrigger(component);
166 if(!commands.isEmpty())
167 commands.get(commands.size()-1).setNext(p);
172 // Execute the first command, the linked list handles the rest of them
173 if(!commands.isEmpty()) {
175 commands.get(0).handleCommand(context);
183 public void layout() {
184 requireLayout = true;
188 public HashMap<String, WidgetData> getWidgetData() {
192 public void displayError(String error) {
193 Logger.defaultLogError(error);