]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.nattable/src/org/simantics/browsing/ui/nattable/NatTableSelectionAdaptor.java
Sync git svn branch with SVN repository r33334.
[simantics/platform.git] / bundles / org.simantics.browsing.ui.nattable / src / org / simantics / browsing / ui / nattable / NatTableSelectionAdaptor.java
1 package org.simantics.browsing.ui.nattable;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.List;\r
6 \r
7 import org.eclipse.jface.viewers.IPostSelectionProvider;\r
8 import org.eclipse.jface.viewers.ISelection;\r
9 import org.eclipse.jface.viewers.ISelectionChangedListener;\r
10 import org.eclipse.jface.viewers.ISelectionProvider;\r
11 import org.eclipse.jface.viewers.SelectionChangedEvent;\r
12 import org.eclipse.jface.viewers.StructuredSelection;\r
13 import org.eclipse.nebula.widgets.nattable.NatTable;\r
14 import org.eclipse.nebula.widgets.nattable.coordinate.PositionCoordinate;\r
15 import org.eclipse.nebula.widgets.nattable.layer.ILayerListener;\r
16 import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;\r
17 import org.eclipse.nebula.widgets.nattable.layer.event.ILayerEvent;\r
18 import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;\r
19 import org.eclipse.nebula.widgets.nattable.selection.event.CellSelectionEvent;\r
20 import org.eclipse.swt.events.SelectionEvent;\r
21 import org.eclipse.swt.events.SelectionListener;\r
22 import org.eclipse.swt.graphics.Point;\r
23 import org.eclipse.swt.widgets.Event;\r
24 import org.simantics.utils.datastructures.MapList;\r
25 import org.simantics.utils.ui.AdaptionUtils;\r
26 \r
27 public class NatTableSelectionAdaptor implements ISelectionProvider, IPostSelectionProvider, ILayerListener {\r
28         NatTable natTable;\r
29         SelectionLayer selectionLayer;\r
30         GETreeData treeData;\r
31         StructuredSelection selection;\r
32         \r
33         private List<ISelectionChangedListener> selectionListeners = new ArrayList<>();\r
34         private List<ISelectionChangedListener> postSelectionListeners = new ArrayList<>();\r
35         private List<SelectionListener> selListeners = new ArrayList<>();\r
36         \r
37         public NatTableSelectionAdaptor(NatTable natTable, SelectionLayer selectionLayer, GETreeData treeData) {\r
38                 this.natTable = natTable;\r
39                 this.selectionLayer = selectionLayer;\r
40                 this.natTable.addLayerListener(this);\r
41                 this.treeData = treeData;\r
42         }\r
43         \r
44         @Override\r
45         public void addSelectionChangedListener(ISelectionChangedListener listener) {\r
46                 selectionListeners.add(listener);\r
47         }\r
48         \r
49         @Override\r
50         public void removeSelectionChangedListener(ISelectionChangedListener listener) {\r
51                 selectionListeners.remove(listener);\r
52         }\r
53         \r
54         @Override\r
55         public void addPostSelectionChangedListener(ISelectionChangedListener listener) {\r
56                 postSelectionListeners.add(listener);\r
57         }\r
58         \r
59         @Override\r
60         public void removePostSelectionChangedListener(ISelectionChangedListener listener) {\r
61                 postSelectionListeners.remove(listener);\r
62         }\r
63         \r
64         public void addSelectionListener(SelectionListener listener) {\r
65                 selListeners.add(listener);\r
66         }\r
67         \r
68         public void removeSelectionListener(SelectionListener listener) {\r
69                 selListeners.remove(listener);\r
70         }\r
71         \r
72         @Override\r
73         public ISelection getSelection() {\r
74                 return selection;\r
75         }\r
76         \r
77         @Override\r
78         public void setSelection(ISelection selection) {\r
79                 if (!(selection instanceof StructuredSelection))\r
80                         throw new IllegalArgumentException("Selection must be structured selection");\r
81                 if (selection.isEmpty()) {\r
82                         selectionLayer.clear(false);\r
83                         natTable.redraw();\r
84                         return;\r
85                 }\r
86                 List<RowSelectionItem> rowItems = new ArrayList<>(AdaptionUtils.adaptToCollection(selection, RowSelectionItem.class));\r
87                 if (rowItems.size() > 0) {\r
88                 \r
89                         setSelectionExternal(rowItems);\r
90                         return;\r
91                 }\r
92                 Collection<TreeNode> nodes = AdaptionUtils.adaptToCollection(selection, TreeNode.class);\r
93                 if (nodes.size() > 0) {\r
94                         List<RowSelectionItem> selected = new ArrayList<>();\r
95                         int allCols[] = new int[selectionLayer.getColumnCount()];\r
96                         for (int i = 0; i < allCols.length; i++)\r
97                                 allCols[i] = i;\r
98                         for (TreeNode n : nodes) {\r
99                                 selected.add(new RowSelectionItem(n, n.listIndex, allCols));\r
100                         }\r
101                         setSelectionExternal(selected);\r
102                         return;\r
103                 }\r
104                 \r
105         }\r
106         \r
107         private void setSelectionExternal(List<RowSelectionItem> items) {\r
108                 selectionLayer.clear(true);\r
109                 for (RowSelectionItem item : items) {\r
110                         for (int c : item.columnIndex)\r
111                                 selectionLayer.selectCell(c, item.rowIndex, false, true);\r
112                 }\r
113                 selection = new StructuredSelection(items);\r
114                 fireEvents();\r
115         }\r
116         \r
117         \r
118         private List<Point> selectedCells = new ArrayList<Point>();\r
119         \r
120         @Override\r
121         public void handleLayerEvent(ILayerEvent event) {\r
122                 if (event instanceof CellSelectionEvent) {\r
123                         evaluateSeletedCells();\r
124                 } \r
125         }\r
126         \r
127         /**\r
128          * Processes current selection to data indices.\r
129          */\r
130         private void evaluateSeletedCells() {\r
131                 selectedCells.clear();\r
132                 for (PositionCoordinate pc : selectionLayer.getSelectedCellPositions()) {\r
133                         ILayerCell cell = pc.getLayer().getCellByPosition(pc.columnPosition, pc.rowPosition);\r
134                         selectedCells.add(new Point(cell.getColumnIndex(), cell.getRowIndex()));\r
135                 }\r
136                 MapList<Integer, Integer> rowMap = new MapList<>();\r
137                 for (Point p : selectedCells) {\r
138                         rowMap.add(p.y, p.x);\r
139                 }\r
140                 List<RowSelectionItem> selectionItems = new ArrayList<>(rowMap.getKeySize());\r
141                 for (Integer row : rowMap.getKeys()) {\r
142                         List<Integer> cols = rowMap.getValues(row);\r
143                         int col[] = new int[cols.size()];\r
144                         for (int i = 0; i < col.length; i++)\r
145                                 col[i] = cols.get(i);\r
146                         selectionItems.add(new RowSelectionItem(treeData.getDataAtIndex(row), row, col));\r
147                 }\r
148                 this.selection = new StructuredSelection(selectionItems);\r
149                 fireEvents();\r
150         }\r
151         \r
152         private void fireEvents() {\r
153                 for (ISelectionChangedListener l : selectionListeners) {\r
154                         l.selectionChanged(new SelectionChangedEvent(this, selection));\r
155                 }\r
156                 for (ISelectionChangedListener l : postSelectionListeners) {\r
157                         l.selectionChanged(new SelectionChangedEvent(this, selection));\r
158                 }\r
159                 Event evt = new Event();\r
160                 evt.widget = natTable;\r
161                 evt.display = natTable.getDisplay();\r
162                 evt.data = selection;\r
163                 for (SelectionListener l : selListeners) {\r
164                         SelectionEvent sel = new SelectionEvent(evt);\r
165                         l.widgetSelected(sel);\r
166                 }\r
167         }\r
168         \r
169         public List<Point> getSelectedCells() {\r
170                 return selectedCells;\r
171         }\r
172 \r
173 }\r