--- /dev/null
+package org.simantics.browsing.ui.nattable;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.eclipse.jface.viewers.IPostSelectionProvider;\r
+import org.eclipse.jface.viewers.ISelection;\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.jface.viewers.StructuredSelection;\r
+import org.eclipse.nebula.widgets.nattable.NatTable;\r
+import org.eclipse.nebula.widgets.nattable.coordinate.PositionCoordinate;\r
+import org.eclipse.nebula.widgets.nattable.layer.ILayerListener;\r
+import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;\r
+import org.eclipse.nebula.widgets.nattable.layer.event.ILayerEvent;\r
+import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;\r
+import org.eclipse.nebula.widgets.nattable.selection.event.CellSelectionEvent;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.events.SelectionListener;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.widgets.Event;\r
+import org.simantics.utils.datastructures.MapList;\r
+\r
+public class NatTableSelectionAdaptor implements ISelectionProvider, IPostSelectionProvider, ILayerListener {\r
+ NatTable natTable;\r
+ SelectionLayer selectionLayer;\r
+ GETreeData treeData;\r
+ StructuredSelection selection;\r
+ \r
+ private List<ISelectionChangedListener> selectionListeners = new ArrayList<>();\r
+ private List<ISelectionChangedListener> postSelectionListeners = new ArrayList<>();\r
+ private List<SelectionListener> selListeners = new ArrayList<>();\r
+ \r
+ public NatTableSelectionAdaptor(NatTable natTable, SelectionLayer selectionLayer, GETreeData treeData) {\r
+ this.natTable = natTable;\r
+ this.selectionLayer = selectionLayer;\r
+ this.natTable.addLayerListener(this);\r
+ this.treeData = treeData;\r
+ }\r
+ \r
+ @Override\r
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {\r
+ selectionListeners.add(listener);\r
+ }\r
+ \r
+ @Override\r
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {\r
+ selectionListeners.remove(listener);\r
+ }\r
+ \r
+ @Override\r
+ public void addPostSelectionChangedListener(ISelectionChangedListener listener) {\r
+ postSelectionListeners.add(listener);\r
+ }\r
+ \r
+ @Override\r
+ public void removePostSelectionChangedListener(ISelectionChangedListener listener) {\r
+ postSelectionListeners.remove(listener);\r
+ }\r
+ \r
+ public void addSelectionListener(SelectionListener listener) {\r
+ selListeners.add(listener);\r
+ }\r
+ \r
+ public void removeSelectionListener(SelectionListener listener) {\r
+ selListeners.remove(listener);\r
+ }\r
+ \r
+ @Override\r
+ public ISelection getSelection() {\r
+ return selection;\r
+ }\r
+ \r
+ @Override\r
+ public void setSelection(ISelection selection) {\r
+ if (!(selection instanceof StructuredSelection))\r
+ throw new IllegalArgumentException("Selection must be structured selection");\r
+ \r
+ }\r
+ \r
+ \r
+ \r
+ private List<Point> selectedCells = new ArrayList<Point>();\r
+ \r
+ @Override\r
+ public void handleLayerEvent(ILayerEvent event) {\r
+ if (event instanceof CellSelectionEvent) {\r
+ evaluateSeletedCells();\r
+ } \r
+ }\r
+ \r
+ /**\r
+ * Processes current selection to data indices.\r
+ */\r
+ private void evaluateSeletedCells() {\r
+ selectedCells.clear();\r
+ for (PositionCoordinate pc : selectionLayer.getSelectedCellPositions()) {\r
+ ILayerCell cell = pc.getLayer().getCellByPosition(pc.columnPosition, pc.rowPosition);\r
+ selectedCells.add(new Point(cell.getColumnIndex(), cell.getRowIndex()));\r
+ }\r
+ MapList<Integer, Integer> rowMap = new MapList<>();\r
+ for (Point p : selectedCells) {\r
+ rowMap.add(p.y, p.x);\r
+ }\r
+ List<RowSelectionItem> selectionItems = new ArrayList<>(rowMap.getKeySize());\r
+ for (Integer row : rowMap.getKeys()) {\r
+ List<Integer> cols = rowMap.getValues(row);\r
+ int col[] = new int[cols.size()];\r
+ for (int i = 0; i < col.length; i++)\r
+ col[i] = cols.get(i);\r
+ selectionItems.add(new RowSelectionItem(treeData.getDataAtIndex(row), row, col));\r
+ }\r
+ this.selection = new StructuredSelection(selectionItems);\r
+ fireEvents();\r
+ }\r
+ \r
+ private void fireEvents() {\r
+ for (ISelectionChangedListener l : selectionListeners) {\r
+ l.selectionChanged(new SelectionChangedEvent(this, selection));\r
+ }\r
+ for (ISelectionChangedListener l : postSelectionListeners) {\r
+ l.selectionChanged(new SelectionChangedEvent(this, selection));\r
+ }\r
+ Event evt = new Event();\r
+ evt.widget = natTable;\r
+ evt.display = natTable.getDisplay();\r
+ evt.data = selection;\r
+ for (SelectionListener l : selListeners) {\r
+ SelectionEvent sel = new SelectionEvent(evt);\r
+ l.widgetSelected(sel);\r
+ }\r
+ }\r
+ \r
+ public List<Point> getSelectedCells() {\r
+ return selectedCells;\r
+ }\r
+\r
+}\r