aboutsummaryrefslogtreecommitdiff
path: root/src/share/classes/javax
diff options
context:
space:
mode:
authordmarkov <none@none>2014-09-12 14:16:41 +0400
committerdmarkov <none@none>2014-09-12 14:16:41 +0400
commite0f7fe411302a2a91c49767755d809b2113d4d51 (patch)
treef8327f9d131c75cccc60f295d04331f167db7969 /src/share/classes/javax
parent9e521ae632604fe5c8a112e50675c1400ea04f4f (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.java24
-rw-r--r--src/share/classes/javax/swing/text/GlyphView.java8
-rw-r--r--src/share/classes/javax/swing/text/View.java7
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