diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/actions/AddFacetAction.java b/java/idea-ui/src/com/intellij/facet/impl/ui/actions/AddFacetToModuleAction.java similarity index 87% rename from java/idea-ui/src/com/intellij/facet/impl/ui/actions/AddFacetAction.java rename to java/idea-ui/src/com/intellij/facet/impl/ui/actions/AddFacetToModuleAction.java index 033ca8078519..754d491060ea 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/ui/actions/AddFacetAction.java +++ b/java/idea-ui/src/com/intellij/facet/impl/ui/actions/AddFacetToModuleAction.java @@ -26,19 +26,16 @@ import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable; -import java.util.Arrays; -import java.util.Comparator; - /** * @author nik */ -public class AddFacetAction extends AnAction implements DumbAware { - private static final Logger LOG = Logger.getInstance("#com.intellij.facet.impl.ui.actions.AddFacetAction"); +public class AddFacetToModuleAction extends AnAction implements DumbAware { + private static final Logger LOG = Logger.getInstance("#com.intellij.facet.impl.ui.actions.AddFacetToModuleAction"); private final FacetEditorFacade myEditor; private final Project myProject; private final FacetType myType; - public AddFacetAction(final FacetEditorFacade editor, Project project, final FacetType type) { + private AddFacetToModuleAction(final FacetEditorFacade editor, Project project, final FacetType type) { super(type.getPresentableName(), null, type.getIcon()); myEditor = editor; myProject = project; @@ -95,16 +92,10 @@ public class AddFacetAction extends AnAction implements DumbAware { } public static AnAction[] createAddFacetActions(FacetEditorFacade editor, Project project) { - final FacetType[] types = FacetTypeRegistry.getInstance().getFacetTypes(); - Arrays.sort(types, new Comparator() { - public int compare(final FacetType o1, final FacetType o2) { - return o1.getPresentableName().compareTo(o2.getPresentableName()); - } - }); - + final FacetType[] types = FacetTypeRegistry.getInstance().getSortedFacetTypes(); AnAction[] actions = new AnAction[types.length]; for (int i = 0; i < types.length; i++) { - actions[i] = new AddFacetAction(editor, project, types[i]); + actions[i] = new AddFacetToModuleAction(editor, project, types[i]); } return actions; } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/AddFacetOfTypeAction.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/AddFacetOfTypeAction.java index 41f397ab005a..82a580cfdf52 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/AddFacetOfTypeAction.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/AddFacetOfTypeAction.java @@ -20,8 +20,8 @@ import com.intellij.facet.FacetType; import com.intellij.facet.FacetTypeId; import com.intellij.facet.FacetTypeRegistry; import com.intellij.facet.impl.ProjectFacetsConfigurator; -import com.intellij.facet.impl.invalid.InvalidFacetType; import com.intellij.ide.util.ChooseElementsDialog; +import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.DumbAwareAction; @@ -29,10 +29,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ui.configuration.ChooseModulesDialog; import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable; import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.ui.NamedConfigurable; -import com.intellij.util.PlatformIcons; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.ArrayList; @@ -44,16 +41,18 @@ import java.util.List; * @author nik */ class AddFacetOfTypeAction extends DumbAwareAction { - private final FacetStructureConfigurable myFacetStructureConfigurable; + private final FacetType myFacetType; + private final StructureConfigurableContext myContext; - AddFacetOfTypeAction(FacetStructureConfigurable facetStructureConfigurable) { - super("New Facet", null, PlatformIcons.ADD_ICON); - this.myFacetStructureConfigurable = facetStructureConfigurable; + AddFacetOfTypeAction(final FacetType type, final StructureConfigurableContext context) { + super(type.getPresentableName(), null, type.getIcon()); + myFacetType = type; + myContext = context; } @Override public void actionPerformed(AnActionEvent e) { - final FacetType type = getSelectedType(); + final FacetType type = myFacetType; if (type == null) return; final FacetTypeId underlyingFacetType = type.getUnderlyingFacetType(); @@ -66,10 +65,9 @@ class AddFacetOfTypeAction extends DumbAwareAction { } private void addSubFacet(FacetType type, FacetTypeId underlyingType) { - final StructureConfigurableContext context = myFacetStructureConfigurable.myContext; - final ProjectFacetsConfigurator facetsConfigurator = context.getModulesConfigurator().getFacetsConfigurator(); + final ProjectFacetsConfigurator facetsConfigurator = myContext.getModulesConfigurator().getFacetsConfigurator(); List suitableParents = new ArrayList(); - for (Module module : context.getModules()) { + for (Module module : myContext.getModules()) { if (type.isSuitableModuleType(module.getModuleType())) { suitableParents.addAll(facetsConfigurator.getFacetsByType(module, underlyingType)); } @@ -83,14 +81,14 @@ class AddFacetOfTypeAction extends DumbAwareAction { } } - final Project project = context.getProject(); + final Project project = myContext.getProject(); if (suitableParents.isEmpty()) { final String parentType = FacetTypeRegistry.getInstance().findFacetType(underlyingType).getPresentableName(); Messages.showErrorDialog(project, "No suitable parent " + parentType + " facets found", "Cannot Create " + type.getPresentableName() + " Facet"); return; } - ChooseParentFacetDialog dialog = new ChooseParentFacetDialog(project, suitableParents, "Select Parent Facet", null); + ChooseParentFacetDialog dialog = new ChooseParentFacetDialog(project, suitableParents); dialog.show(); final List chosen = dialog.getChosenElements(); if (!dialog.isOK() || chosen.size() != 1) return; @@ -101,9 +99,8 @@ class AddFacetOfTypeAction extends DumbAwareAction { } private void addFacetToModule(@NotNull FacetType type) { - final StructureConfigurableContext context = myFacetStructureConfigurable.myContext; - final ProjectFacetsConfigurator facetsConfigurator = context.getModulesConfigurator().getFacetsConfigurator(); - List suitableModules = new ArrayList(Arrays.asList(context.getModules())); + final ProjectFacetsConfigurator facetsConfigurator = myContext.getModulesConfigurator().getFacetsConfigurator(); + List suitableModules = new ArrayList(Arrays.asList(myContext.getModules())); final Iterator iterator = suitableModules.iterator(); while (iterator.hasNext()) { Module module = iterator.next(); @@ -111,7 +108,7 @@ class AddFacetOfTypeAction extends DumbAwareAction { iterator.remove(); } } - final Project project = context.getProject(); + final Project project = myContext.getProject(); if (suitableModules.isEmpty()) { Messages.showErrorDialog(project, "No suitable modules for " + type.getPresentableName() + " facet found.", "Cannot Create Facet"); return; @@ -129,27 +126,29 @@ class AddFacetOfTypeAction extends DumbAwareAction { ProjectStructureConfigurable.getInstance(project).select(facet, true); } - @Override - public void update(AnActionEvent e) { - final FacetType type = getSelectedType(); - e.getPresentation().setEnabled(myFacetStructureConfigurable.myContext.getModules().length > 0 && type != null && !(type instanceof InvalidFacetType)); + public static AnAction[] createAddFacetActions(FacetStructureConfigurable configurable) { + final List result = new ArrayList(); + final StructureConfigurableContext context = configurable.myContext; + for (FacetType type : FacetTypeRegistry.getInstance().getSortedFacetTypes()) { + if (hasSuitableModules(context, type)) { + result.add(new AddFacetOfTypeAction(type, context)); + } + } + return result.toArray(new AnAction[result.size()]); } - @Nullable - private FacetType getSelectedType() { - final NamedConfigurable configurable = myFacetStructureConfigurable.getSelectedConfugurable(); - if (configurable instanceof FacetTypeConfigurable) { - return ((FacetTypeConfigurable)configurable).getFacetType(); + private static boolean hasSuitableModules(StructureConfigurableContext context, FacetType type) { + for (Module module : context.getModules()) { + if (type.isSuitableModuleType(module.getModuleType())) { + return true; + } } - else if (configurable instanceof FacetConfigurable) { - return ((FacetConfigurable)configurable).getEditableObject().getType(); - } - return null; + return false; } private static class ChooseParentFacetDialog extends ChooseElementsDialog { - private ChooseParentFacetDialog(Project project, List items, String title, String description) { - super(project, items, title, description, true); + private ChooseParentFacetDialog(Project project, List items) { + super(project, items, "Select Parent Facet", null, true); myChooser.setSingleSelectionMode(); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetStructureConfigurable.java index f8b9ec7d8df7..d39147b99ba8 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetStructureConfigurable.java @@ -36,6 +36,8 @@ import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStr import com.intellij.openapi.ui.DetailsComponent; import com.intellij.openapi.ui.NamedConfigurable; import com.intellij.openapi.util.IconLoader; +import com.intellij.util.ui.tree.TreeUtil; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -52,6 +54,7 @@ public class FacetStructureConfigurable extends BaseStructureConfigurable { private final ModuleManager myModuleManager; private final Map, FacetTypeEditor> myFacetTypeEditors = new HashMap, FacetTypeEditor>(); private MultipleFacetSettingsEditor myCurrentMultipleSettingsEditor; + @NonNls private static final String NO_FRAMEWORKS_NODE = "No facets are configured"; public FacetStructureConfigurable(final Project project, ModuleManager moduleManager) { super(project); @@ -80,15 +83,20 @@ public class FacetStructureConfigurable extends BaseStructureConfigurable { protected void loadTree() { myTree.setRootVisible(false); myTree.setShowsRootHandles(false); + boolean hasFacetTypeNodes = false; for (FacetType facetType : FacetTypeRegistry.getInstance().getFacetTypes()) { - final FacetTypeEditor editor = getOrCreateFacetTypeEditor(facetType); - if (editor.isVisible() || ProjectFacetManager.getInstance(myProject).hasFacets(facetType.getId())) { + if (ProjectFacetManager.getInstance(myProject).hasFacets(facetType.getId())) { + hasFacetTypeNodes = true; addFacetTypeNode(facetType); } } if (!InvalidFacetManager.getInstance(myProject).getInvalidFacets().isEmpty()) { + hasFacetTypeNodes = true; addFacetTypeNode(InvalidFacetType.getInstance()); } + if (!hasFacetTypeNodes) { + addNode(new MyNode(new TextConfigurable(NO_FRAMEWORKS_NODE, NO_FRAMEWORKS_NODE, "Facets", "Press '+' button to add a new facet", null, null)), myRoot); + } addNode(new MyNode(new FrameworkDetectionConfigurable(myProject)), myRoot); } @@ -108,6 +116,11 @@ public class FacetStructureConfigurable extends BaseStructureConfigurable { } private MyNode addFacetTypeNode(FacetType facetType) { + final MyNode noFrameworksNode = findNodeByObject(myRoot, NO_FRAMEWORKS_NODE); + if (noFrameworksNode != null) { + removePaths(TreeUtil.getPathFromRoot(noFrameworksNode)); + } + FacetTypeConfigurable facetTypeConfigurable = new FacetTypeConfigurable(this, facetType); MyNode facetTypeNode = new MyNode(facetTypeConfigurable); addNode(facetTypeNode, myRoot); @@ -167,6 +180,7 @@ public class FacetStructureConfigurable extends BaseStructureConfigurable { public void reset() { super.reset(); myFacetTypeEditors.clear(); + TreeUtil.expandAll(myTree); } @@ -202,7 +216,13 @@ public class FacetStructureConfigurable extends BaseStructureConfigurable { @NotNull protected ArrayList createActions(final boolean fromPopup) { ArrayList actions = new ArrayList(); - actions.add(new AddFacetOfTypeAction(this)); + actions.add(new AbstractAddGroup("Add") { + @NotNull + @Override + public AnAction[] getChildren(@Nullable AnActionEvent e) { + return AddFacetOfTypeAction.createAddFacetActions(FacetStructureConfigurable.this); + } + }); if (fromPopup) { actions.add(new MyNavigateAction()); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetTypeConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetTypeConfigurable.java index 567290019169..88db4c5dfe01 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetTypeConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetTypeConfigurable.java @@ -58,10 +58,6 @@ public class FacetTypeConfigurable extends NamedConfigurable { return myFacetType.getIcon(); } - public FacetType getFacetType() { - return myFacetType; - } - public String getHelpTopic() { final FacetTypeEditor editor = myFacetStructureConfigurable.getFacetTypeEditor(myFacetType); return editor != null ? editor.getHelpTopic() : null; diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetsTreeCellRenderer.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetsTreeCellRenderer.java index 5b89b3904593..deea9427c3b4 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetsTreeCellRenderer.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetsTreeCellRenderer.java @@ -54,7 +54,7 @@ public class FacetsTreeCellRenderer extends GroupedElementsRenderer.Tree impleme final NamedConfigurable configurable = node.getConfigurable(); if (configurable != null) { final Icon icon = configurable.getIcon(expanded); - final boolean showSeparator = icon == null; + final boolean showSeparator = configurable instanceof FrameworkDetectionConfigurable; int width = -1; if (showSeparator) { final int treeWidth = tree.getSize().width; diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java index 17a90b1d4328..abc1e910a79d 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java @@ -19,7 +19,7 @@ package com.intellij.openapi.roots.ui.configuration.projectRoot; import com.intellij.CommonBundle; import com.intellij.facet.Facet; import com.intellij.facet.impl.ProjectFacetsConfigurator; -import com.intellij.facet.impl.ui.actions.AddFacetAction; +import com.intellij.facet.impl.ui.actions.AddFacetToModuleAction; import com.intellij.ide.IdeBundle; import com.intellij.ide.highlighter.ModuleFileType; import com.intellij.ide.projectView.impl.ModuleGroup; @@ -63,6 +63,7 @@ import com.intellij.openapi.wm.WindowManager; import com.intellij.ui.navigation.Place; import com.intellij.util.Consumer; import com.intellij.util.Function; +import com.intellij.util.PlatformIcons; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.NonNls; @@ -234,7 +235,8 @@ public class ModuleStructureConfigurable extends BaseStructureConfigurable imple }, new Function() { public MyNode fun(final ModuleGroup moduleGroup) { - final NamedConfigurable moduleGroupConfigurable = new ModuleGroupConfigurable(moduleGroup); + final NamedConfigurable moduleGroupConfigurable = + createModuleGroupConfigurable(moduleGroup); return new MyNode(moduleGroupConfigurable, true); } }); @@ -281,7 +283,7 @@ public class ModuleStructureConfigurable extends BaseStructureConfigurable imple } }, new Function() { public MyNode fun(final ModuleGroup moduleGroup) { - final NamedConfigurable moduleGroupConfigurable = new ModuleGroupConfigurable(moduleGroup); + final NamedConfigurable moduleGroupConfigurable = createModuleGroupConfigurable(moduleGroup); return new MyNode(moduleGroupConfigurable, true); } }); @@ -536,6 +538,12 @@ public class ModuleStructureConfigurable extends BaseStructureConfigurable imple return myContext; } + private static TextConfigurable createModuleGroupConfigurable(final ModuleGroup moduleGroup) { + return new TextConfigurable(moduleGroup, moduleGroup.toString(), + ProjectBundle.message("module.group.banner.text", moduleGroup.toString()), + ProjectBundle.message("project.roots.module.groups.text"), + PlatformIcons.OPENED_MODULE_GROUP_ICON, PlatformIcons.CLOSED_MODULE_GROUP_ICON); + } private class MyDataProviderWrapper extends JPanel implements DataProvider { public MyDataProviderWrapper(final JComponent component) { @@ -639,7 +647,7 @@ public class ModuleStructureConfigurable extends BaseStructureConfigurable imple ArrayList result = new ArrayList(); result.add(module); - final AnAction[] facets = AddFacetAction.createAddFacetActions(myFacetEditorFacade, myProject); + final AnAction[] facets = AddFacetToModuleAction.createAddFacetActions(myFacetEditorFacade, myProject); if (facets.length > 0) { result.add(new Separator(ProjectBundle.message("add.group.facet.separator"))); ContainerUtil.addAll(result, facets); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleGroupConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/TextConfigurable.java similarity index 59% rename from java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleGroupConfigurable.java rename to java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/TextConfigurable.java index a3fe20581f7f..f6c08deb3de2 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleGroupConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/TextConfigurable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,68 +13,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/* - * Created by IntelliJ IDEA. - * User: Anna.Kozlova - * Date: 16-Jul-2006 - * Time: 16:52:27 - */ package com.intellij.openapi.roots.ui.configuration.projectRoot; -import com.intellij.ide.projectView.impl.ModuleGroup; import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.ui.NamedConfigurable; import com.intellij.openapi.ui.PanelWithText; -import com.intellij.util.PlatformIcons; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import javax.swing.*; -public class ModuleGroupConfigurable extends NamedConfigurable { - private final ModuleGroup myModuleGroup; +/** + * @author nik + */ +public class TextConfigurable extends NamedConfigurable { + private final T myObject; + private final String myBannerSlogan; + private final String myDisplayName; + private final Icon myOpenedIcon; + private final Icon myClosedIcon; + private final String myDescriptionText; - public ModuleGroupConfigurable(final ModuleGroup moduleGroup) { - myModuleGroup = moduleGroup; + public TextConfigurable(final T object, + final String displayName, + final String bannerSlogan, + final String descriptionText, + final Icon openedIcon, final Icon closedIcon) { + myDisplayName = displayName; + myBannerSlogan = bannerSlogan; + myDescriptionText = descriptionText; + myOpenedIcon = openedIcon; + myClosedIcon = closedIcon; + myObject = object; } public void setDisplayName(final String name) { //do nothing } - public ModuleGroup getEditableObject() { - return myModuleGroup; - } - - public String getBannerSlogan() { - return ProjectBundle.message("module.group.banner.text", myModuleGroup.toString()); - } - - public String getDisplayName() { - return myModuleGroup.toString(); - } - - public Icon getIcon() { - return PlatformIcons.OPENED_MODULE_GROUP_ICON; - } - - public Icon getIcon(final boolean open) { - return open ? PlatformIcons.OPENED_MODULE_GROUP_ICON : PlatformIcons.CLOSED_MODULE_GROUP_ICON; - } - - @Nullable - @NonNls - public String getHelpTopic() { - return null; - } - - - public JComponent createOptionsPanel() { - return new PanelWithText(ProjectBundle.message("project.roots.module.groups.text")); - } - public boolean isModified() { return false; } @@ -90,4 +66,34 @@ public class ModuleGroupConfigurable extends NamedConfigurable { public void disposeUIResources() { //do nothing } + + @Nullable + @NonNls + public String getHelpTopic() { + return null; + } + + public T getEditableObject() { + return myObject; + } + + public String getBannerSlogan() { + return myBannerSlogan; + } + + public String getDisplayName() { + return myDisplayName; + } + + public Icon getIcon() { + return myOpenedIcon; + } + + public Icon getIcon(final boolean open) { + return open ? myOpenedIcon : myClosedIcon; + } + + public JComponent createOptionsPanel() { + return new PanelWithText(myDescriptionText); + } } diff --git a/platform/lang-api/src/com/intellij/facet/FacetTypeRegistry.java b/platform/lang-api/src/com/intellij/facet/FacetTypeRegistry.java index 1b069b998010..7884b7bad32b 100644 --- a/platform/lang-api/src/com/intellij/facet/FacetTypeRegistry.java +++ b/platform/lang-api/src/com/intellij/facet/FacetTypeRegistry.java @@ -42,6 +42,8 @@ public abstract class FacetTypeRegistry { public abstract FacetType[] getFacetTypes(); + public abstract FacetType[] getSortedFacetTypes(); + @Nullable public abstract FacetType findFacetType(String id); diff --git a/platform/lang-impl/src/com/intellij/facet/impl/FacetTypeRegistryImpl.java b/platform/lang-impl/src/com/intellij/facet/impl/FacetTypeRegistryImpl.java index b4a1c7ad25ba..47432d54abbf 100644 --- a/platform/lang-impl/src/com/intellij/facet/impl/FacetTypeRegistryImpl.java +++ b/platform/lang-impl/src/com/intellij/facet/impl/FacetTypeRegistryImpl.java @@ -18,23 +18,25 @@ package com.intellij.facet.impl; import com.intellij.facet.*; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.extensions.ExtensionPoint; import com.intellij.openapi.extensions.ExtensionPointListener; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.extensions.PluginDescriptor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * @author nik */ public class FacetTypeRegistryImpl extends FacetTypeRegistry { private static final Logger LOG = Logger.getInstance("#com.intellij.facet.impl.FacetTypeRegistryImpl"); + private static final Comparator FACET_TYPE_COMPARATOR = new Comparator() { + public int compare(final FacetType o1, final FacetType o2) { + return o1.getPresentableName().compareToIgnoreCase(o2.getPresentableName()); + } + }; private final Map myTypeIds = new HashMap(); private final Map myFacetTypes = new HashMap(); private boolean myExtensionsLoaded = false; @@ -67,7 +69,16 @@ public class FacetTypeRegistryImpl extends FacetTypeRegistry { public synchronized FacetType[] getFacetTypes() { loadExtensions(); final Collection types = myFacetTypes.values(); - return types.toArray(new FacetType[types.size()]); + final FacetType[] facetTypes = types.toArray(new FacetType[types.size()]); + Arrays.sort(facetTypes, FACET_TYPE_COMPARATOR); + return facetTypes; + } + + @Override + public FacetType[] getSortedFacetTypes() { + final FacetType[] types = getFacetTypes(); + Arrays.sort(types, FACET_TYPE_COMPARATOR); + return types; } @Nullable