modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TreeViewBehavior.java

Print this page
rev 9240 : 8076423: JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization

*** 1,7 **** /* ! * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 23,199 **** * questions. */ package com.sun.javafx.scene.control.behavior; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.beans.value.WeakChangeListener; import javafx.collections.ListChangeListener; import javafx.collections.WeakListChangeListener; ! import javafx.geometry.NodeOrientation; import javafx.scene.control.*; ! import javafx.scene.input.KeyEvent; ! import javafx.scene.input.MouseEvent; import javafx.util.Callback; import java.util.ArrayList; import java.util.List; import com.sun.javafx.PlatformUtil; ! import static javafx.scene.input.KeyCode.A; ! import static javafx.scene.input.KeyCode.ADD; ! import static javafx.scene.input.KeyCode.DOWN; ! import static javafx.scene.input.KeyCode.END; ! import static javafx.scene.input.KeyCode.ENTER; ! import static javafx.scene.input.KeyCode.ESCAPE; ! import static javafx.scene.input.KeyCode.F2; ! import static javafx.scene.input.KeyCode.HOME; ! import static javafx.scene.input.KeyCode.KP_DOWN; ! import static javafx.scene.input.KeyCode.KP_LEFT; ! import static javafx.scene.input.KeyCode.KP_RIGHT; ! import static javafx.scene.input.KeyCode.KP_UP; ! import static javafx.scene.input.KeyCode.LEFT; ! import static javafx.scene.input.KeyCode.MULTIPLY; ! import static javafx.scene.input.KeyCode.PAGE_DOWN; ! import static javafx.scene.input.KeyCode.PAGE_UP; ! import static javafx.scene.input.KeyCode.RIGHT; ! import static javafx.scene.input.KeyCode.SPACE; ! import static javafx.scene.input.KeyCode.SUBTRACT; ! import static javafx.scene.input.KeyCode.UP; ! public class TreeViewBehavior<T> extends BehaviorBase<TreeView<T>> { ! /************************************************************************** ! * Setup KeyBindings * ! *************************************************************************/ ! protected static final List<KeyBinding> TREE_VIEW_BINDINGS = new ArrayList<KeyBinding>(); ! static { ! TREE_VIEW_BINDINGS.add(new KeyBinding(HOME, "SelectFirstRow")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(END, "SelectLastRow")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(HOME, "SelectAllToFirstRow").shift()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(END, "SelectAllToLastRow").shift()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(PAGE_UP, "SelectAllPageUp").shift()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(PAGE_DOWN, "SelectAllPageDown").shift()); ! ! TREE_VIEW_BINDINGS.add(new KeyBinding(SPACE, "SelectAllToFocus").shift()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(SPACE, "SelectAllToFocusAndSetAnchor").shortcut().shift()); ! ! TREE_VIEW_BINDINGS.add(new KeyBinding(HOME, "FocusFirstRow").shortcut()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(END, "FocusLastRow").shortcut()); ! ! TREE_VIEW_BINDINGS.add(new KeyBinding(PAGE_UP, "ScrollUp")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(PAGE_DOWN, "ScrollDown")); ! ! TREE_VIEW_BINDINGS.add(new KeyBinding(SPACE, "toggleFocusOwnerSelection")); ! if (PlatformUtil.isMac()) { ! TREE_VIEW_BINDINGS.add(new KeyBinding(SPACE, "toggleFocusOwnerSelection").ctrl().shortcut()); ! } else { ! TREE_VIEW_BINDINGS.add(new KeyBinding(SPACE, "toggleFocusOwnerSelection").ctrl()); ! } ! TREE_VIEW_BINDINGS.add(new KeyBinding(A, "SelectAll").shortcut()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(PAGE_UP, "FocusPageUp").shortcut()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(PAGE_DOWN, "FocusPageDown").shortcut()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(UP, "FocusPreviousRow").shortcut()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(DOWN, "FocusNextRow").shortcut()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(UP, "DiscontinuousSelectPreviousRow").shortcut().shift()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(DOWN, "DiscontinuousSelectNextRow").shortcut().shift()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(PAGE_UP, "DiscontinuousSelectPageUp").shortcut().shift()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(PAGE_DOWN, "DiscontinuousSelectPageDown").shortcut().shift()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(HOME, "DiscontinuousSelectAllToFirstRow").shortcut().shift()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(END, "DiscontinuousSelectAllToLastRow").shortcut().shift()); ! ! TREE_VIEW_BINDINGS.add(new KeyBinding(LEFT, "CollapseRow")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(KP_LEFT, "CollapseRow")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(RIGHT, "ExpandRow")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(KP_RIGHT, "ExpandRow")); ! ! TREE_VIEW_BINDINGS.add(new KeyBinding(MULTIPLY, "ExpandAll")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(ADD, "ExpandRow")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(SUBTRACT, "CollapseRow")); ! ! TREE_VIEW_BINDINGS.add(new KeyBinding(UP, "SelectPreviousRow")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(KP_UP, "SelectPreviousRow")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(DOWN, "SelectNextRow")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(KP_DOWN, "SelectNextRow")); ! ! TREE_VIEW_BINDINGS.add(new KeyBinding(UP, "AlsoSelectPreviousRow").shift()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(KP_UP, "AlsoSelectPreviousRow").shift()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(DOWN, "AlsoSelectNextRow").shift()); ! TREE_VIEW_BINDINGS.add(new KeyBinding(KP_DOWN, "AlsoSelectNextRow").shift()); ! ! TREE_VIEW_BINDINGS.add(new KeyBinding(ENTER, "Edit")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(F2, "Edit")); ! TREE_VIEW_BINDINGS.add(new KeyBinding(ESCAPE, "CancelEdit")); ! } ! ! @Override protected /*final*/ String matchActionForEvent(KeyEvent e) { ! String action = super.matchActionForEvent(e); ! if (getControl().getEffectiveNodeOrientation() == NodeOrientation.RIGHT_TO_LEFT) { ! // Rather than switching the result of the action lookup in this way, the preferred ! // way to do this according to the current architecture would be to hoist the ! // getEffectiveNodeOrientation call up into the key bindings, the same way that ListView ! // orientation (horizontal vs. vertical) is handled with the OrientedKeyBinding class. ! if ("CollapseRow".equals(action) && (e.getCode() == LEFT || e.getCode() == KP_LEFT)) { ! action = "ExpandRow"; ! } else if ("ExpandRow".equals(action) && (e.getCode() == RIGHT || e.getCode() == KP_RIGHT)) { ! action = "CollapseRow"; ! } ! } ! return action; ! } ! ! @Override protected void callAction(String name) { ! if ("SelectPreviousRow".equals(name)) selectPreviousRow(); ! else if ("SelectNextRow".equals(name)) selectNextRow(); ! else if ("SelectFirstRow".equals(name)) selectFirstRow(); ! else if ("SelectLastRow".equals(name)) selectLastRow(); ! else if ("SelectAllPageUp".equals(name)) selectAllPageUp(); ! else if ("SelectAllPageDown".equals(name)) selectAllPageDown(); ! else if ("SelectAllToFirstRow".equals(name)) selectAllToFirstRow(); ! else if ("SelectAllToLastRow".equals(name)) selectAllToLastRow(); ! else if ("AlsoSelectNextRow".equals(name)) alsoSelectNextRow(); ! else if ("AlsoSelectPreviousRow".equals(name)) alsoSelectPreviousRow(); ! else if ("ClearSelection".equals(name)) clearSelection(); ! else if("SelectAll".equals(name)) selectAll(); ! else if ("ScrollUp".equals(name)) scrollUp(); ! else if ("ScrollDown".equals(name)) scrollDown(); ! else if ("ExpandRow".equals(name)) expandRow(); ! else if ("CollapseRow".equals(name)) collapseRow(); ! else if ("ExpandAll".equals(name)) expandAll(); ! // else if ("ExpandOrCollapseRow".equals(name)) expandOrCollapseRow(); ! else if ("Edit".equals(name)) edit(); ! else if ("CancelEdit".equals(name)) cancelEdit(); ! else if ("FocusFirstRow".equals(name)) focusFirstRow(); ! else if ("FocusLastRow".equals(name)) focusLastRow(); ! else if ("toggleFocusOwnerSelection".equals(name)) toggleFocusOwnerSelection(); ! ! else if ("SelectAllToFocus".equals(name)) selectAllToFocus(false); ! else if ("SelectAllToFocusAndSetAnchor".equals(name)) selectAllToFocus(true); ! ! else if ("FocusPageUp".equals(name)) focusPageUp(); ! else if ("FocusPageDown".equals(name)) focusPageDown(); ! else if ("FocusPreviousRow".equals(name)) focusPreviousRow(); ! else if ("FocusNextRow".equals(name)) focusNextRow(); ! else if ("DiscontinuousSelectNextRow".equals(name)) discontinuousSelectNextRow(); ! else if ("DiscontinuousSelectPreviousRow".equals(name)) discontinuousSelectPreviousRow(); ! else if ("DiscontinuousSelectPageUp".equals(name)) discontinuousSelectPageUp(); ! else if ("DiscontinuousSelectPageDown".equals(name)) discontinuousSelectPageDown(); ! else if ("DiscontinuousSelectAllToLastRow".equals(name)) discontinuousSelectAllToLastRow(); ! else if ("DiscontinuousSelectAllToFirstRow".equals(name)) discontinuousSelectAllToFirstRow(); ! else super.callAction(name); ! } ! ! @Override protected void callActionForEvent(KeyEvent e) { // RT-12751: we want to keep an eye on the user holding down the shift key, // so that we know when they enter/leave multiple selection mode. This // changes what happens when certain key combinations are pressed. isShiftDown = e.getEventType() == KeyEvent.KEY_PRESSED && e.isShiftDown(); isShortcutDown = e.getEventType() == KeyEvent.KEY_PRESSED && e.isShortcutDown(); - - super.callActionForEvent(e); } /************************************************************************** * State and Functions * *************************************************************************/ --- 23,64 ---- * questions. */ package com.sun.javafx.scene.control.behavior; + import com.sun.javafx.scene.control.inputmap.InputMap; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.beans.value.WeakChangeListener; import javafx.collections.ListChangeListener; import javafx.collections.WeakListChangeListener; ! import javafx.event.EventHandler; import javafx.scene.control.*; ! import javafx.scene.input.*; import javafx.util.Callback; + import java.util.ArrayList; import java.util.List; import com.sun.javafx.PlatformUtil; ! import com.sun.javafx.scene.control.inputmap.KeyBinding; ! import static javafx.scene.input.KeyCode.*; ! import static com.sun.javafx.scene.control.inputmap.InputMap.KeyMapping; ! public class TreeViewBehavior<T> extends BehaviorBase<TreeView<T>> { ! private final InputMap<TreeView<T>> treeViewInputMap; ! private final EventHandler<KeyEvent> keyEventListener = e -> { ! if (!e.isConsumed()) { // RT-12751: we want to keep an eye on the user holding down the shift key, // so that we know when they enter/leave multiple selection mode. This // changes what happens when certain key combinations are pressed. isShiftDown = e.getEventType() == KeyEvent.KEY_PRESSED && e.isShiftDown(); isShortcutDown = e.getEventType() == KeyEvent.KEY_PRESSED && e.isShortcutDown(); } + }; /************************************************************************** * State and Functions * *************************************************************************/
*** 231,248 **** private boolean selectionChanging = false; private final ListChangeListener<Integer> selectedIndicesListener = c -> { while (c.next()) { if (c.wasReplaced()) { ! if (TreeCellBehavior.hasDefaultAnchor(getControl())) { ! TreeCellBehavior.removeAnchor(getControl()); } } final int shift = c.wasPermutated() ? c.getTo() - c.getFrom() : 0; ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); // there are no selected items, so lets clear out the anchor if (! selectionChanging) { if (sm.isEmpty()) { setAnchor(-1); --- 96,113 ---- private boolean selectionChanging = false; private final ListChangeListener<Integer> selectedIndicesListener = c -> { while (c.next()) { if (c.wasReplaced()) { ! if (TreeCellBehavior.hasDefaultAnchor(getNode())) { ! TreeCellBehavior.removeAnchor(getNode()); } } final int shift = c.wasPermutated() ? c.getTo() - c.getFrom() : 0; ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); // there are no selected items, so lets clear out the anchor if (! selectionChanging) { if (sm.isEmpty()) { setAnchor(-1);
*** 273,339 **** } } }; private final WeakListChangeListener<Integer> weakSelectedIndicesListener = ! new WeakListChangeListener<Integer>(selectedIndicesListener); private final WeakChangeListener<MultipleSelectionModel<TreeItem<T>>> weakSelectionModelListener = ! new WeakChangeListener<MultipleSelectionModel<TreeItem<T>>>(selectionModelListener); public TreeViewBehavior(TreeView<T> control) { ! super(control, TREE_VIEW_BINDINGS); // Fix for RT-16565 ! getControl().selectionModelProperty().addListener(weakSelectionModelListener); if (control.getSelectionModel() != null) { control.getSelectionModel().getSelectedIndices().addListener(weakSelectedIndicesListener); } } @Override public void dispose() { ! TreeCellBehavior.removeAnchor(getControl()); super.dispose(); } private void setAnchor(int anchor) { ! TreeCellBehavior.setAnchor(getControl(), anchor < 0 ? null : anchor, false); } private int getAnchor() { ! return TreeCellBehavior.getAnchor(getControl(), getControl().getFocusModel().getFocusedIndex()); } private boolean hasAnchor() { ! return TreeCellBehavior.hasNonDefaultAnchor(getControl()); } ! @Override public void mousePressed(MouseEvent e) { ! super.mousePressed(e); ! if (! e.isShiftDown()) { ! int index = getControl().getSelectionModel().getSelectedIndex(); setAnchor(index); } ! if (! getControl().isFocused() && getControl().isFocusTraversable()) { ! getControl().requestFocus(); } } private void clearSelection() { ! getControl().getSelectionModel().clearSelection(); //select(null); } private void scrollUp() { int newSelectedIndex = -1; if (onScrollPageUp != null) { newSelectedIndex = onScrollPageUp.call(false); } if (newSelectedIndex == -1) return; ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; sm.clearAndSelect(newSelectedIndex); } private void scrollDown() { --- 138,295 ---- } } }; private final WeakListChangeListener<Integer> weakSelectedIndicesListener = ! new WeakListChangeListener<>(selectedIndicesListener); private final WeakChangeListener<MultipleSelectionModel<TreeItem<T>>> weakSelectionModelListener = ! new WeakChangeListener<>(selectionModelListener); public TreeViewBehavior(TreeView<T> control) { ! super(control); ! ! // // Fix for RT-16565 ! // getNode().selectionModelProperty().addListener(weakSelectionModelListener); ! // if (control.getSelectionModel() != null) { ! // control.getSelectionModel().getSelectedIndices().addListener(weakSelectedIndicesListener); ! // } ! ! ! ! // create a map for treeView-specific mappings ! treeViewInputMap = createInputMap(); ! ! // // add focus traversal mappings ! // addDefaultMapping(treeViewInputMap, FocusTraversalInputMap.getFocusTraversalMappings()); ! addDefaultMapping(treeViewInputMap, ! new KeyMapping(HOME, e -> selectFirstRow()), ! new KeyMapping(END, e -> selectLastRow()), ! new KeyMapping(new KeyBinding(HOME).shift(), e -> selectAllToFirstRow()), ! new KeyMapping(new KeyBinding(END).shift(), e -> selectAllToLastRow()), ! new KeyMapping(new KeyBinding(PAGE_UP).shift(), e -> selectAllPageUp()), ! new KeyMapping(new KeyBinding(PAGE_DOWN).shift(), e -> selectAllPageDown()), ! ! new KeyMapping(new KeyBinding(SPACE).shift(), e -> selectAllToFocus(false)), ! new KeyMapping(new KeyBinding(SPACE).shortcut().shift(), e -> selectAllToFocus(true)), ! ! new KeyMapping(new KeyBinding(HOME).shortcut(), e -> focusFirstRow()), ! new KeyMapping(new KeyBinding(END).shortcut(), e -> focusLastRow()), ! ! new KeyMapping(PAGE_UP, e -> scrollUp()), ! new KeyMapping(PAGE_DOWN, e -> scrollDown()), ! ! new KeyMapping(SPACE, e -> toggleFocusOwnerSelection()), ! ! new KeyMapping(new KeyBinding(A).shortcut(), e -> selectAll()), ! new KeyMapping(new KeyBinding(PAGE_UP).shortcut(), e -> focusPageUp()), ! new KeyMapping(new KeyBinding(PAGE_DOWN).shortcut(), e -> focusPageDown()), ! new KeyMapping(new KeyBinding(UP).shortcut(), e -> focusPreviousRow()), ! new KeyMapping(new KeyBinding(DOWN).shortcut(), e -> focusNextRow()), ! new KeyMapping(new KeyBinding(UP).shortcut().shift(), e -> discontinuousSelectPreviousRow()), ! new KeyMapping(new KeyBinding(DOWN).shortcut().shift(), e -> discontinuousSelectNextRow()), ! new KeyMapping(new KeyBinding(PAGE_UP).shortcut().shift(), e -> discontinuousSelectPageUp()), ! new KeyMapping(new KeyBinding(PAGE_DOWN).shortcut().shift(), e -> discontinuousSelectPageDown()), ! new KeyMapping(new KeyBinding(HOME).shortcut().shift(), e -> discontinuousSelectAllToFirstRow()), ! new KeyMapping(new KeyBinding(END).shortcut().shift(), e -> discontinuousSelectAllToLastRow()), ! ! // these should be read as 'if RTL, use the first method, otherwise use the second' ! new KeyMapping(LEFT, e -> rtl(control, this::expandRow, this::collapseRow)), ! new KeyMapping(KP_LEFT, e -> rtl(control, this::expandRow, this::collapseRow)), ! new KeyMapping(RIGHT, e -> rtl(control, this::collapseRow, this::expandRow)), ! new KeyMapping(KP_RIGHT, e -> rtl(control, this::collapseRow, this::expandRow)), ! ! new KeyMapping(MULTIPLY, e -> expandAll()), ! new KeyMapping(ADD, e -> expandRow()), ! new KeyMapping(SUBTRACT, e -> collapseRow()), ! ! new KeyMapping(UP, e -> selectPreviousRow()), ! new KeyMapping(KP_UP, e -> selectPreviousRow()), ! new KeyMapping(DOWN, e -> selectNextRow()), ! new KeyMapping(KP_DOWN, e -> selectNextRow()), ! ! new KeyMapping(new KeyBinding(UP).shift(), e -> alsoSelectPreviousRow()), ! new KeyMapping(new KeyBinding(KP_UP).shift(), e -> alsoSelectPreviousRow()), ! new KeyMapping(new KeyBinding(DOWN).shift(), e -> alsoSelectNextRow()), ! new KeyMapping(new KeyBinding(KP_DOWN).shift(), e -> alsoSelectNextRow()), ! ! new KeyMapping(ENTER, e -> edit()), ! new KeyMapping(F2, e -> edit()), ! new KeyMapping(ESCAPE, e -> cancelEdit()), ! ! new InputMap.MouseMapping(MouseEvent.MOUSE_PRESSED, this::mousePressed) ! ); ! ! // create OS-specific child mappings ! // --- mac OS ! InputMap<TreeView<T>> macInputMap = new InputMap<>(control); ! macInputMap.setInterceptor(event -> !PlatformUtil.isMac()); ! addDefaultMapping(macInputMap, new KeyMapping(new KeyBinding(SPACE).shortcut().ctrl(), e -> toggleFocusOwnerSelection())); ! addDefaultChildMap(treeViewInputMap, macInputMap); ! ! // --- all other platforms ! InputMap<TreeView<T>> otherOsInputMap = new InputMap<>(control); ! otherOsInputMap.setInterceptor(event -> PlatformUtil.isMac()); ! addDefaultMapping(otherOsInputMap, new KeyMapping(new KeyBinding(SPACE).ctrl(), e -> toggleFocusOwnerSelection())); ! addDefaultChildMap(treeViewInputMap, otherOsInputMap); ! ! // set up other listeners ! // We make this an event _filter_ so that we can determine the state ! // of the shift key before the event handlers get a shot at the event. ! control.addEventFilter(KeyEvent.ANY, keyEventListener); // Fix for RT-16565 ! control.selectionModelProperty().addListener(weakSelectionModelListener); if (control.getSelectionModel() != null) { control.getSelectionModel().getSelectedIndices().addListener(weakSelectedIndicesListener); } } + @Override public InputMap<TreeView<T>> getInputMap() { + return treeViewInputMap; + } + @Override public void dispose() { ! TreeCellBehavior.removeAnchor(getNode()); super.dispose(); } private void setAnchor(int anchor) { ! TreeCellBehavior.setAnchor(getNode(), anchor < 0 ? null : anchor, false); } private int getAnchor() { ! return TreeCellBehavior.getAnchor(getNode(), getNode().getFocusModel().getFocusedIndex()); } private boolean hasAnchor() { ! return TreeCellBehavior.hasNonDefaultAnchor(getNode()); } ! public void mousePressed(MouseEvent e) { if (! e.isShiftDown()) { ! int index = getNode().getSelectionModel().getSelectedIndex(); setAnchor(index); } ! if (! getNode().isFocused() && getNode().isFocusTraversable()) { ! getNode().requestFocus(); } } private void clearSelection() { ! getNode().getSelectionModel().clearSelection(); //select(null); } private void scrollUp() { int newSelectedIndex = -1; if (onScrollPageUp != null) { newSelectedIndex = onScrollPageUp.call(false); } if (newSelectedIndex == -1) return; ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; sm.clearAndSelect(newSelectedIndex); } private void scrollDown() {
*** 341,376 **** if (onScrollPageDown != null) { newSelectedIndex = onScrollPageDown.call(false); } if (newSelectedIndex == -1) return; ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; sm.clearAndSelect(newSelectedIndex); } private void focusFirstRow() { ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; fm.focus(0); if (onMoveToFirstCell != null) onMoveToFirstCell.run(); } private void focusLastRow() { ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; ! fm.focus(getControl().getExpandedItemCount() - 1); if (onMoveToLastCell != null) onMoveToLastCell.run(); } private void focusPreviousRow() { ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; fm.focusPrevious(); if (! isShortcutDown || getAnchor() == -1) { --- 297,332 ---- if (onScrollPageDown != null) { newSelectedIndex = onScrollPageDown.call(false); } if (newSelectedIndex == -1) return; ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; sm.clearAndSelect(newSelectedIndex); } private void focusFirstRow() { ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; fm.focus(0); if (onMoveToFirstCell != null) onMoveToFirstCell.run(); } private void focusLastRow() { ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; ! fm.focus(getNode().getExpandedItemCount() - 1); if (onMoveToLastCell != null) onMoveToLastCell.run(); } private void focusPreviousRow() { ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; fm.focusPrevious(); if (! isShortcutDown || getAnchor() == -1) {
*** 379,392 **** if (onFocusPreviousRow != null) onFocusPreviousRow.run(); } private void focusNextRow() { ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; fm.focusNext(); if (! isShortcutDown || getAnchor() == -1) { --- 335,348 ---- if (onFocusPreviousRow != null) onFocusPreviousRow.run(); } private void focusNextRow() { ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; fm.focusNext(); if (! isShortcutDown || getAnchor() == -1) {
*** 397,424 **** } private void focusPageUp() { int newFocusIndex = onScrollPageUp.call(true); ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; fm.focus(newFocusIndex); } private void focusPageDown() { int newFocusIndex = onScrollPageDown.call(true); ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; fm.focus(newFocusIndex); } private void alsoSelectPreviousRow() { ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; if (isShiftDown && getAnchor() != -1) { int newRow = fm.getFocusedIndex() - 1; if (newRow < 0) return; --- 353,380 ---- } private void focusPageUp() { int newFocusIndex = onScrollPageUp.call(true); ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; fm.focus(newFocusIndex); } private void focusPageDown() { int newFocusIndex = onScrollPageDown.call(true); ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; fm.focus(newFocusIndex); } private void alsoSelectPreviousRow() { ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; if (isShiftDown && getAnchor() != -1) { int newRow = fm.getFocusedIndex() - 1; if (newRow < 0) return;
*** 444,457 **** onSelectPreviousRow.run(); } private void alsoSelectNextRow() { ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; if (isShiftDown && getAnchor() != -1) { int newRow = fm.getFocusedIndex() + 1; int anchor = getAnchor(); --- 400,413 ---- onSelectPreviousRow.run(); } private void alsoSelectNextRow() { ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; if (isShiftDown && getAnchor() != -1) { int newRow = fm.getFocusedIndex() + 1; int anchor = getAnchor();
*** 475,485 **** onSelectNextRow.run(); } private void clearSelectionOutsideRange(int start, int end) { ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; int min = Math.min(start, end); int max = Math.max(start, end); --- 431,441 ---- onSelectNextRow.run(); } private void clearSelectionOutsideRange(int start, int end) { ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; int min = Math.min(start, end); int max = Math.max(start, end);
*** 494,547 **** } selectionChanging = false; } private void selectPreviousRow() { ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int focusIndex = fm.getFocusedIndex(); if (focusIndex <= 0) { return; } setAnchor(focusIndex - 1); ! getControl().getSelectionModel().clearAndSelect(focusIndex - 1); onSelectPreviousRow.run(); } private void selectNextRow() { ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int focusIndex = fm.getFocusedIndex(); ! if (focusIndex == getControl().getExpandedItemCount() - 1) { return; } setAnchor(focusIndex + 1); ! getControl().getSelectionModel().clearAndSelect(focusIndex + 1); onSelectNextRow.run(); } private void selectFirstRow() { ! if (getControl().getExpandedItemCount() > 0) { ! getControl().getSelectionModel().clearAndSelect(0); if (onMoveToFirstCell != null) onMoveToFirstCell.run(); } } private void selectLastRow() { ! getControl().getSelectionModel().clearAndSelect(getControl().getExpandedItemCount() - 1); onMoveToLastCell.run(); } private void selectAllToFirstRow() { ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int leadIndex = fm.getFocusedIndex(); if (isShiftDown) { --- 450,503 ---- } selectionChanging = false; } private void selectPreviousRow() { ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int focusIndex = fm.getFocusedIndex(); if (focusIndex <= 0) { return; } setAnchor(focusIndex - 1); ! getNode().getSelectionModel().clearAndSelect(focusIndex - 1); onSelectPreviousRow.run(); } private void selectNextRow() { ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int focusIndex = fm.getFocusedIndex(); ! if (focusIndex == getNode().getExpandedItemCount() - 1) { return; } setAnchor(focusIndex + 1); ! getNode().getSelectionModel().clearAndSelect(focusIndex + 1); onSelectNextRow.run(); } private void selectFirstRow() { ! if (getNode().getExpandedItemCount() > 0) { ! getNode().getSelectionModel().clearAndSelect(0); if (onMoveToFirstCell != null) onMoveToFirstCell.run(); } } private void selectLastRow() { ! getNode().getSelectionModel().clearAndSelect(getNode().getExpandedItemCount() - 1); onMoveToLastCell.run(); } private void selectAllToFirstRow() { ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int leadIndex = fm.getFocusedIndex(); if (isShiftDown) {
*** 560,597 **** if (onMoveToFirstCell != null) onMoveToFirstCell.run(); } private void selectAllToLastRow() { ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int leadIndex = fm.getFocusedIndex(); if (isShiftDown) { leadIndex = hasAnchor() ? getAnchor() : leadIndex; } sm.clearSelection(); ! sm.selectRange(leadIndex, getControl().getExpandedItemCount()); if (isShiftDown) { setAnchor(leadIndex); } if (onMoveToLastCell != null) onMoveToLastCell.run(); } private void selectAll() { ! getControl().getSelectionModel().selectAll(); } private void selectAllPageUp() { ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int leadIndex = fm.getFocusedIndex(); if (isShiftDown) { leadIndex = getAnchor() == -1 ? leadIndex : getAnchor(); --- 516,553 ---- if (onMoveToFirstCell != null) onMoveToFirstCell.run(); } private void selectAllToLastRow() { ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int leadIndex = fm.getFocusedIndex(); if (isShiftDown) { leadIndex = hasAnchor() ? getAnchor() : leadIndex; } sm.clearSelection(); ! sm.selectRange(leadIndex, getNode().getExpandedItemCount()); if (isShiftDown) { setAnchor(leadIndex); } if (onMoveToLastCell != null) onMoveToLastCell.run(); } private void selectAll() { ! getNode().getSelectionModel().selectAll(); } private void selectAllPageUp() { ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int leadIndex = fm.getFocusedIndex(); if (isShiftDown) { leadIndex = getAnchor() == -1 ? leadIndex : getAnchor();
*** 601,611 **** int leadSelectedIndex = onScrollPageUp.call(false); // fix for RT-34407 int adjust = leadIndex < leadSelectedIndex ? 1 : -1; ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; selectionChanging = true; if (sm.getSelectionMode() == SelectionMode.SINGLE) { sm.select(leadSelectedIndex); --- 557,567 ---- int leadSelectedIndex = onScrollPageUp.call(false); // fix for RT-34407 int adjust = leadIndex < leadSelectedIndex ? 1 : -1; ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; selectionChanging = true; if (sm.getSelectionMode() == SelectionMode.SINGLE) { sm.select(leadSelectedIndex);
*** 615,625 **** } selectionChanging = false; } private void selectAllPageDown() { ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int leadIndex = fm.getFocusedIndex(); if (isShiftDown) { leadIndex = getAnchor() == -1 ? leadIndex : getAnchor(); --- 571,581 ---- } selectionChanging = false; } private void selectAllPageDown() { ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int leadIndex = fm.getFocusedIndex(); if (isShiftDown) { leadIndex = getAnchor() == -1 ? leadIndex : getAnchor();
*** 629,639 **** int leadSelectedIndex = onScrollPageDown.call(false); // fix for RT-34407 int adjust = leadIndex < leadSelectedIndex ? 1 : -1; ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; selectionChanging = true; if (sm.getSelectionMode() == SelectionMode.SINGLE) { sm.select(leadSelectedIndex); --- 585,595 ---- int leadSelectedIndex = onScrollPageDown.call(false); // fix for RT-34407 int adjust = leadIndex < leadSelectedIndex ? 1 : -1; ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; selectionChanging = true; if (sm.getSelectionMode() == SelectionMode.SINGLE) { sm.select(leadSelectedIndex);
*** 644,654 **** selectionChanging = false; } private void selectAllToFocus(boolean setAnchorToFocusIndex) { // Fix for RT-31241 ! final TreeView<T> treeView = getControl(); if (treeView.getEditingItem() != null) return; MultipleSelectionModel<TreeItem<T>> sm = treeView.getSelectionModel(); if (sm == null) return; --- 600,610 ---- selectionChanging = false; } private void selectAllToFocus(boolean setAnchorToFocusIndex) { // Fix for RT-31241 ! final TreeView<T> treeView = getNode(); if (treeView.getEditingItem() != null) return; MultipleSelectionModel<TreeItem<T>> sm = treeView.getSelectionModel(); if (sm == null) return;
*** 664,683 **** sm.selectRange(startPos, endPos); setAnchor(setAnchorToFocusIndex ? focusIndex : anchor); } private void expandRow() { ! Callback<TreeItem<T>, Integer> getIndex = p -> getControl().getRow(p); ! TreeViewBehavior.expandRow(getControl().getSelectionModel(), getIndex); } private void expandAll() { ! TreeViewBehavior.expandAll(getControl().getRoot()); } private void collapseRow() { ! TreeView<T> control = getControl(); TreeViewBehavior.collapseRow(control.getSelectionModel(), control.getRoot(), control.isShowRoot()); } static <T> void expandRow(final MultipleSelectionModel<TreeItem<T>> sm, Callback<TreeItem<T>, Integer> getIndex) { if (sm == null) return; --- 620,639 ---- sm.selectRange(startPos, endPos); setAnchor(setAnchorToFocusIndex ? focusIndex : anchor); } private void expandRow() { ! Callback<TreeItem<T>, Integer> getIndex = p -> getNode().getRow(p); ! TreeViewBehavior.expandRow(getNode().getSelectionModel(), getIndex); } private void expandAll() { ! TreeViewBehavior.expandAll(getNode().getRoot()); } private void collapseRow() { ! TreeView<T> control = getNode(); TreeViewBehavior.collapseRow(control.getSelectionModel(), control.getRoot(), control.isShowRoot()); } static <T> void expandRow(final MultipleSelectionModel<TreeItem<T>> sm, Callback<TreeItem<T>, Integer> getIndex) { if (sm == null) return;
*** 745,769 **** selectedItem.setExpanded(false); } } private void cancelEdit() { ! getControl().edit(null); } private void edit() { ! TreeItem<T> treeItem = getControl().getSelectionModel().getSelectedItem(); if (treeItem == null) return; ! getControl().edit(treeItem); } private void toggleFocusOwnerSelection() { ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int focusedIndex = fm.getFocusedIndex(); if (sm.isSelected(focusedIndex)) { --- 701,725 ---- selectedItem.setExpanded(false); } } private void cancelEdit() { ! getNode().edit(null); } private void edit() { ! TreeItem<T> treeItem = getNode().getSelectionModel().getSelectedItem(); if (treeItem == null) return; ! getNode().edit(treeItem); } private void toggleFocusOwnerSelection() { ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int focusedIndex = fm.getFocusedIndex(); if (sm.isSelected(focusedIndex)) {
*** 779,797 **** /************************************************************************** * Discontinuous Selection * *************************************************************************/ private void discontinuousSelectPreviousRow() { ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; if (sm.getSelectionMode() != SelectionMode.MULTIPLE) { selectPreviousRow(); return; } ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int focusIndex = fm.getFocusedIndex(); final int newFocusIndex = focusIndex - 1; if (newFocusIndex < 0) return; --- 735,753 ---- /************************************************************************** * Discontinuous Selection * *************************************************************************/ private void discontinuousSelectPreviousRow() { ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; if (sm.getSelectionMode() != SelectionMode.MULTIPLE) { selectPreviousRow(); return; } ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int focusIndex = fm.getFocusedIndex(); final int newFocusIndex = focusIndex - 1; if (newFocusIndex < 0) return;
*** 806,829 **** if (onFocusPreviousRow != null) onFocusPreviousRow.run(); } private void discontinuousSelectNextRow() { ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; if (sm.getSelectionMode() != SelectionMode.MULTIPLE) { selectNextRow(); return; } ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int focusIndex = fm.getFocusedIndex(); final int newFocusIndex = focusIndex + 1; ! if (newFocusIndex >= getControl().getExpandedItemCount()) return; int startIndex = focusIndex; if (isShiftDown) { startIndex = getAnchor() == -1 ? focusIndex : getAnchor(); } --- 762,785 ---- if (onFocusPreviousRow != null) onFocusPreviousRow.run(); } private void discontinuousSelectNextRow() { ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; if (sm.getSelectionMode() != SelectionMode.MULTIPLE) { selectNextRow(); return; } ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int focusIndex = fm.getFocusedIndex(); final int newFocusIndex = focusIndex + 1; ! if (newFocusIndex >= getNode().getExpandedItemCount()) return; int startIndex = focusIndex; if (isShiftDown) { startIndex = getAnchor() == -1 ? focusIndex : getAnchor(); }
*** 833,887 **** if (onFocusNextRow != null) onFocusNextRow.run(); } private void discontinuousSelectPageUp() { ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int anchor = getAnchor(); int leadSelectedIndex = onScrollPageUp.call(false); sm.selectRange(anchor, leadSelectedIndex - 1); } private void discontinuousSelectPageDown() { ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int anchor = getAnchor(); int leadSelectedIndex = onScrollPageDown.call(false); sm.selectRange(anchor, leadSelectedIndex + 1); } private void discontinuousSelectAllToFirstRow() { ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int index = fm.getFocusedIndex(); sm.selectRange(0, index); fm.focus(0); if (onMoveToFirstCell != null) onMoveToFirstCell.run(); } private void discontinuousSelectAllToLastRow() { ! MultipleSelectionModel<TreeItem<T>> sm = getControl().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getControl().getFocusModel(); if (fm == null) return; int index = fm.getFocusedIndex() + 1; ! sm.selectRange(index, getControl().getExpandedItemCount()); if (onMoveToLastCell != null) onMoveToLastCell.run(); } } --- 789,843 ---- if (onFocusNextRow != null) onFocusNextRow.run(); } private void discontinuousSelectPageUp() { ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int anchor = getAnchor(); int leadSelectedIndex = onScrollPageUp.call(false); sm.selectRange(anchor, leadSelectedIndex - 1); } private void discontinuousSelectPageDown() { ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int anchor = getAnchor(); int leadSelectedIndex = onScrollPageDown.call(false); sm.selectRange(anchor, leadSelectedIndex + 1); } private void discontinuousSelectAllToFirstRow() { ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int index = fm.getFocusedIndex(); sm.selectRange(0, index); fm.focus(0); if (onMoveToFirstCell != null) onMoveToFirstCell.run(); } private void discontinuousSelectAllToLastRow() { ! MultipleSelectionModel<TreeItem<T>> sm = getNode().getSelectionModel(); if (sm == null) return; ! FocusModel<TreeItem<T>> fm = getNode().getFocusModel(); if (fm == null) return; int index = fm.getFocusedIndex() + 1; ! sm.selectRange(index, getNode().getExpandedItemCount()); if (onMoveToLastCell != null) onMoveToLastCell.run(); } }