--- /dev/null
+package org.simantics.document.swt.core.base;\r
+\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.simantics.document.server.JSONObject;\r
+import org.simantics.document.server.client.WidgetData;\r
+import org.simantics.document.swt.core.SWTDocument;\r
+\r
+public abstract class WidgetContainer<C extends Control> {\r
+ \r
+ C control;\r
+ \r
+ abstract protected Control doCreateControl(SWTDocument document, Composite parent, JSONObject object);\r
+ abstract protected void doUpdateProperties(SWTDocument document, Control control, JSONObject object);\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ public void createControl(SWTDocument document, Composite parent, final JSONObject object) {\r
+ control = (C)doCreateControl(document, parent, object);\r
+ if(control == null) {\r
+ new Exception().printStackTrace();\r
+ return;\r
+ }\r
+ doUpdateProperties(document, control, object);\r
+ }\r
+ \r
+ public C getControl() {\r
+ return (C)control;\r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ public <T> T getOrCreateControl(SWTDocument document, JSONObject object) {\r
+ if(control == null || control.isDisposed()) {\r
+ String parentId = object.getJSONField("parent");\r
+ WidgetData parent = document.getWidget(parentId);\r
+ if(parent != null) {\r
+ WidgetContainer<?> parentContainer = (WidgetContainer<?>)parent.widget;\r
+ Composite pc = (Composite)parentContainer.getOrCreateControl(document, parent.object);\r
+ // TODO: pc may be disposed, how to handle this and why is it happening?\r
+ if(pc != null && !pc.isDisposed())\r
+ createControl(document, pc, object);\r
+ }\r
+ }\r
+ return (T)control;\r
+ }\r
+ \r
+ public void updateProperties(SWTDocument document, JSONObject object) {\r
+ if(control != null) {\r
+ doUpdateProperties(document, control, object);\r
+ }\r
+ }\r
+ \r
+}
\ No newline at end of file