]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/base/WidgetContainer.java b/bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/base/WidgetContainer.java
new file mode 100644 (file)
index 0000000..6053bba
--- /dev/null
@@ -0,0 +1,52 @@
+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