diff --git a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TableViewSkinBase.java b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TableViewSkinBase.java --- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TableViewSkinBase.java +++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TableViewSkinBase.java @@ -937,11 +937,11 @@ case FOCUS_ITEM: { TableFocusModel fm = getFocusModel(); int focusedIndex = fm.getFocusedIndex(); - return flow.getCell(focusedIndex); + return flow.getPrivateCell(focusedIndex); } case CELL_AT_ROW_COLUMN: { int rowIndex = (Integer)parameters[0]; - return flow.getCell(rowIndex); + return flow.getPrivateCell(rowIndex); } case COLUMN_AT_INDEX: { int index = (Integer)parameters[0]; diff --git a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TreeTableViewSkin.java b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TreeTableViewSkin.java --- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TreeTableViewSkin.java +++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TreeTableViewSkin.java @@ -386,7 +386,10 @@ @Override public Object accGetAttribute(Attribute attribute, Object... parameters) { switch (attribute) { - // --- TableView-specific attributes + case ROW_AT_INDEX: { + final int rowIndex = (Integer)parameters[0]; + return rowIndex < 0 ? null : flow.getPrivateCell(rowIndex); + } case SELECTED_CELLS: { List selection = new ArrayList<>(); TreeTableView.TreeTableViewSelectionModel sm = getSkinnable().getSelectionModel(); @@ -397,38 +400,12 @@ return FXCollections.observableArrayList(selection); } - // TreeView-specific attributes - case TREE_ITEM_AT_INDEX: { - final int rowIndex = (Integer)parameters[0]; - return rowIndex < 0 ? null : flow.getCell(rowIndex); - } -// case CHILDREN: { -// return FXCollections.observableArrayList(flow.getCell(0)); -// } -// case ROW_AT_INDEX: { -// int rowIndex = (Integer)parameters[0]; -// return flow.getCell(rowIndex); -// } -// case SELECTED_ROWS: { -// MultipleSelectionModel sm = getSkinnable().getSelectionModel(); -// ObservableList indices = sm.getSelectedIndices(); -// List selection = new ArrayList<>(indices.size()); -// for (int i : indices) { -// TreeTableCell row = flow.getCell(i); -// -// // We should never, ever get row == null. If we do then -// // something is very wrong. -// assert row != null; -// -// if (row != null) selection.add(row); -// } -// return FXCollections.observableArrayList(selection); -// } - case FOCUS_ITEM: // TableViewSkinBase case CELL_AT_ROW_COLUMN: // TableViewSkinBase case COLUMN_AT_INDEX: // TableViewSkinBase case HEADER: // TableViewSkinBase + case VERTICAL_SCROLLBAR: // TableViewSkinBase + case HORIZONTAL_SCROLLBAR: // TableViewSkinBase default: return super.accGetAttribute(attribute, parameters); } } diff --git a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TreeViewSkin.java b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TreeViewSkin.java --- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TreeViewSkin.java +++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TreeViewSkin.java @@ -485,10 +485,6 @@ return flow.getPrivateCell(focusedIndex); } case ROW_AT_INDEX: { - /* Note: Using getVisibleCell() is safer than getCell() for this case. - * getCell() frequently recycles cells for hidden items which can cause - * next sibling traversal to infinite loop. - */ final int rowIndex = (Integer)parameters[0]; return rowIndex < 0 ? null : flow.getPrivateCell(rowIndex); } diff --git a/modules/controls/src/main/java/javafx/scene/control/TreeTableRow.java b/modules/controls/src/main/java/javafx/scene/control/TreeTableRow.java --- a/modules/controls/src/main/java/javafx/scene/control/TreeTableRow.java +++ b/modules/controls/src/main/java/javafx/scene/control/TreeTableRow.java @@ -528,42 +528,48 @@ /** @treatAsPrivate */ @Override public Object accGetAttribute(Attribute attribute, Object... parameters) { - TreeItem treeItem = getTreeItem(); - TreeTableView treeTableView = getTreeTableView(); + final TreeItem treeItem = getTreeItem(); + final TreeTableView treeTableView = getTreeTableView(); + final List> visibleColumns = treeTableView.getVisibleLeafColumns(); + + TreeTableColumn treeColumn = treeTableView.getTreeColumn(); + treeColumn = treeColumn != null ? treeColumn : + !visibleColumns.isEmpty() ? visibleColumns.get(0) : + null; switch (attribute) { case ROLE: return Role.TREE_TABLE_ITEM; case TREE_ITEM_PARENT: { + if (treeTableView == null) return null; if (treeItem == null) return null; - TreeItem parent = treeItem.getParent(); - return parent == null ? treeTableView : getTreeTableRow(getVirtualFlow(), parent); + TreeItem parent = treeItem.getParent(); + if (parent == null) return null; + int parentIndex = treeTableView.getRow(parent); + return treeTableView.accGetAttribute(Attribute.ROW_AT_INDEX, parentIndex); } case TREE_ITEM_COUNT: { - // response is relative to this tree cell - return treeItem == null ? 0 : - treeItem.isLeaf() ? 0 : - ! treeItem.isExpanded() ? 0 : - treeItem.getChildren().size(); + return treeItem == null ? 0 : treeItem.getChildren().size(); } - case TREE_ITEM_AT_INDEX: { - // index is relative to this tree cell - final int offset = (Integer)parameters[0]; - final int p = offset + getIndex(); - return treeItem == null ? null : - p > treeItem.getChildren().size() ? null : - getVirtualFlow().getCell(p); + case TREE_ITEM_AT_INDEX: + if (treeItem == null) return null; + int index = (Integer)parameters[0]; + if (index >= treeItem.getChildren().size()) return null; + TreeItem child = treeItem.getChildren().get(index); + if (child == null) return null; + int childIndex = treeTableView.getRow(child); + return treeTableView.accGetAttribute(Attribute.ROW_AT_INDEX, childIndex); + case TITLE: { + if (treeItem == null) return ""; + return treeColumn.getCellData(treeItem); } - case TITLE: { - Object value = treeItem == null ? null : treeItem.getValue(); - return value == null ? "" : value.toString(); - } + case ROW_INDEX: return getIndex(); + case COLUMN_INDEX: return visibleColumns.indexOf(treeColumn); case LEAF: return treeItem == null ? true : treeItem.isLeaf(); case EXPANDED: return treeItem == null ? false : treeItem.isExpanded(); case INDEX: return getIndex(); case SELECTED: return isSelected(); case DISCLOSURE_LEVEL: { - // FIXME replace with treeTableView.getTreeItemLevel(treeItem) when we sync up with 8u20 - return treeTableView == null ? 0 : TreeTableView.getNodeLevel(treeItem); + return treeTableView == null ? 0 : treeTableView.getTreeItemLevel(treeItem); } default: return super.accGetAttribute(attribute, parameters); } @@ -572,9 +578,18 @@ /** @treatAsPrivate */ @Override public void accExecuteAction(Action action, Object... parameters) { final TreeTableView treeTableView = getTreeTableView(); + final TreeItem treeItem = getTreeItem(); final TreeTableView.TreeTableViewSelectionModel sm = treeTableView == null ? null : treeTableView.getSelectionModel(); switch (action) { + case EXPAND: { + if (treeItem != null) treeItem.setExpanded(true); + break; + } + case COLLAPSE: { + if (treeItem != null) treeItem.setExpanded(false); + break; + } case SELECT: { if (sm != null) sm.clearAndSelect(getIndex()); break; @@ -590,53 +605,4 @@ default: super.accExecuteAction(action); } } - - // returns the TreeTableRow instances used to represent the children of the - // given TreeItem - private List getTreeItemChildren(TreeItem treeItem) { - List children = new ArrayList<>(); - final VirtualFlow> flow = getVirtualFlow(); - for (TreeItem childItem : treeItem.getChildren()) { - TreeTableRow row = getTreeTableRow(flow, childItem); - - // We should never, ever get row == null. If we do then - // something is very wrong. - assert row != null; - - // VirtualFlow should never return duplicates for different - // indices, but I did see this happening. I don't want to - // slow down normal use cases, but during development this - // should be tested for. - assert ! children.contains(row); - - if (row != null) children.add(row); - } - return children; - } - - private VirtualFlow getVirtualFlow() { - // FIXME Ugly hack! Clean this up once everything is understood - Parent p = getParent(); - while (p != null && ! (p instanceof VirtualFlow)) { - p = p.getParent(); - } - - if (p == null) { - return null; - } - - return (VirtualFlow) p; - } - - private TreeTableRow getTreeTableRow(VirtualFlow> flow, TreeItem treeItem) { - // FIXME Ugly hack! Clean this up once everything is understood - final int treeItemIndex = getTreeTableView().getRow(treeItem); - TreeTableRow cell = null; - - if (flow != null) { - cell = flow.getVisibleCell(treeItemIndex); - } - - return cell; - } } diff --git a/modules/controls/src/main/java/javafx/scene/control/TreeTableView.java b/modules/controls/src/main/java/javafx/scene/control/TreeTableView.java --- a/modules/controls/src/main/java/javafx/scene/control/TreeTableView.java +++ b/modules/controls/src/main/java/javafx/scene/control/TreeTableView.java @@ -857,7 +857,7 @@ */ public final ObjectProperty> treeColumnProperty() { if (treeColumn == null) { - treeColumn = new SimpleObjectProperty>(this, "treeColumn", null); + treeColumn = new SimpleObjectProperty<>(this, "treeColumn", null); } return treeColumn; } @@ -1857,9 +1857,8 @@ case TREE_ITEM_COUNT: case ROW_COUNT: return getExpandedItemCount(); + case COLUMN_COUNT: return getVisibleLeafColumns().size(); - // --- TableView-specific attributes - case COLUMN_COUNT: return getVisibleLeafColumns().size(); /* * TreeTableViewSkin returns TreeTableRows back to TreeTableView. * TreeTableRowSkin returns TreeTableCells back to TreeTableRow. @@ -1882,14 +1881,10 @@ MultipleSelectionModel sm = getSelectionModel(); return sm != null && sm.getSelectionMode() == SelectionMode.MULTIPLE; } + case COLUMN_INDEX: //Skin case HEADER: //Skin - - // --- TreeView-specific attributes case ROW_AT_INDEX: //Skin - case SELECTED_ROWS: //Skin - case TREE_ITEM_AT_INDEX: //Skin - case VERTICAL_SCROLLBAR: //Skin case HORIZONTAL_SCROLLBAR: // Skin diff --git a/modules/graphics/src/main/java/com/sun/glass/ui/win/WinAccessible.java b/modules/graphics/src/main/java/com/sun/glass/ui/win/WinAccessible.java --- a/modules/graphics/src/main/java/com/sun/glass/ui/win/WinAccessible.java +++ b/modules/graphics/src/main/java/com/sun/glass/ui/win/WinAccessible.java @@ -427,7 +427,6 @@ case TEXT_FIELD: case PASSWORD_FIELD: case TEXT_AREA: return UIA_TextControlTypeId; - case TREE_TABLE_VIEW: case TABLE_VIEW: return UIA_TableControlTypeId; case LIST_VIEW: return UIA_ListControlTypeId; case TREE_TABLE_CELL: @@ -438,6 +437,7 @@ case CHECKBOX: return UIA_CheckBoxControlTypeId; case COMBOBOX: return UIA_ComboBoxControlTypeId; case HYPERLINK: return UIA_HyperlinkControlTypeId; + case TREE_TABLE_VIEW: case TREE_VIEW: return UIA_TreeControlTypeId; case TREE_TABLE_ITEM: case TREE_ITEM: return UIA_TreeItemControlTypeId; @@ -1210,6 +1210,7 @@ case TABLE_ROW: case TABLE_CELL: return getContainer(Role.TABLE_VIEW); case LIST_ITEM: return getContainer(Role.LIST_VIEW); + case TREE_TABLE_ITEM: case TREE_TABLE_CELL: return getContainer(Role.TREE_TABLE_VIEW); default: } @@ -1223,8 +1224,9 @@ Role role = (Role) getAttribute(ROLE); if (role != null) { switch (role) { + case TREE_TABLE_ITEM: + case TREE_TABLE_CELL: case TABLE_ROW: - case TREE_TABLE_CELL: case TABLE_CELL: result = (Integer)getAttribute(ROW_INDEX); break; case LIST_ITEM: result = (Integer)getAttribute(INDEX); break; default: