platform ui: load/unload a module by double click (IDEA-176860)

This commit is contained in:
nik
2017-09-11 14:38:59 +02:00
parent 4e0c088714
commit 4934b42286
@@ -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<ModuleDescription>, availableTargetModules: List<ModuleDescription>,
dependenciesGraph: Graph<ModuleDescription>,
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<ModuleDescription> {
val modules = ArrayList<ModuleDescription>()
TreeUtil.traverse(node, { node ->