changeset 1625:799439873bf9

6824395: Several Swing core components prevent using them in wrapper classes Reviewed-by: peterz
author alexp
date Mon, 24 Aug 2009 19:22:38 +0400
parents d07bd8fa89e4
children 4914723317b9
files src/share/classes/javax/swing/JEditorPane.java src/share/classes/javax/swing/JLayer.java src/share/classes/javax/swing/JList.java src/share/classes/javax/swing/JTable.java src/share/classes/javax/swing/JTextField.java src/share/classes/javax/swing/JTree.java src/share/classes/javax/swing/plaf/LayerUI.java src/share/classes/javax/swing/text/JTextComponent.java src/share/classes/sun/swing/SwingUtilities2.java test/javax/swing/JLayer/6824395/bug6824395.java test/javax/swing/JLayer/SerializationTest/SerializationTest.java
diffstat 11 files changed, 163 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/javax/swing/JEditorPane.java	Mon Aug 24 18:21:47 2009 +0400
+++ b/src/share/classes/javax/swing/JEditorPane.java	Mon Aug 24 19:22:38 2009 +0400
@@ -24,6 +24,8 @@
  */
 package javax.swing;
 
+import sun.swing.SwingUtilities2;
+
 import java.awt.*;
 import java.awt.event.*;
 import java.lang.reflect.*;
