From 4934b42286b22c1d48edfaaa4bf6f07c5c41aea3 Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 11 Sep 2017 14:05:05 +0200 Subject: [PATCH] platform ui: load/unload a module by double click (IDEA-176860) --- .../ConfigureUnloadedModulesDialog.kt | 59 ++++++++++++++----- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ConfigureUnloadedModulesDialog.kt b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ConfigureUnloadedModulesDialog.kt index 6351ad16b075..183479d4d557 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ConfigureUnloadedModulesDialog.kt +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ConfigureUnloadedModulesDialog.kt @@ -33,6 +33,7 @@ import com.intellij.openapi.ui.VerticalFlowLayout import com.intellij.openapi.util.text.NaturalComparator import com.intellij.openapi.wm.IdeFocusManager import com.intellij.ui.ColoredTreeCellRenderer +import com.intellij.ui.DoubleClickListener import com.intellij.ui.TreeSpeedSearch import com.intellij.ui.components.JBLabel import com.intellij.ui.components.JBScrollPane @@ -45,13 +46,13 @@ import java.awt.BorderLayout import java.awt.Dimension import java.awt.GridBagConstraints import java.awt.GridBagLayout +import java.awt.event.MouseEvent import java.util.* import javax.swing.* import javax.swing.tree.DefaultMutableTreeNode import javax.swing.tree.DefaultTreeModel import javax.swing.tree.MutableTreeNode import javax.swing.tree.TreePath -import kotlin.comparisons.compareBy /** * @author nik @@ -98,22 +99,10 @@ class ConfigureUnloadedModulesDialog(private val project: Project, selectedModul val moveAllToUnloadedButton = JButton(ProjectBundle.message("module.unload.all.button.text")) val moveAllToLoadedButton = JButton(ProjectBundle.message("module.load.all.button.text")) moveToUnloadedButton.addActionListener { - val modulesToMove = includeMissingModules(loadedModulesTree.getSelectedModules(), unloadedModulesTree.getAllModules(), - dependentsGraph, - ProjectBundle.message("module.unload.dependents.dialog.title"), - { selectedSize, additionalSize, additionalFirst -> ProjectBundle.message("module.unload.dependents.dialog.text", selectedSize, additionalSize, additionalFirst)}, - ProjectBundle.message("module.unload.with.dependents.button.text"), - ProjectBundle.message("module.unload.without.dependents.button.text")) - moveModules(modulesToMove, loadedModulesTree, unloadedModulesTree) + moveToUnloaded() } moveToLoadedButton.addActionListener { - val modulesToMove = includeMissingModules(unloadedModulesTree.getSelectedModules(), loadedModulesTree.getAllModules(), - GraphAlgorithms.getInstance().invertEdgeDirections(dependentsGraph), - ProjectBundle.message("module.load.dependencies.dialog.title"), - { selectedSize, additionalSize, additionalFirst -> ProjectBundle.message("module.load.dependencies.dialog.text", selectedSize, additionalSize, additionalFirst)}, - ProjectBundle.message("module.load.with.dependencies.button.text"), - ProjectBundle.message("module.load.without.dependencies.button.text")) - moveModules(modulesToMove, unloadedModulesTree, loadedModulesTree) + moveToLoaded() } moveAllToUnloadedButton.addActionListener { moveAllNodes(loadedModulesTree, unloadedModulesTree) @@ -125,6 +114,8 @@ class ConfigureUnloadedModulesDialog(private val project: Project, selectedModul buttonsPanel.add(moveToLoadedButton) buttonsPanel.add(moveAllToUnloadedButton) buttonsPanel.add(moveAllToLoadedButton) + loadedModulesTree.installDoubleClickListener(this::moveToUnloaded) + unloadedModulesTree.installDoubleClickListener(this::moveToLoaded) val mainPanel = JPanel(BorderLayout()) val gridBag = GridBag().setDefaultWeightX(0, 0.5).setDefaultWeightX(1, 0.0).setDefaultWeightX(2, 0.5) @@ -143,6 +134,32 @@ class ConfigureUnloadedModulesDialog(private val project: Project, selectedModul return mainPanel } + private fun moveToLoaded() { + val modulesToMove = includeMissingModules(unloadedModulesTree.getSelectedModules(), loadedModulesTree.getAllModules(), + GraphAlgorithms.getInstance().invertEdgeDirections(dependentsGraph), + ProjectBundle.message("module.load.dependencies.dialog.title"), + { selectedSize, additionalSize, additionalFirst -> + ProjectBundle.message("module.load.dependencies.dialog.text", selectedSize, additionalSize, + additionalFirst) + }, + ProjectBundle.message("module.load.with.dependencies.button.text"), + ProjectBundle.message("module.load.without.dependencies.button.text")) + moveModules(modulesToMove, unloadedModulesTree, loadedModulesTree) + } + + private fun moveToUnloaded() { + val modulesToMove = includeMissingModules(loadedModulesTree.getSelectedModules(), unloadedModulesTree.getAllModules(), + dependentsGraph, + ProjectBundle.message("module.unload.dependents.dialog.title"), + { selectedSize, additionalSize, additionalFirst -> + ProjectBundle.message("module.unload.dependents.dialog.text", selectedSize, additionalSize, + additionalFirst) + }, + ProjectBundle.message("module.unload.with.dependents.button.text"), + ProjectBundle.message("module.unload.without.dependents.button.text")) + moveModules(modulesToMove, loadedModulesTree, unloadedModulesTree) + } + private fun includeMissingModules(selected: List, availableTargetModules: List, dependenciesGraph: Graph, dialogTitle: String, dialogMessage: (Int, Int, String) -> String, yesButtonText: String, @@ -223,6 +240,18 @@ private class ModuleDescriptionsTree(project: Project) { fun getAllModules() = getAllModulesUnder(root) + fun installDoubleClickListener(action: () -> Unit) { + object : DoubleClickListener() { + override fun onDoubleClick(event: MouseEvent): Boolean { + if (tree.selectionPaths.all { (it?.lastPathComponent as? ModuleDescriptionTreeNode)?.isLeaf == true }) { + action() + return true + } + return false + } + }.installOn(tree) + } + private fun getAllModulesUnder(node: ModuleDescriptionTreeNode): List { val modules = ArrayList() TreeUtil.traverse(node, { node ->