[javafx] Use EditorNotificationPanel in SceneBuilderEditor

#IDEA-358827 Fixed

GitOrigin-RevId: 9b0b8de860491a7f9fc6f043f52dee4b7ec9c9e3
This commit is contained in:
Louis Vignier
2024-09-07 01:05:36 +02:00
committed by intellij-monorepo-bot
parent 9baf611af3
commit c8f3a0af05
2 changed files with 55 additions and 63 deletions

View File

@@ -94,7 +94,7 @@ javafx.root.tag.descriptor.cannot.resolve.class=Cannot resolve class {0}
javafx.scene.builder.editor.download.scene.builder.kit=Download Scene Builder Kit
javafx.scene.builder.editor.download.javafx=Download JavaFX
javafx.scene.builder.editor.failed.to.download.kit.error=Failed to download Scene Builder Kit
javafx.scene.builder.editor.failed.to.open.file.error=Failed to open the file in the Scene Builder.
javafx.scene.builder.editor.failed.to.open.file.error=Failed to open the file in the Scene Builder.
javafx.scene.builder.editor.scene.builder.edit.operation=JavaFX Scene Builder edit operation
javafx.settings.configurable.path.to.scenebuilder=&Path to SceneBuilder:

View File

@@ -1,7 +1,6 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.javaFX.sceneBuilder;
import com.intellij.icons.AllIcons;
import com.intellij.jarRepository.JarRepositoryManager;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
@@ -14,19 +13,20 @@ import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorState;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.ReadonlyStatusHandler;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.HyperlinkLabel;
import com.intellij.ui.EditorNotificationPanel;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.util.download.DownloadableFileDescription;
import com.intellij.ui.SideBorder;
import com.intellij.ui.components.panels.NonOpaquePanel;
import com.intellij.util.download.DownloadableFileService;
import com.intellij.util.download.FileDownloader;
import com.intellij.util.lang.JavaVersion;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -35,8 +35,6 @@ import org.jetbrains.plugins.javaFX.JavaFXBundle;
import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonNames;
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import java.awt.*;
import java.beans.PropertyChangeListener;
import java.io.File;
@@ -62,15 +60,15 @@ public final class SceneBuilderEditor extends UserDataHolderBase implements File
private final CardLayout myLayout = new CardLayout();
private final JPanel myPanel = new JPanel(myLayout);
//private final JPanel myErrorPanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP, 10, 5, true, false));
private final JPanel myErrorPanel = new JPanel(new BorderLayout());
private final HyperlinkLabel myErrorLabel = new HyperlinkLabel();
private final EditorNotificationPanel myErrorNotification = new EditorNotificationPanel(EditorNotificationPanel.Status.Error);
private JTextArea myErrorStack;
private final Document myDocument;
private final ExternalChangeListener myChangeListener;
private SceneBuilder mySceneBuilder;
private NonOpaquePanel myWrapper;
public SceneBuilderEditor(@NotNull Project project, @NotNull VirtualFile file) {
myProject = project;
@@ -83,23 +81,20 @@ public final class SceneBuilderEditor extends UserDataHolderBase implements File
}
private void createErrorPage() {
myErrorLabel.setOpaque(false);
myErrorLabel.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
updateState();
}
});
myErrorStack = new JTextArea(50, 20);
myErrorStack = new JTextArea(1, 20);
myErrorStack.setBorder(JBUI.Borders.empty(UIUtil.LARGE_VGAP, 20));
myErrorStack.setEditable(false);
myErrorPanel.add(myErrorLabel, BorderLayout.NORTH);
myWrapper = new NonOpaquePanel(myErrorNotification);
myWrapper.setBorder(new SideBorder(JBUI.CurrentTheme.Banner.ERROR_BORDER_COLOR, SideBorder.BOTTOM));
myWrapper.setVisible(false);
myErrorPanel.add(myWrapper, BorderLayout.NORTH);
myErrorPanel.add(ScrollPaneFactory.createScrollPane(myErrorStack), BorderLayout.CENTER);
myPanel.add(myErrorPanel);
}
@SuppressWarnings("DialogTitleCapitalization")
private void showErrorPage(Throwable e) {
if (e != null) {
LOG.info(e);
@@ -107,41 +102,43 @@ public final class SceneBuilderEditor extends UserDataHolderBase implements File
removeSceneBuilder();
myWrapper.setVisible(true);
myErrorNotification.clear();
myErrorStack.setText("");
if (JavaVersion.current().feature > 11 &&
e instanceof NoClassDefFoundError &&
!SceneBuilderUtil.getSceneBuilder11Path().toFile().isFile()) {
myErrorLabel.addHyperlinkListener(e1 -> {
DownloadableFileService service = DownloadableFileService.getInstance();
DownloadableFileDescription
description = service.createFileDescription("https://cache-redirector.jetbrains.com/" +
"intellij-dependencies/org/jetbrains/intellij/deps/scenebuilderkit/" +
SceneBuilderUtil.SCENE_BUILDER_VERSION + "/" + SceneBuilderUtil.SCENE_BUILDER_KIT_FULL_NAME,
SceneBuilderUtil.SCENE_BUILDER_KIT_FULL_NAME);
FileDownloader downloader = service.createDownloader(Collections.singletonList(description), "Scene Builder Kit");
try {
Path tempDir = Files.createTempDirectory("" );
myErrorNotification.setText(JavaFXBundle.message("javafx.scene.builder.editor.failed.to.open.file.error"));
myErrorNotification.createActionLabel(
JavaFXBundle.message("javafx.scene.builder.editor.download.scene.builder.kit"),
() -> {
DownloadableFileService service = DownloadableFileService.getInstance();
var description = service.createFileDescription("https://cache-redirector.jetbrains.com/" +
"intellij-dependencies/org/jetbrains/intellij/deps/scenebuilderkit/" +
SceneBuilderUtil.SCENE_BUILDER_VERSION + "/" + SceneBuilderUtil.SCENE_BUILDER_KIT_FULL_NAME, SceneBuilderUtil.SCENE_BUILDER_KIT_FULL_NAME);
FileDownloader downloader = service.createDownloader(Collections.singletonList(description), "Scene Builder Kit");
try {
Path tempDir = Files.createTempDirectory("");
List<Pair<VirtualFile, DownloadableFileDescription>>
list = downloader.downloadWithProgress(tempDir.toString(), myProject, myErrorPanel);
if (list == null || list.isEmpty()) {
myErrorLabel.setHyperlinkText(JavaFXBundle.message("javafx.scene.builder.editor.failed.to.download.kit.error"), "", "");
setErrorIcon();
return;
final var list = downloader.downloadWithProgress(tempDir.toString(), myProject, myErrorPanel);
if (list == null || list.isEmpty()) {
myErrorNotification.clear();
myErrorNotification.setText(JavaFXBundle.message("javafx.scene.builder.editor.failed.to.download.kit.error"));
return;
}
FileUtil.copy(VfsUtilCore.virtualToIoFile(list.get(0).first), SceneBuilderUtil.getSceneBuilder11Path().toFile());
FileUtil.delete(tempDir.toFile());
SceneBuilderUtil.updateLoader();
updateState();
}
catch (IOException e2) {
LOG.warn("Can't download SceneBuilderKit", e2);
}
FileUtil.copy(VfsUtilCore.virtualToIoFile(list.get(0).first), SceneBuilderUtil.getSceneBuilder11Path().toFile());
FileUtil.delete(tempDir.toFile());
SceneBuilderUtil.updateLoader();
updateState();
}
catch (IOException e2) {
LOG.warn("Can't download SceneBuilderKit", e2);
}
});
myErrorLabel.setHyperlinkText(JavaFXBundle.message("javafx.scene.builder.editor.failed.to.open.file.error"),
JavaFXBundle.message("javafx.scene.builder.editor.download.scene.builder.kit"), "");
setErrorIcon();
);
myLayout.show(myPanel, ERROR_CARD);
return;
}
@@ -150,12 +147,12 @@ public final class SceneBuilderEditor extends UserDataHolderBase implements File
Class.forName(JavaFxCommonNames.JAVAFX_SCENE_NODE);
}
catch (ClassNotFoundException exception) {
myErrorLabel.addHyperlinkListener(e1 -> {
downloadJavaFxDependencies();
});
myErrorLabel.setHyperlinkText(JavaFXBundle.message("javafx.scene.builder.editor.failed.to.open.file.error"),
JavaFXBundle.message("javafx.scene.builder.editor.download.javafx"), "");
setErrorIcon();
myErrorNotification.clear();
myErrorNotification.setText(JavaFXBundle.message("javafx.scene.builder.editor.failed.to.open.file.error"));
myErrorNotification.createActionLabel(
JavaFXBundle.message("javafx.scene.builder.editor.download.javafx"),
() -> downloadJavaFxDependencies()
);
myLayout.show(myPanel, ERROR_CARD);
return;
}
@@ -180,17 +177,12 @@ public final class SceneBuilderEditor extends UserDataHolderBase implements File
description = "Unknown error occurred";
}
myErrorLabel.setHyperlinkText(JavaFXBundle.message("javafx.scene.builder.editor.failed.to.open.file.error"), "", "");
setErrorIcon();
myErrorNotification.setText(JavaFXBundle.message("javafx.scene.builder.editor.failed.to.open.file.error"));
myErrorStack.setText(description);
myErrorStack.setVisible(true);
myErrorStack.setRows(description.split("\n").length);
myLayout.show(myPanel, ERROR_CARD);
}
private void setErrorIcon() {
myErrorLabel.setIcon(AllIcons.General.Error);
}
private void downloadJavaFxDependencies() {
for (String coordinate : SceneBuilderUtil.JAVAFX_ARTIFACTS) {
RepositoryLibraryProperties libraryProperties =