]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTScrolledComposite.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.views.swt.client / src / org / simantics / views / swt / client / impl / SWTScrolledComposite.java
diff --git a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTScrolledComposite.java b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTScrolledComposite.java
new file mode 100644 (file)
index 0000000..421315f
--- /dev/null
@@ -0,0 +1,153 @@
+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