--- /dev/null
+package org.simantics.views.swt.client.impl;\r
+\r
+import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.jface.layout.GridLayoutFactory;\r
+import org.eclipse.jface.resource.ColorDescriptor;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.custom.ScrolledComposite;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.graphics.RGB;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Event;\r
+import org.eclipse.swt.widgets.Listener;\r
+import org.simantics.views.ViewUtils.GridLayoutBean;\r
+import org.simantics.views.swt.client.base.SWTViewUtils;\r
+import org.simantics.views.swt.client.base.SingleSWTViewNode;\r
+\r
+public class SWTScrolledComposite extends SingleSWTViewNode<ScrolledComposite> {\r
+ \r
+ private Composite explorers;\r
+\r
+ private static final long serialVersionUID = 7932335224632082902L;\r
+ \r
+ public GridLayoutBean layout;\r
+ \r
+ private int minSize = 100;\r
+ \r
+ protected ScrollListener listener;\r
+ \r
+ public class ScrollListener implements Listener {\r
+\r
+ public Control[] composites;\r
+\r
+ final public int minSize;\r
+ \r
+ private boolean pending = false;\r
+\r
+ public ScrollListener(int minSize) {\r
+ this.minSize = minSize;\r
+ }\r
+\r
+ @Override\r
+ public void handleEvent(Event event) {\r
+ handleEvent();\r
+ }\r
+\r
+ public void handleEvent() {\r
+ \r
+ if(pending) return;\r
+ \r
+ pending = true;\r
+ \r
+ Display.getCurrent().asyncExec(new Runnable() {\r
+\r
+ @Override\r
+ public void run() {\r
+ doHandleEvent();\r
+ }\r
+ \r
+ });\r
+ \r
+ }\r
+\r
+ public void doHandleEvent() {\r
+\r
+ if(isDisposed()) return;\r
+ \r
+ pending = false;\r
+\r
+ Point c = control.getSize();\r
+ Point o = explorers.getSize();\r
+ Point p = explorers.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);\r
+ if(!o.equals(p)) {\r
+ explorers.setSize(c.x-25, p.y);\r
+ }\r
+\r
+ }\r
+\r
+ }\r
+ \r
+ @Override\r
+ public Control getControl() {\r
+ return explorers;\r
+ }\r
+ \r
+ @Override\r
+ public void createControls(org.eclipse.swt.widgets.Composite parent) {\r
+ \r
+ control = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);\r
+ \r
+ setProperties();\r
+ \r
+ listener = new ScrollListener(minSize);\r
+\r
+ control.setBackground( (Color) getResourceManager().get( ColorDescriptor.createFrom(new RGB(245, 245, 245)) ) );\r
+ control.setLayout(GridLayoutFactory.fillDefaults()\r
+ .margins(0, 0).spacing(0, 0).create());\r
+ control.setExpandVertical(false);\r
+ control.setExpandHorizontal(false);\r
+ GridDataFactory.fillDefaults().grab(true, true).span(2, 1).applyTo(control);\r
+\r
+ explorers = new Composite(control, SWT.NONE);\r
+ explorers.setBackground(Display.getCurrent().getSystemColor(\r
+ SWT.COLOR_WHITE));\r
+ // Make sure that exploders are visible\r
+ explorers.setSize(1300, 1300);\r
+ explorers.setLayout(GridLayoutFactory.fillDefaults().margins(0, 0).numColumns(1)\r
+ .spacing(0, 0).create());\r
+\r
+ control.setMinSize(100, 100);\r
+ control.setContent(explorers);\r
+\r
+ createChildComposites(explorers);\r
+ \r
+ listener.composites = explorers.getChildren();\r
+ \r
+ control.addListener(SWT.Resize, listener);\r
+ \r
+ for (Control composite : listener.composites) {\r
+ composite.addListener(SWT.Resize, listener);\r
+ }\r
+ \r
+ }\r
+\r
+ final public void synchronizeLayout(GridLayoutBean layout) {\r
+ if(layout != null) control.setLayout(SWTViewUtils.toLayout(layout));\r
+ }\r
+ \r
+ public static void propagate(Control control) {\r
+ \r
+ Control parent = control.getParent();\r
+ if(parent == null) return;\r
+ \r
+ if(parent instanceof ScrolledComposite) {\r
+ \r
+ Point c = parent.getSize();\r
+ Point o = control.getSize();\r
+ Point p = control.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);\r
+ if(!o.equals(p)) {\r
+ control.setSize(c.x-25, p.y);\r
+ }\r
+ \r
+ } else {\r
+ \r
+ propagate(parent);\r
+ \r
+ }\r
+ \r
+ }\r
+ \r
+}\r