changeset 4948:d208527888ed

Automated merge with ssh://jfxsrc.us.oracle.com//javafx/8.0/MASTER/jfx/rt
author David Grieve<david.grieve@oracle.com>
date Tue, 10 Sep 2013 10:20:20 -0400
parents 361d97db0d1c cc0cbc9a12e1
children 3c1652de9d60
files
diffstat 38 files changed, 705 insertions(+), 430 deletions(-) [+]
line wrap: on
line diff
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/AccordionSkin.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/AccordionSkin.java	Tue Sep 10 10:20:20 2013 -0400
@@ -238,6 +238,9 @@
                     expandedPane = getSkinnable().getExpandedPane();
                     getSkinnable().setExpandedPane(null);
                 }
+
+                // added to resolve RT-32787
+                previousHeight = 0;
             }
         };
     }
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ComboBoxListViewSkin.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ComboBoxListViewSkin.java	Tue Sep 10 10:20:20 2013 -0400
@@ -476,12 +476,8 @@
         } else {
             // run item through StringConverter if it isn't null
             StringConverter<T> c = comboBox.getConverter();
-            
-            // prompt text used to be displayed in the display text of a 
-            // non-editable node, but was removed as per RT-29284
-            String s = item == null ? /*comboBox.getPromptText()*/"" : (c == null ? item.toString() : c.toString(item));
+            String s = item == null ? comboBox.getPromptText() : (c == null ? item.toString() : c.toString(item));
             cell.setText(s);
-            
             cell.setGraphic(null);
             return s == null || s.isEmpty();
         }
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ProgressIndicatorSkin.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ProgressIndicatorSkin.java	Tue Sep 10 10:20:20 2013 -0400
@@ -528,64 +528,66 @@
         static final private Duration UNCLIPPED_DELAY = new Duration(0);
 
         private void rebuildTimeline() {
-            final ObservableList<KeyFrame> keyFrames = FXCollections.<KeyFrame>observableArrayList();
-            keyFrames.add(
-              new KeyFrame(
-                Duration.millis(0), new EventHandler<ActionEvent>() {
-                  @Override public void handle(ActionEvent event) {
-                      /**
-                       * Stop the animation if the ProgressBar is removed
-                       * from a Scene, or is invisible.
-                       * Pause the animation if it's outside of a clipped
-                       * region (e.g. not visible in a ScrollPane)
-                       */
-                      if (indeterminateTimeline != null) {
-                          stopIfInvisibleOrDisconnected();
-                          if (!isVisibleInClip()) {
-                              Platform.runLater(new Runnable() {
-                                @Override public void run() {
-                                    if (indeterminateTimeline != null) {
-                                        if (indeterminateTimeline.getDelay().compareTo(CLIPPED_DELAY) != 0) {
-                                            indeterminateTimeline.setDelay(CLIPPED_DELAY);
-                                        }
-                                        indeterminateTimeline.stop();
-                                        indeterminateTimeline.jumpTo(Duration.ZERO);
-                                        indeterminateTimeline.play();
-                                    }
-                                }
-                              });
-                          }
-                          else {
-                              Platform.runLater(new Runnable() {
-                                @Override public void run() {
-                                    if (indeterminateTimeline != null) {
-                                        if (indeterminateTimeline.getDelay().compareTo(UNCLIPPED_DELAY) != 0) {
-                                            indeterminateTimeline.setDelay(UNCLIPPED_DELAY);
+            if (indeterminateTimeline != null) {
+                final ObservableList<KeyFrame> keyFrames = FXCollections.<KeyFrame>observableArrayList();
+                keyFrames.add(
+                  new KeyFrame(
+                    Duration.millis(0), new EventHandler<ActionEvent>() {
+                      @Override public void handle(ActionEvent event) {
+                          /**
+                           * Stop the animation if the ProgressBar is removed
+                           * from a Scene, or is invisible.
+                           * Pause the animation if it's outside of a clipped
+                           * region (e.g. not visible in a ScrollPane)
+                           */
+                          if (indeterminateTimeline != null) {
+                              stopIfInvisibleOrDisconnected();
+                              if (!isVisibleInClip()) {
+                                  Platform.runLater(new Runnable() {
+                                    @Override public void run() {
+                                        if (indeterminateTimeline != null) {
+                                            if (indeterminateTimeline.getDelay().compareTo(CLIPPED_DELAY) != 0) {
+                                                indeterminateTimeline.setDelay(CLIPPED_DELAY);
+                                            }
+                                            indeterminateTimeline.stop();
+                                            indeterminateTimeline.jumpTo(Duration.ZERO);
+                                            indeterminateTimeline.play();
                                         }
                                     }
-                                }
-                              });
+                                  });
+                              }
+                              else {
+                                  Platform.runLater(new Runnable() {
+                                    @Override public void run() {
+                                        if (indeterminateTimeline != null) {
+                                            if (indeterminateTimeline.getDelay().compareTo(UNCLIPPED_DELAY) != 0) {
+                                                indeterminateTimeline.setDelay(UNCLIPPED_DELAY);
+                                            }
+                                        }
+                                    }
+                                  });
+                              }
                           }
                       }
-                  }
-                }));
-            if(spinEnabled) {
-                keyFrames.add(new KeyFrame(Duration.millis(1), new KeyValue(pathsG.rotateProperty(), 360)));
-                keyFrames.add(new KeyFrame(Duration.millis(3900), new KeyValue(pathsG.rotateProperty(), 0)));
+                    }));
+                if(spinEnabled) {
+                    keyFrames.add(new KeyFrame(Duration.millis(1), new KeyValue(pathsG.rotateProperty(), 360)));
+                    keyFrames.add(new KeyFrame(Duration.millis(3900), new KeyValue(pathsG.rotateProperty(), 0)));
+                }
+
+                for (int i = 100; i <= 3900; i += 100) {
+                    keyFrames.add(
+                            new KeyFrame(
+                                    Duration.millis(i), new EventHandler<ActionEvent>() {
+                                @Override public void handle(ActionEvent event) {
+                                    shiftColors();
+                                }
+                            }));
+                }
+                indeterminateTimeline.stop();
+                indeterminateTimeline.getKeyFrames().setAll(keyFrames);
+                indeterminateTimeline.playFromStart();
             }
-
-            for (int i = 100; i <= 3900; i += 100) {
-                keyFrames.add(
-                        new KeyFrame(
-                                Duration.millis(i), new EventHandler<ActionEvent>() {
-                            @Override public void handle(ActionEvent event) {
-                                shiftColors();
-                            }
-                        }));
-            }
-            indeterminateTimeline.stop();
-            indeterminateTimeline.getKeyFrames().setAll(keyFrames);
-            indeterminateTimeline.playFromStart();
         }
 
         private void pauseIndicator(boolean pause) {
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ScrollBarSkin.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ScrollBarSkin.java	Tue Sep 10 10:20:20 2013 -0400
@@ -329,9 +329,11 @@
         super.handleControlPropertyChanged(p);
         if ("ORIENTATION".equals(p)) {
             getSkinnable().requestLayout();
-        } else if ("MIN".equals(p) || "MAX".equals(p) || "VALUE".equals(p) || "VISIBLE_AMOUNT".equals(p)) {
+        } else if ("MIN".equals(p) || "MAX".equals(p) || "VISIBLE_AMOUNT".equals(p)) {
             positionThumb();
             getSkinnable().requestLayout();
+        } else if ("VALUE".equals(p)) {
+            positionThumb();
         }
     }
 
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ScrollPaneSkin.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ScrollPaneSkin.java	Tue Sep 10 10:20:20 2013 -0400
@@ -150,9 +150,15 @@
                     (scrollNode.getLayoutBounds().getHeight() != 0.0 && nodeHeight != scrollNode.getLayoutBounds().getHeight())) {
                     getSkinnable().requestLayout();
                 } else {
-                    // otherwise just update scrollbars based on new scrollNode size
-                    updateVerticalSB();
-                    updateHorizontalSB();
+                    /**
+                     * we just need to update scrollbars based on new scrollNode size,
+                     * but we don't do this while dragging, there's no need,
+                     * and it jumps, as dragging updates the scrollbar too.
+                     */
+                    if (!dragDetected) {
+                        updateVerticalSB();
+                        updateHorizontalSB();
+                    }
                 }
             }
         }
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/VirtualFlow.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/VirtualFlow.java	Tue Sep 10 10:20:20 2013 -0400
@@ -1586,7 +1586,7 @@
         }
 
         if (pile.size() > 0) {
-            accumCell = pile.get(0);
+            return pile.get(0);
         }
 
         // We need to use the accumCell and return that
--- a/modules/controls/src/main/java/javafx/scene/control/Labeled.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/Labeled.java	Tue Sep 10 10:20:20 2013 -0400
@@ -468,7 +468,9 @@
                         }
                         if (url != null) {
                             final Image img = StyleManager.getInstance().getCachedImage(url.toExternalForm());
-                            ((StyleableProperty)graphicProperty()).applyStyle(origin, new ImageView(img));
+                            if (img != null) {
+                                ((StyleableProperty)graphicProperty()).applyStyle(origin, new ImageView(img));
+                            }
                         }
                     }
                 }
--- a/modules/controls/src/main/java/javafx/scene/control/TableCell.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/TableCell.java	Tue Sep 10 10:20:20 2013 -0400
@@ -542,9 +542,11 @@
         final int index = getIndex();
         final boolean isEmpty = isEmpty();
         final T oldValue = getItem();
+
+        final boolean indexExceedsItemCount = index >= itemCount;
         
         // there is a whole heap of reasons why we should just punt...
