Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.85 KB | None | 0 0
  1. package scrolltocolumn;
  2.  
  3. import javafx.event.EventHandler;
  4. import javafx.geometry.Bounds;
  5. import javafx.geometry.Orientation;
  6. import javafx.scene.control.ScrollBar;
  7. import javafx.scene.control.ScrollToEvent;
  8. import javafx.scene.control.TableColumn;
  9. import javafx.scene.control.TableView;
  10. import javafx.scene.input.KeyCode;
  11. import javafx.scene.input.KeyEvent;
  12.  
  13. import java.util.Optional;
  14.  
  15. /**
  16. * EventHandler for changing behavior on right or left key for TableView has
  17. * SelectionModel.setSelectionMode(SelectionMode.SINGLE), SelectionModel.setCellSelectionEnabled(true).
  18. *
  19. * <pre>
  20. * {@code
  21. * // usage
  22. * yourTableView.addEventHandler(KeyEvent.KEY_PRESSED, new PagenateColumnEventHandler(yourTableView));
  23. * }</pre>
  24. */
  25. class PagenateColumnEventHandler implements EventHandler<KeyEvent> {
  26. private TableView<?> tableView;
  27.  
  28. PagenateColumnEventHandler(TableView<?> tableView) {
  29. this.tableView = tableView;
  30. }
  31.  
  32. @Override
  33. public void handle(KeyEvent event) {
  34. if (KeyCode.RIGHT.equals(event.getCode())) {
  35. if (!event.isControlDown()) tableView.getSelectionModel().selectRightCell();
  36. else tableView.getFocusModel().focusRightCell();
  37. if (!isInViewport(tableView, getFocusedColumn(tableView))) headToColumnImpl(tableView, getFocusedColumn(tableView));
  38. event.consume();
  39. } else if (KeyCode.LEFT.equals(event.getCode())) {
  40. if (!event.isControlDown()) tableView.getSelectionModel().selectLeftCell();
  41. else tableView.getFocusModel().focusLeftCell();
  42. scrollToColumnImpl(tableView, getFocusedColumn(tableView));
  43. event.consume();
  44. }
  45. }
  46.  
  47. private static <T, S> TableColumn<T, S> getFocusedColumn(TableView<T> tableView) {
  48. return tableView.getFocusModel().getFocusedCell().getTableColumn();
  49. }
  50.  
  51. public static <T,S> void scrollToColumnIndex(TableView<T> tableView, int index) {
  52. scrollToColumn(tableView, tableView.getColumns().get(index));
  53. }
  54.  
  55. public static <T,S> void scrollToColumn(TableView<T> tableView, TableColumn<T,S> column) {
  56. if ( column == null) return;
  57.  
  58. if (tableView.getOnScrollToColumn() != null) {
  59. tableView.getOnScrollToColumn().handle(new ScrollToEvent<>(tableView, tableView, ScrollToEvent.scrollToColumn(), column));
  60. }
  61.  
  62. scrollToColumnImpl(tableView, column);
  63. }
  64.  
  65. private static boolean isInViewport(TableView<?> tableView, TableColumn<?, ?> column) {
  66. if (column == null) return false;
  67.  
  68. Bounds scrollContentsBounds = tableView.lookup(".clipped-container").getLayoutBounds();
  69. double leftOffset = getLeftOffset(tableView, column);
  70.  
  71. boolean[] returnValue = new boolean[]{false};
  72. getTableViewScrollBar(tableView, Orientation.HORIZONTAL).ifPresent(scroll -> {
  73. returnValue[0] = scroll.getValue() <= leftOffset &&
  74. leftOffset + column.getWidth() <= scroll.getValue() + scrollContentsBounds.getWidth();
  75. });
  76. return returnValue[0];
  77. }
  78.  
  79. private static void headToColumnImpl(TableView<?> tableView, TableColumn<?, ?> column) {
  80. if (column == null) return;
  81.  
  82. Bounds scrollContentsBounds = tableView.lookup(".clipped-container").getLayoutBounds();
  83. getTableViewScrollBar(tableView, Orientation.HORIZONTAL).ifPresent(scroll -> {
  84. double leftOffset = getLeftOffset(tableView, column);
  85. leftOffset = Math.min(leftOffset, scroll.getMax()); // Check for considering last page.
  86. scroll.setValue(leftOffset);
  87. });
  88. }
  89.  
  90. private static void scrollToColumnImpl(TableView<?> tableView, TableColumn<?, ?> column) {
  91. if (column == null) return;
  92.  
  93. Bounds scrollContentsBounds = tableView.lookup(".clipped-container").getLayoutBounds();
  94. getTableViewScrollBar(tableView, Orientation.HORIZONTAL).ifPresent(scroll -> {
  95. double offset = getLeftOffset(tableView, column);
  96. double minOffset = offset - scrollContentsBounds.getWidth() + column.getWidth();
  97. scroll.setValue( Math.max(minOffset, Math.min(scroll.getValue(), offset)) );
  98. });
  99. }
  100.  
  101. private static double getLeftOffset(TableView<?> tableView, TableColumn<?, ?> column) {
  102. if (column == null) return 0.0d;
  103.  
  104. double offset = 0.0d;
  105. for (int i=0; i<tableView.getColumns().size(); i++) {
  106. if (tableView.getColumns().get(i) == column) return offset;
  107. offset += tableView.getColumns().get(i).getWidth();
  108. }
  109. return offset;
  110. }
  111.  
  112. private static Optional<ScrollBar> getTableViewScrollBar(TableView<?> tableView, Orientation orientation) {
  113. return tableView.lookupAll(".scroll-bar")
  114. .stream()
  115. .filter(node -> node instanceof ScrollBar && ((ScrollBar)node).getOrientation() == orientation)
  116. .map(node -> ((ScrollBar)node))
  117. .findFirst();
  118. }
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement