let markup model listeners know when font style has changed for a highlighter

This commit is contained in:
Dmitry Batrak
2016-02-03 17:01:47 +03:00
parent a7f1c90b95
commit 2d3e730454
10 changed files with 68 additions and 59 deletions
@@ -671,7 +671,7 @@ public class DaemonRespondToChangesTest extends DaemonAnalyzerTestCase {
final int[] count = {0};
MarkupModelEx modelEx = (MarkupModelEx)DocumentMarkupModel.forDocument(getDocument(getFile()), getProject(), true);
modelEx.addMarkupModelListener(getTestRootDisposable(), new MarkupModelListener() {
modelEx.addMarkupModelListener(getTestRootDisposable(), new MarkupModelListener.Adapter() {
@Override
public void afterAdded(@NotNull RangeHighlighterEx highlighter) {
count[0]++;
@@ -681,10 +681,6 @@ public class DaemonRespondToChangesTest extends DaemonAnalyzerTestCase {
public void beforeRemoved(@NotNull RangeHighlighterEx highlighter) {
count[0]++;
}
@Override
public void attributesChanged(@NotNull RangeHighlighterEx highlighter, boolean renderersChanged) {
}
});
type(' ');
@@ -718,7 +714,7 @@ public class DaemonRespondToChangesTest extends DaemonAnalyzerTestCase {
}
@Override
public void attributesChanged(@NotNull RangeHighlighterEx highlighter, boolean renderersChanged) {
public void attributesChanged(@NotNull RangeHighlighterEx highlighter, boolean renderersChanged, boolean fontStyleChanged) {
changed(highlighter, ExceptionUtil.getThrowableText(new Throwable("changed")));
}
@@ -769,7 +765,7 @@ public class DaemonRespondToChangesTest extends DaemonAnalyzerTestCase {
}
@Override
public void attributesChanged(@NotNull RangeHighlighterEx highlighter, boolean renderersChanged) {
public void attributesChanged(@NotNull RangeHighlighterEx highlighter, boolean renderersChanged, boolean fontStyleChanged) {
changed(highlighter, ExceptionUtil.getThrowableText(new Throwable("changed")));
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -151,7 +151,7 @@ public class MarkupModelWindow extends UserDataHolderBase implements MarkupModel
}
@Override
public void fireAttributesChanged(@NotNull RangeHighlighterEx segmentHighlighter, boolean renderersChanged) {
public void fireAttributesChanged(@NotNull RangeHighlighterEx segmentHighlighter, boolean renderersChanged, boolean fontStyleChanged) {
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ public interface MarkupModelEx extends MarkupModel {
@Nullable
RangeHighlighterEx addPersistentLineHighlighter(int lineNumber, int layer, TextAttributes textAttributes);
void fireAttributesChanged(@NotNull RangeHighlighterEx segmentHighlighter, boolean renderersChanged);
void fireAttributesChanged(@NotNull RangeHighlighterEx segmentHighlighter, boolean renderersChanged, boolean fontStyleChanged);
void fireAfterAdded(@NotNull RangeHighlighterEx segmentHighlighter);
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -144,7 +144,7 @@ public class EmptyMarkupModel implements MarkupModelEx {
}
@Override
public void fireAttributesChanged(@NotNull RangeHighlighterEx segmentHighlighter, boolean renderersChanged) {
public void fireAttributesChanged(@NotNull RangeHighlighterEx segmentHighlighter, boolean renderersChanged, boolean fontStyleChanged) {
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -144,9 +144,11 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx
public void changeAttributesInBatch(@NotNull RangeHighlighterEx highlighter,
@NotNull Consumer<RangeHighlighterEx> changeAttributesAction) {
ApplicationManager.getApplication().assertIsDispatchThread();
RangeHighlighterImpl.ChangeResult changed = ((RangeHighlighterImpl)highlighter).changeAttributesNoEvents(changeAttributesAction);
if (changed != RangeHighlighterImpl.ChangeResult.NOT_CHANGED) {
fireAttributesChanged(highlighter, changed == RangeHighlighterImpl.ChangeResult.RENDERERS_CHANGED);
byte changeStatus = ((RangeHighlighterImpl)highlighter).changeAttributesNoEvents(changeAttributesAction);
if ((changeStatus & RangeHighlighterImpl.CHANGED_MASK) != 0) {
fireAttributesChanged(highlighter,
(changeStatus & RangeHighlighterImpl.RENDERERS_CHANGED_MASK) != 0,
(changeStatus & RangeHighlighterImpl.FONT_STYLE_CHANGED_MASK) != 0);
}
}
@@ -225,9 +227,9 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx
}
@Override
public void fireAttributesChanged(@NotNull RangeHighlighterEx segmentHighlighter, boolean renderersChanged) {
public void fireAttributesChanged(@NotNull RangeHighlighterEx segmentHighlighter, boolean renderersChanged, boolean fontStyleChanged) {
for (MarkupModelListener listener : myListeners) {
listener.attributesChanged(segmentHighlighter, renderersChanged);
listener.attributesChanged(segmentHighlighter, renderersChanged, fontStyleChanged);
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -57,12 +57,17 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
private static final byte ERROR_STRIPE_IS_THIN_MASK = 2;
private static final byte TARGET_AREA_IS_EXACT_MASK = 4;
private static final byte IN_BATCH_CHANGE_MASK = 8;
private static final byte CHANGED_MASK = 16;
private static final byte RENDERERS_CHANGED_MASK = 32;
static final byte CHANGED_MASK = 16;
static final byte RENDERERS_CHANGED_MASK = 32;
static final byte FONT_STYLE_CHANGED_MASK = 64;
@MagicConstant(intValues = {AFTER_END_OF_LINE_MASK, ERROR_STRIPE_IS_THIN_MASK, TARGET_AREA_IS_EXACT_MASK, IN_BATCH_CHANGE_MASK, CHANGED_MASK, RENDERERS_CHANGED_MASK})
@MagicConstant(intValues = {AFTER_END_OF_LINE_MASK, ERROR_STRIPE_IS_THIN_MASK, TARGET_AREA_IS_EXACT_MASK, IN_BATCH_CHANGE_MASK,
CHANGED_MASK, RENDERERS_CHANGED_MASK, FONT_STYLE_CHANGED_MASK})
private @interface FlagConstant {}
@MagicConstant(flags = {CHANGED_MASK, RENDERERS_CHANGED_MASK, FONT_STYLE_CHANGED_MASK})
private @interface ChangeStatus {}
RangeHighlighterImpl(@NotNull MarkupModel model,
int start,
int end,
@@ -98,9 +103,13 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
TextAttributes old = myTextAttributes;
myTextAttributes = textAttributes;
if (!Comparing.equal(old, textAttributes)) {
fireChanged(false);
fireChanged(false, getFontStyle(old) != getFontStyle(textAttributes));
}
}
private static int getFontStyle(TextAttributes textAttributes) {
return textAttributes == null ? Font.PLAIN : textAttributes.getFontType();
}
@Override
@NotNull
@@ -118,7 +127,7 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
LineMarkerRenderer old = myLineMarkerRenderer;
myLineMarkerRenderer = renderer;
if (!Comparing.equal(old, renderer)) {
fireChanged(true);
fireChanged(true, false);
}
}
@@ -132,7 +141,7 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
CustomHighlighterRenderer old = myCustomRenderer;
myCustomRenderer = renderer;
if (!Comparing.equal(old, renderer)) {
fireChanged(true);
fireChanged(true, false);
}
}
@@ -146,7 +155,7 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
GutterMark old = myGutterIconRenderer;
myGutterIconRenderer = renderer;
if (!Comparing.equal(old, renderer)) {
fireChanged(true);
fireChanged(true, false);
}
}
@@ -164,7 +173,7 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
Color old = myErrorStripeColor;
myErrorStripeColor = color;
if (!Comparing.equal(old, color)) {
fireChanged(false);
fireChanged(false, false);
}
}
@@ -179,7 +188,7 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
Object old = myErrorStripeTooltip;
myErrorStripeTooltip = tooltipObject;
if (!Comparing.equal(old, tooltipObject)) {
fireChanged(false);
fireChanged(false, false);
}
}
@@ -194,7 +203,7 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
boolean old = isThinErrorStripeMark();
setFlag(ERROR_STRIPE_IS_THIN_MASK, value);
if (old != value) {
fireChanged(false);
fireChanged(false, false);
}
}
@@ -208,7 +217,7 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
Color old = myLineSeparatorColor;
myLineSeparatorColor = color;
if (!Comparing.equal(old, color)) {
fireChanged(false);
fireChanged(false, false);
}
}
@@ -222,14 +231,14 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
SeparatorPlacement old = mySeparatorPlacement;
mySeparatorPlacement = placement;
if (!Comparing.equal(old, placement)) {
fireChanged(false);
fireChanged(false, false);
}
}
@Override
public void setEditorFilter(@NotNull MarkupEditorFilter filter) {
myFilter = filter;
fireChanged(false);
fireChanged(false, false);
}
@Override
@@ -248,20 +257,19 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
boolean old = isAfterEndOfLine();
setFlag(AFTER_END_OF_LINE_MASK, afterEndOfLine);
if (old != afterEndOfLine) {
fireChanged(false);
fireChanged(false, false);
}
}
private void fireChanged(boolean renderersChanged) {
private void fireChanged(boolean renderersChanged, boolean fontStyleChanged) {
if (myModel instanceof MarkupModelEx) {
if (isFlagSet(IN_BATCH_CHANGE_MASK)) {
setFlag(CHANGED_MASK, true);
if (renderersChanged) {
setFlag(RENDERERS_CHANGED_MASK, true);
}
if (renderersChanged) setFlag(RENDERERS_CHANGED_MASK, true);
if (fontStyleChanged) setFlag(FONT_STYLE_CHANGED_MASK, true);
}
else {
((MarkupModelEx)myModel).fireAttributesChanged(this, renderersChanged);
((MarkupModelEx)myModel).fireAttributesChanged(this, renderersChanged, fontStyleChanged);
}
}
}
@@ -299,24 +307,27 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
}
enum ChangeResult { NOT_CHANGED, MINOR_CHANGE, RENDERERS_CHANGED }
@NotNull
ChangeResult changeAttributesNoEvents(@NotNull Consumer<RangeHighlighterEx> change) {
@ChangeStatus
byte changeAttributesNoEvents(@NotNull Consumer<RangeHighlighterEx> change) {
assert !isFlagSet(IN_BATCH_CHANGE_MASK);
assert !isFlagSet(CHANGED_MASK);
setFlag(IN_BATCH_CHANGE_MASK, true);
setFlag(RENDERERS_CHANGED_MASK, false);
ChangeResult result;
setFlag(FONT_STYLE_CHANGED_MASK, false);
byte result = 0;
try {
change.consume(this);
}
finally {
setFlag(IN_BATCH_CHANGE_MASK, false);
boolean changed = isFlagSet(CHANGED_MASK);
boolean renderersChanged = isFlagSet(RENDERERS_CHANGED_MASK);
result = changed ? renderersChanged ? ChangeResult.RENDERERS_CHANGED : ChangeResult.MINOR_CHANGE : ChangeResult.NOT_CHANGED;
if (isFlagSet(CHANGED_MASK)) {
result |= CHANGED_MASK;
if (isFlagSet(RENDERERS_CHANGED_MASK)) result |= RENDERERS_CHANGED_MASK;
if (isFlagSet(FONT_STYLE_CHANGED_MASK)) result |= FONT_STYLE_CHANGED_MASK;
}
setFlag(CHANGED_MASK, false);
setFlag(RENDERERS_CHANGED_MASK, false);
setFlag(FONT_STYLE_CHANGED_MASK, false);
}
return result;
}
@@ -330,7 +341,7 @@ class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx
LineSeparatorRenderer old = myLineSeparatorRenderer;
myLineSeparatorRenderer = renderer;
if (!Comparing.equal(old, renderer)) {
fireChanged(true);
fireChanged(true, false);
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@ public interface MarkupModelListener extends EventListener {
void beforeRemoved(@NotNull RangeHighlighterEx highlighter);
void attributesChanged(@NotNull RangeHighlighterEx highlighter, boolean renderersChanged);
void attributesChanged(@NotNull RangeHighlighterEx highlighter, boolean renderersChanged, boolean fontStyleChanged);
abstract class Adapter implements MarkupModelListener {
@Override
@@ -39,7 +39,7 @@ public interface MarkupModelListener extends EventListener {
}
@Override
public void attributesChanged(@NotNull RangeHighlighterEx highlighter, boolean renderersChanged) {
public void attributesChanged(@NotNull RangeHighlighterEx highlighter, boolean renderersChanged, boolean fontStyleChanged) {
}
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -128,8 +128,8 @@ public class EditorFilteringMarkupModelEx implements MarkupModelEx {
}
@Override
public void fireAttributesChanged(@NotNull RangeHighlighterEx segmentHighlighter, boolean renderersChanged) {
myDelegate.fireAttributesChanged(segmentHighlighter, renderersChanged);
public void fireAttributesChanged(@NotNull RangeHighlighterEx segmentHighlighter, boolean renderersChanged, boolean fontStyleChanged) {
myDelegate.fireAttributesChanged(segmentHighlighter, renderersChanged, fontStyleChanged);
}
@Override
@@ -374,16 +374,16 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
}
@Override
public void afterAdded(@NotNull RangeHighlighterEx highlighter) {
attributesChanged(highlighter, areRenderersInvolved(highlighter));
attributesChanged(highlighter, areRenderersInvolved(highlighter), false);
}
@Override
public void beforeRemoved(@NotNull RangeHighlighterEx highlighter) {
attributesChanged(highlighter, areRenderersInvolved(highlighter));
attributesChanged(highlighter, areRenderersInvolved(highlighter), false);
}
@Override
public void attributesChanged(@NotNull RangeHighlighterEx highlighter, boolean renderersChanged) {
public void attributesChanged(@NotNull RangeHighlighterEx highlighter, boolean renderersChanged, boolean fontStyleChanged) {
if (myDocument.isInBulkUpdate()) return; // bulkUpdateFinished() will repaint anything
if (myUseNewRendering && renderersChanged) {
@@ -5497,7 +5497,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
for (RangeHighlighter highlighter : myDocumentMarkupModel.getDelegate().getAllHighlighters()) {
boolean oldAvailable = oldFilter == null || oldFilter.value(highlighter);
boolean newAvailable = filter == null || filter.value(highlighter);
if (oldAvailable != newAvailable) myMarkupModelListener.attributesChanged((RangeHighlighterEx)highlighter, true);
if (oldAvailable != newAvailable) myMarkupModelListener.attributesChanged((RangeHighlighterEx)highlighter, true, false);
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -134,7 +134,7 @@ public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreak
markupModel = (MarkupModelEx)DocumentMarkupModel.forDocument(document, getProject(), false);
if (markupModel != null) {
// renderersChanged false - we don't change gutter size
markupModel.fireAttributesChanged((RangeHighlighterEx)highlighter, false);
markupModel.fireAttributesChanged((RangeHighlighterEx)highlighter, false, false);
}
}
}