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());
}
}