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

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

*** 1,7 **** /* ! * Copyright (c) 2012, 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) 2012, 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
*** 28,103 **** import static javafx.scene.input.KeyCode.*; import javafx.beans.value.ChangeListener; import javafx.beans.value.WeakChangeListener; import javafx.collections.ObservableList; - import javafx.geometry.NodeOrientation; import javafx.scene.control.TableColumnBase; import javafx.scene.control.TableFocusModel; import javafx.scene.control.TablePositionBase; import javafx.scene.control.TableSelectionModel; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeTableColumn; import javafx.scene.control.TreeTablePosition; import javafx.scene.control.TreeTableView; ! import javafx.scene.input.KeyEvent; import javafx.util.Callback; - import java.util.ArrayList; - import java.util.List; - public class TreeTableViewBehavior<T> extends TableViewBehaviorBase<TreeTableView<T>, TreeItem<T>, TreeTableColumn<T, ?>> { /************************************************************************** * * - * Setup key bindings * - * * - *************************************************************************/ - - protected static final List<KeyBinding> TREE_TABLE_VIEW_BINDINGS = new ArrayList<KeyBinding>(); - - static { - // Add these bindings at the front of the list, so they take precedence - TREE_TABLE_VIEW_BINDINGS.add(new KeyBinding(LEFT, "CollapseRow")); - TREE_TABLE_VIEW_BINDINGS.add(new KeyBinding(KP_LEFT, "CollapseRow")); - TREE_TABLE_VIEW_BINDINGS.add(new KeyBinding(RIGHT, "ExpandRow")); - TREE_TABLE_VIEW_BINDINGS.add(new KeyBinding(KP_RIGHT, "ExpandRow")); - - TREE_TABLE_VIEW_BINDINGS.add(new KeyBinding(MULTIPLY, "ExpandAll")); - TREE_TABLE_VIEW_BINDINGS.add(new KeyBinding(ADD, "ExpandRow")); - TREE_TABLE_VIEW_BINDINGS.add(new KeyBinding(SUBTRACT, "CollapseRow")); - - TREE_TABLE_VIEW_BINDINGS.addAll(TABLE_VIEW_BINDINGS); - } - - @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 ("ExpandRow".equals(name)) rightArrowPressed(); - else if ("CollapseRow".equals(name)) leftArrowPressed(); - else if ("ExpandAll".equals(name)) expandAll(); - else super.callAction(name); - } - - - - /************************************************************************** - * * * Listeners * * * *************************************************************************/ private final ChangeListener<TreeTableView.TreeTableViewSelectionModel<T>> selectionModelListener = --- 28,52 ---- import static javafx.scene.input.KeyCode.*; import javafx.beans.value.ChangeListener; import javafx.beans.value.WeakChangeListener; import javafx.collections.ObservableList; import javafx.scene.control.TableColumnBase; import javafx.scene.control.TableFocusModel; import javafx.scene.control.TablePositionBase; import javafx.scene.control.TableSelectionModel; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeTableColumn; import javafx.scene.control.TreeTablePosition; import javafx.scene.control.TreeTableView; ! import com.sun.javafx.scene.control.inputmap.InputMap; import javafx.util.Callback; public class TreeTableViewBehavior<T> extends TableViewBehaviorBase<TreeTableView<T>, TreeItem<T>, TreeTableColumn<T, ?>> { /************************************************************************** * * * Listeners * * * *************************************************************************/ private final ChangeListener<TreeTableView.TreeTableViewSelectionModel<T>> selectionModelListener =
*** 109,130 **** newValue.getSelectedCells().addListener(weakSelectedCellsListener); } }; private final WeakChangeListener<TreeTableView.TreeTableViewSelectionModel<T>> weakSelectionModelListener = ! new WeakChangeListener<TreeTableView.TreeTableViewSelectionModel<T>>(selectionModelListener); /************************************************************************** * * * Constructors * * * *************************************************************************/ public TreeTableViewBehavior(TreeTableView<T> control) { ! super(control, TREE_TABLE_VIEW_BINDINGS); // Fix for RT-16565 control.selectionModelProperty().addListener(weakSelectionModelListener); if (getSelectionModel() != null) { control.getSelectionModel().getSelectedCells().addListener(selectedCellsListener); --- 58,95 ---- newValue.getSelectedCells().addListener(weakSelectedCellsListener); } }; private final WeakChangeListener<TreeTableView.TreeTableViewSelectionModel<T>> weakSelectionModelListener = ! new WeakChangeListener<>(selectionModelListener); /************************************************************************** * * * Constructors * * * *************************************************************************/ public TreeTableViewBehavior(TreeTableView<T> control) { ! super(control); ! ! // Add these bindings as a child input map, so they take precedence ! InputMap<TreeTableView<T>> expandCollapseInputMap = new InputMap<>(control); ! expandCollapseInputMap.getMappings().addAll( ! // these should be read as 'if RTL, use the first method, otherwise use the second' ! new InputMap.KeyMapping(LEFT, e -> rtl(control, this::expandRow, this::collapseRow)), ! new InputMap.KeyMapping(KP_LEFT, e -> rtl(control, this::expandRow, this::collapseRow)), ! new InputMap.KeyMapping(RIGHT, e -> rtl(control, this::collapseRow, this::expandRow)), ! new InputMap.KeyMapping(KP_RIGHT, e -> rtl(control, this::collapseRow, this::expandRow)), ! ! new InputMap.KeyMapping(MULTIPLY, e -> expandAll()), ! new InputMap.KeyMapping(ADD, e -> expandRow()), ! new InputMap.KeyMapping(SUBTRACT, e -> collapseRow()) ! ); ! addDefaultChildMap(getInputMap(), expandCollapseInputMap); ! // Fix for RT-16565 control.selectionModelProperty().addListener(weakSelectionModelListener); if (getSelectionModel() != null) { control.getSelectionModel().getSelectedCells().addListener(selectedCellsListener);
*** 139,195 **** * * *************************************************************************/ /** {@inheritDoc} */ @Override protected int getItemCount() { ! return getControl().getExpandedItemCount(); } /** {@inheritDoc} */ @Override protected TableFocusModel getFocusModel() { ! return getControl().getFocusModel(); } /** {@inheritDoc} */ @Override protected TableSelectionModel<TreeItem<T>> getSelectionModel() { ! return getControl().getSelectionModel(); } /** {@inheritDoc} */ @Override protected ObservableList<TreeTablePosition<T,?>> getSelectedCells() { ! return getControl().getSelectionModel().getSelectedCells(); } /** {@inheritDoc} */ @Override protected TablePositionBase getFocusedCell() { ! return getControl().getFocusModel().getFocusedCell(); } /** {@inheritDoc} */ @Override protected int getVisibleLeafIndex(TableColumnBase tc) { ! return getControl().getVisibleLeafIndex((TreeTableColumn)tc); } /** {@inheritDoc} */ @Override protected TreeTableColumn getVisibleLeafColumn(int index) { ! return getControl().getVisibleLeafColumn(index); } /** {@inheritDoc} */ @Override protected void editCell(int row, TableColumnBase tc) { ! getControl().edit(row, (TreeTableColumn)tc); } /** {@inheritDoc} */ @Override protected ObservableList<TreeTableColumn<T,?>> getVisibleLeafColumns() { ! return getControl().getVisibleLeafColumns(); } /** {@inheritDoc} */ @Override protected TablePositionBase<TreeTableColumn<T, ?>> getTablePosition(int row, TableColumnBase<TreeItem<T>, ?> tc) { ! return new TreeTablePosition(getControl(), row, (TreeTableColumn)tc); } /************************************************************************** --- 104,160 ---- * * *************************************************************************/ /** {@inheritDoc} */ @Override protected int getItemCount() { ! return getNode().getExpandedItemCount(); } /** {@inheritDoc} */ @Override protected TableFocusModel getFocusModel() { ! return getNode().getFocusModel(); } /** {@inheritDoc} */ @Override protected TableSelectionModel<TreeItem<T>> getSelectionModel() { ! return getNode().getSelectionModel(); } /** {@inheritDoc} */ @Override protected ObservableList<TreeTablePosition<T,?>> getSelectedCells() { ! return getNode().getSelectionModel().getSelectedCells(); } /** {@inheritDoc} */ @Override protected TablePositionBase getFocusedCell() { ! return getNode().getFocusModel().getFocusedCell(); } /** {@inheritDoc} */ @Override protected int getVisibleLeafIndex(TableColumnBase tc) { ! return getNode().getVisibleLeafIndex((TreeTableColumn)tc); } /** {@inheritDoc} */ @Override protected TreeTableColumn getVisibleLeafColumn(int index) { ! return getNode().getVisibleLeafColumn(index); } /** {@inheritDoc} */ @Override protected void editCell(int row, TableColumnBase tc) { ! getNode().edit(row, (TreeTableColumn)tc); } /** {@inheritDoc} */ @Override protected ObservableList<TreeTableColumn<T,?>> getVisibleLeafColumns() { ! return getNode().getVisibleLeafColumns(); } /** {@inheritDoc} */ @Override protected TablePositionBase<TreeTableColumn<T, ?>> getTablePosition(int row, TableColumnBase<TreeItem<T>, ?> tc) { ! return new TreeTablePosition(getNode(), row, (TreeTableColumn)tc); } /**************************************************************************
*** 199,209 **** *************************************************************************/ /** {@inheritDoc} */ @Override protected void selectAllToFocus(boolean setAnchorToFocusIndex) { // Fix for RT-31241 ! if (getControl().getEditingCell() != null) return; super.selectAllToFocus(setAnchorToFocusIndex); } /************************************************************************** --- 164,174 ---- *************************************************************************/ /** {@inheritDoc} */ @Override protected void selectAllToFocus(boolean setAnchorToFocusIndex) { // Fix for RT-31241 ! if (getNode().getEditingCell() != null) return; super.selectAllToFocus(setAnchorToFocusIndex); } /**************************************************************************
*** 215,225 **** /** * The next methods handle the left/right arrow input differently depending * on whether we are in row or cell selection. */ private void rightArrowPressed() { ! if (getControl().getSelectionModel().isCellSelectionEnabled()) { if (isRTL()) { selectLeftCell(); } else { selectRightCell(); } --- 180,190 ---- /** * The next methods handle the left/right arrow input differently depending * on whether we are in row or cell selection. */ private void rightArrowPressed() { ! if (getNode().getSelectionModel().isCellSelectionEnabled()) { if (isRTL()) { selectLeftCell(); } else { selectRightCell(); }
*** 227,237 **** expandRow(); } } private void leftArrowPressed() { ! if (getControl().getSelectionModel().isCellSelectionEnabled()) { if (isRTL()) { selectRightCell(); } else { selectLeftCell(); } --- 192,202 ---- expandRow(); } } private void leftArrowPressed() { ! if (getNode().getSelectionModel().isCellSelectionEnabled()) { if (isRTL()) { selectRightCell(); } else { selectLeftCell(); }
*** 239,256 **** collapseRow(); } } 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() { ! TreeTableView<T> control = getControl(); TreeViewBehavior.collapseRow(control.getSelectionModel(), control.getRoot(), control.isShowRoot()); } } --- 204,221 ---- collapseRow(); } } 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() { ! TreeTableView<T> control = getNode(); TreeViewBehavior.collapseRow(control.getSelectionModel(), control.getRoot(), control.isShowRoot()); } }