6899413: Fix for CR #6878399 should be refactored
authoralexp
Thu, 29 Apr 2010 18:38:25 +0400
changeset 5449 21bec46ee9e3
parent 5448 96e9d2b5c719
child 5450 7232e9363e50
6899413: Fix for CR #6878399 should be refactored Reviewed-by: peterz
jdk/src/share/classes/javax/swing/JEditorPane.java
jdk/src/share/classes/javax/swing/JList.java
jdk/src/share/classes/javax/swing/JTable.java
jdk/src/share/classes/javax/swing/JTextField.java
jdk/src/share/classes/javax/swing/JTree.java
jdk/src/share/classes/javax/swing/SwingUtilities.java
jdk/src/share/classes/javax/swing/text/JTextComponent.java
--- a/jdk/src/share/classes/javax/swing/JEditorPane.java	Wed Apr 21 18:12:21 2010 +0400
+++ b/jdk/src/share/classes/javax/swing/JEditorPane.java	Thu Apr 29 18:38:25 2010 +0400
@@ -1330,8 +1330,9 @@
      */
     public Dimension getPreferredSize() {
         Dimension d = super.getPreferredSize();
-        JViewport port = SwingUtilities.getParentViewport(this);
-        if (port != null) {
+        Container parent = SwingUtilities.getUnwrappedParent(this);
+        if (parent instanceof JViewport) {
+            JViewport port = (JViewport) parent;
             TextUI ui = getUI();
             int prefWidth = d.width;
             int prefHeight = d.height;
@@ -1452,8 +1453,9 @@
      * match its own, false otherwise
      */
     public boolean getScrollableTracksViewportWidth() {
-        JViewport port = SwingUtilities.getParentViewport(this);
-        if (port != null) {
+        Container parent = SwingUtilities.getUnwrappedParent(this);
+        if (parent instanceof JViewport) {
+            JViewport port = (JViewport) parent;
             TextUI ui = getUI();
             int w = port.getWidth();
             Dimension min = ui.getMinimumSize(this);
@@ -1474,8 +1476,9 @@
      *          false otherwise
      */
     public boolean getScrollableTracksViewportHeight() {
-        JViewport port = SwingUtilities.getParentViewport(this);
-        if (port != null) {
+        Container parent = SwingUtilities.getUnwrappedParent(this);
+        if (parent instanceof JViewport) {
+            JViewport port = (JViewport) parent;
             TextUI ui = getUI();
             int h = port.getHeight();
             Dimension min = ui.getMinimumSize(this);
--- a/jdk/src/share/classes/javax/swing/JList.java	Wed Apr 21 18:12:21 2010 +0400
+++ b/jdk/src/share/classes/javax/swing/JList.java	Thu Apr 29 18:38:25 2010 +0400
@@ -25,17 +25,7 @@
 
 package javax.swing;
 
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.GraphicsEnvironment;
-import java.awt.HeadlessException;
-import java.awt.Insets;
-import java.awt.Point;
-import java.awt.Rectangle;
+import java.awt.*;
 import java.awt.event.*;
 
 import java.util.Vector;
@@ -2779,9 +2769,9 @@
                                       getVisibleRowCount() <= 0) {
             return true;
         }
-        JViewport port = SwingUtilities.getParentViewport(this);
-        if (port != null) {
-            return port.getWidth() > getPreferredSize().width;
+        Container parent = SwingUtilities.getUnwrappedParent(this);
+        if (parent instanceof JViewport) {
+            return parent.getWidth() > getPreferredSize().width;
         }
         return false;
     }
@@ -2805,9 +2795,9 @@
                      getVisibleRowCount() <= 0) {
             return true;
         }
-        JViewport port = SwingUtilities.getParentViewport(this);
-        if (port != null) {
-            return port.getHeight() > getPreferredSize().height;
+        Container parent = SwingUtilities.getUnwrappedParent(this);
+        if (parent instanceof JViewport) {
+            return parent.getHeight() > getPreferredSize().height;
         }
         return false;
     }
--- a/jdk/src/share/classes/javax/swing/JTable.java	Wed Apr 21 18:12:21 2010 +0400
+++ b/jdk/src/share/classes/javax/swing/JTable.java	Thu Apr 29 18:38:25 2010 +0400
@@ -719,8 +719,9 @@
      * @see #addNotify
      */
     protected void configureEnclosingScrollPane() {
-        JViewport port = SwingUtilities.getParentViewport(this);
-        if (port != null) {
+        Container parent = SwingUtilities.getUnwrappedParent(this);
+        if (parent instanceof JViewport) {
+            JViewport port = (JViewport) parent;
             Container gp = port.getParent();
             if (gp instanceof JScrollPane) {
                 JScrollPane scrollPane = (JScrollPane)gp;
@@ -752,8 +753,9 @@
      * from configureEnclosingScrollPane() and updateUI() in a safe manor.
      */
     private void configureEnclosingScrollPaneUI() {
-        JViewport port = SwingUtilities.getParentViewport(this);
-        if (port != null) {
+        Container parent = SwingUtilities.getUnwrappedParent(this);
+        if (parent instanceof JViewport) {
+            JViewport port = (JViewport) parent;
             Container gp = port.getParent();
             if (gp instanceof JScrollPane) {
                 JScrollPane scrollPane = (JScrollPane)gp;
@@ -822,8 +824,9 @@
      * @since 1.3
      */
     protected void unconfigureEnclosingScrollPane() {
-        JViewport port = SwingUtilities.getParentViewport(this);
-        if (port != null) {
+        Container parent = SwingUtilities.getUnwrappedParent(this);
+        if (parent instanceof JViewport) {
+            JViewport port = (JViewport) parent;
             Container gp = port.getParent();
             if (gp instanceof JScrollPane) {
                 JScrollPane scrollPane = (JScrollPane)gp;
@@ -5217,10 +5220,10 @@
      * @see #getFillsViewportHeight
      */
     public boolean getScrollableTracksViewportHeight() {
-        JViewport port = SwingUtilities.getParentViewport(this);
+        Container parent = SwingUtilities.getUnwrappedParent(this);
         return getFillsViewportHeight()
-               && port != null
-               && port.getHeight() > getPreferredSize().height;
+               && parent instanceof JViewport
+               && parent.getHeight() > getPreferredSize().height;
     }
 
     /**
--- a/jdk/src/share/classes/javax/swing/JTextField.java	Wed Apr 21 18:12:21 2010 +0400
+++ b/jdk/src/share/classes/javax/swing/JTextField.java	Thu Apr 29 18:38:25 2010 +0400
@@ -292,7 +292,7 @@
      */
     @Override
     public boolean isValidateRoot() {
-        return SwingUtilities.getParentViewport(this) == null;
+        return !(SwingUtilities.getUnwrappedParent(this) instanceof JViewport);
     }
 
 
--- a/jdk/src/share/classes/javax/swing/JTree.java	Wed Apr 21 18:12:21 2010 +0400
+++ b/jdk/src/share/classes/javax/swing/JTree.java	Thu Apr 29 18:38:25 2010 +0400
@@ -3498,9 +3498,9 @@
      * @see Scrollable#getScrollableTracksViewportWidth
      */
     public boolean getScrollableTracksViewportWidth() {
-        JViewport port = SwingUtilities.getParentViewport(this);
-        if (port != null) {
-            return port.getWidth() > getPreferredSize().width;
+        Container parent = SwingUtilities.getUnwrappedParent(this);
+        if (parent instanceof JViewport) {
+            return parent.getWidth() > getPreferredSize().width;
         }
         return false;
     }
@@ -3515,9 +3515,9 @@
      * @see Scrollable#getScrollableTracksViewportHeight
      */
     public boolean getScrollableTracksViewportHeight() {
-        JViewport port = SwingUtilities.getParentViewport(this);
-        if (port != null) {
-            return port.getHeight() > getPreferredSize().height;
+        Container parent = SwingUtilities.getUnwrappedParent(this);
+        if (parent instanceof JViewport) {
+            return parent.getHeight() > getPreferredSize().height;
         }
         return false;
     }
--- a/jdk/src/share/classes/javax/swing/SwingUtilities.java	Wed Apr 21 18:12:21 2010 +0400
+++ b/jdk/src/share/classes/javax/swing/SwingUtilities.java	Thu Apr 29 18:38:25 2010 +0400
@@ -1969,58 +1969,53 @@
     }
 
     /**
-     * Looks for the first ancestor of the {@code component}
+     * Returns the first ancestor of the {@code component}
      * which is not an instance of {@link JLayer}.
-     * If this ancestor is an instance of {@code JViewport},
-     * this {@code JViewport} is returned, otherwise returns {@code null}.
-     * The following way of obtaining the parent {@code JViewport}
-     * is not recommended any more:
-     * <pre>
-     * JViewport port = null;
-     * Container parent = component.getParent();
-     * // not recommended any more
-     * if(parent instanceof JViewport) {
-     *     port = (JViewport) parent;
-     * }
-     * </pre>
-     * Here is the way to go:
-     * <pre>
-     * // the correct way:
-     * JViewport port = SwingUtilities.getParentViewport(component);
-     * </pre>
-     * @param component {@code Component} to get the parent {@code JViewport} of.
-     * @return the {@code JViewport} instance for the {@code component}
-     * or {@code null}
+     *
+     * @param component {@code Component} to get
+     * the first ancestor of, which is not a {@link JLayer} instance.
+     *
+     * @return the first ancestor of the {@code component}
+     * which is not an instance of {@link JLayer}.
+     * If such an ancestor can not be found, {@code null} is returned.
+     *
      * @throws NullPointerException if {@code component} is {@code null}
+     * @see JLayer
      *
      * @since 1.7
      */
-    public static JViewport getParentViewport(Component component) {
-        do {
-            component = component.getParent();
-            if (component instanceof JViewport) {
-                return (JViewport) component;
-            }
-        } while(component instanceof JLayer);
-        return null;
+    public static Container getUnwrappedParent(Component component) {
+        Container parent = component.getParent();
+        while(parent instanceof JLayer) {
+            parent = parent.getParent();
+        }
+        return parent;
     }
 
     /**
      * Returns the first {@code JViewport}'s descendant
-     * which is not an instance of {@code JLayer} or {@code null}.
+     * which is not an instance of {@code JLayer}.
+     * If such a descendant can not be found, {@code null} is returned.
      *
      * If the {@code viewport}'s view component is not a {@code JLayer},
-     * this method is equal to {@link JViewport#getView()}
-     * otherwise {@link JLayer#getView()} will be recursively tested
+     * this method is equivalent to {@link JViewport#getView()}
+     * otherwise {@link JLayer#getView()} will be recursively
+     * called on all descending {@code JLayer}s.
+     *
+     * @param viewport {@code JViewport} to get the first descendant of,
+     * which in not a {@code JLayer} instance.
      *
      * @return the first {@code JViewport}'s descendant
-     * which is not an instance of {@code JLayer} or {@code null}.
+     * which is not an instance of {@code JLayer}.
+     * If such a descendant can not be found, {@code null} is returned.
      *
      * @throws NullPointerException if {@code viewport} is {@code null}
      * @see JViewport#getView()
      * @see JLayer
+     *
+     * @since 1.7
      */
-    static Component getUnwrappedView(JViewport viewport) {
+    public static Component getUnwrappedView(JViewport viewport) {
         Component view = viewport.getView();
         while (view instanceof JLayer) {
             view = ((JLayer)view).getView();
--- a/jdk/src/share/classes/javax/swing/text/JTextComponent.java	Wed Apr 21 18:12:21 2010 +0400
+++ b/jdk/src/share/classes/javax/swing/text/JTextComponent.java	Thu Apr 29 18:38:25 2010 +0400
@@ -2069,9 +2069,9 @@
      *   width to match its own
      */
     public boolean getScrollableTracksViewportWidth() {
-        JViewport port = SwingUtilities.getParentViewport(this);
-        if (port != null) {
-            return port.getWidth() > getPreferredSize().width;
+        Container parent = SwingUtilities.getUnwrappedParent(this);
+        if (parent instanceof JViewport) {
+            return parent.getWidth() > getPreferredSize().width;
         }
         return false;
     }
@@ -2090,9 +2090,9 @@
      *   to match its own
      */
     public boolean getScrollableTracksViewportHeight() {
-        JViewport port = SwingUtilities.getParentViewport(this);
-        if (port != null) {
-            return (port.getHeight() > getPreferredSize().height);
+        Container parent = SwingUtilities.getUnwrappedParent(this);
+        if (parent instanceof JViewport) {
+            return parent.getHeight() > getPreferredSize().height;
         }
         return false;
     }