show facet type nodes in Project Structure dialog only if corresponding facets exist in project

This commit is contained in:
nik
2011-08-17 13:46:13 +04:00
parent 2f1648434d
commit 21d91e40ae
9 changed files with 144 additions and 111 deletions
@@ -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<FacetType>() {
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;
}
@@ -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<Facet> suitableParents = new ArrayList<Facet>();
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<Facet> 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<Module> suitableModules = new ArrayList<Module>(Arrays.asList(context.getModules()));
final ProjectFacetsConfigurator facetsConfigurator = myContext.getModulesConfigurator().getFacetsConfigurator();
List<Module> suitableModules = new ArrayList<Module>(Arrays.asList(myContext.getModules()));
final Iterator<Module> 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<AnAction> result = new ArrayList<AnAction>();
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<Facet> {
private ChooseParentFacetDialog(Project project, List<? extends Facet> items, String title, String description) {
super(project, items, title, description, true);
private ChooseParentFacetDialog(Project project, List<? extends Facet> items) {
super(project, items, "Select Parent Facet", null, true);
myChooser.setSingleSelectionMode();
}
@@ -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<FacetType<?, ?>, FacetTypeEditor> myFacetTypeEditors = new HashMap<FacetType<?,?>, 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<String>(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<AnAction> createActions(final boolean fromPopup) {
ArrayList<AnAction> actions = new ArrayList<AnAction>();
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());
}
@@ -58,10 +58,6 @@ public class FacetTypeConfigurable extends NamedConfigurable<FacetType> {
return myFacetType.getIcon();
}
public FacetType getFacetType() {
return myFacetType;
}
public String getHelpTopic() {
final FacetTypeEditor editor = myFacetStructureConfigurable.getFacetTypeEditor(myFacetType);
return editor != null ? editor.getHelpTopic() : null;
@@ -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;
@@ -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<ModuleGroup, MyNode>() {
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<ModuleGroup, MyNode>() {
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<ModuleGroup> createModuleGroupConfigurable(final ModuleGroup moduleGroup) {
return new TextConfigurable<ModuleGroup>(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<AnAction> result = new ArrayList<AnAction>();
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);
@@ -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<ModuleGroup> {
private final ModuleGroup myModuleGroup;
/**
* @author nik
*/
public class TextConfigurable<T> extends NamedConfigurable<T> {
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<ModuleGroup> {
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);
}
}