--- /dev/null
+package org.simantics.views.swt.client.impl;\r
+\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import org.eclipse.jface.viewers.ISelectionChangedListener;\r
+import org.eclipse.jface.viewers.ISelectionProvider;\r
+import org.eclipse.jface.viewers.SelectionChangedEvent;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.custom.CTabFolder;\r
+import org.eclipse.swt.custom.CTabItem;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.simantics.browsing.ui.swt.widgets.GraphExplorerComposite;\r
+import org.simantics.utils.ui.jface.BasePostSelectionProvider;\r
+import org.simantics.views.ViewUtils.GridLayoutBean;\r
+import org.simantics.views.swt.client.base.ISWTViewNode;\r
+import org.simantics.views.swt.client.base.SingleSWTViewNode;\r
+\r
+public class SWTTabFolder extends SingleSWTViewNode<CTabFolder> {\r
+ \r
+ private static final long serialVersionUID = -8003676031533344133L;\r
+\r
+ public List<String> childNames;\r
+\r
+ public GridLayoutBean layout;\r
+ \r
+ final BasePostSelectionProvider selectionProvider = new BasePostSelectionProvider();\r
+\r
+ ISelectionChangedListener selectionListener = new ISelectionChangedListener() {\r
+ \r
+ @Override\r
+ public void selectionChanged(SelectionChangedEvent event) {\r
+ selectionProvider.firePostSelection(event.getSelection());\r
+ }\r
+ \r
+ };\r
+ \r
+ private CTabItem createItem(int index, CTabFolder folder, Control control) {\r
+ \r
+ CTabItem item = new CTabItem(folder, SWT.NONE, index);\r
+ item.setControl(control);\r
+ return item;\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void createControls(Composite parent) {\r
+ control = new CTabFolder(parent, SWT.BOTTOM | SWT.FLAT);\r
+ setProperties();\r
+ createChildComposites();\r
+ updateFolder();\r
+ }\r
+ \r
+ protected void childrenChanged() {\r
+ // FIXME: this is probably not what is intended, just modified it like this to get rid of the NPE it was producing.\r
+ if (control != null && !control.isDisposed())\r
+ updateFolder();\r
+ }\r
+\r
+ protected void updateFolder() {\r
+ \r
+ assert(childNames != null);\r
+ \r
+ HashSet<Control> existing = new HashSet<Control>();\r
+\r
+ for(CTabItem c : control.getItems()) {\r
+ existing.add(c.getControl());\r
+ }\r
+\r
+ int index = existing.size();\r
+ boolean hasSomeSelectionProviders = false;\r
+\r
+ for(ISWTViewNode node : getChildComposites()) {\r
+\r
+ Control c = node.getControl();\r
+ if(c != null && !existing.contains(c)) {\r
+\r
+ CTabItem item = createItem(index, control, c);\r
+ item.setText(childNames.get(index++));\r
+\r
+ for(Control c2 : getControls(item)) {\r
+ if(c2 instanceof GraphExplorerComposite) {\r
+ GraphExplorerComposite gec = (GraphExplorerComposite)c2;\r
+ ISelectionProvider sp = (ISelectionProvider)gec.getAdapter(ISelectionProvider.class);\r
+ sp.addSelectionChangedListener(selectionListener);\r
+ hasSomeSelectionProviders = true;\r
+ }\r
+ }\r
+\r
+ }\r
+ }\r
+\r
+ if(hasSomeSelectionProviders) {\r
+ // We use our combined selection provider\r
+ getSite().setSelectionProvider(selectionProvider);\r
+ }\r
+\r
+ control.setSelection(0);\r
+ control.update();\r
+ }\r
+\r
+ Set<Control> getControls(CTabItem item) {\r
+ HashSet<Control> result = new HashSet<Control>();\r
+ forControl(item.getControl(), result);\r
+ return result;\r
+ }\r
+ \r
+ void forControl(Control control, HashSet<Control> controls) {\r
+ controls.add(control);\r
+ if(control instanceof Composite) {\r
+ Composite composite = (Composite)control;\r
+ for(Control child : composite.getChildren()) forControl(child, controls);\r
+ }\r
+ }\r
+ \r
+ public void synchronizeChildNames(List<String> childNames) {\r
+ \r
+ }\r
+ \r
+ final public void synchronizeLayout(GridLayoutBean layout) {\r
+ }\r
+ \r
+}\r