]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.browsing.ui.nattable/src/org/simantics/browsing/ui/nattable/NatTableSelectionAdaptor.java
Sync git svn branch with SVN repository r33144.
[simantics/platform.git] / bundles / org.simantics.browsing.ui.nattable / src / org / simantics / browsing / ui / nattable / NatTableSelectionAdaptor.java
diff --git a/bundles/org.simantics.browsing.ui.nattable/src/org/simantics/browsing/ui/nattable/NatTableSelectionAdaptor.java b/bundles/org.simantics.browsing.ui.nattable/src/org/simantics/browsing/ui/nattable/NatTableSelectionAdaptor.java
new file mode 100644 (file)
index 0000000..4302cde
--- /dev/null
@@ -0,0 +1,139 @@
+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