diff options
author | dmarkov <none@none> | 2014-09-12 14:16:41 +0400 |
---|---|---|
committer | dmarkov <none@none> | 2014-09-12 14:16:41 +0400 |
commit | e0f7fe411302a2a91c49767755d809b2113d4d51 (patch) | |
tree | f8327f9d131c75cccc60f295d04331f167db7969 /src/share/classes/javax | |
parent | 9e521ae632604fe5c8a112e50675c1400ea04f4f (diff) |
8048110: Using tables in JTextPane leads to infinite loop in FlowLayout.layoutRow
Reviewed-by: alexp, alexsch
Diffstat (limited to 'src/share/classes/javax')
-rw-r--r-- | src/share/classes/javax/swing/text/FlowView.java | 24 | ||||
-rw-r--r-- | src/share/classes/javax/swing/text/GlyphView.java | 8 | ||||
-rw-r--r-- | src/share/classes/javax/swing/text/View.java | 7 |
3 files changed, 31 insertions, 8 deletions
diff --git a/src/share/classes/javax/swing/text/FlowView.java b/src/share/classes/javax/swing/text/FlowView.java index 53e63e2cf..9c5cf03f7 100644 --- a/src/share/classes/javax/swing/text/FlowView.java +++ b/src/share/classes/javax/swing/text/FlowView.java @@ -800,14 +800,22 @@ public abstract class FlowView extends BoxView { @Override protected void forwardUpdate(DocumentEvent.ElementChange ec, DocumentEvent e, Shape a, ViewFactory f) { - calculateUpdateIndexes(e); - // Send update event to all views followed by the changed place. - lastUpdateIndex = Math.max((getViewCount() - 1), 0); - for (int i = firstUpdateIndex; i <= lastUpdateIndex; i++) { - View v = getView(i); - if (v != null) { - Shape childAlloc = getChildAllocation(i, a); - forwardUpdateToView(v, e, childAlloc, f); + // Update the view responsible for the changed element by invocation of + // super method. + super.forwardUpdate(ec, e, a, f); + // Re-calculate the update indexes and update the views followed by + // the changed place. Note: we update the views only when insertion or + // removal takes place. + DocumentEvent.EventType type = e.getType(); + if (type == DocumentEvent.EventType.INSERT || + type == DocumentEvent.EventType.REMOVE) { + firstUpdateIndex = Math.min((lastUpdateIndex + 1), (getViewCount() - 1)); + lastUpdateIndex = Math.max((getViewCount() - 1), 0); + for (int i = firstUpdateIndex; i <= lastUpdateIndex; i++) { + View v = getView(i); + if (v != null) { + v.updateAfterChange(); + } } } } diff --git a/src/share/classes/javax/swing/text/GlyphView.java b/src/share/classes/javax/swing/text/GlyphView.java index 6aef36823..fd75fa096 100644 --- a/src/share/classes/javax/swing/text/GlyphView.java +++ b/src/share/classes/javax/swing/text/GlyphView.java @@ -971,6 +971,14 @@ public class GlyphView extends View implements TabableView, Cloneable { } } + /** {@inheritDoc} */ + @Override + void updateAfterChange() { + // Drop the break spots. They will be re-calculated during + // layout. It is necessary for proper line break calculation. + breakSpots = null; + } + /** * Class to hold data needed to justify this GlyphView in a PargraphView.Row */ diff --git a/src/share/classes/javax/swing/text/View.java b/src/share/classes/javax/swing/text/View.java index 2b49055ab..d1e4e1336 100644 --- a/src/share/classes/javax/swing/text/View.java +++ b/src/share/classes/javax/swing/text/View.java @@ -1199,6 +1199,13 @@ public abstract class View implements SwingConstants { } /** + * Updates the view to reflect the changes. + */ + void updateAfterChange() { + // Do nothing by default. Should be overridden in subclasses, if any. + } + + /** * Forwards the <code>DocumentEvent</code> to the give child view. This * simply messages the view with a call to <code>insertUpdate</code>, * <code>removeUpdate</code>, or <code>changedUpdate</code> depending |