diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/BuildElementsEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/BuildElementsEditor.java index 747645655044..0b1fc42076f6 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/BuildElementsEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/BuildElementsEditor.java @@ -146,7 +146,11 @@ public class BuildElementsEditor extends ModuleElementsEditor { private void updateOutputPathPresentation() { if (getCompilerExtension().isCompilerOutputPathInherited()) { - final String baseUrl = ProjectStructureConfigurable.getInstance(myProject).getProjectConfig().getCompilerOutputUrl(); + ProjectConfigurable projectConfig = ProjectStructureConfigurable.getInstance(myProject).getProjectConfig(); + if (projectConfig == null) { + return; + } + final String baseUrl = projectConfig.getCompilerOutputUrl(); moduleCompileOutputChanged(baseUrl, getModel().getModule().getName()); } else { final VirtualFile compilerOutputPath = getCompilerExtension().getCompilerOutputPath(); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java index fd855a7b7ddc..9c6343a59ba7 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java @@ -60,6 +60,8 @@ import java.awt.*; import java.util.ArrayList; import java.util.List; +import static com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurableFilter.ConfigurableId; + public class ProjectStructureConfigurable extends BaseConfigurable implements SearchableConfigurable, Place.Navigator { public static final DataKey KEY = DataKey.create("ProjectStructureConfiguration"); @@ -220,13 +222,40 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se addFacetsConfig(); addArtifactsConfig(); } + + ProjectStructureConfigurableAdder[] adders = ProjectStructureConfigurableAdder.EP_NAME.getExtensions(); + for (ProjectStructureConfigurableAdder adder : adders) { + for (Configurable configurable : adder.getExtraProjectConfigurables(myProject, myContext)) { + addConfigurable(configurable, true); + } + } + mySidePanel.addSeparator("Platform Settings"); addJdkListConfig(); addGlobalLibrariesConfig(); + + for (ProjectStructureConfigurableAdder adder : adders) { + for (Configurable configurable : adder.getExtraPlatformConfigurables(myProject, myContext)) { + addConfigurable(configurable, true); + } + } } private void addArtifactsConfig() { - addConfigurable(myArtifactsStructureConfigurable); + addConfigurable(myArtifactsStructureConfigurable, ConfigurableId.ARTIFACTS); + } + + private void addConfigurable(final Configurable configurable, final ConfigurableId configurableId) { + addConfigurable(configurable, isAvailable(configurableId)); + } + + private boolean isAvailable(ConfigurableId id) { + for (ProjectStructureConfigurableFilter filter : ProjectStructureConfigurableFilter.EP_NAME.getExtensions()) { + if (!filter.isAvailable(id, myProject)) { + return false; + } + } + return true; } public ArtifactsStructureConfigurable getArtifactsStructureConfigurable() { @@ -235,7 +264,7 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se private void addFacetsConfig() { if (myFacetStructureConfigurable.isVisible()) { - addConfigurable(myFacetStructureConfigurable); + addConfigurable(myFacetStructureConfigurable, ConfigurableId.FACETS); } } @@ -244,25 +273,25 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se myJdkListConfig = JdkListConfigurable.getInstance(myProject); myJdkListConfig.init(myContext); } - addConfigurable(myJdkListConfig); + addConfigurable(myJdkListConfig, ConfigurableId.JDK_LIST); } private void addProjectConfig() { myProjectConfig = new ProjectConfigurable(myProject, myContext, myModuleConfigurator, myProjectJdksModel); - addConfigurable(myProjectConfig); + addConfigurable(myProjectConfig, ConfigurableId.PROJECT); } private void addProjectLibrariesConfig() { - addConfigurable(myProjectLibrariesConfig); + addConfigurable(myProjectLibrariesConfig, ConfigurableId.PROJECT_LIBRARIES); } private void addGlobalLibrariesConfig() { - addConfigurable(myGlobalLibrariesConfig); + addConfigurable(myGlobalLibrariesConfig, ConfigurableId.GLOBAL_LIBRARIES); } private void addModulesConfig() { myModulesConfig = ModuleStructureConfigurable.getInstance(myProject); - addConfigurable(myModulesConfig); + addConfigurable(myModulesConfig, ConfigurableId.MODULES); } @Override @@ -579,10 +608,12 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se return myProjectConfig; } - private void addConfigurable(Configurable configurable) { + private void addConfigurable(Configurable configurable, boolean addToSidePanel) { myName2Config.add(configurable); - mySidePanel.addPlace(createPlaceFor(configurable), new Presentation(configurable.getDisplayName())); + if (addToSidePanel) { + mySidePanel.addPlace(createPlaceFor(configurable), new Presentation(configurable.getDisplayName())); + } } private static Place createPlaceFor(final Configurable configurable) { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurableAdder.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurableAdder.java new file mode 100644 index 000000000000..4a79ada53eb5 --- /dev/null +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurableAdder.java @@ -0,0 +1,40 @@ +/* + * Copyright 2013 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.roots.ui.configuration; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.options.Configurable; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +public abstract class ProjectStructureConfigurableAdder { + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.projectStructureConfigurableAdder"); + + @NotNull + public List getExtraProjectConfigurables(@NotNull Project project, @NotNull StructureConfigurableContext context) { + return Collections.emptyList(); + } + + @NotNull + public List getExtraPlatformConfigurables(@NotNull Project project, @NotNull StructureConfigurableContext context) { + return Collections.emptyList(); + } + +} diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurableFilter.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurableFilter.java new file mode 100644 index 000000000000..98666759c73c --- /dev/null +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurableFilter.java @@ -0,0 +1,30 @@ +/* + * Copyright 2013 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.roots.ui.configuration; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; + +public abstract class ProjectStructureConfigurableFilter { + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.projectStructureConfigurableFilter"); + + public enum ConfigurableId { + PROJECT, MODULES, PROJECT_LIBRARIES, FACETS, ARTIFACTS, JDK_LIST, GLOBAL_LIBRARIES + } + + public abstract boolean isAvailable(@NotNull ConfigurableId id, @NotNull Project project); +} diff --git a/resources/src/idea/RichPlatformPlugin.xml b/resources/src/idea/RichPlatformPlugin.xml index d0d63b13f033..c539ddb15bde 100644 --- a/resources/src/idea/RichPlatformPlugin.xml +++ b/resources/src/idea/RichPlatformPlugin.xml @@ -78,6 +78,8 @@ + +