diff --git a/build.gradle b/build.gradle index b92e7f57d..be9822d21 100644 --- a/build.gradle +++ b/build.gradle @@ -140,7 +140,7 @@ dependencies { 'io.fabric8:openshift-client:6.12.0', 'org.apache.commons:commons-compress:1.26.1', 'org.apache.commons:commons-exec:1.4.0', - 'com.redhat.devtools.intellij:intellij-common:1.9.5', + 'com.redhat.devtools.intellij:intellij-common:1.9.6-SNAPSHOT', 'io.jsonwebtoken:jjwt-impl:0.12.5', 'io.jsonwebtoken:jjwt-jackson:0.12.5', 'org.keycloak:keycloak-installed-adapter:24.0.2', @@ -150,7 +150,7 @@ dependencies { 'org.junit.platform:junit-platform-launcher:1.10.2', 'org.mockito:mockito-core:5.11.0', 'org.easytesting:fest-assert:1.4', - 'com.redhat.devtools.intellij:intellij-common:1.9.5:test', + 'com.redhat.devtools.intellij:intellij-common:1.9.6-SNAPSHOT:test', 'org.awaitility:awaitility:4.2.1', 'org.mock-server:mockserver-client-java:5.15.0', 'org.mock-server:mockserver-netty:5.15.0', diff --git a/src/it/java/org/jboss/tools/intellij/openshift/test/ui/annotations/UITest.java b/src/it/java/org/jboss/tools/intellij/openshift/test/ui/annotations/UITest.java index c73130532..a637a52d7 100644 --- a/src/it/java/org/jboss/tools/intellij/openshift/test/ui/annotations/UITest.java +++ b/src/it/java/org/jboss/tools/intellij/openshift/test/ui/annotations/UITest.java @@ -10,12 +10,12 @@ ******************************************************************************/ package org.jboss.tools.intellij.openshift.test.ui.annotations; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import org.junit.jupiter.api.Tag; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; - -import org.junit.jupiter.api.Tag; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** * @author Ondrej Dockal diff --git a/src/it/java/org/jboss/tools/intellij/openshift/test/ui/common/ImportProjectFromVersionControlFixture.java b/src/it/java/org/jboss/tools/intellij/openshift/test/ui/common/ImportProjectFromVersionControlFixture.java index 4c8f9c5b4..d97babb2b 100644 --- a/src/it/java/org/jboss/tools/intellij/openshift/test/ui/common/ImportProjectFromVersionControlFixture.java +++ b/src/it/java/org/jboss/tools/intellij/openshift/test/ui/common/ImportProjectFromVersionControlFixture.java @@ -18,7 +18,9 @@ import com.intellij.remoterobot.fixtures.FixtureName; import com.intellij.remoterobot.fixtures.JTextFieldFixture; import org.jetbrains.annotations.NotNull; + import java.time.Duration; + import static com.intellij.remoterobot.search.locators.Locators.byXpath; /** diff --git a/src/it/java/org/jboss/tools/intellij/openshift/test/ui/common/ProjectTreeFixture.java b/src/it/java/org/jboss/tools/intellij/openshift/test/ui/common/ProjectTreeFixture.java index 8cc9c8ccc..c1b5cd6a6 100644 --- a/src/it/java/org/jboss/tools/intellij/openshift/test/ui/common/ProjectTreeFixture.java +++ b/src/it/java/org/jboss/tools/intellij/openshift/test/ui/common/ProjectTreeFixture.java @@ -17,7 +17,9 @@ import com.intellij.remoterobot.fixtures.FixtureName; import com.intellij.remoterobot.fixtures.JTreeFixture; import org.jetbrains.annotations.NotNull; + import java.time.Duration; + import static com.intellij.remoterobot.search.locators.Locators.byXpath; import static com.intellij.remoterobot.utils.RepeatUtilsKt.waitFor; diff --git a/src/it/java/org/jboss/tools/intellij/openshift/test/ui/common/WelcomeDialogFixture.java b/src/it/java/org/jboss/tools/intellij/openshift/test/ui/common/WelcomeDialogFixture.java index 5f905d3c9..93cff2b4e 100644 --- a/src/it/java/org/jboss/tools/intellij/openshift/test/ui/common/WelcomeDialogFixture.java +++ b/src/it/java/org/jboss/tools/intellij/openshift/test/ui/common/WelcomeDialogFixture.java @@ -14,10 +14,12 @@ import com.intellij.remoterobot.data.RemoteComponent; import com.intellij.remoterobot.fixtures.ComponentFixture; import com.intellij.remoterobot.fixtures.ContainerFixture; -import org.jetbrains.annotations.NotNull; import com.intellij.remoterobot.fixtures.DefaultXpath; import com.intellij.remoterobot.fixtures.FixtureName; +import org.jetbrains.annotations.NotNull; + import java.time.Duration; + import static com.intellij.remoterobot.search.locators.Locators.byXpath; /** diff --git a/src/it/java/org/jboss/tools/intellij/openshift/test/ui/views/GettingStartedView.java b/src/it/java/org/jboss/tools/intellij/openshift/test/ui/views/GettingStartedView.java index c60ca3f58..fee9798f9 100644 --- a/src/it/java/org/jboss/tools/intellij/openshift/test/ui/views/GettingStartedView.java +++ b/src/it/java/org/jboss/tools/intellij/openshift/test/ui/views/GettingStartedView.java @@ -12,7 +12,11 @@ import com.intellij.remoterobot.RemoteRobot; import com.intellij.remoterobot.data.RemoteComponent; -import com.intellij.remoterobot.fixtures.*; +import com.intellij.remoterobot.fixtures.ComponentFixture; +import com.intellij.remoterobot.fixtures.ContainerFixture; +import com.intellij.remoterobot.fixtures.DefaultXpath; +import com.intellij.remoterobot.fixtures.FixtureName; +import com.intellij.remoterobot.fixtures.JTreeFixture; import com.intellij.remoterobot.search.locators.Locator; import com.intellij.remoterobot.utils.Keyboard; import com.intellij.remoterobot.utils.WaitForConditionTimeoutException; diff --git a/src/main/java/org/jboss/tools/intellij/openshift/actions/helm/AddHelmRepoAction.java b/src/main/java/org/jboss/tools/intellij/openshift/actions/helm/AddHelmRepoAction.java new file mode 100644 index 000000000..fe70f8bd2 --- /dev/null +++ b/src/main/java/org/jboss/tools/intellij/openshift/actions/helm/AddHelmRepoAction.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2023 Red Hat, Inc. + * Distributed under license by Red Hat, Inc. All rights reserved. + * This program is made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v20.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + ******************************************************************************/ +package org.jboss.tools.intellij.openshift.actions.helm; + +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.project.Project; +import com.redhat.devtools.intellij.common.utils.ApplicationUtils; +import com.redhat.devtools.intellij.common.utils.SwingUtils; +import java.awt.Point; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; +import org.jboss.tools.intellij.openshift.actions.HelmAction; +import org.jboss.tools.intellij.openshift.telemetry.TelemetryService; +import org.jboss.tools.intellij.openshift.tree.application.HelmRepositoriesNode; +import org.jboss.tools.intellij.openshift.ui.helm.AddHelmRepoDialog; +import org.jboss.tools.intellij.openshift.utils.helm.Helm; +import org.jboss.tools.intellij.openshift.utils.helm.HelmRepository; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class AddHelmRepoAction extends HelmAction { + + private static final Logger LOGGER = LoggerFactory.getLogger(AddHelmRepoAction.class); + + @Override + public void actionPerformedOnSelectedObject(AnActionEvent anActionEvent, Object selected, @NotNull Helm helm) { + Project project = getEventProject(anActionEvent); + if (!(selected instanceof HelmRepositoriesNode repositoriesNode)) { + return; + } + openAddHelmRepoDialog(repositoriesNode, helm, project, SwingUtils.getMouseLocation(anActionEvent)); + } + + private void openAddHelmRepoDialog(HelmRepositoriesNode repositoriesNode, Helm helm, Project project, Point location) { + CompletableFuture.supplyAsync( + () -> listRepositories(helm), + ApplicationUtils.PLATFORM_EXECUTOR + ).thenAcceptAsync( + repositories -> { + AddHelmRepoDialog dialog = new AddHelmRepoDialog(repositories, repositoriesNode, helm, project, location); + sendTelemetryResults(TelemetryService.TelemetryResult.SUCCESS); + dialog.show(); + }, + ApplicationUtils.UI_EXECUTOR + ); + } + + private Collection listRepositories(Helm helm) { + try { + return helm.listRepos(); + } catch (IOException e) { + LOGGER.warn("Could not list helm repositories", e); + return Collections.emptyList(); + } + } + + @Override + public String getTelemetryActionName() { + return "helm-add repo"; + } + + @Override + public boolean isVisible(Object selected) { + return selected instanceof HelmRepositoriesNode; + } +} diff --git a/src/main/java/org/jboss/tools/intellij/openshift/actions/helm/OpenHelmChartsAction.java b/src/main/java/org/jboss/tools/intellij/openshift/actions/helm/OpenHelmChartsAction.java index 97cb2f471..345eb4e16 100644 --- a/src/main/java/org/jboss/tools/intellij/openshift/actions/helm/OpenHelmChartsAction.java +++ b/src/main/java/org/jboss/tools/intellij/openshift/actions/helm/OpenHelmChartsAction.java @@ -13,10 +13,10 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.project.Project; import org.jboss.tools.intellij.openshift.actions.HelmAction; +import org.jboss.tools.intellij.openshift.actions.NodeUtils; import org.jboss.tools.intellij.openshift.telemetry.TelemetryService; import org.jboss.tools.intellij.openshift.tree.application.ApplicationsRootNode; import org.jboss.tools.intellij.openshift.tree.application.NamespaceNode; -import org.jboss.tools.intellij.openshift.tree.application.ParentableNode; import org.jboss.tools.intellij.openshift.ui.helm.ChartsDialog; import org.jboss.tools.intellij.openshift.utils.helm.Helm; import org.jboss.tools.intellij.openshift.utils.odo.Odo; @@ -27,11 +27,10 @@ public class OpenHelmChartsAction extends HelmAction { @Override public void actionPerformedOnSelectedObject(AnActionEvent anActionEvent, Object selected, @NotNull Helm helm) { Project project = getEventProject(anActionEvent); - ParentableNode parentableNode = ((ParentableNode) selected); - if (parentableNode == null) { + ApplicationsRootNode rootNode = NodeUtils.getRoot(selected); + if (rootNode == null) { return; } - ApplicationsRootNode rootNode = parentableNode.getRoot(); Odo odo = rootNode.getOdo().getNow(null); if (odo == null) { return; diff --git a/src/main/java/org/jboss/tools/intellij/openshift/ui/SwingUtils.java b/src/main/java/org/jboss/tools/intellij/openshift/ui/SwingUtils.java index 33cf1019b..c10c1b4ef 100644 --- a/src/main/java/org/jboss/tools/intellij/openshift/ui/SwingUtils.java +++ b/src/main/java/org/jboss/tools/intellij/openshift/ui/SwingUtils.java @@ -10,33 +10,15 @@ ******************************************************************************/ package org.jboss.tools.intellij.openshift.ui; -import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.wm.impl.IdeGlassPaneEx; import com.intellij.ui.JBColor; import com.intellij.ui.SizedIcon; -import com.intellij.ui.WindowMoveListener; -import com.intellij.ui.WindowResizeListener; import com.intellij.ui.components.JBScrollPane; import com.intellij.ui.scale.JBUIScale; import com.intellij.ui.table.JBTable; import com.intellij.util.containers.JBIterable; import com.intellij.util.ui.JBFont; -import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; -import org.jetbrains.annotations.NotNull; - -import javax.swing.AbstractButton; -import javax.swing.DefaultCellEditor; -import javax.swing.Icon; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JRootPane; -import javax.swing.JTable; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableCellEditor; -import javax.swing.text.JTextComponent; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; @@ -47,6 +29,16 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; +import javax.swing.AbstractButton; +import javax.swing.DefaultCellEditor; +import javax.swing.Icon; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableCellEditor; +import javax.swing.text.JTextComponent; +import org.jetbrains.annotations.NotNull; public class SwingUtils { @@ -136,19 +128,6 @@ private static JBIterable focusableComponents(@NotNull Component comp .filter(c -> c instanceof JComboBox || c instanceof AbstractButton || c instanceof JTextComponent); } - public static void setGlassPaneResizable(JRootPane rootPane, Disposable disposable) { - WindowResizeListener resizeListener = new WindowResizeListener(rootPane, JBUI.insets(10), null); - IdeGlassPaneEx glassPane = (IdeGlassPaneEx) rootPane.getGlassPane(); - glassPane.addMousePreprocessor(resizeListener, disposable); - glassPane.addMouseMotionPreprocessor(resizeListener, disposable); - } - - public static void setMovable(JRootPane rootPane, JComponent... movableComponents) { - WindowMoveListener windowMoveListener = new WindowMoveListener(rootPane); - Stream.of(movableComponents).forEach( - component -> component.addMouseListener(windowMoveListener)); - } - public static Point locationOrMouseLocation(Point location) { if (location == null) { location = MouseInfo.getPointerInfo().getLocation(); diff --git a/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/AddHelmRepoDialog.java b/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/AddHelmRepoDialog.java new file mode 100644 index 000000000..4383e5a0a --- /dev/null +++ b/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/AddHelmRepoDialog.java @@ -0,0 +1,268 @@ +/******************************************************************************* + * Copyright (c) 2023 Red Hat, Inc. + * Distributed under license by Red Hat, Inc. All rights reserved. + * This program is made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v20.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + ******************************************************************************/ +package org.jboss.tools.intellij.openshift.ui.helm; + +import com.intellij.icons.AllIcons; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.Task; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogPanel; +import com.intellij.openapi.ui.ValidationInfo; +import com.intellij.openapi.ui.validation.DialogValidation; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.wm.IdeFocusManager; +import com.intellij.ui.components.JBLabel; +import com.intellij.ui.components.JBTextField; +import com.redhat.devtools.intellij.common.ui.UndecoratedDialog; +import java.awt.Point; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.IOException; +import java.net.URI; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.swing.JComponent; +import net.miginfocom.swing.MigLayout; +import org.jboss.tools.intellij.openshift.actions.NodeUtils; +import org.jboss.tools.intellij.openshift.actions.NotificationUtils; +import org.jboss.tools.intellij.openshift.tree.application.HelmRepositoriesNode; +import org.jboss.tools.intellij.openshift.utils.helm.Helm; +import org.jboss.tools.intellij.openshift.utils.helm.HelmRepository; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.jboss.tools.intellij.openshift.ui.SwingUtils.setBold; + +public class AddHelmRepoDialog extends UndecoratedDialog { + + private static final Logger LOGGER = LoggerFactory.getLogger(AddHelmRepoDialog.class); + + private final Collection existingRepositories; + private final HelmRepositoriesNode repositoriesNode; + private final Helm helm; + private final Project project; + private final Point location; + private JBLabel title; + + private boolean nameManuallyModified = false; + private JBTextField nameText; + private JBTextField urlText; + private JBTextField flagsText; + + public AddHelmRepoDialog(Collection repositories, HelmRepositoriesNode repositoriesNode, Helm helm, Project project, Point location) { + super(project, null, false, IdeModalityType.MODELESS, true); + this.existingRepositories = repositories; + this.repositoriesNode = repositoriesNode; + this.helm = helm; + this.project = project; + this.location = location; + init(); + } + + @Override + protected void init() { + super.init(); + + setOKButtonText("Add"); + setGlassPaneResizable(); + setMovableUsing(title); + if (location != null) { + setLocation(location); + } + registerEscapeShortcut(e -> closeImmediately()); + } + + @Override + protected @Nullable JComponent createCenterPanel() { + DialogPanel panel = new DialogPanel(new MigLayout( + "flowx, ins 4, gap 4, fillx, filly, hidemode 3", + "[left][300:pref][right]")); + Map> validators = new HashMap<>(); + panel.setValidationsOnInput(validators); + panel.setValidationsOnApply(validators); + + this.title = new JBLabel("Add repository"); + setBold(title); + panel.add(title, "spanx 2, gap 0 0 0 14"); + + JBLabel closeIcon = new JBLabel(); + closeIcon.setIcon(AllIcons.Windows.CloseSmall); + closeIcon.addMouseListener(onClose()); + panel.add(closeIcon, "aligny top, wrap"); + + JBLabel nameLabel = new JBLabel("Name:"); + panel.add(nameLabel); + this.nameText = new JBTextField(); + panel.add(nameText, "growx, spanx 2, wrap"); + validators.put(nameText, Collections.singletonList(validateName(nameText))); + nameText.addKeyListener(onKeyInName()); + + JBLabel urlLabel = new JBLabel("URL:"); + panel.add(urlLabel); + this.urlText = new JBTextField(); + panel.add(urlText, "growx, spanx 2, wrap"); + validators.put(urlText, Collections.singletonList(validateURL(urlText))); + urlText.addKeyListener(onKeyInUrl(nameText, urlText)); + + JBLabel flagsLabel = new JBLabel("Flags:"); + panel.add(flagsLabel); + this.flagsText = new JBTextField(); + panel.add(flagsText, "growx, spanx 2, wrap"); + flagsText.addKeyListener(onKeyInFlags()); + + initValidation(); + panel.validateAll(); + IdeFocusManager.getInstance(null).requestFocus(urlText, true); + return panel; + } + + private KeyListener onKeyInUrl(JBTextField nameText, JBTextField urlTextField) { + return new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + String host = urlTextField.getText(); + if (!StringUtil.isEmptyOrSpaces(host) + && !nameManuallyModified) { + nameText.setText(getName(host)); + nameManuallyModified = false; + } + doOkOnEnterKey(e); + super.keyReleased(e); + } + }; + } + + private KeyListener onKeyInName() { + return new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + nameManuallyModified = true; + doOkOnEnterKey(e); + } + }; + } + + private KeyListener onKeyInFlags() { + return new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + doOkOnEnterKey(e); + } + }; + } + + private void doOkOnEnterKey(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + doOKAction(); + } + } + + @NotNull + private DialogValidation validateName(JBTextField textField) { + return () -> { + String name = textField.getText(); + if (StringUtil.isEmptyOrSpaces(name)) { + return null; + } + if (name.contains("/")) { + return new ValidationInfo("Name must not contain '/'", textField); + } else if (existingRepositories.stream().anyMatch( + repository -> repository.getName().equals(name))) { + return new ValidationInfo("Repository with this name already exists", textField); + } + return null; + }; + } + + @NotNull + private DialogValidation validateURL(JBTextField textField) { + return () -> { + String url = textField.getText(); + if (url == null) { + return null; + } + String host = com.redhat.devtools.intellij.common.utils.UrlUtils.getHost(url); + if (host == null) { + return new ValidationInfo("Invalid URL", textField); + } + return null; + }; + } + + private String getName(String url) { + try { + URI uri = URI.create(url); + String host = uri.getHost(); + if (StringUtil.isEmptyOrSpaces(host)) { + return null; + } + String path = uri.getPath(); + if (StringUtil.isEmptyOrSpaces(path)) { + return host; + } else { + // "https://docs.wildfly.org/charts/wildfly-charts/ -> docs.wildfly.org-charts-wildfly-charts + if (path.endsWith("/")) { + path = path.substring(0, path.length() - 1); + } + String appendix = path + .replaceAll("/", "-"); + return host + appendix; + } + } catch (IllegalArgumentException e) { + return null; + } + + } + + private MouseAdapter onClose() { + return new MouseAdapter() { + @Override + public void mouseReleased(MouseEvent e) { + close(0); + } + }; + } + + @Override + protected void doOKAction() { + addRepo(nameText.getText(), urlText.getText(), flagsText.getText(), helm); + super.doOKAction(); + } + + private void addRepo(String name, String url, String flags, Helm helm) { + if (StringUtil.isEmptyOrSpaces(url) + || StringUtil.isEmptyOrSpaces(name)) { + return; + } + + ProgressManager.getInstance().run(new Task.Backgroundable(project, "Adding helm repo " + name, true) { + @Override + public void run(@NotNull ProgressIndicator indicator) { + try { + helm.addRepo(name, url, StringUtil.isEmptyOrSpaces(flags)? null : flags); + NodeUtils.fireModified(repositoriesNode); + } catch (IOException e) { + NotificationUtils.notifyError("Could not add helm repo " + name, e.getMessage()); + } + } + }); + } + +} diff --git a/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/ChartIcons.java b/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/ChartIcons.java index 43afa2bbb..0a7e38062 100644 --- a/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/ChartIcons.java +++ b/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/ChartIcons.java @@ -13,7 +13,7 @@ import com.intellij.ui.IconManager; import org.jboss.tools.intellij.openshift.utils.helm.ChartRelease; -import javax.swing.Icon; +import javax.swing.*; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; diff --git a/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/ChartPanels.java b/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/ChartPanels.java index e3a510eeb..a297cb568 100644 --- a/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/ChartPanels.java +++ b/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/ChartPanels.java @@ -17,8 +17,8 @@ import org.jboss.tools.intellij.openshift.utils.helm.Helm; import org.jboss.tools.intellij.openshift.utils.odo.Odo; -import javax.swing.JComponent; -import java.awt.Component; +import javax.swing.*; +import java.awt.*; import java.util.stream.Stream; public class ChartPanels extends MultiPanel { diff --git a/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/ChartsDialog.java b/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/ChartsDialog.java index 69fa8ac33..f2153683c 100644 --- a/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/ChartsDialog.java +++ b/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/ChartsDialog.java @@ -12,16 +12,10 @@ import com.intellij.find.SearchTextArea; import com.intellij.icons.AllIcons; -import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.CommonShortcuts; -import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.OnePixelDivider; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.ui.OnePixelSplitter; -import com.intellij.ui.PopupBorder; import com.intellij.ui.components.JBLabel; import com.intellij.ui.components.JBPanel; import com.intellij.ui.components.JBScrollPane; @@ -29,6 +23,22 @@ import com.intellij.ui.render.RenderingUtil; import com.intellij.ui.table.JBTable; import com.intellij.util.ui.JBUI; +import com.redhat.devtools.intellij.common.ui.UndecoratedDialog; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; +import javax.swing.ImageIcon; +import javax.swing.JComponent; +import javax.swing.JTable; +import javax.swing.JTextArea; +import javax.swing.border.Border; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.DefaultTableModel; import net.miginfocom.swing.MigLayout; import org.jboss.tools.intellij.openshift.tree.application.ApplicationsRootNode; import org.jboss.tools.intellij.openshift.ui.StatusIcon; @@ -41,31 +51,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.swing.ImageIcon; -import javax.swing.JComponent; -import javax.swing.JRootPane; -import javax.swing.JTable; -import javax.swing.JTextArea; -import javax.swing.RootPaneContainer; -import javax.swing.border.Border; -import javax.swing.event.ListSelectionListener; -import javax.swing.table.DefaultTableModel; -import java.awt.Window; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.function.Supplier; - import static org.jboss.tools.intellij.openshift.ui.SwingUtils.EXECUTOR_BACKGROUND; import static org.jboss.tools.intellij.openshift.ui.SwingUtils.EXECUTOR_UI; import static org.jboss.tools.intellij.openshift.ui.SwingUtils.setBold; import static org.jboss.tools.intellij.openshift.ui.helm.ChartVersions.toChartVersions; -public class ChartsDialog extends DialogWrapper { +public class ChartsDialog extends UndecoratedDialog { private static final Logger LOGGER = LoggerFactory.getLogger(ChartsDialog.class); @@ -93,32 +84,15 @@ public ChartsDialog(ApplicationsRootNode rootNode, Helm helm, Odo odo, Project p protected void init() { super.init(); setUndecorated(true); - Window dialogWindow = getPeer().getWindow(); - JRootPane rootPane = ((RootPaneContainer) dialogWindow).getRootPane(); - registerShortcuts(rootPane); - setBorders(rootPane); - SwingUtils.setGlassPaneResizable(getPeer().getRootPane(), getDisposable()); - SwingUtils.setMovable(getRootPane(), title, statusIcon.get()); + registerEscapeShortcut(e -> closeImmediately()); + setGlassPaneResizable(); + setMovableUsing(title, statusIcon.get()); setupTable(chartsTable, chartsTableModel, statusIcon) .thenCompose((Void) -> addDefaultRepo(helm)) .thenCompose((Void) -> load(chartsTable, chartsTableModel, statusIcon, helm)); } - private static void setBorders(JRootPane rootPane) { - rootPane.setBorder(PopupBorder.Factory.create(true, true)); - rootPane.setWindowDecorationStyle(JRootPane.NONE); - } - - private void registerShortcuts(JRootPane rootPane) { - AnAction escape = ActionManager.getInstance().getAction("EditorEscape"); - DumbAwareAction.create(e -> closeImmediately()) - .registerCustomShortcutSet( - escape == null ? CommonShortcuts.ESCAPE : escape.getShortcutSet(), - rootPane, - myDisposable); - } - @Override protected @Nullable JComponent createCenterPanel() { JBPanel panel = new JBPanel<>(new MigLayout( @@ -242,12 +216,6 @@ private CompletableFuture load( }, EXECUTOR_UI); } - private void closeImmediately() { - if (isVisible()) { - doCancelAction(); - } - } - private static Border createSearchTextBorders() { return JBUI.Borders.compound( JBUI.Borders.customLine(JBUI.CurrentTheme.BigPopup.searchFieldBorderColor(), 1, 0, 1, 0), diff --git a/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/DetailsPanel.java b/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/DetailsPanel.java index be04e8f46..e5950a199 100644 --- a/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/DetailsPanel.java +++ b/src/main/java/org/jboss/tools/intellij/openshift/ui/helm/DetailsPanel.java @@ -18,8 +18,7 @@ import net.miginfocom.swing.MigLayout; import org.jboss.tools.intellij.openshift.ui.SwingUtils; -import javax.swing.JButton; -import javax.swing.JLabel; +import javax.swing.*; import java.awt.event.ActionEvent; class DetailsPanel extends JBPanel implements ChartPanel, Disposable { diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index bd9b4561a..edcd78ec3 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -334,6 +334,7 @@ +