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;
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;
}
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);
@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;
}
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);