preserve consistency of EditorSizeManager state when editor is modified while it's hidden

This commit is contained in:
Dmitry Batrak
2015-11-30 11:28:17 +03:00
parent a478299fd4
commit 86d3361105
2 changed files with 19 additions and 0 deletions
@@ -754,6 +754,10 @@ public class SoftWrapModelImpl implements SoftWrapModelEx, PrioritizedInternalDo
return dumpState(); return dumpState();
} }
public boolean isDirty() {
return myDirty;
}
/** /**
* Defines generic interface for the command that may be proceeded in both <code>'soft wraps aware'</code> and * Defines generic interface for the command that may be proceeded in both <code>'soft wraps aware'</code> and
* <code>'soft wraps unaware'</code> modes. * <code>'soft wraps unaware'</code> modes.
@@ -70,6 +70,10 @@ class EditorSizeManager implements PrioritizedDocumentListener, Disposable, Fold
private int myFoldingChangeStartOffset = Integer.MAX_VALUE; private int myFoldingChangeStartOffset = Integer.MAX_VALUE;
private int myFoldingChangeEndOffset = Integer.MIN_VALUE; private int myFoldingChangeEndOffset = Integer.MIN_VALUE;
private boolean myDirty; // true if we cannot calculate preferred size now because soft wrap model was invalidated after editor
// became hidden. myLineWidths contents is irrelevant in such a state. Previously calculated preferred size
// is kept until soft wraps will be recalculated and size calculations will become possible
private final List<TextRange> myDeferredRanges = new ArrayList<TextRange>(); private final List<TextRange> myDeferredRanges = new ArrayList<TextRange>();
private final SoftWrapAwareDocumentParsingListenerAdapter mySoftWrapChangeListener = new SoftWrapAwareDocumentParsingListenerAdapter() { private final SoftWrapAwareDocumentParsingListenerAdapter mySoftWrapChangeListener = new SoftWrapAwareDocumentParsingListenerAdapter() {
@@ -179,6 +183,7 @@ class EditorSizeManager implements PrioritizedDocumentListener, Disposable, Fold
private int getPreferredWidth() { private int getPreferredWidth() {
if (myWidthInPixels < 0) { if (myWidthInPixels < 0) {
assert !myDocument.isInBulkUpdate(); assert !myDocument.isInBulkUpdate();
assert !myDirty;
myWidthInPixels = calculatePreferredWidth(); myWidthInPixels = calculatePreferredWidth();
} }
validateMaxLineWithExtension(); validateMaxLineWithExtension();
@@ -273,6 +278,11 @@ class EditorSizeManager implements PrioritizedDocumentListener, Disposable, Fold
} }
private void doInvalidateRange(int startOffset, int endOffset) { private void doInvalidateRange(int startOffset, int endOffset) {
if (myDirty) return;
if (myEditor.getSoftWrapModel().isDirty()) {
myDirty = true;
return;
}
myWidthInPixels = -1; myWidthInPixels = -1;
int startVisualLine = myView.offsetToVisualLine(startOffset, false); int startVisualLine = myView.offsetToVisualLine(startOffset, false);
int endVisualLine = myView.offsetToVisualLine(endOffset, true); int endVisualLine = myView.offsetToVisualLine(endOffset, true);
@@ -309,6 +319,11 @@ class EditorSizeManager implements PrioritizedDocumentListener, Disposable, Fold
} }
private void onTextLayoutPerformed(int startOffset, int endOffset) { private void onTextLayoutPerformed(int startOffset, int endOffset) {
if (myDirty) return;
if (myEditor.getSoftWrapModel().isDirty()) {
myDirty = true;
return;
}
boolean purePaintingMode = myEditor.isPurePaintingMode(); boolean purePaintingMode = myEditor.isPurePaintingMode();
boolean foldingEnabled = myEditor.getFoldingModel().isFoldingEnabled(); boolean foldingEnabled = myEditor.getFoldingModel().isFoldingEnabled();
myEditor.setPurePaintingMode(false); myEditor.setPurePaintingMode(false);