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