-        if (index >= itemCount ||
+        if (indexExceedsItemCount ||
                 index < 0 || 
                 columnIndex < 0 ||
                 !isVisible() ||
@@ -557,7 +559,12 @@
             // refer to Ensemble8PopUpTree.png - in this case the arrows are being
             // shown as the new cells are instantiated with the arrows in the
             // children list, and are only hidden in updateItem.
-            if ((!isEmpty && oldValue != null) || isFirstRun) {
+            // RT-32621: There are circumstances where we need to updateItem,
+            // even when the index is greater than the itemCount. For example,
+            // RT-32621 identifies issues where a TreeTableView collapses a
+            // TreeItem but the custom cells remain visible. This is now
+            // resolved with the check for indexExceedsItemCount.
+            if ((!isEmpty && oldValue != null) || isFirstRun || indexExceedsItemCount) {
                 updateItem(null, true);
                 isFirstRun = false;
             }
--- a/modules/controls/src/main/java/javafx/scene/control/TableColumnBase.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/TableColumnBase.java	Tue Sep 10 10:20:20 2013 -0400
@@ -76,7 +76,7 @@
  *      right-clicks the column header area
  *    <li>Have the contents of the table be sorted (using 
  *      {@link #comparatorProperty() comparator}, {@link #sortable sortable} and
- *      {@link #sortTypeProperty() sortType})
+ *      sortType).
  * </ul>
  * </p>
  * 
@@ -222,9 +222,13 @@
     // --- Parent Column
     /**
      * This read-only property will always refer to the parent of this column,
-     * in the situation where nested columns are being used. To create a nested
-     * column is simply a matter of placing TableColumnBase instances inside the
-     * {@link #columns} ObservableList of a TableColumnBase.
+     * in the situation where nested columns are being used.
+     *
+     * <p>In the currently existing subclasses, to create a nested
+     * column is simply a matter of placing the relevant TableColumnBase instances
+     * inside the columns ObservableList (for example, see
+     * {@link javafx.scene.control.TableColumn#getColumns()} and
+     * {@link javafx.scene.control.TreeTableColumn#getColumns()}.
      */
     private ReadOnlyObjectWrapper<TableColumnBase<S,?>> parentColumn;
     void setParentColumn(TableColumnBase<S,?> value) { parentColumnPropertyImpl().set(value); }
@@ -265,7 +269,6 @@
      * The id of this TableColumnBase. This simple string identifier is useful 
      * for finding a specific TableColumnBase within a UI control that uses 
      * TableColumnBase instances. The default value is {@code null}.
-     * @since JavaFX 2.2
      */
     private StringProperty id;
     public final void setId(String value) { idProperty().set(value); }
@@ -288,7 +291,6 @@
      * <p>
      * Parsing this style might not be supported on some limited
      * platforms. It is recommended to use a standalone CSS file instead.
-     * @since JavaFX 2.2
      */
     private StringProperty style;
     public final void setStyle(String value) { styleProperty().set(value); }
@@ -310,7 +312,6 @@
      * each element of the list is a style class to which this Node belongs.
      *
      * @see <a href="http://www.w3.org/TR/css3-selectors/#class-html">CSS3 class selectors</a>
-     * @since JavaFX 2.2
      */
     @Override public ObservableList<String> getStyleClass() {
         return styleClass;
@@ -321,7 +322,6 @@
     /**
      * <p>The graphic to show in the table column to allow the user to
      * indicate graphically what is in the column. </p>
-     * @since JavaFX 2.2
      */
     private ObjectProperty<Node> graphic;
     public final void setGraphic(Node value) {
@@ -353,8 +353,6 @@
      * on screen to indicate whether the table column is part of the sort order, 
      * and if so, whether the sort is ascending or descending, and what position in 
      * the sort order it is in.
-     * 
-     * @since JavaFX 2.2
      */
     private ObjectProperty<Node> sortNode = new SimpleObjectProperty<Node>(this, "sortNode");
     public final void setSortNode(Node value) { sortNodeProperty().set(value); }
@@ -597,7 +595,6 @@
       *
       * @return an observable map of properties on this table column for use 
       * primarily by application developers
-     * @since JavaFX 2.2
      */
     public final ObservableMap<Object, Object> getProperties() {
         if (properties == null) {
@@ -609,7 +606,6 @@
     /**
      * Tests if this table column has properties.
      * @return true if node has properties.
-     * @since JavaFX 2.2
      */
     public boolean hasProperties() {
         return properties != null && ! properties.isEmpty();
@@ -625,7 +621,6 @@
      *
      * @param value The value to be stored - this can later be retrieved by calling
      *          {@link TableColumnBase#getUserData()}.
-     * @since JavaFX 2.2
      */
     public void setUserData(Object value) {
         getProperties().put(USER_DATA_KEY, value);
@@ -637,7 +632,6 @@
      *
      * @return The Object that was previously set, or null if no property
      *          has been set or if null was set.
-     * @since JavaFX 2.2
      */
     public Object getUserData() {
         return getProperties().get(USER_DATA_KEY);
--- a/modules/controls/src/main/java/javafx/scene/control/TreeTableCell.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/TreeTableCell.java	Tue Sep 10 10:20:20 2013 -0400
@@ -533,9 +533,11 @@
         final int index = getIndex();
         final boolean isEmpty = isEmpty();
         final T oldValue = getItem();
+
+        final boolean indexExceedsItemCount = index >= itemCount;
         
         // there is a whole heap of reasons why we should just punt...
-        if (index >= itemCount ||
+        if (indexExceedsItemCount ||
                 index < 0 || 
                 columnIndex < 0 ||
                 !isVisible() ||
@@ -549,7 +551,12 @@
             // refer to Ensemble8PopUpTree.png - in this case the arrows are being
             // shown as the new cells are instantiated with the arrows in the
             // children list, and are only hidden in updateItem.
-            if ((!isEmpty && oldValue != null) || isFirstRun) {
+            // RT-32621: There are circumstances where we need to updateItem,
+            // even when the index is greater than the itemCount. For example,
+            // RT-32621 identifies issues where a TreeTableView collapses a
+            // TreeItem but the custom cells remain visible. This is now
+            // resolved with the check for indexExceedsItemCount.
+            if ((!isEmpty && oldValue != null) || isFirstRun || indexExceedsItemCount) {
                 updateItem(null, true);
                 isFirstRun = false;
             }
--- a/modules/controls/src/main/java/javafx/scene/control/TreeTableView.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/TreeTableView.java	Tue Sep 10 10:20:20 2013 -0400
@@ -950,115 +950,6 @@
         return editingCell;
     }
 
-    
-    // --- On Edit Start
-    private ObjectProperty<EventHandler<TreeTableView.EditEvent<S>>> onEditStart;
-
-    /**
-     * Sets the {@link EventHandler} that will be called when the user begins
-     * an edit. 
-     */
-    public final void setOnEditStart(EventHandler<TreeTableView.EditEvent<S>> value) {
-        onEditStartProperty().set(value);
-    }
-
-    /**
-     * Returns the {@link EventHandler} that will be called when the user begins
-     * an edit.
-     */
-    public final EventHandler<TreeTableView.EditEvent<S>> getOnEditStart() {
-        return onEditStart == null ? null : onEditStart.get();
-    }
-
-    /**
-     * This event handler will be fired when the user successfully initiates
-     * editing.
-     */
-    public final ObjectProperty<EventHandler<TreeTableView.EditEvent<S>>> onEditStartProperty() {
-        if (onEditStart == null) {
-            onEditStart = new SimpleObjectProperty<EventHandler<TreeTableView.EditEvent<S>>>(this, "onEditStart") {
-                @Override protected void invalidated() {
-                    setEventHandler(TreeTableView.<S>editStartEvent(), get());
-                }
-            };
-        }
-        return onEditStart;
-    }
-
-
-    // --- On Edit Commit
-    private ObjectProperty<EventHandler<TreeTableView.EditEvent<S>>> onEditCommit;
-
-    /**
-     * Sets the {@link EventHandler} that will be called when the user commits
-     * an edit. 
-     */
-    public final void setOnEditCommit(EventHandler<TreeTableView.EditEvent<S>> value) {
-        onEditCommitProperty().set(value);
-    }
-
-    /**
-     * Returns the {@link EventHandler} that will be called when the user commits
-     * an edit.
-     */
-    public final EventHandler<TreeTableView.EditEvent<S>> getOnEditCommit() {
-        return onEditCommit == null ? null : onEditCommit.get();
-    }
-
-    /**
-     * <p>This property is used when the user performs an action that should
-     * result in their editing input being persisted.</p>
-     *
-     * <p>The EventHandler in this property should not be called directly - 
-     * instead call {@link TreeCell#commitEdit(java.lang.Object)} from within
-     * your custom TreeCell. This will handle firing this event, updating the 
-     * view, and switching out of the editing state.</p>
-     */
-    public final ObjectProperty<EventHandler<TreeTableView.EditEvent<S>>> onEditCommitProperty() {
-        if (onEditCommit == null) {
-            onEditCommit = new SimpleObjectProperty<EventHandler<TreeTableView.EditEvent<S>>>(this, "onEditCommit") {
-                @Override protected void invalidated() {
-                    setEventHandler(TreeTableView.<S>editCommitEvent(), get());
-                }
-            };
-        }
-        return onEditCommit;
-    }
-
-
-    // --- On Edit Cancel
-    private ObjectProperty<EventHandler<TreeTableView.EditEvent<S>>> onEditCancel;
-
-    /**
-     * Sets the {@link EventHandler} that will be called when the user cancels
-     * an edit.
-     */
-    public final void setOnEditCancel(EventHandler<TreeTableView.EditEvent<S>> value) {
-        onEditCancelProperty().set(value);
-    }
-
-    /**
-     * Returns the {@link EventHandler} that will be called when the user cancels
-     * an edit.
-     */
-    public final EventHandler<TreeTableView.EditEvent<S>> getOnEditCancel() {
-        return onEditCancel == null ? null : onEditCancel.get();
-    }
-
-    /**
-     * This event handler will be fired when the user cancels editing a cell.
-     */
-    public final ObjectProperty<EventHandler<TreeTableView.EditEvent<S>>> onEditCancelProperty() {
-        if (onEditCancel == null) {
-            onEditCancel = new SimpleObjectProperty<EventHandler<TreeTableView.EditEvent<S>>>(this, "onEditCancel") {
-                @Override protected void invalidated() {
-                    setEventHandler(TreeTableView.<S>editCancelEvent(), get());
-                }
-            };
-        }
-        return onEditCancel;
-    }
-    
 
     // --- Table menu button visible
     private BooleanProperty tableMenuButtonVisible;
--- a/modules/controls/src/main/java/javafx/scene/control/cell/ProgressBarTableCell.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/cell/ProgressBarTableCell.java	Tue Sep 10 10:20:20 2013 -0400
@@ -91,6 +91,7 @@
         this.getStyleClass().add("progress-bar-table-cell");
         
         this.progressBar = new ProgressBar();
+        this.progressBar.setMaxWidth(Double.MAX_VALUE);
     }
     
     
@@ -109,8 +110,10 @@
             setGraphic(null);
         } else {
             progressBar.progressProperty().unbind();
-            
-            observable = getTableColumn().getCellObservableValue(getIndex());
+
+            final TableColumn<S,Double> column = getTableColumn();
+            observable = column == null ? null : column.getCellObservableValue(getIndex());
+
             if (observable != null) {
                 progressBar.progressProperty().bind(observable);
             } else if (item != null) {
--- a/modules/controls/src/main/java/javafx/scene/control/cell/ProgressBarTreeTableCell.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/cell/ProgressBarTreeTableCell.java	Tue Sep 10 10:20:20 2013 -0400
@@ -27,6 +27,7 @@
 
 import javafx.beans.value.ObservableValue;
 import javafx.scene.control.ProgressBar;
+import javafx.scene.control.TableColumn;
 import javafx.scene.control.TreeTableCell;
 import javafx.scene.control.TreeTableColumn;
 import javafx.util.Callback;
@@ -91,6 +92,7 @@
         this.getStyleClass().add("progress-bar-tree-table-cell");
         
         this.progressBar = new ProgressBar();
+        this.progressBar.setMaxWidth(Double.MAX_VALUE);
     }
     
     
@@ -110,7 +112,9 @@
         } else {
             progressBar.progressProperty().unbind();
             
-            observable = getTableColumn().getCellObservableValue(getIndex());
+            final TreeTableColumn<S,Double> column = getTableColumn();
+            observable = column == null ? null : column.getCellObservableValue(getIndex());
+
             if (observable != null) {
                 progressBar.progressProperty().bind(observable);
             } else if (item != null) {
--- a/modules/controls/src/main/java/javafx/scene/control/cell/TextFieldTreeCell.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/cell/TextFieldTreeCell.java	Tue Sep 10 10:20:20 2013 -0400
@@ -216,8 +216,6 @@
     /** {@inheritDoc} */
     @Override public void updateItem(T item, boolean empty) {
         super.updateItem(item, empty);
-        
-        TreeItem<T> treeItem = getTreeItem();
         CellUtils.updateItem(this, getConverter(), hbox, getTreeItemGraphic(), textField);
     }
     
--- a/modules/controls/src/main/java/javafx/scene/control/cell/TextFieldTreeTableCell.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/cell/TextFieldTreeTableCell.java	Tue Sep 10 10:20:20 2013 -0400
@@ -56,7 +56,7 @@
     /**
      * Provides a {@link TextField} that allows editing of the cell content when
      * the cell is double-clicked, or when 
-     * {@link TableView#edit(int, javafx.scene.control.TreeTableColumn)} is called. 
+     * {@link javafx.scene.control.TreeTableView#edit(int, javafx.scene.control.TreeTableColumn)} is called.
      * This method will only  work on {@link TreeTableColumn} instances which are of
      * type String.
      * 
@@ -71,7 +71,7 @@
     /**
      * Provides a {@link TextField} that allows editing of the cell content when
      * the cell is double-clicked, or when 
-     * {@link TableView#edit(int, javafx.scene.control.TreeTableColumn) } is called. 
+     * {@link javafx.scene.control.TreeTableView#edit(int, javafx.scene.control.TreeTableColumn) } is called.
      * This method will work  on any {@link TreeTableColumn} instance, regardless of 
      * its generic type. However, to enable this, a {@link StringConverter} must 
      * be provided that will convert the given String (from what the user typed 
--- a/modules/controls/src/test/java/com/sun/javafx/scene/control/infrastructure/MouseEventFirer.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/test/java/com/sun/javafx/scene/control/infrastructure/MouseEventFirer.java	Tue Sep 10 10:20:20 2013 -0400
@@ -51,6 +51,11 @@
         fireMouseEvent(MouseEvent.MOUSE_PRESSED, modifiers);
         fireMouseEvent(MouseEvent.MOUSE_RELEASED, modifiers);
     }
+
+    public void fireMousePressAndRelease(int clickCount, KeyModifier... modifiers) {
+        fireMouseEvent(MouseEvent.MOUSE_PRESSED, MouseButton.PRIMARY, clickCount, 0, 0, modifiers);
+        fireMouseEvent(MouseEvent.MOUSE_RELEASED, MouseButton.PRIMARY, clickCount, 0, 0, modifiers);
+    }
     
     public void fireMouseClicked() {
         fireMouseEvent(MouseEvent.MOUSE_CLICKED);
@@ -83,6 +88,10 @@
     public void fireMousePressed(double deltaX, double deltaY, KeyModifier... modifiers) {
         fireMouseEvent(MouseEvent.MOUSE_PRESSED, deltaX, deltaY, modifiers);
     }
+
+    public void fireMousePressed(int clickCount, double deltaX, double deltaY, KeyModifier... modifiers) {
+        fireMouseEvent(MouseEvent.MOUSE_PRESSED, MouseButton.PRIMARY, clickCount, deltaX, deltaY, modifiers);
+    }
     
     public void fireMouseReleased() {
         fireMouseEvent(MouseEvent.MOUSE_RELEASED);
--- a/modules/controls/src/test/java/com/sun/javafx/scene/control/infrastructure/VirtualFlowTestUtils.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/test/java/com/sun/javafx/scene/control/infrastructure/VirtualFlowTestUtils.java	Tue Sep 10 10:20:20 2013 -0400
@@ -51,12 +51,20 @@
     }
 
     public static void clickOnRow(final Control control, int row, KeyModifier... modifiers) {
-        clickOnRow(control, row, false, modifiers);
+        clickOnRow(control, row, 1, false, modifiers);
+    }
+
+    public static void clickOnRow(final Control control, int row, int clickCount, KeyModifier... modifiers) {
+        clickOnRow(control, row, clickCount, false, modifiers);
+    }
+
+    public static void clickOnRow(final Control control, int row, boolean ignoreChildren, KeyModifier... modifiers) {
+        clickOnRow(control, row, 1, ignoreChildren, modifiers);
     }
 
     // ignore children allows clicking on the row, rather than a child in that row.
     // This is good for testing, for example, TableRowBehavior
-    public static void clickOnRow(final Control control, int row, boolean ignoreChildren, KeyModifier... modifiers) {
+    public static void clickOnRow(final Control control, int row, int clickCount, boolean ignoreChildren, KeyModifier... modifiers) {
         IndexedCell cell = VirtualFlowTestUtils.getCell(control, row);
 
         if (! ignoreChildren && ((cell instanceof TableRow) || (cell instanceof TreeTableRow))) {
@@ -65,7 +73,7 @@
                     continue;
                 }
                 IndexedCell<?> childCell = (IndexedCell<?>)n;
-                new MouseEventFirer(childCell).fireMousePressAndRelease(modifiers);
+                new MouseEventFirer(childCell).fireMousePressAndRelease(clickCount, modifiers);
                 break;
             }
         } else {
@@ -76,7 +84,7 @@
                 mef.fireMousePressed(cell.getWidth(), cell.getHeight() / 2.0, modifiers);
                 mef.fireMouseReleased(cell.getWidth(), cell.getHeight() / 2.0, modifiers);
             } else {
-                new MouseEventFirer(cell).fireMousePressAndRelease(modifiers);
+                new MouseEventFirer(cell).fireMousePressAndRelease(clickCount, modifiers);
             }
         }
     }
--- a/modules/controls/src/test/java/javafx/scene/control/ListViewKeyInputTest.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/test/java/javafx/scene/control/ListViewKeyInputTest.java	Tue Sep 10 10:20:20 2013 -0400
@@ -1167,7 +1167,7 @@
         assertEquals(2, rt31577_count);
     }
 
-    @Ignore @Test public void test_rt32383_pageDown() {
+    @Test public void test_rt32383_pageDown() {
         // this test requires a lot of data
         listView.getItems().clear();
         for (int i = 0; i < 100; i++) {
@@ -1180,19 +1180,19 @@
 
         final String initialFocusOwner = fm.getFocusedItem();
 
-        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final String newFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, newFocusOwner);
 
-        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final String nextFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, nextFocusOwner);
         assertNotSame(newFocusOwner, nextFocusOwner);
     }
 
-    @Ignore @Test public void test_rt32383_pageUp() {
+    @Test public void test_rt32383_pageUp() {
         // this test requires a lot of data
         listView.getItems().clear();
         for (int i = 0; i < 100; i++) {
@@ -1214,12 +1214,12 @@
 
         final String initialFocusOwner = fm.getFocusedItem();
 
-        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final String newFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, newFocusOwner);
 
-        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final String nextFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, nextFocusOwner);
--- a/modules/controls/src/test/java/javafx/scene/control/TableViewKeyInputTest.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/test/java/javafx/scene/control/TableViewKeyInputTest.java	Tue Sep 10 10:20:20 2013 -0400
@@ -1906,7 +1906,7 @@
         assertEquals(2, rt31577_count);
     }
 
-    @Ignore @Test public void test_rt32383_pageDown() {
+    @Test public void test_rt32383_pageDown() {
         // this test requires a lot of data
         tableView.getItems().clear();
         for (int i = 0; i < 100; i++) {
@@ -1919,19 +1919,19 @@
 
         final String initialFocusOwner = fm.getFocusedItem();
 
-        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final String newFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, newFocusOwner);
 
-        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final String nextFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, nextFocusOwner);
         assertNotSame(newFocusOwner, nextFocusOwner);
     }
 
-    @Ignore @Test public void test_rt32383_pageUp() {
+    @Test public void test_rt32383_pageUp() {
         // this test requires a lot of data
         tableView.getItems().clear();
         for (int i = 0; i < 100; i++) {
@@ -1950,12 +1950,12 @@
 
         final String initialFocusOwner = fm.getFocusedItem();
 
-        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final String newFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, newFocusOwner);
 
-        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final String nextFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, nextFocusOwner);
--- a/modules/controls/src/test/java/javafx/scene/control/TreeTableCellTest.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/test/java/javafx/scene/control/TreeTableCellTest.java	Tue Sep 10 10:20:20 2013 -0400
@@ -277,20 +277,20 @@
         assertEquals(apples, tree.getEditingCell().getTreeItem());
     }
 
-    @Ignore // TODO file bug!
-    @Test public void editCellFiresEventOnTree() {
-        tree.setEditable(true);
-        cell.updateTreeTableView(tree);
-        cell.updateIndex(2);
-        final boolean[] called = new boolean[] { false };
-        tree.setOnEditStart(new EventHandler<TreeTableView.EditEvent<String>>() {
-            @Override public void handle(TreeTableView.EditEvent<String> event) {
-                called[0] = true;
-            }
-        });
-        cell.startEdit();
-        assertTrue(called[0]);
-    }
+//    @Ignore // TODO file bug!
+//    @Test public void editCellFiresEventOnTree() {
+//        tree.setEditable(true);
+//        cell.updateTreeTableView(tree);
+//        cell.updateIndex(2);
+//        final boolean[] called = new boolean[] { false };
+//        tree.setOnEditStart(new EventHandler<TreeTableView.EditEvent<String>>() {
+//            @Override public void handle(TreeTableView.EditEvent<String> event) {
+//                called[0] = true;
+//            }
+//        });
+//        cell.startEdit();
+//        assertTrue(called[0]);
+//    }
 
     // commitEdit()
     @Test public void commitWhenTreeIsNullIsOK() {
@@ -310,21 +310,21 @@
         assertEquals("Watermelon", tree.getRoot().getChildren().get(0).getValue());
     }
 
-    @Ignore // TODO file bug!
-    @Test public void commitSendsEventToTree() {
-        tree.setEditable(true);
-        cell.updateTreeTableView(tree);
-        cell.updateIndex(1);
-        cell.startEdit();
-        final boolean[] called = new boolean[] { false };
-        tree.setOnEditCommit(new EventHandler<TreeTableView.EditEvent<String>>() {
-            @Override public void handle(TreeTableView.EditEvent<String> event) {
-                called[0] = true;
-            }
-        });
-        cell.commitEdit("Watermelon");
-        assertTrue(called[0]);
-    }
+//    @Ignore // TODO file bug!
+//    @Test public void commitSendsEventToTree() {
+//        tree.setEditable(true);
+//        cell.updateTreeTableView(tree);
+//        cell.updateIndex(1);
+//        cell.startEdit();
+//        final boolean[] called = new boolean[] { false };
+//        tree.setOnEditCommit(new EventHandler<TreeTableView.EditEvent<String>>() {
+//            @Override public void handle(TreeTableView.EditEvent<String> event) {
+//                called[0] = true;
+//            }
+//        });
+//        cell.commitEdit("Watermelon");
+//        assertTrue(called[0]);
+//    }
 
     @Test public void afterCommitTreeTableViewEditingCellIsNull() {
         tree.setEditable(true);
@@ -344,21 +344,21 @@
         cell.cancelEdit();
     }
 
-    @Ignore // TODO file bug!
-    @Test public void cancelEditFiresChangeEvent() {
-        tree.setEditable(true);
-        cell.updateTreeTableView(tree);
-        cell.updateIndex(1);
-        cell.startEdit();
-        final boolean[] called = new boolean[] { false };
-        tree.setOnEditCancel(new EventHandler<TreeTableView.EditEvent<String>>() {
-            @Override public void handle(TreeTableView.EditEvent<String> event) {
-                called[0] = true;
-            }
-        });
-        cell.cancelEdit();
-        assertTrue(called[0]);
-    }
+//    @Ignore // TODO file bug!
+//    @Test public void cancelEditFiresChangeEvent() {
+//        tree.setEditable(true);
+//        cell.updateTreeTableView(tree);
+//        cell.updateIndex(1);
+//        cell.startEdit();
+//        final boolean[] called = new boolean[] { false };
+//        tree.setOnEditCancel(new EventHandler<TreeTableView.EditEvent<String>>() {
+//            @Override public void handle(TreeTableView.EditEvent<String> event) {
+//                called[0] = true;
+//            }
+//        });
+//        cell.cancelEdit();
+//        assertTrue(called[0]);
+//    }
 
     @Test public void cancelSetsTreeTableViewEditingIndexToNegativeOne() {
         tree.setEditable(true);
--- a/modules/controls/src/test/java/javafx/scene/control/TreeTableRowTest.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/test/java/javafx/scene/control/TreeTableRowTest.java	Tue Sep 10 10:20:20 2013 -0400
@@ -590,19 +590,19 @@
         assertEquals(apples, tree.getEditingCell().getTreeItem());
     }
 
-    @Test public void editCellFiresEventOnTree() {
-        tree.setEditable(true);
-        cell.updateTreeTableView(tree);
-        cell.updateIndex(2);
-        final boolean[] called = new boolean[] { false };
-        tree.setOnEditStart(new EventHandler<TreeTableView.EditEvent<String>>() {
-            @Override public void handle(TreeTableView.EditEvent<String> event) {
-                called[0] = true;
-            }
-        });
-        cell.startEdit();
-        assertTrue(called[0]);
-    }
+//    @Test public void editCellFiresEventOnTree() {
+//        tree.setEditable(true);
+//        cell.updateTreeTableView(tree);
+//        cell.updateIndex(2);
+//        final boolean[] called = new boolean[] { false };
+//        tree.setOnEditStart(new EventHandler<TreeTableView.EditEvent<String>>() {
+//            @Override public void handle(TreeTableView.EditEvent<String> event) {
+//                called[0] = true;
+//            }
+//        });
+//        cell.startEdit();
+//        assertTrue(called[0]);
+//    }
 
     // commitEdit()
     @Test public void commitWhenTreeIsNullIsOK() {
@@ -620,20 +620,20 @@
         assertEquals("Watermelon", tree.getRoot().getChildren().get(0).getValue());
     }
 
-    @Test public void commitSendsEventToTree() {
-        tree.setEditable(true);
-        cell.updateTreeTableView(tree);
-        cell.updateIndex(1);
-        cell.startEdit();
-        final boolean[] called = new boolean[] { false };
-        tree.setOnEditCommit(new EventHandler<TreeTableView.EditEvent<String>>() {
-            @Override public void handle(TreeTableView.EditEvent<String> event) {
-                called[0] = true;
-            }
-        });
-        cell.commitEdit("Watermelon");
-        assertTrue(called[0]);
-    }
+//    @Test public void commitSendsEventToTree() {
+//        tree.setEditable(true);
+//        cell.updateTreeTableView(tree);
+//        cell.updateIndex(1);
+//        cell.startEdit();
+//        final boolean[] called = new boolean[] { false };
+//        tree.setOnEditCommit(new EventHandler<TreeTableView.EditEvent<String>>() {
+//            @Override public void handle(TreeTableView.EditEvent<String> event) {
+//                called[0] = true;
+//            }
+//        });
+//        cell.commitEdit("Watermelon");
+//        assertTrue(called[0]);
+//    }
 
     @Test public void afterCommitTreeTableViewEditingCellIsNull() {
         tree.setEditable(true);
@@ -652,20 +652,20 @@
         cell.cancelEdit();
     }
 
-    @Test public void cancelEditFiresChangeEvent() {
-        tree.setEditable(true);
-        cell.updateTreeTableView(tree);
-        cell.updateIndex(1);
-        cell.startEdit();
-        final boolean[] called = new boolean[] { false };
-        tree.setOnEditCancel(new EventHandler<TreeTableView.EditEvent<String>>() {
-            @Override public void handle(TreeTableView.EditEvent<String> event) {
-                called[0] = true;
-            }
-        });
-        cell.cancelEdit();
-        assertTrue(called[0]);
-    }
+//    @Test public void cancelEditFiresChangeEvent() {
+//        tree.setEditable(true);
+//        cell.updateTreeTableView(tree);
+//        cell.updateIndex(1);
+//        cell.startEdit();
+//        final boolean[] called = new boolean[] { false };
+//        tree.setOnEditCancel(new EventHandler<TreeTableView.EditEvent<String>>() {
+//            @Override public void handle(TreeTableView.EditEvent<String> event) {
+//                called[0] = true;
+//            }
+//        });
+//        cell.cancelEdit();
+//        assertTrue(called[0]);
+//    }
 
     @Test public void cancelSetsTreeTableViewEditingCellIsNull() {
         tree.setEditable(true);
--- a/modules/controls/src/test/java/javafx/scene/control/TreeTableViewKeyInputTest.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/test/java/javafx/scene/control/TreeTableViewKeyInputTest.java	Tue Sep 10 10:20:20 2013 -0400
@@ -2422,7 +2422,7 @@
         assertEquals(2, rt31577_count);
     }
 
-    @Ignore @Test public void test_rt32383_pageDown() {
+    @Test public void test_rt32383_pageDown() {
         // this test requires a lot of data
         for (int i = 0; i < 100; i++) {
             root.getChildren().add(new TreeItem<String>("Row " + i));
@@ -2434,19 +2434,19 @@
 
         final TreeItem<String> initialFocusOwner = fm.getFocusedItem();
 
-        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final TreeItem<String> newFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, newFocusOwner);
 
-        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final TreeItem<String> nextFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, nextFocusOwner);
         assertNotSame(newFocusOwner, nextFocusOwner);
     }
 
-    @Ignore @Test public void test_rt32383_pageUp() {
+    @Test public void test_rt32383_pageUp() {
         // this test requires a lot of data
         for (int i = 0; i < 100; i++) {
             root.getChildren().add(new TreeItem<String>("Row " + i));
@@ -2464,12 +2464,12 @@
 
         final TreeItem<String> initialFocusOwner = fm.getFocusedItem();
 
-        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final TreeItem<String> newFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, newFocusOwner);
 
-        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final TreeItem<String> nextFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, nextFocusOwner);
--- a/modules/controls/src/test/java/javafx/scene/control/TreeViewKeyInputTest.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/test/java/javafx/scene/control/TreeViewKeyInputTest.java	Tue Sep 10 10:20:20 2013 -0400
@@ -29,6 +29,7 @@
 import javafx.beans.InvalidationListener;
 import javafx.beans.Observable;
 import javafx.collections.FXCollections;
+import javafx.event.Event;
 import javafx.event.EventHandler;
 import javafx.scene.input.KeyCode;
 import java.util.List;
@@ -1370,7 +1371,7 @@
         assertEquals(2, rt31577_count);
     }
 
-    @Ignore @Test public void test_rt32383_pageDown() {
+    @Test public void test_rt32383_pageDown() {
         // this test requires a lot of data
         for (int i = 0; i < 100; i++) {
             root.getChildren().add(new TreeItem<String>("Row " + i));
@@ -1382,19 +1383,19 @@
 
         final TreeItem<String> initialFocusOwner = fm.getFocusedItem();
 
-        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final TreeItem<String> newFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, newFocusOwner);
 
-        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_DOWN, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final TreeItem<String> nextFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, nextFocusOwner);
         assertNotSame(newFocusOwner, nextFocusOwner);
     }
 
-    @Ignore @Test public void test_rt32383_pageUp() {
+    @Test public void test_rt32383_pageUp() {
         // this test requires a lot of data
         for (int i = 0; i < 100; i++) {
             root.getChildren().add(new TreeItem<String>("Row " + i));
@@ -1412,12 +1413,12 @@
 
         final TreeItem<String> initialFocusOwner = fm.getFocusedItem();
 
-        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final TreeItem<String> newFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, newFocusOwner);
 
-        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.CTRL);
+        keyboard.doKeyPress(KeyCode.PAGE_UP, KeyModifier.getShortcutKey());
         Toolkit.getToolkit().firePulse();
         final TreeItem<String> nextFocusOwner = fm.getFocusedItem();
         assertNotSame(initialFocusOwner, nextFocusOwner);
@@ -1491,4 +1492,71 @@
         assertNotSame(initialSelectionOwner, nextSelectionOwner);
         assertNotSame(newSelectionOwner, nextSelectionOwner);
     }
+
+    private int rt32783_count_start = 0;
+    private int rt32783_count_commit = 0;
+    private int rt32783_count_cancel = 0;
+    private int rt32783_count = 0;
+    @Test public void test_rt32683() {
+        // set up test
+        final int items = 8;
+        TreeItem<String> newRoot = new TreeItem<>("New root");
+        newRoot.setExpanded(false);
+        for (int i = 0; i < items; i++) {
+            newRoot.getChildren().add(new TreeItem<>("Row " + i));
+        }
+
+        treeView.setRoot(newRoot);
+        treeView.setEditable(true);
+        treeView.setOnEditStart(new EventHandler() {
+            @Override public void handle(Event t) {
+                rt32783_count_start++;
+            }
+        });
+
+        treeView.setOnEditCommit(new EventHandler() {
+            @Override public void handle(Event t) {
+                rt32783_count_commit++;
+            }
+        });
+
+        treeView.setOnEditCancel(new EventHandler() {
+            @Override public void handle(Event t) {
+                rt32783_count_cancel++;
+            }
+        });
+
+        treeView.editingItemProperty().addListener(new InvalidationListener() {
+            @Override
+            public void invalidated(Observable observable) {
+                assertNotNull(treeView.getEditingItem());
+                System.out.println("editing item: " + treeView.getEditingItem());
+                rt32783_count++;
+            }
+        });
+
+        // start test
+//        final int middleIndex = items / 2;
+
+        newRoot.setExpanded(true);
+        Toolkit.getToolkit().firePulse();
+        newRoot.setExpanded(false);
+        Toolkit.getToolkit().firePulse();
+
+        final MultipleSelectionModel sm = treeView.getSelectionModel();
+        sm.clearAndSelect(0);
+
+        // need to get the cell before the editing starts
+//        TreeCell cell = (TreeCell)VirtualFlowTestUtils.getCell(treeView, 0);
+
+        // this forces the selected cell to go into editing mode
+        keyboard.doKeyPress(KeyCode.F2);
+//        Toolkit.getToolkit().firePulse();
+
+        assertEquals(1, rt32783_count_start);
+        assertEquals(0, rt32783_count_commit);
+        assertEquals(0, rt32783_count_cancel);
+//        assertTrue(cell.isEditing());
+        assertEquals(newRoot, treeView.getEditingItem());
+    }
 }
--- a/modules/controls/src/test/java/javafx/scene/control/TreeViewTest.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/test/java/javafx/scene/control/TreeViewTest.java	Tue Sep 10 10:20:20 2013 -0400
@@ -718,7 +718,6 @@
         VirtualFlowTestUtils.assertRowsEmpty(tree, 3, -1); // rows 3+ should be empty
     }
 
-    @Ignore("Test has started failing - I have reopened the jira issue")
     @Test public void test_rt28556() {
         List<Employee> employees = Arrays.<Employee>asList(
             new Employee("Ethan Williams", "Sales Department"),
--- a/modules/controls/src/test/java/javafx/scene/control/cell/ProgressBarTableCellTest.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/test/java/javafx/scene/control/cell/ProgressBarTableCellTest.java	Tue Sep 10 10:20:20 2013 -0400
@@ -140,8 +140,21 @@
         assertNotNull(cell.getGraphic());
         assertTrue(cell.getGraphic() instanceof ProgressBar);
     }
-    
 
+
+
+    /**************************************************************************
+     *
+     * misc tests
+     *
+     **************************************************************************/
+
+    @Test public void test_graphicMaxWidthIsDoubleMaxValue() {
+        ProgressBarTableCell<Object> cell = new ProgressBarTableCell<>();
+        cell.updateItem(0.5, false);
+        assertNotNull(cell.getGraphic());
+        assertEquals(Double.MAX_VALUE, ((ProgressBar)cell.getGraphic()).getMaxWidth(), 0.0);
+    }
     
 //    /**************************************************************************
 //     * 
--- a/modules/controls/src/test/java/javafx/scene/control/cell/ProgressBarTreeTableCellTest.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/controls/src/test/java/javafx/scene/control/cell/ProgressBarTreeTableCellTest.java	Tue Sep 10 10:20:20 2013 -0400
@@ -141,9 +141,24 @@
         assertNotNull(cell.getGraphic());
         assertTrue(cell.getGraphic() instanceof ProgressBar);
     }
-    
 
-    
+
+
+    /**************************************************************************
+     *
+     * misc tests
+     *
+     **************************************************************************/
+
+    @Test public void test_graphicMaxWidthIsDoubleMaxValue() {
+        ProgressBarTreeTableCell<Object> cell = new ProgressBarTreeTableCell<>();
+        cell.updateItem(0.5, false);
+        assertNotNull(cell.getGraphic());
+        assertEquals(Double.MAX_VALUE, ((ProgressBar)cell.getGraphic()).getMaxWidth(), 0.0);
+    }
+
+
+
 //    /**************************************************************************
 //     * 
 //     * test checkbox selection state is bound
--- a/modules/graphics/src/main/docs/javafx/scene/doc-files/cssref.html	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/graphics/src/main/docs/javafx/scene/doc-files/cssref.html	Tue Sep 10 10:20:20 2013 -0400
@@ -963,7 +963,7 @@
       <a href="#typesize" class="typelink">&lt;size&gt;</a>[,
       <a href="#typeboolean" class="typelink">&lt;boolean&gt;</a>]?]?)</p>
     <p>The parameters, in order, are:<br>
-    <p style="margin-left: 40px;">  
+    <p style="margin-left: 40px;">
     <span class="grammar"><a href="#typestring" class="typelink">&lt;string&gt;</a></span>
       The URL of the image.<br>
       <span class="grammar"><a href="#typesize" class="typelink">&lt;size&gt;</a></span>
@@ -977,8 +977,8 @@
       <span class="grammar"><a href="#typeboolean" class="typelink">&lt;boolean&gt;</a></span>
       The proportional flag which indicates whether start and end locations are proportional or absolute<br>
     </p>
-    <p>For a full explanation of the parameters, refer to the 
-        <a href="../paint/ImagePattern.html" class="typelink">ImagePattern</a> javadoc.</p>    
+    <p>For a full explanation of the parameters, refer to the
+        <a href="../paint/ImagePattern.html" class="typelink">ImagePattern</a> javadoc.</p>
     <p>Following are examples of the use of image-pattern:</p>
     <p class="example">image-pattern("images/Duke.png")</p>
     <p class="example">image-pattern("images/Duke.png", 20%, 20%, 80%, 80%)</p>
@@ -2674,7 +2674,7 @@
           <td class="propertyname">-fx-min-height, -fx-pref-height, -fx-max-height</td>
           <td class="value"><a href="#typenumber" class="typelink">&lt;number&gt;</a></td>
           <td class="default">-1</td>
-          <td>Percentage values are not useful since the actual value would be 
+          <td>Percentage values are not useful since the actual value would be
               computed from the width and/or height of the Regions's parent before
               the parent is laid out.</td>
         </tr>
@@ -2682,7 +2682,7 @@
           <td class="propertyname">-fx-min-width, -fx-pref-width, -fx-max-width</td>
           <td class="value"><a href="#typenumber" class="typelink">&lt;number&gt;</a></td>
           <td class="default">-1</td>
-          <td>Percentage values are not useful since the actual value would be 
+          <td>Percentage values are not useful since the actual value would be
               computed from the width and/or height of the Region's parent before
               the parent is laid out.</td>
         </tr>
@@ -4298,6 +4298,18 @@
           <td>&nbsp;</td>
         </tr>
         <tr>
+            <td class="propertyname">-fx-open-tab-animation</td>
+            <td class="value">[ grow | none ]</td>
+            <td>grow</td>
+            <td>&#39;none&#39; disables Tab opening animation</td>
+        </tr>
+        <tr>
+            <td class="propertyname">-fx-close-tab-animation</td>
+            <td class="value">[ grow | none ]</td>
+            <td>grow</td>
+            <td>&#39;none&#39; disables Tab closing animation</td>
+        </tr>
+        <tr>
           <td colspan="4" class="parents">Also has all properties of <a href="#control">Control</a></td>
         </tr>
       </tbody>
--- a/modules/graphics/src/main/java/com/sun/javafx/css/StyleManager.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/css/StyleManager.java	Tue Sep 10 10:20:20 2013 -0400
@@ -25,6 +25,8 @@
 
 package com.sun.javafx.css;
 
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
 import javafx.css.Styleable;
 import java.io.FileNotFoundException;
 import java.io.FilePermission;
@@ -672,26 +674,42 @@
 
     public Image getCachedImage(String url) {
 
-        Image image = imageCache.get(url);
-        if (image == null) {
+        Image image = null;
+        if (imageCache.containsKey(url)) {
+
+            image = imageCache.get(url);
+
+        } else {
 
             try {
 
                 image = new Image(url);
+
+                // RT-31865
+                if (image.isError()) {
+
+                    final PlatformLogger logger = getLogger();
+                    if (logger != null && logger.isLoggable(Level.WARNING)) {
+                        logger.warning("Error loading image: " + url);
+                    }
+
+                    image = null;
+                }
+
                 imageCache.put(url, image);
 
             } catch (IllegalArgumentException iae) {
                 // url was empty!
                 final PlatformLogger logger = getLogger();
                 if (logger != null && logger.isLoggable(Level.WARNING)) {
-                        LOGGER.warning(iae.getLocalizedMessage());
+                    logger.warning(iae.getLocalizedMessage());
                 }
 
             } catch (NullPointerException npe) {
                 // url was null!
                 final PlatformLogger logger = getLogger();
                 if (logger != null && logger.isLoggable(Level.WARNING)) {
-                        LOGGER.warning(npe.getLocalizedMessage());
+                    logger.warning(npe.getLocalizedMessage());
                 }
             }
         }
--- a/modules/graphics/src/main/java/com/sun/javafx/css/converters/CursorConverter.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/css/converters/CursorConverter.java	Tue Sep 10 10:20:20 2013 -0400
@@ -48,12 +48,24 @@
 
     @Override
     public Cursor convert(ParsedValue<String, Cursor> value, Font not_used) {
+
         // the parser doesn't covert cusor, so convert it from the raw value
         String string = value.getValue();
-        if (string.startsWith("Cursor.")) {
-            string = string.substring("Cursor.".length());
+
+        if (string != null) {
+
+            int index = string.indexOf("Cursor.");
+            if (index > -1) {
+                string = string.substring(index+"Cursor.".length());
+            }
+            string = string.replace('-','_').toUpperCase();
         }
-        return Cursor.cursor(string);
+
+        try {
+            return Cursor.cursor(string);
+        } catch (IllegalArgumentException | NullPointerException exception) {
+            return Cursor.DEFAULT;
+        }
     }
 
     @Override
--- a/modules/graphics/src/main/java/com/sun/javafx/css/parser/CSSParser.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/css/parser/CSSParser.java	Tue Sep 10 10:20:20 2013 -0400
@@ -135,11 +135,6 @@
     private Styleable  sourceOfInlineStyle;
 
     // source is a file
-//    private void setInputSource(String url) {
-//        setInputSource(url, null);
-//    }
-
-    // source is a file
     private void setInputSource(String url, String str) {
         stylesheetAsText = str;
         sourceOfStylesheet = url;
@@ -244,7 +239,7 @@
         final String path = url != null ? url.toExternalForm() : null;
         final Stylesheet stylesheet = new Stylesheet(path);
         if (url != null) {
-            setInputSource(path);
+            setInputSource(path, null);
             Reader reader = new BufferedReader(new InputStreamReader(url.openStream()));
             parse(stylesheet, reader);
         }
--- a/modules/graphics/src/main/java/javafx/scene/CssStyleHelper.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/graphics/src/main/java/javafx/scene/CssStyleHelper.java	Tue Sep 10 10:20:20 2013 -0400
@@ -1704,40 +1704,48 @@
         }
 
         CascadingStyle fontSize = getStyle(styleable, property.concat("-size"), styleMap, states);
-        // don't look past current node for font size if user set the font
-        // or if we're looking up the font for font cache.
-        if (fontSize == null && origin != StyleOrigin.USER) {
-            fontSize = lookupInheritedFont(styleable, property.concat("-size"), styleMap, distance);
+        if (fontSize != null) {
+            // if we have a font shorthand and it is more specific than font-size, then don't use the font-size style
+            if (fontShorthand != null && fontShorthand.compareTo(fontSize) < 0) {
+                fontSize = null;
+            }
+
+        } else if (origin != StyleOrigin.USER) {
+            //
+            // If we don't have a font-size, see if there is an inherited font-size.
+            // If lookupInheritedFontProperty returns other than null, then we know that font-size is closer (more specific)
+            // than the font shorthand
+            //
+            fontSize = lookupInheritedFontProperty(styleable, property.concat("-size"), styleMap, distance, fontShorthand);
         }
 
-        // font-size must be closer and more specific than font shorthand
         if (fontSize != null) {
 
-            if (fontShorthand == null || fontShorthand.compareTo(fontSize) >= 0) {
+            // The logic above ensures that, if fontSize is not null, then it is either
+            // 1) a style matching this node and is more specific than the font shorthand or
+            // 2) an inherited style that is more specific than the font shorthand
+            // and, therefore, we can use the fontSize style
+            final CalculatedValue cv =
+                    calculateValue(fontSize, styleable, dummyFontProperty,
+                            styleMap, states, styleable, cvFont, styleList);
 
-                final CalculatedValue cv =
-                        calculateValue(fontSize, styleable, dummyFontProperty,
-                                styleMap, states, styleable, cvFont, styleList);
+            if (cv.getValue() instanceof Double) {
+                if (origin == null || origin.compareTo(fontSize.getOrigin()) <= 0) {
 
-                if (cv.getValue() instanceof Double) {
-                    if (origin == null || origin.compareTo(fontSize.getOrigin()) <= 0) {
+                    origin = cv.getOrigin();
+                }
+                size = ((Double) cv.getValue()).doubleValue();
 
-                        origin = cv.getOrigin();
-                    }
-                    size = ((Double) cv.getValue()).doubleValue();
-
-                    if (cvFont != null) {
-                        boolean isRelative = cvFont.isRelative() || cv.isRelative();
-                        Font font = deriveFont((Font) cvFont.getValue(), family, weight, posture, size);
-                        cvFont = new CalculatedValue(font, origin, isRelative);
-                    } else {
-                        boolean isRelative = cv.isRelative();
-                        Font font = deriveFont(Font.getDefault(), family, weight, posture, size);
-                        cvFont = new CalculatedValue(font, origin, isRelative);
-                    }
-                    foundStyle = true;
+                if (cvFont != null) {
+                    boolean isRelative = cvFont.isRelative() || cv.isRelative();
+                    Font font = deriveFont((Font) cvFont.getValue(), family, weight, posture, size);
+                    cvFont = new CalculatedValue(font, origin, isRelative);
+                } else {
+                    boolean isRelative = cv.isRelative();
+                    Font font = deriveFont(Font.getDefault(), family, weight, posture, size);
+                    cvFont = new CalculatedValue(font, origin, isRelative);
                 }
-
+                foundStyle = true;
             }
 
         }
@@ -1749,76 +1757,112 @@
         }
 
         CascadingStyle fontWeight = getStyle(styleable, property.concat("-weight"), styleMap, states);
-        // don't look past current node for font weight if user set the font
-        if (fontWeight == null && origin != StyleOrigin.USER) {
-            fontWeight = lookupInheritedFont(styleable,property.concat("-weight"), styleMap, distance);
+        if (fontWeight != null) {
+            // if we have a font shorthand and it is more specific than font-weight, then don't use the font-weight style
+            if (fontShorthand != null && fontShorthand.compareTo(fontWeight) < 0) {
+                fontWeight = null;
+            }
+
+        } else if (origin != StyleOrigin.USER) {
+            //
+            // If we don't have a font-weight, see if there is an inherited font-weight.
+            // If lookupInheritedFontProperty returns other than null, then we know that font-weight is closer (more specific)
+            // than the font shorthand
+            //
+            fontWeight = lookupInheritedFontProperty(styleable, property.concat("-weight"), styleMap, distance, fontShorthand);
         }
 
         if (fontWeight != null) {
 
-            if (fontShorthand == null || fontShorthand.compareTo(fontWeight) >= 0) {
+            // The logic above ensures that, if fontWeight is not null, then it is either
+            // 1) a style matching this node and is more specific than the font shorthand or
+            // 2) an inherited style that is more specific than the font shorthand
+            // and, therefore, we can use the fontWeight style
 
-                final CalculatedValue cv =
-                        calculateValue(fontWeight, styleable, dummyFontProperty,
-                                styleMap, states, styleable, null, null);
+            final CalculatedValue cv =
+                    calculateValue(fontWeight, styleable, dummyFontProperty,
+                            styleMap, states, styleable, null, null);
 
-                if (cv.getValue() instanceof FontWeight) {
-                    if (origin == null || origin.compareTo(fontWeight.getOrigin()) <= 0) {
-                        origin = cv.getOrigin();
-                    }
-                    weight = (FontWeight)cv.getValue();
-                    foundStyle = true;
+            if (cv.getValue() instanceof FontWeight) {
+                if (origin == null || origin.compareTo(fontWeight.getOrigin()) <= 0) {
+                    origin = cv.getOrigin();
                 }
+                weight = (FontWeight)cv.getValue();
+                foundStyle = true;
+            }
+        }
+
+
+        CascadingStyle fontStyle = getStyle(styleable, property.concat("-style"), styleMap, states);
+        if (fontStyle != null) {
+            // if we have a font shorthand and it is more specific than font-style, then don't use the font-style style
+            if (fontShorthand != null && fontShorthand.compareTo(fontStyle) < 0) {
+                fontStyle = null;
+            }
+
+        } else if (origin != StyleOrigin.USER) {
+            //
+            // If we don't have a font-style, see if there is an inherited font-style.
+            // If lookupInheritedFontProperty returns other than null, then we know that font-style is closer (more specific)
+            // than the font shorthand
+            //
+            fontStyle = lookupInheritedFontProperty(styleable, property.concat("-style"), styleMap, distance, fontShorthand);
+        }
+
+        if (fontStyle != null) {
+
+            // The logic above ensures that, if fontStyle is not null, then it is either
+            // 1) a style matching this node and is more specific than the font shorthand or
+            // 2) an inherited style that is more specific than the font shorthand
+            // and, therefore, we can use the fontStyle style
+
+            final CalculatedValue cv =
+                    calculateValue(fontStyle, styleable, dummyFontProperty,
+                            styleMap, states, styleable, null, null);
+
+            if (cv.getValue() instanceof FontPosture) {
+                if (origin == null || origin.compareTo(fontStyle.getOrigin()) <= 0) {
+                    origin = cv.getOrigin();
+                }
+                posture = (FontPosture)cv.getValue();
+                foundStyle = true;
             }
 
         }
 
-        CascadingStyle fontStyle = getStyle(styleable, property.concat("-style"), styleMap, states);
-        // don't look past current node for font style if user set the font
-        if (fontStyle == null && origin != StyleOrigin.USER) {
-            fontStyle = lookupInheritedFont(styleable, property.concat("-style"), styleMap, distance);
-        }
+        CascadingStyle fontFamily = getStyle(styleable, property.concat("-family"), styleMap, states);
+        if (fontFamily != null) {
+            // if we have a font shorthand and it is more specific than font-family, then don't use the font-family style
+            if (fontShorthand != null && fontShorthand.compareTo(fontFamily) < 0) {
+                fontFamily = null;
+            }
 
-        if (fontStyle != null) {
-
-            if (fontShorthand == null || fontShorthand.compareTo(fontStyle) >= 0) {
-
-                final CalculatedValue cv =
-                        calculateValue(fontStyle, styleable, dummyFontProperty,
-                                styleMap, states, styleable, null, null);
-
-                if (cv.getValue() instanceof FontPosture) {
-                    if (origin == null || origin.compareTo(fontStyle.getOrigin()) <= 0) {
-                        origin = cv.getOrigin();
-                    }
-                    posture = (FontPosture)cv.getValue();
-                    foundStyle = true;
-                }
-
-            }
-        }
-
-        CascadingStyle fontFamily = getStyle(styleable, property.concat("-family"), styleMap, states);
-        // don't look past current node for font family if user set the font
-        if (fontFamily == null && origin != StyleOrigin.USER) {
-            fontFamily = lookupInheritedFont(styleable,property.concat("-family"), styleMap, distance);
+        } else if (origin != StyleOrigin.USER) {
+            //
+            // If we don't have a font-family, see if there is an inherited font-family.
+            // If lookupInheritedFontProperty returns other than null, then we know that font-family is closer (more specific)
+            // than the font shorthand
+            //
+            fontFamily = lookupInheritedFontProperty(styleable, property.concat("-family"), styleMap, distance, fontShorthand);
         }
 
         if (fontFamily != null) {
 
-            if (fontShorthand == null || fontShorthand.compareTo(fontFamily) >= 0) {
+            // The logic above ensures that, if fontFamily is not null, then it is either
+            // 1) a style matching this node and is more specific than the font shorthand or
+            // 2) an inherited style that is more specific than the font shorthand
+            // and, therefore, we can use the fontFamily style
 
-                final CalculatedValue cv =
-                        calculateValue(fontFamily, styleable, dummyFontProperty,
-                                styleMap, states, styleable, null, null);
+            final CalculatedValue cv =
+                    calculateValue(fontFamily, styleable, dummyFontProperty,
+                            styleMap, states, styleable, null, null);
 
-                if (cv.getValue() instanceof String) {
-                    if (origin == null || origin.compareTo(fontFamily.getOrigin()) <= 0) {
-                        origin = cv.getOrigin();
-                    }
-                    family = (String)cv.getValue();
-                    foundStyle = true;
+            if (cv.getValue() instanceof String) {
+                if (origin == null || origin.compareTo(fontFamily.getOrigin()) <= 0) {
+                    origin = cv.getOrigin();
                 }
+                family = (String)cv.getValue();
+                foundStyle = true;
             }
 
         }
@@ -1834,14 +1878,12 @@
         return SKIP;
     }
 
-    /**
-     * Called when we must getInheritedStyle a value from a parent node in the scenegraph.
-     */
-    private CascadingStyle lookupInheritedFont(
+    private CascadingStyle lookupInheritedFontProperty(
             final Styleable styleable,
             final String property,
             final StyleMap styleMap,
-            final int distance) {
+            final int distance,
+            CascadingStyle fontShorthand) {
 
         Styleable parent = styleable != null ? styleable.getStyleableParent() : null;
 
@@ -1859,6 +1901,14 @@
 
                 if (cascadingStyle != null) {
 
+                    // If we are closer to the node than the font shorthand, then font shorthand doesn't matter.
+                    // If the font shorthand and this style are the same distance, then we need to compare.
+                    if (fontShorthand != null && nlooks == 0) {
+                        if (fontShorthand.compareTo(cascadingStyle) < 0) {
+                            return null;
+                        }
+                    }
+
                     final ParsedValueImpl cssValue = cascadingStyle.getParsedValueImpl();
 
                     if ("inherit".equals(cssValue.getValue()) == false) {
--- a/modules/graphics/src/main/java/javafx/scene/Node.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/graphics/src/main/java/javafx/scene/Node.java	Tue Sep 10 10:20:20 2013 -0400
@@ -8669,21 +8669,34 @@
             return;
         }
 
+        if (cssFlag == CssFlags.RECALCULATE) {
+            // TODO: re-evalutate handling of CssFlags.RECALCULATE - see below
+            cssFlag = CssFlags.REAPPLY;
+        }
+
         if (cssFlag == CssFlags.REAPPLY) {
 
+            // RT-24621 - If this node's parent's cssFlag is REAPPLY, then CSS should be applied to the parent first,
+            // otherwise the styles this node uses will be incomplete (missing lookups, missing inherited styles, etc).
+            // find the top-most parent whose flag is REAPPLY and start from there, if there is one.
+            Parent _parent = getParent();
+            if(_parent != null && _parent.cssFlag == this.cssFlag) {
+                // TODO: danger of infinite loop here!
+                _parent.impl_processCSS();
+            }
+
             // Match new styles if my own indicates I need to reapply
             styleHelper = CssStyleHelper.createStyleHelper(this);
 
-        } else if (cssFlag == CssFlags.RECALCULATE) {
-
-            // Recalculate means that the in-line style has changed.
-
-            // Note: recalculate used to do something different than reapply,
-            // but the way calculated values are cached has changed.
-            // TODO: re-evalutate handling of CssFlags.RECALCULATE
-            cssFlag = CssFlags.REAPPLY;
-            styleHelper = CssStyleHelper.createStyleHelper(this);
-
+//        } else if (cssFlag == CssFlags.RECALCULATE) {
+//
+//            // Recalculate means that the in-line style has changed.
+//
+//            // Note: recalculate used to do something different than reapply,
+//            // but the way calculated values are cached has changed.
+//            cssFlag = CssFlags.REAPPLY;
+//            styleHelper = CssStyleHelper.createStyleHelper(this);
+//
         }
 
         final CssFlags flag = cssFlag;
--- a/modules/graphics/src/main/java/javafx/scene/layout/Background.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/graphics/src/main/java/javafx/scene/layout/Background.java	Tue Sep 10 10:20:20 2013 -0400
@@ -506,12 +506,16 @@
         for (BackgroundImage bi : images) {
             if (bi.opaque == null) {
                 // If the image is not yet loaded, just skip it
-                final com.sun.prism.Image platformImage = (com.sun.prism.Image) acc.getImageProperty(bi.image).get();
+                // Note: Unit test wants this to be com.sun.javafx.tk.PlatformImage, not com.sun.prism.Image
+                final com.sun.javafx.tk.PlatformImage platformImage = acc.getImageProperty(bi.image).get();
                 if (platformImage == null) continue;
 
                 // The image has been loaded, so update the opaque flag
-                assert platformImage != null;
-                bi.opaque = platformImage.isOpaque();
+                if (platformImage instanceof com.sun.prism.Image) {
+                    bi.opaque = ((com.sun.prism.Image)platformImage).isOpaque();
+                } else {
+                    continue;
+                }
             }
 
             // At this point we know that we're processing an image which has already been resolved
--- a/modules/graphics/src/main/java/javafx/scene/layout/BackgroundConverter.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/graphics/src/main/java/javafx/scene/layout/BackgroundConverter.java	Tue Sep 10 10:20:20 2013 -0400
@@ -109,6 +109,8 @@
                 if (imageUrls[i] == null) continue;
 
                 final Image image = StyleManager.getInstance().getCachedImage(imageUrls[i]);
+                if (image == null) continue;
+
                 final RepeatStruct repeat = (repeats.length > 0) ?
                         repeats[i <= lastRepeatIndex ? i : lastRepeatIndex] : null; // min
                 final BackgroundPosition position = (positions.length > 0) ?
--- a/modules/graphics/src/test/java/com/sun/javafx/css/CursorTypeTest.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/graphics/src/test/java/com/sun/javafx/css/CursorTypeTest.java	Tue Sep 10 10:20:20 2013 -0400
@@ -25,7 +25,7 @@
 
 package com.sun.javafx.css;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 import javafx.css.ParsedValue;
 import javafx.scene.Cursor;
 import javafx.scene.text.Font;
@@ -52,4 +52,67 @@
         assertEquals(expResult, result);
     }
 
+    @Test
+    public void testConvert_with_hyphen() {
+        ParsedValue<String,Cursor> value = new ParsedValueImpl<String,Cursor>("open-hand", CursorConverter.getInstance());
+        Font font = null;
+        Cursor expResult = Cursor.OPEN_HAND;
+        Cursor result = value.convert(font);
+        assertEquals(expResult, result);
+    }
+
+    @Test
+    public void testConvert_with_Cursor_dot() {
+        ParsedValue<String,Cursor> value = new ParsedValueImpl<String,Cursor>("Cursor.open-hand", CursorConverter.getInstance());
+        Font font = null;
+        Cursor expResult = Cursor.OPEN_HAND;
+        Cursor result = value.convert(font);
+        assertEquals(expResult, result);
+    }
+
+    @Test
+    public void testConvert_with_package_name() {
+        ParsedValue<String,Cursor> value = new ParsedValueImpl<String,Cursor>("javafx.scene.Cursor.open-hand", CursorConverter.getInstance());
+        Font font = null;
+        Cursor expResult = Cursor.OPEN_HAND;
+        Cursor result = value.convert(font);
+        assertEquals(expResult, result);
+    }
+
+    @Test
+    public void testConvert_with_package_name_only() {
+        ParsedValue<String,Cursor> value = new ParsedValueImpl<String,Cursor>("javafx.scene.Cursor.", CursorConverter.getInstance());
+        Font font = null;
+        Cursor expResult = Cursor.DEFAULT;
+        Cursor result = value.convert(font);
+        assertEquals(expResult, result);
+    }
+
+    @Test
+    public void testConvert_with_empty_string() {
+        ParsedValue<String,Cursor> value = new ParsedValueImpl<String,Cursor>("", CursorConverter.getInstance());
+        Font font = null;
+        Cursor expResult = Cursor.DEFAULT;
+        Cursor result = value.convert(font);
+        assertEquals(expResult, result);
+    }
+
+    @Test
+    public void testConvert_with_null() {
+        ParsedValue<String,Cursor> value = new ParsedValueImpl<String,Cursor>(null, CursorConverter.getInstance());
+        Font font = null;
+        Cursor expResult = Cursor.DEFAULT;
+        Cursor result = value.convert(font);
+        assertEquals(expResult, result);
+    }
+
+    @Test
+    public void testConvert_with_bogus_value() {
+        ParsedValue<String,Cursor> value = new ParsedValueImpl<String,Cursor>("bogus", CursorConverter.getInstance());
+        Font font = null;
+        Cursor expResult = Cursor.DEFAULT;
+        Cursor result = value.convert(font);
+        assertEquals(expResult, result);
+    }
+
 }
--- a/modules/graphics/src/test/java/com/sun/javafx/css/FontTypeTest.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/graphics/src/test/java/com/sun/javafx/css/FontTypeTest.java	Tue Sep 10 10:20:20 2013 -0400
@@ -261,5 +261,23 @@
 
     }
 
+    @Test public void testRT_29773() {
 
+        Text txt = new Text("testRT_29773");
+        txt.setId("test-rt-29773");
+
+        Group g = new Group();
+
+        Scene scene  = new Scene(g);
+        scene.getStylesheets().add(FontTypeTest.class.getResource("HonorDeveloperSettingsTest_AUTHOR.css").toExternalForm());
+        g.getChildren().add(txt);
+
+        g.impl_processCSS(true);
+
+        Font f = txt.getFont();
+        // should get size and amble from .root, 'italic' from #test-rt-32551, bold from inline.
+        assertEquals("Amble Condensed", f.getName());
+        assertEquals(20, f.getSize(),0);
+
+    }
 }
--- a/modules/graphics/src/test/java/javafx/scene/layout/RegionCSSTest.java	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/graphics/src/test/java/javafx/scene/layout/RegionCSSTest.java	Tue Sep 10 10:20:20 2013 -0400
@@ -25,6 +25,10 @@
 
 package javafx.scene.layout;
 
+import com.sun.javafx.pgstub.StubImageLoaderFactory;
+import com.sun.javafx.pgstub.StubPlatformImageInfo;
+import com.sun.javafx.pgstub.StubToolkit;
+import com.sun.javafx.tk.Toolkit;
 import javafx.geometry.Insets;
 import javafx.geometry.Side;
 import javafx.scene.Scene;
@@ -33,6 +37,11 @@
 import org.junit.Ignore;
 import org.junit.Test;
 
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+
 import static javafx.scene.layout.BackgroundSize.*;
 import static org.junit.Assert.*;
 
@@ -59,10 +68,60 @@
     private void processCSS() {
         scene.getRoot().impl_processCSS(true);
     }
+
+    private static void installImage(final String str) {
+
+        if (str == null || str.trim().isEmpty()) return;
+
+        URL imageUrl = null;
+
+        try {
+
+            URI uri =  new URI(str.trim());
+
+            // if url doesn't have a scheme
+            if (uri.isAbsolute() == false) {
+
+                final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+                final String path = uri.getPath();
+
+                URL resource = null;
+
+                if (path.startsWith("/")) {
+                    resource = contextClassLoader.getResource(path.substring(1));
+                } else {
+                    resource = contextClassLoader.getResource(path);
+                }
+
+                imageUrl = resource;
+
+            } else {
+                // else, url does have a scheme
+                imageUrl = uri.toURL();
+            }
+
+        } catch (MalformedURLException malf) {
+
+        } catch (URISyntaxException urise) {
+        }
+
+        if (imageUrl != null) {
+
+            StubImageLoaderFactory imageLoaderFactory =
+                    ((StubToolkit) Toolkit.getToolkit()).getImageLoaderFactory();
+
+            imageLoaderFactory.registerImage(
+                    imageUrl.toExternalForm(), new StubPlatformImageInfo(100, 100));
+        }
+
+    }
     
     @Before public void setUp() {
         region = new Region();
         scene = new Scene(region);
+
+        installImage("javafx/scene/layout/red.png");
+        installImage("javafx/scene/layout/center-btn.png");
     }
 
     /**************************************************************************
--- a/modules/graphics/src/test/resources/com/sun/javafx/css/HonorDeveloperSettingsTest_AUTHOR.css	Thu Sep 05 07:34:01 2013 -0700
+++ b/modules/graphics/src/test/resources/com/sun/javafx/css/HonorDeveloperSettingsTest_AUTHOR.css	Tue Sep 10 10:20:20 2013 -0400
@@ -11,4 +11,6 @@
 #rt-20686-author { -fx-font-smoothing-type: lcd; }
 
 /* FontTypeTest testRT_32551 */
-#test-rt-32551 { -fx-font-style: italic; }
\ No newline at end of file
+#test-rt-32551 { -fx-font-style: italic; }
+
+#test-rt-29773 { -fx-font-family: 'Amble Cn'; }
\ No newline at end of file