]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTTabFolder.java
Several Wiki documentation view improvements.
[simantics/platform.git] / bundles / org.simantics.views.swt.client / src / org / simantics / views / swt / client / impl / SWTTabFolder.java
1 package org.simantics.views.swt.client.impl;\r
2 \r
3 import java.util.HashSet;\r
4 import java.util.List;\r
5 import java.util.Set;\r
6 \r
7 import org.eclipse.jface.viewers.ISelectionChangedListener;\r
8 import org.eclipse.jface.viewers.ISelectionProvider;\r
9 import org.eclipse.jface.viewers.SelectionChangedEvent;\r
10 import org.eclipse.swt.SWT;\r
11 import org.eclipse.swt.custom.CTabFolder;\r
12 import org.eclipse.swt.custom.CTabItem;\r
13 import org.eclipse.swt.widgets.Composite;\r
14 import org.eclipse.swt.widgets.Control;\r
15 import org.simantics.browsing.ui.swt.widgets.GraphExplorerComposite;\r
16 import org.simantics.utils.ui.jface.BasePostSelectionProvider;\r
17 import org.simantics.views.ViewUtils.LayoutBean;\r
18 import org.simantics.views.swt.client.base.ISWTViewNode;\r
19 import org.simantics.views.swt.client.base.SingleSWTViewNode;\r
20 \r
21 public class SWTTabFolder extends SingleSWTViewNode<CTabFolder> {\r
22         \r
23         private static final long serialVersionUID = -8003676031533344133L;\r
24 \r
25         public List<String> childNames;\r
26 \r
27         public LayoutBean layout;\r
28         \r
29         final BasePostSelectionProvider selectionProvider = new BasePostSelectionProvider();\r
30 \r
31         ISelectionChangedListener selectionListener = new ISelectionChangedListener() {\r
32                 \r
33                 @Override\r
34                 public void selectionChanged(SelectionChangedEvent event) {\r
35                         selectionProvider.firePostSelection(event.getSelection());\r
36                 }\r
37                 \r
38         };\r
39         \r
40         private CTabItem createItem(int index, CTabFolder folder, Control control) {\r
41                 \r
42                 CTabItem item = new CTabItem(folder, SWT.NONE, index);\r
43                 item.setControl(control);\r
44                 return item;\r
45                 \r
46         }\r
47         \r
48         @Override\r
49         public void createControls(Composite parent) {\r
50                 control = new CTabFolder(parent, SWT.BOTTOM | SWT.FLAT);\r
51                 setProperties();\r
52                 createChildComposites();\r
53                 updateFolder();\r
54         }\r
55         \r
56         protected void childrenChanged() {\r
57             // FIXME: this is probably not what is intended, just modified it like this to get rid of the NPE it was producing.\r
58             if (control != null && !control.isDisposed())\r
59                 updateFolder();\r
60         }\r
61 \r
62         protected void updateFolder() {\r
63                 \r
64                 assert(childNames != null);\r
65                 \r
66             HashSet<Control> existing = new HashSet<Control>();\r
67 \r
68             for(CTabItem c : control.getItems()) {\r
69                 existing.add(c.getControl());\r
70             }\r
71 \r
72             int index = existing.size();\r
73             boolean hasSomeSelectionProviders = false;\r
74 \r
75             for(ISWTViewNode node : getChildComposites()) {\r
76 \r
77                 Control c = node.getControl();\r
78                 if(c != null && !existing.contains(c)) {\r
79 \r
80                     CTabItem item = createItem(index, control, c);\r
81                     item.setText(childNames.get(index++));\r
82 \r
83                     for(Control c2 : getControls(item)) {\r
84                         if(c2 instanceof GraphExplorerComposite) {\r
85                             GraphExplorerComposite gec = (GraphExplorerComposite)c2;\r
86                             ISelectionProvider sp = (ISelectionProvider)gec.getAdapter(ISelectionProvider.class);\r
87                             sp.addSelectionChangedListener(selectionListener);\r
88                             hasSomeSelectionProviders = true;\r
89                         }\r
90                     }\r
91 \r
92                 }\r
93             }\r
94 \r
95             if(hasSomeSelectionProviders) {\r
96                 // We use our combined selection provider\r
97                 getSite().setSelectionProvider(selectionProvider);\r
98             }\r
99 \r
100             control.setSelection(0);\r
101             control.update();\r
102         }\r
103 \r
104     Set<Control> getControls(CTabItem item) {\r
105                 HashSet<Control> result = new HashSet<Control>();\r
106                 forControl(item.getControl(), result);\r
107                 return result;\r
108         }\r
109         \r
110         void forControl(Control control, HashSet<Control> controls) {\r
111                 controls.add(control);\r
112                 if(control instanceof Composite) {\r
113                         Composite composite = (Composite)control;\r
114                         for(Control child : composite.getChildren()) forControl(child, controls);\r
115                 }\r
116         }\r
117         \r
118         public void synchronizeChildNames(List<String> childNames) {\r
119                 \r
120         }\r
121         \r
122         final public void synchronizeLayout(LayoutBean layout) {\r
123         }\r
124         \r
125 }\r