]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/base/WidgetContainer.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.swt.core / src / org / simantics / document / swt / core / base / WidgetContainer.java
1 package org.simantics.document.swt.core.base;\r
2 \r
3 import org.eclipse.swt.widgets.Composite;\r
4 import org.eclipse.swt.widgets.Control;\r
5 import org.simantics.document.server.JSONObject;\r
6 import org.simantics.document.server.client.WidgetData;\r
7 import org.simantics.document.swt.core.SWTDocument;\r
8 \r
9 public abstract class WidgetContainer<C extends Control> {\r
10         \r
11         C control;\r
12         \r
13         abstract protected Control doCreateControl(SWTDocument document, Composite parent, JSONObject object);\r
14         abstract protected void doUpdateProperties(SWTDocument document, Control control, JSONObject object);\r
15         \r
16         @SuppressWarnings("unchecked")\r
17         public void createControl(SWTDocument document, Composite parent, final JSONObject object) {\r
18                 control = (C)doCreateControl(document, parent, object);\r
19                 if(control == null) {\r
20                         new Exception().printStackTrace();\r
21                         return;\r
22                 }\r
23                 doUpdateProperties(document, control, object);\r
24         }\r
25         \r
26         public C getControl() {\r
27                 return (C)control;\r
28         }\r
29         \r
30         @SuppressWarnings("unchecked")\r
31         public <T> T getOrCreateControl(SWTDocument document, JSONObject object) {\r
32                 if(control == null || control.isDisposed()) {\r
33                         String parentId = object.getJSONField("parent");\r
34                         WidgetData parent = document.getWidget(parentId);\r
35                         if(parent != null) {\r
36                                 WidgetContainer<?> parentContainer = (WidgetContainer<?>)parent.widget;\r
37                                 Composite pc = (Composite)parentContainer.getOrCreateControl(document, parent.object);\r
38                                 // TODO: pc may be disposed, how to handle this and why is it happening?\r
39                                 if(pc != null && !pc.isDisposed())\r
40                                         createControl(document, pc, object);\r
41                         }\r
42                 }\r
43                 return (T)control;\r
44         }\r
45         \r
46         public void updateProperties(SWTDocument document, JSONObject object) {\r
47                 if(control != null) {\r
48                         doUpdateProperties(document, control, object);\r
49                 }\r
50         }\r
51         \r
52 }