diff --git a/json/src/com/jetbrains/jsonSchema/widget/JsonSchemaStatusWidget.java b/json/src/com/jetbrains/jsonSchema/widget/JsonSchemaStatusWidget.java index 9bfc8184c277..02bb2cf856f8 100644 --- a/json/src/com/jetbrains/jsonSchema/widget/JsonSchemaStatusWidget.java +++ b/json/src/com/jetbrains/jsonSchema/widget/JsonSchemaStatusWidget.java @@ -65,8 +65,7 @@ class JsonSchemaStatusWidget extends EditorBasedStatusBarPopup { private final AtomicReference> mySuppressInfoRef = new AtomicReference<>(); - private volatile VirtualFile myLastUpdatedFile; - private volatile WidgetState mySchemaWidgetState; + private volatile Pair myLastWidgetStateAndFilePair; private ProgressIndicator myCurrentProgress; JsonSchemaStatusWidget(@NotNull Project project) { @@ -198,14 +197,18 @@ class JsonSchemaStatusWidget extends EditorBasedStatusBarPopup { return WidgetStatus.ENABLED; } - @NotNull @Override - protected WidgetState getWidgetState(@Nullable VirtualFile file) { + protected @NotNull WidgetState getWidgetState(@Nullable VirtualFile file) { + Pair lastStateAndFilePair = myLastWidgetStateAndFilePair; + WidgetState widgetState = calcWidgetState(file, Pair.getFirst(lastStateAndFilePair), Pair.getSecond(lastStateAndFilePair)); + myLastWidgetStateAndFilePair = new Pair<>(widgetState, file); + return widgetState; + } + + private @NotNull WidgetState calcWidgetState(@Nullable VirtualFile file, + @Nullable WidgetState lastWidgetState, + @Nullable VirtualFile lastFile) { Pair suppressInfo = mySuppressInfoRef.getAndSet(null); - WidgetState schemaWidgetState = mySchemaWidgetState; - mySchemaWidgetState = null; - VirtualFile lastUpdatedFile = myLastUpdatedFile; - myLastUpdatedFile = file; if (myCurrentProgress != null && !myCurrentProgress.isCanceled()) { myCurrentProgress.cancel(); } @@ -232,7 +235,7 @@ class JsonSchemaStatusWidget extends EditorBasedStatusBarPopup { scheduleSuppressCheck(file, myCurrentProgress); // show 'loading' only when switching between files and previous state was not hidden, otherwise the widget will "jump" - if (!Comparing.equal(lastUpdatedFile, file) && schemaWidgetState != null && schemaWidgetState != WidgetState.HIDDEN) { + if (!Comparing.equal(lastFile, file) && lastWidgetState != null && lastWidgetState != WidgetState.HIDDEN) { return new WidgetState(JsonBundle.message("schema.widget.checking.state.tooltip"), JsonBundle.message("schema.widget.checking.state.text", isJsonFile ? JsonBundle.message("schema.widget.prefix.json.files") @@ -248,12 +251,10 @@ class JsonSchemaStatusWidget extends EditorBasedStatusBarPopup { } } - WidgetState state = doGetWidgetState(file, isJsonFile); - mySchemaWidgetState = state; - return state; + return doGetWidgetState(file, isJsonFile); } - private WidgetState doGetWidgetState(@NotNull VirtualFile file, boolean isJsonFile) { + private @NotNull WidgetState doGetWidgetState(@NotNull VirtualFile file, boolean isJsonFile) { JsonSchemaService service = getService(); if (service == null) { return getNoSchemaState(); @@ -463,17 +464,19 @@ class JsonSchemaStatusWidget extends EditorBasedStatusBarPopup { @Nullable @Override protected ListPopup createPopup(DataContext context) { - final VirtualFile virtualFile = CommonDataKeys.VIRTUAL_FILE.getData(context); - if (virtualFile == null) return null; + VirtualFile file = CommonDataKeys.VIRTUAL_FILE.getData(context); + if (file == null) return null; Project project = getProject(); - WidgetState popupState = mySchemaWidgetState; - if (!(popupState instanceof MyWidgetState) || !virtualFile.equals(myLastUpdatedFile)) return null; - - JsonSchemaService service = getService(); - if (service == null) return null; - - return JsonSchemaStatusPopup.createPopup(service, project, virtualFile, ((MyWidgetState)popupState).isWarning()); + Pair lastWidgetStateAndFilePair = myLastWidgetStateAndFilePair; + WidgetState lastWidgetState = Pair.getFirst(lastWidgetStateAndFilePair); + if (lastWidgetState instanceof MyWidgetState && file.equals(Pair.getSecond(lastWidgetStateAndFilePair))) { + JsonSchemaService service = getService(); + if (service != null) { + return JsonSchemaStatusPopup.createPopup(service, project, file, ((MyWidgetState)lastWidgetState).isWarning()); + } + } + return null; } @Override