X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.document.swt.core%2Fsrc%2Forg%2Fsimantics%2Fdocument%2Fswt%2Fcore%2Fbase%2FWidgetContainer.java;fp=bundles%2Forg.simantics.document.swt.core%2Fsrc%2Forg%2Fsimantics%2Fdocument%2Fswt%2Fcore%2Fbase%2FWidgetContainer.java;h=6053bbab91b8f305c5ab6465fd86754013dfbeab;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git 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 index 000000000..6053bbab9 --- /dev/null +++ b/bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/base/WidgetContainer.java @@ -0,0 +1,52 @@ +package org.simantics.document.swt.core.base; + +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.simantics.document.server.JSONObject; +import org.simantics.document.server.client.WidgetData; +import org.simantics.document.swt.core.SWTDocument; + +public abstract class WidgetContainer { + + C control; + + abstract protected Control doCreateControl(SWTDocument document, Composite parent, JSONObject object); + abstract protected void doUpdateProperties(SWTDocument document, Control control, JSONObject object); + + @SuppressWarnings("unchecked") + public void createControl(SWTDocument document, Composite parent, final JSONObject object) { + control = (C)doCreateControl(document, parent, object); + if(control == null) { + new Exception().printStackTrace(); + return; + } + doUpdateProperties(document, control, object); + } + + public C getControl() { + return (C)control; + } + + @SuppressWarnings("unchecked") + public T getOrCreateControl(SWTDocument document, JSONObject object) { + if(control == null || control.isDisposed()) { + String parentId = object.getJSONField("parent"); + WidgetData parent = document.getWidget(parentId); + if(parent != null) { + WidgetContainer parentContainer = (WidgetContainer)parent.widget; + Composite pc = (Composite)parentContainer.getOrCreateControl(document, parent.object); + // TODO: pc may be disposed, how to handle this and why is it happening? + if(pc != null && !pc.isDisposed()) + createControl(document, pc, object); + } + } + return (T)control; + } + + public void updateProperties(SWTDocument document, JSONObject object) { + if(control != null) { + doUpdateProperties(document, control, object); + } + } + +} \ No newline at end of file