--- old/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TableRowSkin.java 2015-09-03 15:22:51.286427700 -0700 +++ /dev/null 2015-09-03 15:22:52.000000000 -0700 @@ -1,178 +0,0 @@ -/* - * Copyright (c) 2011, 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 - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.javafx.scene.control.skin; - - -import java.util.ArrayList; -import java.util.List; - -import javafx.beans.property.DoubleProperty; -import javafx.scene.control.TableCell; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TablePosition; -import javafx.scene.control.TableRow; -import javafx.scene.control.TableView; - -import com.sun.javafx.scene.control.behavior.CellBehaviorBase; -import com.sun.javafx.scene.control.behavior.TableRowBehavior; - -import javafx.beans.property.ObjectProperty; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.scene.AccessibleAttribute; -import javafx.scene.Node; -import javafx.scene.control.Control; -import javafx.scene.control.TableColumnBase; -import javafx.scene.control.TableView.TableViewFocusModel; - -/** - */ -public class TableRowSkin extends TableRowSkinBase, CellBehaviorBase>, TableCell> { - - private TableView tableView; - private TableViewSkin tableViewSkin; - - public TableRowSkin(TableRow tableRow) { - super(tableRow, new TableRowBehavior(tableRow)); - - this.tableView = tableRow.getTableView(); - updateTableViewSkin(); - - super.init(tableRow); - - registerChangeListener(tableRow.tableViewProperty(), "TABLE_VIEW"); - } - - @Override protected void handleControlPropertyChanged(String p) { - super.handleControlPropertyChanged(p); - if ("TABLE_VIEW".equals(p)) { - updateTableViewSkin(); - - for (int i = 0, max = cells.size(); i < max; i++) { - Node n = cells.get(i); - if (n instanceof TableCell) { - ((TableCell)n).updateTableView(getSkinnable().getTableView()); - } - } - - this.tableView = getSkinnable().getTableView(); - } - } - - @Override protected TableCell getCell(TableColumnBase tcb) { - TableColumn tableColumn = (TableColumn) tcb; - TableCell cell = (TableCell) tableColumn.getCellFactory().call(tableColumn); - - // we set it's TableColumn, TableView and TableRow - cell.updateTableColumn(tableColumn); - cell.updateTableView(tableColumn.getTableView()); - cell.updateTableRow(getSkinnable()); - - return cell; - } - - @Override protected ObservableList> getVisibleLeafColumns() { - return tableView.getVisibleLeafColumns(); - } - - @Override protected void updateCell(TableCell cell, TableRow row) { - cell.updateTableRow(row); - } - - @Override protected DoubleProperty fixedCellSizeProperty() { - return tableView.fixedCellSizeProperty(); - } - - @Override protected boolean isColumnPartiallyOrFullyVisible(TableColumnBase tc) { - return tableViewSkin == null ? false : tableViewSkin.isColumnPartiallyOrFullyVisible((TableColumn)tc); - } - - @Override protected TableColumn getTableColumnBase(TableCell cell) { - return cell.getTableColumn(); - } - - @Override protected ObjectProperty graphicProperty() { - return null; - } - - @Override protected Control getVirtualFlowOwner() { - return getSkinnable().getTableView(); - } - - private void updateTableViewSkin() { - TableView tableView = getSkinnable().getTableView(); - if (tableView.getSkin() instanceof TableViewSkin) { - tableViewSkin = (TableViewSkin)tableView.getSkin(); - } - } - - @Override - protected Object queryAccessibleAttribute(AccessibleAttribute attribute, Object... parameters) { - switch (attribute) { - case SELECTED_ITEMS: { - // FIXME this could be optimised to iterate over cellsMap only - // (selectedCells could be big, cellsMap is much smaller) - List selection = new ArrayList<>(); - int index = getSkinnable().getIndex(); - for (TablePosition pos : tableView.getSelectionModel().getSelectedCells()) { - if (pos.getRow() == index) { - TableColumn column = pos.getTableColumn(); - if (column == null) { - /* This is the row-based case */ - column = tableView.getVisibleLeafColumn(0); - } - TableCell cell = cellsMap.get(column).get(); - if (cell != null) selection.add(cell); - } - return FXCollections.observableArrayList(selection); - } - } - case CELL_AT_ROW_COLUMN: { - int colIndex = (Integer)parameters[1]; - TableColumn column = tableView.getVisibleLeafColumn(colIndex); - if (cellsMap.containsKey(column)) { - return cellsMap.get(column).get(); - } - return null; - } - case FOCUS_ITEM: { - TableViewFocusModel fm = tableView.getFocusModel(); - TablePosition focusedCell = fm.getFocusedCell(); - TableColumn column = focusedCell.getTableColumn(); - if (column == null) { - /* This is the row-based case */ - column = tableView.getVisibleLeafColumn(0); - } - if (cellsMap.containsKey(column)) { - return cellsMap.get(column).get(); - } - return null; - } - default: return super.queryAccessibleAttribute(attribute, parameters); - } - } - -} --- /dev/null 2015-09-03 15:22:52.000000000 -0700 +++ new/modules/controls/src/main/java/javafx/scene/control/skin/TableRowSkin.java 2015-09-03 15:22:50.512383400 -0700 @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2011, 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 + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javafx.scene.control.skin; + + +import java.util.ArrayList; +import java.util.List; + +import com.sun.javafx.scene.control.behavior.BehaviorBase; +import javafx.beans.property.DoubleProperty; +import javafx.scene.control.Accordion; +import javafx.scene.control.Button; +import javafx.scene.control.TableCell; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TablePosition; +import javafx.scene.control.TableRow; +import javafx.scene.control.TableView; + +import com.sun.javafx.scene.control.behavior.TableRowBehavior; + +import javafx.beans.property.ObjectProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.scene.AccessibleAttribute; +import javafx.scene.Node; +import javafx.scene.control.Control; +import javafx.scene.control.TableColumnBase; +import javafx.scene.control.TableView.TableViewFocusModel; + +/** + * Default skin implementation for the {@link TableRow} control. + * + * @see TableRow + * @since 9 + */ +public class TableRowSkin extends TableRowSkinBase, TableCell> { + + /*************************************************************************** + * * + * Private fields * + * * + **************************************************************************/ + + private TableViewSkin tableViewSkin; + private final BehaviorBase> behavior; + + + + /*************************************************************************** + * * + * Constructors * + * * + **************************************************************************/ + + /** + * Creates a new TableRowSkin instance, installing the necessary child + * nodes into the Control {@link Control#getChildren() children} list, as + * well as the necessary input mappings for handling key, mouse, etc events. + * + * @param control The control that this skin should be installed onto. + */ + public TableRowSkin(TableRow control) { + super(control); + + // install default input map for the TableRow control + behavior = new TableRowBehavior<>(control); +// control.setInputMap(behavior.getInputMap()); + + updateTableViewSkin(); + + registerChangeListener(control.tableViewProperty(), e -> { + updateTableViewSkin(); + + for (int i = 0, max = cells.size(); i < max; i++) { + Node n = cells.get(i); + if (n instanceof TableCell) { + ((TableCell)n).updateTableView(getSkinnable().getTableView()); + } + } + }); + } + + + + /*************************************************************************** + * * + * Public API * + * * + **************************************************************************/ + + /** {@inheritDoc} */ + @Override public void dispose() { + super.dispose(); + + if (behavior != null) { + behavior.dispose(); + } + } + + /** {@inheritDoc} */ + @Override protected Object queryAccessibleAttribute(AccessibleAttribute attribute, Object... parameters) { + switch (attribute) { + case SELECTED_ITEMS: { + // FIXME this could be optimised to iterate over cellsMap only + // (selectedCells could be big, cellsMap is much smaller) + List selection = new ArrayList<>(); + int index = getSkinnable().getIndex(); + for (TablePosition pos : getVirtualFlowOwner().getSelectionModel().getSelectedCells()) { + if (pos.getRow() == index) { + TableColumn column = pos.getTableColumn(); + if (column == null) { + /* This is the row-based case */ + column = getVirtualFlowOwner().getVisibleLeafColumn(0); + } + TableCell cell = cellsMap.get(column).get(); + if (cell != null) selection.add(cell); + } + return FXCollections.observableArrayList(selection); + } + } + case CELL_AT_ROW_COLUMN: { + int colIndex = (Integer)parameters[1]; + TableColumn column = getVirtualFlowOwner().getVisibleLeafColumn(colIndex); + if (cellsMap.containsKey(column)) { + return cellsMap.get(column).get(); + } + return null; + } + case FOCUS_ITEM: { + TableViewFocusModel fm = getVirtualFlowOwner().getFocusModel(); + TablePosition focusedCell = fm.getFocusedCell(); + TableColumn column = focusedCell.getTableColumn(); + if (column == null) { + /* This is the row-based case */ + column = getVirtualFlowOwner().getVisibleLeafColumn(0); + } + if (cellsMap.containsKey(column)) { + return cellsMap.get(column).get(); + } + return null; + } + default: return super.queryAccessibleAttribute(attribute, parameters); + } + } + + + + /*************************************************************************** + * * + * Private implementation * + * * + **************************************************************************/ + + /** {@inheritDoc} */ + @Override TableCell getCell(TableColumnBase tcb) { + TableColumn tableColumn = (TableColumn) tcb; + TableCell cell = (TableCell) tableColumn.getCellFactory().call(tableColumn); + + // we set it's TableColumn, TableView and TableRow + cell.updateTableColumn(tableColumn); + cell.updateTableView(tableColumn.getTableView()); + cell.updateTableRow(getSkinnable()); + + return cell; + } + + /** {@inheritDoc} */ + @Override ObservableList> getVisibleLeafColumns() { + return getVirtualFlowOwner().getVisibleLeafColumns(); + } + + /** {@inheritDoc} */ + @Override void updateCell(TableCell cell, TableRow row) { + cell.updateTableRow(row); + } + + /** {@inheritDoc} */ + @Override DoubleProperty fixedCellSizeProperty() { + return getVirtualFlowOwner().fixedCellSizeProperty(); + } + + /** {@inheritDoc} */ + @Override boolean isColumnPartiallyOrFullyVisible(TableColumnBase tc) { + return tableViewSkin == null ? false : tableViewSkin.isColumnPartiallyOrFullyVisible((TableColumn)tc); + } + + /** {@inheritDoc} */ + @Override TableColumn getTableColumnBase(TableCell cell) { + return cell.getTableColumn(); + } + + /** {@inheritDoc} */ + @Override ObjectProperty graphicProperty() { + return null; + } + + /** {@inheritDoc} */ + @Override TableView getVirtualFlowOwner() { + return getSkinnable().getTableView(); + } + + private void updateTableViewSkin() { + TableView tableView = getSkinnable().getTableView(); + if (tableView.getSkin() instanceof TableViewSkin) { + tableViewSkin = (TableViewSkin)tableView.getSkin(); + } + } +}