1 package org.simantics.document.swt.core.base;
\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
9 public abstract class WidgetContainer<C extends Control> {
\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
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
23 doUpdateProperties(document, control, object);
\r
26 public C getControl() {
\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
46 public void updateProperties(SWTDocument document, JSONObject object) {
\r
47 if(control != null) {
\r
48 doUpdateProperties(document, control, object);
\r