configuration ui: implemented possibility to add a project-wide settings to ModuleAwa...
authorAlexandr Evstigneev <alexandr.evstigneev@jetbrains.com>
Tue, 13 Sep 2016 06:33:17 +0000 (09:33 +0300)
committerAlexandr Evstigneev <Alexandr.Evstigneev@jetbrains.com>
Thu, 17 Nov 2016 12:45:33 +0000 (15:45 +0300)
(cherry picked from commit 06be44a)

IDEA-CR-13744

platform/lang-impl/src/com/intellij/application/options/ModuleAwareProjectConfigurable.java

index be7e3b84a59e4dc36ce3aa6e167e7bd5c14fe1a3..00c5d804c597b565957a757ab83e20af0b70b68a 100644 (file)
@@ -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<T extends UnnamedConfigurab
   private final String myDisplayName;
   private final String myHelpTopic;
   private final Map<Module, T> 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<T extends UnnamedConfigurab
     }
     final List<Module> 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<Module> listDataModel = new CollectionListModel<>(modules);
+    final JBList moduleList = new JBList(listDataModel);
     new ListSpeedSearch(moduleList, new Function<Object, String>() {
       @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<T extends UnnamedConfigurab
       @Override
       public void valueChanged(ListSelectionEvent e) {
         final Module value = (Module)moduleList.getSelectedValue();
-        layout.show(cardPanel, value.getName());
+        layout.show(cardPanel, value == null ? ourProjectItemKey : value.getName());
       }
     });
-    if (modules.size() > 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<T extends UnnamedConfigurab
     return null;
   }
 
+  /**
+   * This configurable is for project-wide settings
+   *
+   * @return configurable or null if none
+   */
+  @Nullable
+  protected T createProjectConfigurable() {
+    return null;
+  }
+
+  /**
+   * Name for project-wide settings in modules list
+   *
+   * @return
+   */
+  @NotNull
+  protected String getProjectConfigurableItemName() {
+    return "Common";
+  }
+
+  /**
+   * Icon for project-wide sttings in modules list
+   *
+   * @return
+   */
+  @Nullable
+  protected Icon getProjectConfigurableItemIcon() {
+    return null;
+  }
+
   @NotNull
   protected abstract T createModuleConfigurable(Module module);