diff --git a/src/share/classes/javax/swing/text/GlyphView.java b/src/share/classes/javax/swing/text/GlyphView.java index d73ab6f618b49a0aae7b90235c8b5f7158dd6032..624f737b3768b3968a36e152cc69509ecc094f1d 100644 --- a/src/share/classes/javax/swing/text/GlyphView.java +++ b/src/share/classes/javax/swing/text/GlyphView.java @@ -541,7 +541,30 @@ public class GlyphView extends View implements TabableView, Cloneable { */ @Override public float getMinimumSpan(int axis) { - return super.getMinimumSpan(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); + } } /** diff --git a/src/share/classes/javax/swing/text/ParagraphView.java b/src/share/classes/javax/swing/text/ParagraphView.java index d06b3bc2bed3b6bd3dc0af9206ec973692b134b0..b88dd8731bb887090439bb59629b7d74ab50c55b 100644 --- a/src/share/classes/javax/swing/text/ParagraphView.java +++ b/src/share/classes/javax/swing/text/ParagraphView.java @@ -721,7 +721,34 @@ public class ParagraphView extends FlowView implements TabExpander { @Override protected SizeRequirements calculateMinorAxisRequirements(int axis, SizeRequirements r) { - return super.calculateMinorAxisRequirements(axis, 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; } /** diff --git a/test/javax/swing/text/GlyphView/6539700/bug6539700.java b/test/javax/swing/text/GlyphView/6539700/bug6539700.java deleted file mode 100644 index 4f26b65374c4e7a7b466c8d651f6b396ea4fef20..0000000000000000000000000000000000000000 --- a/test/javax/swing/text/GlyphView/6539700/bug6539700.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2009, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.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 = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + - "AAAAAAAAAAAAAA"; - 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"); - } -}