]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/SWTDocumentClient.java
58c280595b0ac8fd31de57ca3d5cd6a45fdbaebd
[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.Collection;
4 import java.util.HashMap;
5 import java.util.HashSet;
6 import java.util.Map;
7
8 import org.eclipse.jface.layout.GridDataFactory;
9 import org.eclipse.jface.layout.GridLayoutFactory;
10 import org.eclipse.jface.viewers.ISelectionProvider;
11 import org.eclipse.swt.graphics.Color;
12 import org.eclipse.swt.graphics.Device;
13 import org.eclipse.swt.graphics.Font;
14 import org.eclipse.swt.widgets.Composite;
15 import org.eclipse.swt.widgets.Control;
16 import org.eclipse.ui.IWorkbenchSite;
17 import org.simantics.db.common.utils.Logger;
18 import org.simantics.document.server.JSONObject;
19 import org.simantics.document.server.client.DocumentClient;
20 import org.simantics.document.server.client.WidgetData;
21 import org.simantics.document.server.client.WidgetMapping;
22 import org.simantics.document.server.handler.AbstractEventHandler;
23 import org.simantics.document.server.io.CommandContext;
24 import org.simantics.document.swt.core.base.WidgetContainer;
25 import org.simantics.document.swt.core.widget.FillComposite;
26 import org.simantics.ui.colors.Colors;
27 import org.simantics.ui.fonts.Fonts;
28 import org.simantics.utils.threads.IThreadWorkQueue;
29 import org.simantics.utils.threads.SWTThread;
30
31 public class SWTDocumentClient extends DocumentClient implements SWTDocument {
32
33         private Composite container;
34         private IWorkbenchSite site;
35         private ISelectionProvider selectionProvider;
36         private Device device;
37         private IThreadWorkQueue thread;
38         private Map<org.simantics.datatypes.literal.RGB.Integer, Color> colors = new HashMap<org.simantics.datatypes.literal.RGB.Integer, Color>();
39         private Map<org.simantics.datatypes.literal.Font, Font> fonts = new HashMap<org.simantics.datatypes.literal.Font, Font>();
40
41         private boolean requireLayout=false;
42
43         public SWTDocumentClient(WidgetMapping mapping, ISelectionProvider selectionProvider, IWorkbenchSite site, Composite container) {
44                 
45                 super(mapping, SWTViews.getCommandMapping());
46                 
47                 this.container = container;
48                 this.site = site;
49                 this.selectionProvider = selectionProvider;
50                 this.device = container.getDisplay();
51                 this.thread = SWTThread.getThreadAccess(container);
52
53                 JSONObject rootObject = new JSONObject("root");
54                 rootObject.addJSONField("type", "Root");
55                 FillComposite mgr = new FillComposite();
56                 WidgetContainer<?> wc = mgr.createWidget(rootObject); 
57                 wc.createControl(this, container, rootObject);
58                 
59                 GridDataFactory.fillDefaults().grab(true, true).minSize(1, 1).applyTo((Control)wc.getControl());
60                 GridLayoutFactory.fillDefaults().applyTo((Composite)wc.getControl());
61                 
62                 widgetData.put("root", new WidgetData(this, wc, rootObject));
63                 
64         }
65         
66         @Override
67         public IThreadWorkQueue thread() {
68                 return thread;
69         }
70         
71         @Override
72         public Color getColor(org.simantics.datatypes.literal.RGB.Integer descriptor) {
73                 Color color = colors.get(descriptor);
74                 if(color == null) {
75                         color = Colors.swt(device, descriptor);
76                         colors.put(descriptor, color);
77                 }
78                 return color;
79         }
80         
81         @Override
82         public Font getFont(org.simantics.datatypes.literal.Font descriptor) {
83                 Font font = fonts.get(descriptor);
84                 if(font == null) {
85                         font = Fonts.swt(device, descriptor);
86                         fonts.put(descriptor, font);
87                 }
88                 return font;
89         }
90         
91         @Override
92         public ISelectionProvider getSelectionProvider() {
93                 return selectionProvider;
94         }
95         
96         @Override
97         public IWorkbenchSite getSite() {
98                 return site;
99         }
100         
101         @Override
102         public void post(final AbstractEventHandler handler, CommandContext parameters) {
103                 handler.handle(parameters);
104         }
105
106         @Override
107         protected void updateDocument(Collection<JSONObject> objects) {
108                 assert thread.currentThreadAccess();
109                 super.updateDocument(objects);
110                 if(requireLayout) {
111                         container.layout(true, true);
112                         requireLayout = false;
113                 }
114         }
115
116         @Override
117         protected void updateTree(HashSet<WidgetData> updates) {
118                 
119                 if(updates.isEmpty()) return;
120                 
121                 for(WidgetData data : updates) {
122                         WidgetContainer<?> container = (WidgetContainer<?>)data.widget;
123                         Control ctrl = container.getControl();
124                         if (ctrl == null || ctrl.isDisposed())
125                                 continue;
126                         if(ctrl instanceof Composite) {
127                                 Composite composite = (Composite)ctrl;
128                                 for(Control c : composite.getChildren()) {
129                                         c.dispose();
130                                 }
131                         }
132                 }
133                 
134                 super.updateTree(updates);
135                 
136                 for(WidgetData data : widgetData.values()) {
137                         WidgetContainer<?> container = (WidgetContainer<?>)data.widget;
138                         if(container != null)
139                             container.getOrCreateControl(this, data.object);
140                 }
141                 
142         }
143         
144         @Override
145         public void layout() {
146                 requireLayout = true;
147         }
148         
149     @Override
150     public HashMap<String, WidgetData> getWidgetData() {
151         return widgetData;
152     }
153     
154     public void displayError(String error) {
155         Logger.defaultLogError(error);
156     }
157         
158 }