@@ -1323,8 +1325,8 @@
      */
     public Dimension getPreferredSize() {
         Dimension d = super.getPreferredSize();
-        if (getParent() instanceof JViewport) {
-            JViewport port = (JViewport)getParent();
+        JViewport port = SwingUtilities2.getViewport(this);
+        if (port != null) {
             TextUI ui = getUI();
             int prefWidth = d.width;
             int prefHeight = d.height;
@@ -1445,8 +1447,8 @@
      * match its own, false otherwise
      */
     public boolean getScrollableTracksViewportWidth() {
-        if (getParent() instanceof JViewport) {
-            JViewport port = (JViewport)getParent();
+        JViewport port = SwingUtilities2.getViewport(this);
+        if (port != null) {
             TextUI ui = getUI();
             int w = port.getWidth();
             Dimension min = ui.getMinimumSize(this);
@@ -1467,8 +1469,8 @@
      *          false otherwise
      */
     public boolean getScrollableTracksViewportHeight() {
-        if (getParent() instanceof JViewport) {
-            JViewport port = (JViewport)getParent();
+        JViewport port = SwingUtilities2.getViewport(this);
+        if (port != null) {
             TextUI ui = getUI();
             int h = port.getHeight();
             Dimension min = ui.getMinimumSize(this);
--- a/src/share/classes/javax/swing/JLayer.java	Mon Aug 24 18:21:47 2009 +0400
+++ b/src/share/classes/javax/swing/JLayer.java	Mon Aug 24 19:22:38 2009 +0400
@@ -495,9 +495,6 @@
         if (getUI() != null) {
             return getUI().getScrollableTracksViewportHeight(this);
         }
-        if (getParent() instanceof JViewport) {
-            return ((getParent()).getHeight() > getPreferredSize().height);
-        }
         return false;
     }
 
@@ -518,9 +515,6 @@
         if (getUI() != null) {
             return getUI().getScrollableTracksViewportWidth(this);
         }
-        if (getParent() instanceof JViewport) {
-            return ((getParent()).getWidth() > getPreferredSize().width);
-        }
         return false;
     }
 
--- a/src/share/classes/javax/swing/JList.java	Mon Aug 24 18:21:47 2009 +0400
+++ b/src/share/classes/javax/swing/JList.java	Mon Aug 24 19:22:38 2009 +0400
@@ -2722,8 +2722,9 @@
                                       getVisibleRowCount() <= 0) {
             return true;
         }
-        if (getParent() instanceof JViewport) {
-            return (getParent().getWidth() > getPreferredSize().width);
+        JViewport port = SwingUtilities2.getViewport(this);
+        if (port != null) {
+            return port.getWidth() > getPreferredSize().width;
         }
         return false;
     }
@@ -2747,8 +2748,9 @@
                      getVisibleRowCount() <= 0) {
             return true;
         }
-        if (getParent() instanceof JViewport) {
-            return (getParent().getHeight() > getPreferredSize().height);
+        JViewport port = SwingUtilities2.getViewport(this);
+        if (port != null) {
+            return port.getHeight() > getPreferredSize().height;
         }
         return false;
     }
--- a/src/share/classes/javax/swing/JTable.java	Mon Aug 24 18:21:47 2009 +0400
+++ b/src/share/classes/javax/swing/JTable.java	Mon Aug 24 19:22:38 2009 +0400
@@ -718,9 +718,9 @@
      * @see #addNotify
      */
     protected void configureEnclosingScrollPane() {
-        Container p = getParent();
-        if (p instanceof JViewport) {
-            Container gp = p.getParent();
+        JViewport port = SwingUtilities2.getViewport(this);
+        if (port != null) {
+            Container gp = port.getParent();
             if (gp instanceof JScrollPane) {
                 JScrollPane scrollPane = (JScrollPane)gp;
                 // Make certain we are the viewPort's view and not, for
@@ -750,9 +750,9 @@
      * from configureEnclosingScrollPane() and updateUI() in a safe manor.
      */
     private void configureEnclosingScrollPaneUI() {
-        Container p = getParent();
-        if (p instanceof JViewport) {
-            Container gp = p.getParent();
+        JViewport port = SwingUtilities2.getViewport(this);
+        if (port != null) {
+            Container gp = port.getParent();
             if (gp instanceof JScrollPane) {
                 JScrollPane scrollPane = (JScrollPane)gp;
                 // Make certain we are the viewPort's view and not, for
@@ -819,9 +819,9 @@
      * @since 1.3
      */
     protected void unconfigureEnclosingScrollPane() {
-        Container p = getParent();
-        if (p instanceof JViewport) {
-            Container gp = p.getParent();
+        JViewport port = SwingUtilities2.getViewport(this);
+        if (port != null) {
+            Container gp = port.getParent();
             if (gp instanceof JScrollPane) {
                 JScrollPane scrollPane = (JScrollPane)gp;
                 // Make certain we are the viewPort's view and not, for
@@ -5215,9 +5215,10 @@
      * @see #getFillsViewportHeight
      */
     public boolean getScrollableTracksViewportHeight() {
+        JViewport port = SwingUtilities2.getViewport(this);
         return getFillsViewportHeight()
-               && getParent() instanceof JViewport
-               && (getParent().getHeight() > getPreferredSize().height);
+               && port != null
+               && port.getHeight() > getPreferredSize().height;
     }
 
     /**
--- a/src/share/classes/javax/swing/JTextField.java	Mon Aug 24 18:21:47 2009 +0400
+++ b/src/share/classes/javax/swing/JTextField.java	Mon Aug 24 19:22:38 2009 +0400
@@ -24,6 +24,8 @@
  */
 package javax.swing;
 
+import sun.swing.SwingUtilities2;
+
 import java.awt.*;
 import java.awt.event.*;
 import java.beans.*;
@@ -288,11 +290,7 @@
      * @see JComponent#isValidateRoot
      */
     public boolean isValidateRoot() {
-        Component parent = getParent();
-        if (parent instanceof JViewport) {
-            return false;
-        }
-        return true;
+        return SwingUtilities2.getViewport(this) == null;
     }
 
 
--- a/src/share/classes/javax/swing/JTree.java	Mon Aug 24 18:21:47 2009 +0400
+++ b/src/share/classes/javax/swing/JTree.java	Mon Aug 24 19:22:38 2009 +0400
@@ -3498,8 +3498,9 @@
      * @see Scrollable#getScrollableTracksViewportWidth
      */
     public boolean getScrollableTracksViewportWidth() {
-        if (getParent() instanceof JViewport) {
-            return getParent().getWidth() > getPreferredSize().width;
+        JViewport port = SwingUtilities2.getViewport(this);
+        if (port != null) {
+            return port.getWidth() > getPreferredSize().width;
         }
         return false;
     }
@@ -3514,8 +3515,9 @@
      * @see Scrollable#getScrollableTracksViewportHeight
      */
     public boolean getScrollableTracksViewportHeight() {
-        if (getParent() instanceof JViewport) {
-            return getParent().getHeight() > getPreferredSize().height;
+        JViewport port = SwingUtilities2.getViewport(this);
+        if (port != null) {
+            return port.getHeight() > getPreferredSize().height;
         }
         return false;
     }
--- a/src/share/classes/javax/swing/plaf/LayerUI.java	Mon Aug 24 18:21:47 2009 +0400
+++ b/src/share/classes/javax/swing/plaf/LayerUI.java	Mon Aug 24 19:22:38 2009 +0400
@@ -303,9 +303,6 @@
         if (l.getView() instanceof Scrollable) {
             return ((Scrollable)l.getView()).getScrollableTracksViewportHeight();
         }
-        if (l.getParent() instanceof JViewport) {
-            return (((JViewport)l.getParent()).getHeight() > l.getPreferredSize().height);
-        }
         return false;
     }
 
@@ -322,9 +319,6 @@
         if (l.getView() instanceof Scrollable) {
             return ((Scrollable)l.getView()).getScrollableTracksViewportWidth();
         }
-        if (l.getParent() instanceof JViewport) {
-            return (((JViewport)l.getParent()).getWidth() > l.getPreferredSize().width);
-        }
         return false;
     }
 
--- a/src/share/classes/javax/swing/text/JTextComponent.java	Mon Aug 24 18:21:47 2009 +0400
+++ b/src/share/classes/javax/swing/text/JTextComponent.java	Mon Aug 24 19:22:38 2009 +0400
@@ -2069,8 +2069,9 @@
      *   width to match its own
      */
     public boolean getScrollableTracksViewportWidth() {
-        if (getParent() instanceof JViewport) {
-            return (getParent().getWidth() > getPreferredSize().width);
+        JViewport port = SwingUtilities2.getViewport(this);
+        if (port != null) {
+            return port.getWidth() > getPreferredSize().width;
         }
         return false;
     }
@@ -2089,8 +2090,9 @@
      *   to match its own
      */
     public boolean getScrollableTracksViewportHeight() {
-        if (getParent() instanceof JViewport) {
-            return (getParent().getHeight() > getPreferredSize().height);
+        JViewport port = SwingUtilities2.getViewport(this);
+        if (port != null) {
+            return (port.getHeight() > getPreferredSize().height);
         }
         return false;
     }
--- a/src/share/classes/sun/swing/SwingUtilities2.java	Mon Aug 24 18:21:47 2009 +0400
+++ b/src/share/classes/sun/swing/SwingUtilities2.java	Mon Aug 24 19:22:38 2009 +0400
@@ -1844,4 +1844,22 @@
                                          boolean three) {
         return liesIn(rect, p, false, false, three);
     }
+
+    /**
+     * Returns the {@code JViewport} instance for the {@code component}
+     * or {@code null}.
+     *
+     * @return the {@code JViewport} instance for the {@code component}
+     * or {@code null}
+     * @throws NullPointerException if {@code component} is {@code null}
+     */
+    public static JViewport getViewport(Component component) {
+        do {
+            component = component.getParent();
+            if (component instanceof JViewport) {
+                return (JViewport) component;
+            }
+        } while(component instanceof JLayer);
+        return null;
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JLayer/6824395/bug6824395.java	Mon Aug 24 19:22:38 2009 +0400
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+ /*
+ * @test
+ * @summary Checks that JLayer inside JViewport works is correctly laid out
+ * @author Alexander Potochkin
+ * @run main bug6824395
+ */
+
+
+import sun.awt.SunToolkit;
+
+import javax.swing.*;
+import javax.swing.plaf.LayerUI;
+import java.awt.*;
+
+public class bug6824395 {
+
+    static JScrollPane scrollPane;
+
+    public static void main(String[] args) throws Exception {
+        SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                JFrame frame = new JFrame("testing");
+                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+                JEditorPane editorPane = new JEditorPane();
+                String str = "hello\n";
+                for(int i = 0; i<5; i++) {
+                    str += str;
+                }
+
+                editorPane.setText(str);
+
+                JLayer<JEditorPane> editorPaneLayer = new JLayer<JEditorPane>(editorPane);
+                LayerUI<JComponent> layerUI = new LayerUI<JComponent>();
+                editorPaneLayer.setUI(layerUI);
+
+                scrollPane = new JScrollPane(editorPaneLayer);
+
+                scrollPane.setPreferredSize(new Dimension(200, 250));
+                frame.add(scrollPane);
+
+                frame.setSize(200, 200);
+                frame.pack();
+                frame.setVisible(true);
+            }
+        });
+        toolkit.realSync();
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                if (scrollPane.getViewportBorderBounds().width != scrollPane.getViewport().getView().getWidth()) {
+                    throw new RuntimeException("Wrong component's width!");
+                }
+            }
+        });
+    }
+}
--- a/test/javax/swing/JLayer/SerializationTest/SerializationTest.java	Mon Aug 24 18:21:47 2009 +0400
+++ b/test/javax/swing/JLayer/SerializationTest/SerializationTest.java	Mon Aug 24 19:22:38 2009 +0400
@@ -1,3 +1,26 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
 /*
  * @test
  * @summary Makes sure that JLayer is synchronizable
@@ -50,4 +73,4 @@
             return "TestLayerUI";
         }
     }
-}
\ No newline at end of file
+}