diff --git a/java/java-impl/src/com/intellij/ide/projectView/actions/MarkGeneratedSourceRootAction.java b/java/java-impl/src/com/intellij/ide/projectView/actions/MarkGeneratedSourceRootAction.java new file mode 100644 index 000000000000..e56a43233581 --- /dev/null +++ b/java/java-impl/src/com/intellij/ide/projectView/actions/MarkGeneratedSourceRootAction.java @@ -0,0 +1,69 @@ +/* + * Copyright 2000-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.ide.projectView.actions; + +import com.intellij.icons.AllIcons; +import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.module.JavaModuleType; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleType; +import com.intellij.openapi.roots.ContentEntry; +import com.intellij.openapi.roots.SourceFolder; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; +import org.jetbrains.jps.model.java.JavaSourceRootProperties; +import org.jetbrains.jps.model.java.JavaSourceRootType; +import org.jetbrains.jps.model.java.JpsJavaExtensionService; + +/** + * @author nik + */ +public class MarkGeneratedSourceRootAction extends MarkRootActionBase { + public MarkGeneratedSourceRootAction() { + Presentation presentation = getTemplatePresentation(); + presentation.setIcon(AllIcons.Modules.SourceRoot); + presentation.setText("Generated Sources Root"); + presentation.setDescription("Mark directory as a source root for generated files"); + } + + @Override + protected boolean isEnabled(@NotNull RootsSelection selection, @NotNull Module module) { + if (!(ModuleType.get(module) instanceof JavaModuleType)) return false; + + if (selection.myHaveSelectedFilesUnderSourceRoots) { + return false; + } + + if (!selection.mySelectedDirectories.isEmpty()) { + return true; + } + + for (SourceFolder root : selection.mySelectedRoots) { + JavaSourceRootProperties properties = root.getJpsElement().getProperties(JavaModuleSourceRootTypes.SOURCES); + if (properties != null && !properties.isForGeneratedSources()) { + return true; + } + } + return false; + } + + @Override + protected void modifyRoots(VirtualFile vFile, ContentEntry entry) { + JavaSourceRootProperties properties = JpsJavaExtensionService.getInstance().createSourceRootProperties("", true); + entry.addSourceFolder(vFile, JavaSourceRootType.SOURCE, properties); + } +} diff --git a/java/java-impl/src/com/intellij/ide/projectView/actions/UnmarkGeneratedSourceRootAction.java b/java/java-impl/src/com/intellij/ide/projectView/actions/UnmarkGeneratedSourceRootAction.java new file mode 100644 index 000000000000..0af8706ab38c --- /dev/null +++ b/java/java-impl/src/com/intellij/ide/projectView/actions/UnmarkGeneratedSourceRootAction.java @@ -0,0 +1,55 @@ +/* + * Copyright 2000-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.ide.projectView.actions; + +import com.intellij.icons.AllIcons; +import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.ContentEntry; +import com.intellij.openapi.roots.SourceFolder; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; +import org.jetbrains.jps.model.java.JavaSourceRootProperties; +import org.jetbrains.jps.model.java.JavaSourceRootType; + +/** + * @author nik + */ +public class UnmarkGeneratedSourceRootAction extends MarkRootActionBase { + public UnmarkGeneratedSourceRootAction() { + Presentation presentation = getTemplatePresentation(); + presentation.setIcon(AllIcons.Modules.SourceRoot); + presentation.setText("Unmark Generated Sources Root"); + presentation.setDescription("Mark directory as an ordinary source root"); + } + + @Override + protected boolean isEnabled(@NotNull RootsSelection selection, @NotNull Module module) { + for (SourceFolder root : selection.mySelectedRoots) { + JavaSourceRootProperties properties = root.getJpsElement().getProperties(JavaModuleSourceRootTypes.SOURCES); + if (properties != null && properties.isForGeneratedSources()) { + return true; + } + } + return false; + } + + @Override + protected void modifyRoots(VirtualFile vFile, ContentEntry entry) { + entry.addSourceFolder(vFile, JavaSourceRootType.SOURCE); + } +} diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkExcludeRootAction.java b/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkExcludeRootAction.java index 823a79864110..1ff9a785a2ab 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkExcludeRootAction.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkExcludeRootAction.java @@ -17,7 +17,7 @@ package com.intellij.ide.projectView.actions; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.module.Module; import com.intellij.openapi.roots.ContentEntry; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.io.FileUtil; @@ -51,7 +51,7 @@ public class MarkExcludeRootAction extends MarkRootActionBase { } @Override - protected boolean isEnabled(@NotNull RootsSelection selection) { + protected boolean isEnabled(@NotNull RootsSelection selection, @NotNull Module module) { return true; } } diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkRootActionBase.java b/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkRootActionBase.java index 2c14eba67f87..20570cd8d221 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkRootActionBase.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkRootActionBase.java @@ -19,7 +19,6 @@ import com.intellij.ide.projectView.impl.ProjectRootsUtil; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.LangDataKeys; -import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.DumbAwareAction; @@ -82,13 +81,14 @@ public abstract class MarkRootActionBase extends DumbAwareAction { @Override public void update(AnActionEvent e) { + Module module = e.getData(LangDataKeys.MODULE); RootsSelection selection = getSelection(e); - boolean enabled = (!selection.mySelectedRoots.isEmpty() || !selection.mySelectedFiles.isEmpty()) && isEnabled(selection); + boolean enabled = module != null && (!selection.mySelectedRoots.isEmpty() || !selection.mySelectedDirectories.isEmpty()) && isEnabled(selection, module); e.getPresentation().setVisible(enabled); e.getPresentation().setEnabled(enabled); } - protected abstract boolean isEnabled(@NotNull RootsSelection selection); + protected abstract boolean isEnabled(@NotNull RootsSelection selection, @NotNull Module module); protected static RootsSelection getSelection(AnActionEvent e) { Module module = e.getData(LangDataKeys.MODULE); @@ -111,7 +111,7 @@ public abstract class MarkRootActionBase extends DumbAwareAction { selection.mySelectedRoots.add(folder); } else { - selection.mySelectedFiles.add(file); + selection.mySelectedDirectories.add(file); if (fileIndex.isInSourceContent(file)) { selection.myHaveSelectedFilesUnderSourceRoots = true; } @@ -124,7 +124,7 @@ public abstract class MarkRootActionBase extends DumbAwareAction { public static final RootsSelection EMPTY = new RootsSelection(); public List mySelectedRoots = new ArrayList(); - public List mySelectedFiles = new ArrayList(); + public List mySelectedDirectories = new ArrayList(); public boolean myHaveSelectedFilesUnderSourceRoots; } } diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkSourceRootAction.java b/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkSourceRootAction.java index aaa21dc9e145..08eabbb101f8 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkSourceRootAction.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkSourceRootAction.java @@ -16,6 +16,7 @@ package com.intellij.ide.projectView.actions; import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.module.Module; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.roots.ContentEntry; import com.intellij.openapi.roots.SourceFolder; @@ -44,12 +45,12 @@ public class MarkSourceRootAction extends MarkRootActionBase { } @Override - protected boolean isEnabled(@NotNull RootsSelection selection) { + protected boolean isEnabled(@NotNull RootsSelection selection, @NotNull Module module) { if (selection.myHaveSelectedFilesUnderSourceRoots) { return false; } - if (!selection.mySelectedFiles.isEmpty()) { + if (!selection.mySelectedDirectories.isEmpty()) { return true; } diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/actions/UnmarkRootAction.java b/platform/lang-impl/src/com/intellij/ide/projectView/actions/UnmarkRootAction.java index e84f6822d84a..cf2724dc039f 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/actions/UnmarkRootAction.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/actions/UnmarkRootAction.java @@ -16,6 +16,7 @@ package com.intellij.ide.projectView.actions; import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.module.Module; import com.intellij.openapi.roots.ContentEntry; import com.intellij.openapi.roots.SourceFolder; import com.intellij.openapi.roots.ui.configuration.ModuleSourceRootEditHandler; @@ -55,8 +56,8 @@ public class UnmarkRootAction extends MarkRootActionBase { } @Override - protected boolean isEnabled(@NotNull RootsSelection selection) { - return selection.mySelectedFiles.isEmpty() && !selection.mySelectedRoots.isEmpty(); + protected boolean isEnabled(@NotNull RootsSelection selection, @NotNull Module module) { + return selection.mySelectedDirectories.isEmpty() && !selection.mySelectedRoots.isEmpty(); } protected void modifyRoots(VirtualFile vFile, ContentEntry entry) { diff --git a/resources/src/idea/JavaActions.xml b/resources/src/idea/JavaActions.xml index 7f0ae1ca8cdf..c0a7d4ade398 100644 --- a/resources/src/idea/JavaActions.xml +++ b/resources/src/idea/JavaActions.xml @@ -315,6 +315,12 @@ + + + + + +