6539700: JTextPane line wrap radically different from previous versions in jre 1.5.0_10+
authorgsm
Mon, 03 Aug 2009 19:22:02 +0400
changeset 3503 03ab8aa8d3a1
parent 3502 821e773cae60
child 3504 3e34353145c5
6539700: JTextPane line wrap radically different from previous versions in jre 1.5.0_10+ Reviewed-by: peterz
jdk/src/share/classes/javax/swing/text/GlyphView.java
jdk/src/share/classes/javax/swing/text/ParagraphView.java
jdk/test/javax/swing/text/GlyphView/6539700/bug6539700.java
--- a/jdk/src/share/classes/javax/swing/text/GlyphView.java	Fri Jul 31 16:27:35 2009 +0400
+++ b/jdk/src/share/classes/javax/swing/text/GlyphView.java	Mon Aug 03 19:22:02 2009 +0400
@@ -540,30 +540,7 @@
      */
     @Override
     public float getMinimumSpan(int axis) {
-        switch (axis) {
-        case View.X_AXIS:
-            if (minimumSpan < 0) {
-                minimumSpan = 0;
-                int p0 = getStartOffset();
-                int p1 = getEndOffset();
-                while (p1 > p0) {
-                    int breakSpot = getBreakSpot(p0, p1);
-                    if (breakSpot == BreakIterator.DONE) {
-                        // the rest of the view is non-breakable
-                        breakSpot = p0;
-                    }
-                    minimumSpan = Math.max(minimumSpan,
-                            getPartialSpan(breakSpot, p1));
-                    // Note: getBreakSpot returns the *last* breakspot
-                    p1 = breakSpot - 1;
-                }
-            }
-            return minimumSpan;
-        case View.Y_AXIS:
-            return super.getMinimumSpan(axis);
-        default:
-            throw new IllegalArgumentException("Invalid axis: " + axis);
-        }
+        return super.getMinimumSpan(axis);
     }
 
     /**
--- a/jdk/src/share/classes/javax/swing/text/ParagraphView.java	Fri Jul 31 16:27:35 2009 +0400
+++ b/jdk/src/share/classes/javax/swing/text/ParagraphView.java	Mon Aug 03 19:22:02 2009 +0400
@@ -721,35 +721,7 @@
     @Override
     protected SizeRequirements calculateMinorAxisRequirements(int axis,
                                                         SizeRequirements r) {
-        r = super.calculateMinorAxisRequirements(axis, r);
-
-        float min = 0;
-        float glue = 0;
-        int n = getLayoutViewCount();
-        for (int i = 0; i < n; i++) {
-            View v = getLayoutView(i);
-            float span = v.getMinimumSpan(axis);
-            if (v.getBreakWeight(axis, 0, v.getMaximumSpan(axis))
-                                                        > View.BadBreakWeight) {
-                // find the longest non-breakable fragments at the view edges
-                int p0 = v.getStartOffset();
-                int p1 = v.getEndOffset();
-                float start = findEdgeSpan(v, axis, p0, p0, p1);
-                float end = findEdgeSpan(v, axis, p1, p0, p1);
-                glue += start;
-                min = Math.max(min, Math.max(span, glue));
-                glue = end;
-            } else {
-                // non-breakable view
-                glue += span;
-                min = Math.max(min, glue);
-            }
-        }
-        r.minimum = Math.max(r.minimum, (int) min);
-        r.preferred = Math.max(r.minimum,  r.preferred);
-        r.maximum = Math.max(r.preferred, r.maximum);
-
-        return r;
+        return super.calculateMinorAxisRequirements(axis, r);
     }
 
     /**
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/GlyphView/6539700/bug6539700.java	Mon Aug 03 19:22:02 2009 +0400
@@ -0,0 +1,114 @@
+/*
+ * 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
+ * @bug 6539700
+ * @summary test that the long space-less lines are correctly soft-wrapped
+ * @author Sergey Groznyh
+ * @run main bug6539700
+ */
+
+import javax.swing.JEditorPane;
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import javax.swing.text.ParagraphView;
+import javax.swing.text.View;
+
+public class bug6539700 {
+    static JFrame f;
+    static JEditorPane ep;
+    static String text = "AAAAAAAA<b>AAAAAA</b>AAAAAAAA<b>AAAAAAAAA</b>" +
+                         "AA<b>AAA</b>AAAAAAAAA";
+    static int size = 100;
+    static Class rowClass = null;
+
+    static void createContentPane() {
+        ep = new JEditorPane();
+        ep.setContentType("text/html");
+        ep.setEditable(false);
+        ep.setText(text);
+        f = new JFrame();
+        f.setSize(size, 2 * size);
+        f.add(ep);
+        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        f.setVisible(true);
+    }
+
+    static void checkRows(View v, boolean last) {
+        int width = (int) v.getPreferredSpan(View.X_AXIS);
+
+        if (v.getClass() == rowClass) {
+            // Row width shouldn't exceed the container width
+            if (width > size) {
+                throw new RuntimeException("too long row: " + width);
+            }
+
+            // Row shouldn't be too short (except for the last one)
+            if (!last) {
+                if (width < size * 2 / 3) {
+                    throw new RuntimeException("too short row: " + width);
+                }
+            }
+        }
+
+        int n = v.getViewCount();
+        if (n > 0) {
+            for (int i = 0; i < n; i++) {
+                View c = v.getView(i);
+                checkRows(c, i == n - 1);
+            }
+        }
+    }
+
+    public static void main(String[] argv) {
+        try {
+            SwingUtilities.invokeAndWait(new Runnable() {
+                public void run() {
+                    createContentPane();
+                }
+            });
+        } catch (Exception ex) {
+            throw new RuntimeException(ex);
+        }
+
+        Class[] pvchildren = ParagraphView.class.getDeclaredClasses();
+        for (Class c : pvchildren) {
+            if (c.getName().equals("javax.swing.text.ParagraphView$Row")) {
+                rowClass = c;
+                break;
+            }
+        }
+        if (rowClass == null) {
+            throw new RuntimeException("can't find ParagraphView.Row class");
+        }
+
+        SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                checkRows(ep.getUI().getRootView(ep), true);
+            }
+        });
+
+        System.out.println("OK");
+    }
+}