diff options
author | Thomas Schindl | 2008-06-18 09:15:31 +0000 |
---|---|---|
committer | Thomas Schindl | 2008-06-18 09:15:31 +0000 |
commit | cdfd696bf847353c2f32e62ddeaab59008a78d80 (patch) | |
tree | 7c0791bc1f80aa0df309b0884b2ea4a8467e0000 /examples/org.eclipse.jface.snippets | |
parent | 679b820907b70423fdb99e8ecfe3483945fef51b (diff) | |
download | eclipse.platform.ui-cdfd696bf847353c2f32e62ddeaab59008a78d80.tar.gz eclipse.platform.ui-cdfd696bf847353c2f32e62ddeaab59008a78d80.tar.xz eclipse.platform.ui-cdfd696bf847353c2f32e62ddeaab59008a78d80.zip |
Bug 237597 - [Snippet] To show how to work-around cell navigation problems in 3.3
(with reordering support)
Diffstat (limited to 'examples/org.eclipse.jface.snippets')
-rw-r--r-- | examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet059CellNavigationIn33.java | 127 |
1 files changed, 118 insertions, 9 deletions
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet059CellNavigationIn33.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet059CellNavigationIn33.java index b08842b4d0d..e15ce28892a 100644 --- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet059CellNavigationIn33.java +++ b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet059CellNavigationIn33.java @@ -33,6 +33,7 @@ import org.eclipse.jface.viewers.TableViewerFocusCellManager; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; +import org.eclipse.jface.viewers.ViewerRow; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; @@ -43,6 +44,7 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; /** * Example for full feature cell navigation in 3.3. This snippet uses internal @@ -122,7 +124,7 @@ public class Snippet059CellNavigationIn33 { TableViewerColumn column = new TableViewerColumn(v, SWT.NONE); column.getColumn().setWidth(200); column.getColumn().setText("Givenname"); -// column.getColumn().setMoveable(true); + column.getColumn().setMoveable(true); column.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { @@ -145,7 +147,7 @@ public class Snippet059CellNavigationIn33 { final TableViewerColumn columnA = new TableViewerColumn(v, SWT.NONE); columnA.getColumn().setWidth(200); columnA.getColumn().setText("Surname"); -// columnA.getColumn().setMoveable(true); + columnA.getColumn().setMoveable(true); columnA.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { @@ -173,7 +175,7 @@ public class Snippet059CellNavigationIn33 { column = new TableViewerColumn(v, SWT.NONE); column.getColumn().setWidth(200); column.getColumn().setText("E-Mail"); -// column.getColumn().setMoveable(true); + column.getColumn().setMoveable(true); column.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { @@ -197,7 +199,7 @@ public class Snippet059CellNavigationIn33 { column = new TableViewerColumn(v, SWT.NONE); column.getColumn().setWidth(200); column.getColumn().setText("Gender"); -// column.getColumn().setMoveable(true); + column.getColumn().setMoveable(true); column.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { @@ -227,19 +229,126 @@ public class Snippet059CellNavigationIn33 { }); CellNavigationStrategy naviStrat = new CellNavigationStrategy() { + private int getVisualIndex(ViewerRow row, int creationIndex) { + TableItem item = (TableItem) row.getItem(); + int[] order = item.getParent().getColumnOrder(); + + for (int i = 0; i < order.length; i++) { + if (order[i] == creationIndex) { + return i; + } + } + return creationIndex; + } + + private int getCreationIndex(ViewerRow row, int visualIndex) { + TableItem item = (TableItem) row.getItem(); + if( item != null && ! item.isDisposed() /*&& hasColumns() && isValidOrderIndex(visualIndex)*/ ) { + return item.getParent().getColumnOrder()[visualIndex]; + } + return visualIndex; + } + + private ViewerCell getCellAtVisualIndex(ViewerRow row, int visualIndex) { + return getCell(row,getCreationIndex(row, visualIndex)); + } + + private boolean isVisible(ViewerCell cell) { + return getWidth(cell) > 0; + } + + private int getWidth(ViewerCell cell) { + TableItem item = (TableItem) cell.getViewerRow().getItem(); + return item.getParent().getColumn(cell.getColumnIndex()).getWidth(); + } + + private ViewerCell getCell(ViewerRow row, int index) { + return row.getCell(index); + } + + private ViewerCell getNeighbor(ViewerCell currentCell, int directionMask, boolean sameLevel) { + ViewerRow row; + + if ((directionMask & ViewerCell.ABOVE) == ViewerCell.ABOVE) { + row = currentCell.getViewerRow().getNeighbor(ViewerRow.ABOVE, sameLevel); + } else if ((directionMask & ViewerCell.BELOW) == ViewerCell.BELOW) { + row = currentCell.getViewerRow().getNeighbor(ViewerRow.BELOW, sameLevel); + } else { + row = currentCell.getViewerRow(); + } + + if (row != null) { + int columnIndex; + columnIndex = getVisualIndex(row,currentCell.getColumnIndex()); + + int modifier = 0; + + if ((directionMask & ViewerCell.LEFT) == ViewerCell.LEFT) { + modifier = -1; + } else if ((directionMask & ViewerCell.RIGHT) == ViewerCell.RIGHT) { + modifier = 1; + } + + columnIndex += modifier; + + if (columnIndex >= 0 && columnIndex < row.getColumnCount()) { + ViewerCell cell = getCellAtVisualIndex(row,columnIndex); + if( cell != null ) { + while( cell != null && columnIndex < row.getColumnCount() - 1 && columnIndex > 0 ) { + if( isVisible(cell) ) { + break; + } + + columnIndex += modifier; + cell = getCellAtVisualIndex(row,columnIndex); + if( cell == null ) { + break; + } + } + } + + return cell; + } + } + return null; + } + + private ViewerCell internalFindSelectedCell(ColumnViewer viewer, + ViewerCell currentSelectedCell, Event event) { + switch (event.keyCode) { + case SWT.ARROW_UP: + if (currentSelectedCell != null) { + return getNeighbor(currentSelectedCell, ViewerCell.ABOVE, false); + } + break; + case SWT.ARROW_DOWN: + if (currentSelectedCell != null) { + return getNeighbor(currentSelectedCell, ViewerCell.BELOW, false); + } + break; + case SWT.ARROW_LEFT: + if (currentSelectedCell != null) { + return getNeighbor(currentSelectedCell, ViewerCell.LEFT, true); + } + break; + case SWT.ARROW_RIGHT: + if (currentSelectedCell != null) { + return getNeighbor(currentSelectedCell, ViewerCell.RIGHT, true); + } + break; + } + + return null; + } public ViewerCell findSelectedCell(ColumnViewer viewer, ViewerCell currentSelectedCell, Event event) { - ViewerCell cell = super.findSelectedCell(viewer, - currentSelectedCell, event); + ViewerCell cell = internalFindSelectedCell(viewer, currentSelectedCell, event); if (cell != null) { TableColumn t = v.getTable().getColumn( cell.getColumnIndex()); v.getTable().showColumn(t); - if (t.getWidth() == 0) { - cell = findSelectedCell(viewer, cell, event); - } } return cell; |