From ee504a7c931c8b58b4bd53db548f6f877ed5c237 Mon Sep 17 00:00:00 2001 From: Alexandr Evstigneev Date: Tue, 13 Sep 2016 09:33:17 +0300 Subject: [PATCH] configuration ui: implemented possibility to add a project-wide settings to ModuleAwareProjectConfigurable (cherry picked from commit 06be44a) IDEA-CR-13744 --- .../ModuleAwareProjectConfigurable.java | 75 +++++++++++++++++-- 1 file changed, 67 insertions(+), 8 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/ModuleAwareProjectConfigurable.java b/platform/lang-impl/src/com/intellij/application/options/ModuleAwareProjectConfigurable.java index be7e3b84a59e..00c5d804c597 100644 --- a/platform/lang-impl/src/com/intellij/application/options/ModuleAwareProjectConfigurable.java +++ b/platform/lang-impl/src/com/intellij/application/options/ModuleAwareProjectConfigurable.java @@ -22,7 +22,6 @@ import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.options.UnnamedConfigurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Splitter; -import com.intellij.openapi.util.Condition; import com.intellij.platform.ModuleAttachProcessor; import com.intellij.ui.CollectionListModel; import com.intellij.ui.ListSpeedSearch; @@ -52,6 +51,7 @@ public abstract class ModuleAwareProjectConfigurable myModuleConfigurables = new HashMap<>(); + private final static String ourProjectItemKey = "thisisnotthemoduleyouarelookingfor"; public ModuleAwareProjectConfigurable(@NotNull Project project, String displayName, String helpTopic) { myProject = project; @@ -85,29 +85,56 @@ public abstract class ModuleAwareProjectConfigurable modules = ContainerUtil.filter(ModuleAttachProcessor.getSortedModules(myProject), module -> isSuitableForModule(module)); - if (modules.size() == 1) { + + final T projectConfigurable = createProjectConfigurable(); + + if (modules.size() == 1 && projectConfigurable == null) { Module module = modules.get(0); final T configurable = createModuleConfigurable(module); myModuleConfigurables.put(module, configurable); return configurable.createComponent(); } final Splitter splitter = new Splitter(false, 0.25f); - final JBList moduleList = new JBList(new CollectionListModel<>(modules)); + CollectionListModel listDataModel = new CollectionListModel<>(modules); + final JBList moduleList = new JBList(listDataModel); new ListSpeedSearch(moduleList, new Function() { @Override public String fun(Object o) { - if (o instanceof Module) { + if (o == null) { + return getProjectConfigurableItemName(); + } + else if (o instanceof Module) { return ((Module)o).getName(); } return null; } }); moduleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - moduleList.setCellRenderer(new ModuleListCellRenderer()); + moduleList.setCellRenderer(new ModuleListCellRenderer() { + @Override + public void customize(JList list, Module module, int index, boolean selected, boolean hasFocus) { + if (module == null) { + setText(getProjectConfigurableItemName()); + setIcon(getProjectConfigurableItemIcon()); + } + else { + super.customize(list, module, index, selected, hasFocus); + } + } + }); splitter.setFirstComponent(new JBScrollPane(moduleList)); final CardLayout layout = new CardLayout(); final JPanel cardPanel = new JPanel(layout); splitter.setSecondComponent(cardPanel); + + + if (projectConfigurable != null) { + myModuleConfigurables.put(null, projectConfigurable); + final JComponent component = projectConfigurable.createComponent(); + cardPanel.add(component, ourProjectItemKey); + listDataModel.add(0, null); + } + for (Module module : modules) { final T configurable = createModuleConfigurable(module); myModuleConfigurables.put(module, configurable); @@ -118,12 +145,14 @@ public abstract class ModuleAwareProjectConfigurable 0) { + + if (moduleList.getItemsCount() > 0) { moduleList.setSelectedIndex(0); - layout.show(cardPanel, modules.get(0).getName()); + Module module = listDataModel.getElementAt(0); + layout.show(cardPanel, module == null ? ourProjectItemKey : module.getName()); } return splitter; } @@ -133,6 +162,36 @@ public abstract class ModuleAwareProjectConfigurable