diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/module/QuarkusExtensionsStep.java b/src/main/java/com/redhat/devtools/intellij/quarkus/module/QuarkusExtensionsStep.java index f0ab6da47..7e8c82348 100644 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/module/QuarkusExtensionsStep.java +++ b/src/main/java/com/redhat/devtools/intellij/quarkus/module/QuarkusExtensionsStep.java @@ -39,6 +39,7 @@ import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import java.awt.*; +import java.awt.event.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashSet; @@ -204,6 +205,7 @@ public void hyperlinkUpdate(HyperlinkEvent e) { } } }); + extensionsTree.addCheckboxTreeListener(new CheckboxTreeListener() { @Override public void nodeStateChanged(@NotNull CheckedTreeNode node) { @@ -220,6 +222,57 @@ public void nodeStateChanged(@NotNull CheckedTreeNode node) { selectedExtensions.setModel(new SelectedExtensionsModel(categories)); } }); + + //(Un)Check extension on double-click + extensionsTree.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + TreePath path = extensionsTree.getPathForLocation(e.getX(), e.getY()); + if (path != null && path.getLastPathComponent() instanceof CheckedTreeNode) { + var treeNode = (CheckedTreeNode) path.getLastPathComponent(); + extensionsTree.setNodeState(treeNode, !treeNode.isChecked()); + } + } + } + }); + + //Unselect extensions on double-click + selectedExtensions.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + int selectedIndex = selectedExtensions.getSelectedIndex(); + if (selectedIndex > -1) { + QuarkusExtension extension = selectedExtensions.getModel().getElementAt(selectedIndex); + if (unselectExtension(extensionsTree, extension)) { + // The extensions was not visible in the tree so didn't trigger a selectedExtension model refresh + // so we force it manually + selectedExtensions.setModel(new SelectedExtensionsModel(categories)); + }; + } + } + } + }); + + //Unselect extensions when pressing the DELETE or BACKSPACE key + selectedExtensions.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_DELETE || e.getKeyCode() == KeyEvent.VK_BACK_SPACE) { + boolean requiresModelRefresh = false; + for (QuarkusExtension extension : selectedExtensions.getSelectedValuesList()) { + requiresModelRefresh = unselectExtension(extensionsTree, extension) || requiresModelRefresh; + } + selectedExtensions.clearSelection(); + if (requiresModelRefresh) { + // Some extensions were not visible in the tree so didn't trigger a selectedExtension model refresh + // so we force it manually + selectedExtensions.setModel(new SelectedExtensionsModel(categories)); + } + } + } + }); + extensionsTree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { @@ -228,7 +281,7 @@ public void valueChanged(TreeSelectionEvent e) { if (comp instanceof QuarkusExtension) { StringBuilder builder = new StringBuilder("
" + ((QuarkusExtension) comp).getDescription() + "."); if (StringUtils.isNotBlank(((QuarkusExtension) comp).getGuide())) { - builder.append(" Click to open guide"); + builder.append(" Click to open guide"); } builder.append(""); extensionDetailTextPane.setText(builder.toString()); @@ -274,6 +327,34 @@ private CheckedTreeNode getModel(List