]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/SWTDocumentClient.java
Playground for Antti.
[simantics/platform.git] / bundles / org.simantics.document.swt.core / src / org / simantics / document / swt / core / SWTDocumentClient.java
1 package org.simantics.document.swt.core;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.HashMap;
6 import java.util.HashSet;
7 import java.util.List;
8 import java.util.Map;
9
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;
37
38 public class SWTDocumentClient extends DocumentClient implements SWTDocument {
39
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>();
47
48         private boolean requireLayout=false;
49
50         public SWTDocumentClient(WidgetMapping mapping, ISelectionProvider selectionProvider, IWorkbenchSite site, Composite container) {
51                 
52                 super(mapping, SWTViews.getCommandMapping());
53                 
54                 this.container = container;
55                 this.site = site;
56                 this.selectionProvider = selectionProvider;
57                 this.device = container.getDisplay();
58                 this.thread = SWTThread.getThreadAccess(container);
59
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);
65                 
66                 GridDataFactory.fillDefaults().grab(true, true).minSize(1, 1).applyTo((Control)wc.getControl());
67                 GridLayoutFactory.fillDefaults().applyTo((Composite)wc.getControl());
68                 
69                 widgetData.put("root", new WidgetData(this, wc, rootObject));
70                 
71         }
72         
73         @Override
74         public IThreadWorkQueue thread() {
75                 return thread;
76         }
77         
78         @Override
79         public Color getColor(org.simantics.datatypes.literal.RGB.Integer descriptor) {
80                 Color color = colors.get(descriptor);
81                 if(color == null) {
82                         color = Colors.swt(device, descriptor);
83                         colors.put(descriptor, color);
84                 }
85                 return color;
86         }
87         
88         @Override
89         public Font getFont(org.simantics.datatypes.literal.Font descriptor) {
90                 Font font = fonts.get(descriptor);
91                 if(font == null) {
92                         font = Fonts.swt(device, descriptor);
93                         fonts.put(descriptor, font);
94                 }
95                 return font;
96         }
97         
98         @Override
99         public ISelectionProvider getSelectionProvider() {
100                 return selectionProvider;
101         }
102         
103         @Override
104         public IWorkbenchSite getSite() {
105                 return site;
106         }
107         
108         @Override
109         public void post(AbstractEventHandler handler, CommandContextMutable parameters) {
110                 handler.handle(parameters);
111         }
112         
113
114         @Override
115         protected void updateDocument(Collection<JSONObject> objects) {
116                 assert thread.currentThreadAccess();
117                 super.updateDocument(objects);
118                 if(requireLayout) {
119                         container.layout(true, true);
120                         requireLayout = false;
121                 }
122         }
123
124         @Override
125         protected void updateTree(HashSet<WidgetData> updates) {
126                 
127                 if(updates.isEmpty()) return;
128                 
129                 for(WidgetData data : updates) {
130                         WidgetContainer<?> container = (WidgetContainer<?>)data.widget;
131                         Control ctrl = container.getControl();
132                         if (ctrl == null || ctrl.isDisposed())
133                                 continue;
134                         if(ctrl instanceof Composite) {
135                                 Composite composite = (Composite)ctrl;
136                                 for(Control c : composite.getChildren()) {
137                                         c.dispose();
138                                 }
139                         }
140                 }
141                 
142                 super.updateTree(updates);
143                 
144                 for(WidgetData data : widgetData.values()) {
145                         WidgetContainer<?> container = (WidgetContainer<?>)data.widget;
146                         if(container != null)
147                             container.getOrCreateControl(this, data.object);
148                 }
149                 
150         }
151         
152         @Override
153         public CommandContext handleCommands(List<Pair<WidgetData, ICommand>> data, CommandContextMutable context, Object component) {   
154
155             // Build a linked list of commands
156
157             ArrayList<IEventCommand> commands = new ArrayList<IEventCommand>();
158             for(Pair<WidgetData, ICommand> pair : data) {
159                 WidgetData d = pair.first;
160
161                 ICommand c = pair.second;
162                 IEventCommand p = d.eventCommand(c, null);
163 //              if(component != null && p != null)
164 //                  p.setTrigger(component);
165                 if(p != null) {
166                     if(!commands.isEmpty())
167                         commands.get(commands.size()-1).setNext(p);
168                     commands.add(p);
169                 }
170             }
171
172             // Execute the first command, the linked list handles the rest of them
173             if(!commands.isEmpty()) {
174                 try {
175                     commands.get(0).handleCommand(context);
176                 } finally {
177                 }
178             }
179             return context;
180         }
181
182         @Override
183         public void layout() {
184                 requireLayout = true;
185         }
186         
187     @Override
188     public HashMap<String, WidgetData> getWidgetData() {
189         return widgetData;
190     }
191     
192     public void displayError(String error) {
193         Logger.defaultLogError(error);
194     }
195         
196 }