json schema widget: show json schema popup on click (WEB-55244)

(cherry picked from commit 28be1e7cc7f67a4283ebc4fa741cc3b1319a5f72)

IJ-CR-22521

GitOrigin-RevId: 89ac473476958ee4afc4c464d32d2ea6b0e2fe50
This commit is contained in:
Sergey Simonchik
2022-03-28 21:01:06 +00:00
committed by intellij-monorepo-bot
parent cd217d438e
commit 2f287c8a52
@@ -65,8 +65,7 @@ class JsonSchemaStatusWidget extends EditorBasedStatusBarPopup {
private final AtomicReference<Pair<VirtualFile, Boolean>> mySuppressInfoRef = new AtomicReference<>();
private volatile VirtualFile myLastUpdatedFile;
private volatile WidgetState mySchemaWidgetState;
private volatile Pair<WidgetState, VirtualFile> 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<WidgetState, VirtualFile> 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<VirtualFile, Boolean> 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<WidgetState, VirtualFile> 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