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 +1,7 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * 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,76 +28,25 @@
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 com.sun.javafx.scene.control.inputmap.InputMap;
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 =
@@ -109,22 +58,38 @@
newValue.getSelectedCells().addListener(weakSelectedCellsListener);
}
};
private final WeakChangeListener<TreeTableView.TreeTableViewSelectionModel<T>> weakSelectionModelListener =
- new WeakChangeListener<TreeTableView.TreeTableViewSelectionModel<T>>(selectionModelListener);
+ new WeakChangeListener<>(selectionModelListener);
/**************************************************************************
* *
* Constructors *
* *
*************************************************************************/
public TreeTableViewBehavior(TreeTableView<T> control) {
- super(control, TREE_TABLE_VIEW_BINDINGS);
+ 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,57 +104,57 @@
* *
*************************************************************************/
/** {@inheritDoc} */
@Override protected int getItemCount() {
- return getControl().getExpandedItemCount();
+ return getNode().getExpandedItemCount();
}
/** {@inheritDoc} */
@Override protected TableFocusModel getFocusModel() {
- return getControl().getFocusModel();
+ return getNode().getFocusModel();
}
/** {@inheritDoc} */
@Override protected TableSelectionModel<TreeItem<T>> getSelectionModel() {
- return getControl().getSelectionModel();
+ return getNode().getSelectionModel();
}
/** {@inheritDoc} */
@Override protected ObservableList<TreeTablePosition<T,?>> getSelectedCells() {
- return getControl().getSelectionModel().getSelectedCells();
+ return getNode().getSelectionModel().getSelectedCells();
}
/** {@inheritDoc} */
@Override protected TablePositionBase getFocusedCell() {
- return getControl().getFocusModel().getFocusedCell();
+ return getNode().getFocusModel().getFocusedCell();
}
/** {@inheritDoc} */
@Override protected int getVisibleLeafIndex(TableColumnBase tc) {
- return getControl().getVisibleLeafIndex((TreeTableColumn)tc);
+ return getNode().getVisibleLeafIndex((TreeTableColumn)tc);
}
/** {@inheritDoc} */
@Override protected TreeTableColumn getVisibleLeafColumn(int index) {
- return getControl().getVisibleLeafColumn(index);
+ return getNode().getVisibleLeafColumn(index);
}
/** {@inheritDoc} */
@Override protected void editCell(int row, TableColumnBase tc) {
- getControl().edit(row, (TreeTableColumn)tc);
+ getNode().edit(row, (TreeTableColumn)tc);
}
/** {@inheritDoc} */
@Override protected ObservableList<TreeTableColumn<T,?>> getVisibleLeafColumns() {
- return getControl().getVisibleLeafColumns();
+ return getNode().getVisibleLeafColumns();
}
/** {@inheritDoc} */
@Override protected TablePositionBase<TreeTableColumn<T, ?>>
getTablePosition(int row, TableColumnBase<TreeItem<T>, ?> tc) {
- return new TreeTablePosition(getControl(), row, (TreeTableColumn)tc);
+ return new TreeTablePosition(getNode(), row, (TreeTableColumn)tc);
}
/**************************************************************************
@@ -199,11 +164,11 @@
*************************************************************************/
/** {@inheritDoc} */
@Override protected void selectAllToFocus(boolean setAnchorToFocusIndex) {
// Fix for RT-31241
- if (getControl().getEditingCell() != null) return;
+ if (getNode().getEditingCell() != null) return;
super.selectAllToFocus(setAnchorToFocusIndex);
}
/**************************************************************************
@@ -215,11 +180,11 @@
/**
* 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 (getNode().getSelectionModel().isCellSelectionEnabled()) {
if (isRTL()) {
selectLeftCell();
} else {
selectRightCell();
}
@@ -227,11 +192,11 @@
expandRow();
}
}
private void leftArrowPressed() {
- if (getControl().getSelectionModel().isCellSelectionEnabled()) {
+ if (getNode().getSelectionModel().isCellSelectionEnabled()) {
if (isRTL()) {
selectRightCell();
} else {
selectLeftCell();
}
@@ -239,18 +204,18 @@
collapseRow();
}
}
private void expandRow() {
- Callback<TreeItem<T>, Integer> getIndex = p -> getControl().getRow(p);
- TreeViewBehavior.expandRow(getControl().getSelectionModel(), getIndex);
+ Callback<TreeItem<T>, Integer> getIndex = p -> getNode().getRow(p);
+ TreeViewBehavior.expandRow(getNode().getSelectionModel(), getIndex);
}
private void expandAll() {
- TreeViewBehavior.expandAll(getControl().getRoot());
+ TreeViewBehavior.expandAll(getNode().getRoot());
}
private void collapseRow() {
- TreeTableView<T> control = getControl();
+ TreeTableView<T> control = getNode();
TreeViewBehavior.collapseRow(control.getSelectionModel(), control.getRoot(), control.isShowRoot());
}
}