From 999a2e8e526d26caff6f8d898313885aebd7c67f Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 22 Oct 2013 12:19:44 +0400 Subject: [PATCH] added option 'for generated source' for java source roots, generated roots won't be suggested as target for refactorings (IDEA-112680) --- .../quickFix/CreateClassOrPackageFix.java | 5 +- .../intention/impl/CreateClassDialog.java | 5 +- .../openapi/roots/JavaProjectRootsUtil.java | 29 +++++++ .../refactoring/copy/CopyClassDialog.java | 5 +- .../JavaExtractSuperBaseDialog.java | 4 +- .../extractclass/ExtractClassDialog.java | 5 +- .../DestinationFolderComboBox.java | 4 +- .../JavaMoveClassesOrPackagesHandler.java | 3 +- .../MoveClassesOrPackagesDialog.java | 4 +- .../MoveClassesOrPackagesImpl.java | 5 +- .../MoveClassesOrPackagesUtil.java | 5 +- .../move/moveInner/MoveInnerDialog.java | 4 +- .../src/org/jetbrains/jps/ProjectPaths.java | 4 +- .../jps/incremental/ModuleBuildTarget.java | 5 +- .../jps/incremental/ResourcesTarget.java | 2 +- .../resources/ResourceCopyingTest.java | 5 +- .../model/java/JavaSourceRootProperties.java | 70 +++++++++++++++- .../jps/model/java/JavaSourceRootType.java | 8 +- .../model/java/JpsJavaExtensionService.java | 6 ++ .../impl/JpsJavaExtensionServiceImpl.java | 12 +++ .../jetbrains/jps/model/JpsModuleTest.java | 7 +- .../java/JpsJavaModelSerializerExtension.java | 17 ++-- .../ui/configuration/ContentEntryEditor.java | 7 +- .../JavaSourceRootEditHandlerBase.java | 79 +++++++++++++++---- .../openapi/roots/impl/SourceFolderImpl.java | 17 ++-- .../impl/module/content/JpsContentEntry.java | 5 +- .../impl/module/content/JpsSourceFolder.java | 6 +- .../src/messages/ProjectBundle.properties | 12 +-- .../model/JpsIdeaSpecificSettings.java | 7 +- 29 files changed, 248 insertions(+), 99 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateClassOrPackageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateClassOrPackageFix.java index 5b8baae9e1a1..f29f21b42633 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateClassOrPackageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateClassOrPackageFix.java @@ -27,6 +27,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.JavaProjectRootsUtil; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VirtualFile; @@ -37,7 +38,6 @@ import com.intellij.psi.util.CreateClassUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import java.util.*; @@ -252,8 +252,7 @@ public class CreateClassOrPackageFix extends LocalQuickFixAndIntentionActionOnPs } } else { - for (VirtualFile root : ProjectRootManager.getInstance(psiManager.getProject()).getModuleSourceRoots( - JavaModuleSourceRootTypes.SOURCES)) { + for (VirtualFile root : JavaProjectRootsUtil.getSuitableDestinationSourceRoots(psiManager.getProject())) { PsiDirectory directory = psiManager.findDirectory(root); if (LOG.isDebugEnabled()) { LOG.debug("Root: " + root + ", directory: " + directory); diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java index 13f6e2ec1fb5..e21f032c5d2e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java @@ -26,7 +26,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.roots.JavaProjectRootsUtil; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Computable; @@ -49,7 +49,6 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -208,7 +207,7 @@ public class CreateClassDialog extends DialogWrapper { gbConstraints.insets.top = 4; panel.add(myDestinationCB, gbConstraints); - final boolean isMultipleSourceRoots = ProjectRootManager.getInstance(myProject).getModuleSourceRoots(JavaModuleSourceRootTypes.SOURCES).size() > 1; + final boolean isMultipleSourceRoots = JavaProjectRootsUtil.getSuitableDestinationSourceRoots(myProject).size() > 1; myDestinationCB.setVisible(isMultipleSourceRoots); label.setVisible(isMultipleSourceRoots); label.setLabelFor(myDestinationCB); diff --git a/java/java-impl/src/com/intellij/openapi/roots/JavaProjectRootsUtil.java b/java/java-impl/src/com/intellij/openapi/roots/JavaProjectRootsUtil.java index 30f350eb79d3..6a04def9469c 100644 --- a/java/java-impl/src/com/intellij/openapi/roots/JavaProjectRootsUtil.java +++ b/java/java-impl/src/com/intellij/openapi/roots/JavaProjectRootsUtil.java @@ -1,10 +1,20 @@ package com.intellij.openapi.roots; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.impl.SourceFolderImpl; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiCodeFragment; import com.intellij.psi.PsiFile; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; +import org.jetbrains.jps.model.java.JavaSourceRootProperties; + +import java.util.ArrayList; +import java.util.List; /** * @author nik @@ -19,4 +29,23 @@ public class JavaProjectRootsUtil { return !projectFileIndex.isUnderSourceRootOfType(file, JavaModuleSourceRootTypes.SOURCES) && !projectFileIndex.isInLibrarySource(file) && !projectFileIndex.isInLibraryClasses(file); } + + /** + * @return list of all java source roots in the project which can be suggested as a target directory for a class created by user + */ + @NotNull + public static List getSuitableDestinationSourceRoots(@NotNull Project project) { + List roots = new ArrayList(); + for (Module module : ModuleManager.getInstance(project).getModules()) { + for (ContentEntry entry : ModuleRootManager.getInstance(module).getContentEntries()) { + for (SourceFolder sourceFolder : entry.getSourceFolders(JavaModuleSourceRootTypes.SOURCES)) { + JavaSourceRootProperties properties = (JavaSourceRootProperties)((SourceFolderImpl)sourceFolder).getJpsElement().getProperties(); + if (!properties.isForGeneratedSources()) { + ContainerUtil.addIfNotNull(roots, sourceFolder.getFile()); + } + } + } + } + return roots; + } } diff --git a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java index 5460ee36e1f3..02ff65e14b2d 100644 --- a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java @@ -17,7 +17,7 @@ package com.intellij.refactoring.copy; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.roots.JavaProjectRootsUtil; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Pass; @@ -38,7 +38,6 @@ import com.intellij.util.ui.FormBuilder; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import javax.swing.*; import java.awt.*; @@ -115,7 +114,7 @@ class CopyClassDialog extends DialogWrapper{ } final JLabel label = new JLabel(RefactoringBundle.message("target.destination.folder")); - final boolean isMultipleSourceRoots = ProjectRootManager.getInstance(myProject).getModuleSourceRoots(JavaModuleSourceRootTypes.SOURCES).size() > 1; + final boolean isMultipleSourceRoots = JavaProjectRootsUtil.getSuitableDestinationSourceRoots(myProject).size() > 1; myDestinationCB.setVisible(!myDoClone && isMultipleSourceRoots); label.setVisible(!myDoClone && isMultipleSourceRoots); label.setLabelFor(myDestinationCB); diff --git a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/JavaExtractSuperBaseDialog.java b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/JavaExtractSuperBaseDialog.java index 59349c39a2b0..817b6846f6ca 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/JavaExtractSuperBaseDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/JavaExtractSuperBaseDialog.java @@ -17,6 +17,7 @@ package com.intellij.refactoring.extractSuperclass; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.JavaProjectRootsUtil; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.ComponentWithBrowseButton; @@ -36,7 +37,6 @@ import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.ui.EditorComboBox; import com.intellij.ui.components.JBLabel; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import javax.swing.*; import java.awt.*; @@ -72,7 +72,7 @@ public abstract class JavaExtractSuperBaseDialog extends ExtractSuperBaseDialog< @Override protected JPanel createDestinationRootPanel() { - final List sourceRoots = ProjectRootManager.getInstance(myProject).getModuleSourceRoots(JavaModuleSourceRootTypes.SOURCES); + final List sourceRoots = JavaProjectRootsUtil.getSuitableDestinationSourceRoots(myProject); if (sourceRoots.size() <= 1) return super.createDestinationRootPanel(); final JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassDialog.java b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassDialog.java index ca324a02a25f..18e53fb6ece5 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassDialog.java @@ -18,7 +18,7 @@ package com.intellij.refactoring.extractclass; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.roots.JavaProjectRootsUtil; import com.intellij.openapi.ui.Messages; import com.intellij.psi.*; import com.intellij.psi.presentation.java.SymbolPresentationUtil; @@ -42,7 +42,6 @@ import com.intellij.util.ui.FormBuilder; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -252,7 +251,7 @@ class ExtractClassDialog extends RefactoringDialog implements MemberInfoChangeLi .addLabeledComponent(new JLabel(), extractAsEnum) .addLabeledComponent(RefactorJBundle.message("package.for.new.class.label"), packageTextField); - if (ProjectRootManager.getInstance(myProject).getModuleSourceRoots(JavaModuleSourceRootTypes.SOURCES).size() > 1) { + if (JavaProjectRootsUtil.getSuitableDestinationSourceRoots(myProject).size() > 1) { builder.addLabeledComponent(RefactoringBundle.message("target.destination.folder"), myDestinationFolderComboBox); } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/DestinationFolderComboBox.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/DestinationFolderComboBox.java index bb9379add0b1..9aa1b3125af4 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/DestinationFolderComboBox.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/DestinationFolderComboBox.java @@ -21,6 +21,7 @@ import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.JavaProjectRootsUtil; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.ComboBoxWithWidePopup; @@ -34,7 +35,6 @@ import com.intellij.refactoring.MoveDestination; import com.intellij.refactoring.PackageWrapper; import com.intellij.ui.*; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import javax.swing.*; import java.awt.*; @@ -81,7 +81,7 @@ public abstract class DestinationFolderComboBox extends ComboboxWithBrowseButton final PsiDirectory initialTargetDirectory, final Pass errorMessageUpdater, final EditorComboBox editorComboBox) { myInitialTargetDirectory = initialTargetDirectory; - mySourceRoots = ProjectRootManager.getInstance(project).getModuleSourceRoots(JavaModuleSourceRootTypes.SOURCES); + mySourceRoots = JavaProjectRootsUtil.getSuitableDestinationSourceRoots(project); new ComboboxSpeedSearch(getComboBox()) { @Override protected String getElementText(Object element) { diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java index f9e1a9ad87c3..905e3713197c 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java @@ -44,7 +44,6 @@ import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashSet; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import javax.swing.*; import java.awt.*; @@ -301,7 +300,7 @@ public class JavaMoveClassesOrPackagesHandler extends MoveHandlerDelegate { private static boolean canMoveOrRearrangePackages(PsiElement[] elements) { if (elements.length == 0) return false; final Project project = elements[0].getProject(); - if (ProjectRootManager.getInstance(project).getModuleSourceRoots(JavaModuleSourceRootTypes.SOURCES).size() == 1) { + if (JavaProjectRootsUtil.getSuitableDestinationSourceRoots(project).size() == 1) { return false; } for (PsiElement element : elements) { diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesDialog.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesDialog.java index 424eae716012..30cef8b1273f 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesDialog.java @@ -25,6 +25,7 @@ import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.JavaProjectRootsUtil; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.Messages; @@ -54,7 +55,6 @@ import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import javax.swing.*; import java.awt.*; @@ -506,6 +506,6 @@ public class MoveClassesOrPackagesDialog extends RefactoringDialog { } private List getSourceRoots() { - return ProjectRootManager.getInstance(myProject).getModuleSourceRoots(JavaModuleSourceRootTypes.SOURCES); + return JavaProjectRootsUtil.getSuitableDestinationSourceRoots(myProject); } } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesImpl.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesImpl.java index 2a5f6396a482..6d333e9cb54b 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesImpl.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesImpl.java @@ -28,7 +28,7 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.roots.JavaProjectRootsUtil; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Ref; @@ -44,7 +44,6 @@ import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import java.util.ArrayList; import java.util.Arrays; @@ -368,7 +367,7 @@ public class MoveClassesOrPackagesImpl { } private static List buildRearrangeTargetsList(final Project project, final PsiDirectory[] directories) { - final List sourceRoots = ProjectRootManager.getInstance(project).getModuleSourceRoots(JavaModuleSourceRootTypes.SOURCES); + final List sourceRoots = JavaProjectRootsUtil.getSuitableDestinationSourceRoots(project); List sourceRootDirectories = new ArrayList(); sourceRoots: for (final VirtualFile sourceRoot : sourceRoots) { diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesUtil.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesUtil.java index 2f3e93382199..03540a97e749 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesUtil.java @@ -20,6 +20,7 @@ import com.intellij.lang.java.JavaFindUsagesProvider; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.JavaProjectRootsUtil; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Computable; @@ -40,7 +41,6 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; import com.intellij.psi.util.FileTypeUtils; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import java.io.File; import java.util.*; @@ -284,8 +284,7 @@ public class MoveClassesOrPackagesUtil { directory = directories[0]; } else { - final List contentSourceRoots = ProjectRootManager.getInstance(project).getModuleSourceRoots( - JavaModuleSourceRootTypes.SOURCES); + final List contentSourceRoots = JavaProjectRootsUtil.getSuitableDestinationSourceRoots(project); if (contentSourceRoots.size() == 1 && (baseDirVirtualFile == null || fileIndex.isInTestSourceContent(contentSourceRoots.get(0)) == isBaseDirInTestSources)) { directory = ApplicationManager.getApplication().runWriteAction(new Computable() { @Override diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerDialog.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerDialog.java index b10af008c89f..dd87120c6770 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerDialog.java @@ -23,6 +23,7 @@ package com.intellij.refactoring.move.moveInner; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.JavaProjectRootsUtil; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.NullableComputable; @@ -49,7 +50,6 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; import javax.swing.*; import java.awt.event.ItemEvent; @@ -198,7 +198,7 @@ public class MoveInnerDialog extends RefactoringDialog { final String targetName = myPackageNameField.getText(); if (!Comparing.equal(name, targetName)) { final ProjectRootManager projectRootManager = ProjectRootManager.getInstance(myProject); - final List contentSourceRoots = projectRootManager.getModuleSourceRoots(JavaModuleSourceRootTypes.SOURCES); + final List contentSourceRoots = JavaProjectRootsUtil.getSuitableDestinationSourceRoots(myProject); final PackageWrapper newPackage = new PackageWrapper(PsiManager.getInstance(myProject), targetName); final VirtualFile targetSourceRoot; if (contentSourceRoots.size() > 1) { diff --git a/jps/jps-builders/src/org/jetbrains/jps/ProjectPaths.java b/jps/jps-builders/src/org/jetbrains/jps/ProjectPaths.java index caa7e58a4338..40cf644ba76a 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/ProjectPaths.java +++ b/jps/jps-builders/src/org/jetbrains/jps/ProjectPaths.java @@ -21,7 +21,6 @@ import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsDummyElement; -import org.jetbrains.jps.model.JpsSimpleElement; import org.jetbrains.jps.model.java.*; import org.jetbrains.jps.model.java.compiler.ProcessorConfigProfile; import org.jetbrains.jps.model.library.JpsOrderRootType; @@ -113,8 +112,7 @@ public class ProjectPaths { for (JpsModuleSourceRoot root : module.getSourceRoots()) { if (root.getRootType().equals(JavaSourceRootType.SOURCE) || includeTests && root.getRootType().equals(JavaSourceRootType.TEST_SOURCE)) { - JavaSourceRootProperties properties = (JavaSourceRootProperties)((JpsSimpleElement)root.getProperties()).getData(); - String prefix = properties.getPackagePrefix(); + String prefix = ((JavaSourceRootProperties)root.getProperties()).getPackagePrefix(); if (!prefix.isEmpty()) { prefix = prefix.replace('.', '/'); if (!prefix.endsWith("/")) { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java index a16810e15792..a6ac897a1d2d 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java @@ -35,7 +35,6 @@ import org.jetbrains.jps.cmdline.ProjectDescriptor; import org.jetbrains.jps.indices.IgnoredFileIndex; import org.jetbrains.jps.indices.ModuleExcludeIndex; import org.jetbrains.jps.model.JpsModel; -import org.jetbrains.jps.model.JpsSimpleElement; import org.jetbrains.jps.model.java.*; import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerConfiguration; import org.jetbrains.jps.model.java.compiler.ProcessorConfigProfile; @@ -138,7 +137,7 @@ public final class ModuleBuildTarget extends JVMModuleBuildTarget> sourceRoot : myModule.getSourceRoots(type)) { + for (JpsTypedModuleSourceRoot sourceRoot : myModule.getSourceRoots(type)) { if (JpsPathUtil.isUnder(moduleExcludes, sourceRoot.getFile())) { continue; } @@ -147,7 +146,7 @@ public final class ModuleBuildTarget extends JVMModuleBuildTarget excludedRootProviders = JpsServiceManager.getInstance().getExtensions(ExcludedJavaSourceRootProvider.class); - for (JpsTypedModuleSourceRoot> sourceRoot : myModule.getSourceRoots(type)) { + for (JpsTypedModuleSourceRoot> sourceRoot : myModule.getSourceRoots(type)) { if (!isExcludedFromCompilation(excludedRootProviders, sourceRoot)) { final String packagePrefix = sourceRoot.getProperties().getData().getPackagePrefix(); final File rootFile = sourceRoot.getFile(); diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java index d05df54a9ebe..d2ad9f1f71c5 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java @@ -17,7 +17,6 @@ package org.jetbrains.jps.builders.resources; import com.intellij.util.PathUtil; import org.jetbrains.jps.builders.JpsBuildTestCase; -import org.jetbrains.jps.model.JpsSimpleElement; import org.jetbrains.jps.model.java.JavaResourceRootType; import org.jetbrains.jps.model.java.JavaSourceRootProperties; import org.jetbrains.jps.model.java.JavaSourceRootType; @@ -60,9 +59,9 @@ public class ResourceCopyingTest extends JpsBuildTestCase { String file = createFile("src/a.xml"); JpsModule m = addModule("m", PathUtil.getParentPath(file)); JpsModuleSourceRoot sourceRoot = assertOneElement(m.getSourceRoots()); - JpsTypedModuleSourceRoot> typed = sourceRoot.asTyped(JavaSourceRootType.SOURCE); + JpsTypedModuleSourceRoot typed = sourceRoot.asTyped(JavaSourceRootType.SOURCE); assertNotNull(typed); - typed.getProperties().setData(new JavaSourceRootProperties("xxx")); + typed.getProperties().setPackagePrefix("xxx"); rebuildAll(); assertOutput(m, fs().dir("xxx").file("a.xml")); } diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JavaSourceRootProperties.java b/jps/model-api/src/org/jetbrains/jps/model/java/JavaSourceRootProperties.java index fcf046926251..3e2fb95d96af 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/JavaSourceRootProperties.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/JavaSourceRootProperties.java @@ -15,24 +15,88 @@ */ package org.jetbrains.jps.model.java; +import com.intellij.openapi.util.Comparing; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.JpsSimpleElement; +import org.jetbrains.jps.model.ex.JpsElementBase; /** * @author nik */ -public class JavaSourceRootProperties { - private final String myPackagePrefix; +public class JavaSourceRootProperties extends JpsElementBase implements JpsSimpleElement { + private String myPackagePrefix = ""; + private boolean myForGeneratedSources; + /** + * @deprecated do not call this method directly, use {@link org.jetbrains.jps.model.java.JpsJavaExtensionService#createSourceRootProperties(String)} instead + */ public JavaSourceRootProperties() { - myPackagePrefix = ""; } + /** + * @deprecated do not call this method directly, use {@link org.jetbrains.jps.model.java.JpsJavaExtensionService#createSourceRootProperties(String)} instead + */ public JavaSourceRootProperties(@NotNull String packagePrefix) { myPackagePrefix = packagePrefix; } + /** + * @deprecated do not call this method directly, use {@link org.jetbrains.jps.model.java.JpsJavaExtensionService#createSourceRootProperties(String, boolean)} instead + */ + public JavaSourceRootProperties(@NotNull String packagePrefix, boolean forGeneratedSources) { + myPackagePrefix = packagePrefix; + myForGeneratedSources = forGeneratedSources; + } + @NotNull public String getPackagePrefix() { return myPackagePrefix; } + + @NotNull + @Override + public JavaSourceRootProperties createCopy() { + return new JavaSourceRootProperties(myPackagePrefix, myForGeneratedSources); + } + + public boolean isForGeneratedSources() { + return myForGeneratedSources; + } + + public void setPackagePrefix(@NotNull String packagePrefix) { + if (!Comparing.equal(myPackagePrefix, packagePrefix)) { + myPackagePrefix = packagePrefix; + fireElementChanged(); + } + } + + public void setForGeneratedSources(boolean forGeneratedSources) { + if (myForGeneratedSources != forGeneratedSources) { + myForGeneratedSources = forGeneratedSources; + fireElementChanged(); + } + } + + @Override + public void applyChanges(@NotNull JavaSourceRootProperties modified) { + setPackagePrefix(modified.myPackagePrefix); + setForGeneratedSources(modified.myForGeneratedSources); + } + + /** + * @deprecated use {@link #setPackagePrefix(String)} instead + */ + @Override + public void setData(@NotNull JavaSourceRootProperties data) { + applyChanges(data); + } + + /** + * @deprecated use {@link #getPackagePrefix()} instead + */ + @NotNull + @Override + public JavaSourceRootProperties getData() { + return this; + } } diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JavaSourceRootType.java b/jps/model-api/src/org/jetbrains/jps/model/java/JavaSourceRootType.java index 97a03687a0fd..c10c8cac70a6 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/JavaSourceRootType.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/JavaSourceRootType.java @@ -16,15 +16,13 @@ package org.jetbrains.jps.model.java; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jps.model.JpsElementFactory; -import org.jetbrains.jps.model.JpsSimpleElement; import org.jetbrains.jps.model.ex.JpsElementTypeBase; import org.jetbrains.jps.model.module.JpsModuleSourceRootType; /** * @author nik */ -public class JavaSourceRootType extends JpsElementTypeBase> implements JpsModuleSourceRootType> { +public class JavaSourceRootType extends JpsElementTypeBase implements JpsModuleSourceRootType { public static final JavaSourceRootType SOURCE = new JavaSourceRootType(); public static final JavaSourceRootType TEST_SOURCE = new JavaSourceRootType(); @@ -33,7 +31,7 @@ public class JavaSourceRootType extends JpsElementTypeBase createDefaultProperties() { - return JpsElementFactory.getInstance().createSimpleElement(new JavaSourceRootProperties()); + public JavaSourceRootProperties createDefaultProperties() { + return JpsJavaExtensionService.getInstance().createSourceRootProperties(""); } } diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java b/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java index 12df795d34a0..bcd5eeff098b 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java @@ -115,4 +115,10 @@ public abstract class JpsJavaExtensionService { @NotNull public abstract JpsApplicationRunConfigurationProperties createRunConfigurationProperties(JpsApplicationRunConfigurationState state); + + @NotNull + public abstract JavaSourceRootProperties createSourceRootProperties(@NotNull String packagePrefix, boolean isGenerated); + + @NotNull + public abstract JavaSourceRootProperties createSourceRootProperties(@NotNull String packagePrefix); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java index a27142cb8b3e..40179134c921 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java @@ -176,6 +176,18 @@ public class JpsJavaExtensionServiceImpl extends JpsJavaExtensionService { return new JpsApplicationRunConfigurationPropertiesImpl(state); } + @NotNull + @Override + public JavaSourceRootProperties createSourceRootProperties(@NotNull String packagePrefix, boolean isGenerated) { + return new JavaSourceRootProperties(packagePrefix, isGenerated); + } + + @NotNull + @Override + public JavaSourceRootProperties createSourceRootProperties(@NotNull String packagePrefix) { + return createSourceRootProperties(packagePrefix, false); + } + @Override @NotNull public JpsProductionModuleOutputPackagingElement createProductionModuleOutput(@NotNull JpsModuleReference moduleReference) { diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsModuleTest.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsModuleTest.java index 58ca33824813..438090741fda 100644 --- a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsModuleTest.java +++ b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsModuleTest.java @@ -30,8 +30,7 @@ import java.util.List; public class JpsModuleTest extends JpsModelTestCase { public void testAddSourceRoot() { final JpsModule module = myProject.addModule("m", JpsJavaModuleType.INSTANCE); - JpsSimpleElement properties = JpsElementFactory.getInstance().createSimpleElement( - new JavaSourceRootProperties("com.xxx")); + JavaSourceRootProperties properties = JpsJavaExtensionService.getInstance().createSourceRootProperties("com.xxx"); final JpsModuleSourceRoot sourceRoot = module.addSourceRoot("file://url", JavaSourceRootType.SOURCE, properties); assertSameElements(myDispatcher.retrieveAdded(JpsModule.class), module); @@ -41,9 +40,9 @@ public class JpsModuleTest extends JpsModelTestCase { assertEquals("file://url", root.getUrl()); assertSameElements(ContainerUtilRt.newArrayList(module.getSourceRoots(JavaSourceRootType.SOURCE)), root); assertEmpty(ContainerUtil.newArrayList(module.getSourceRoots(JavaSourceRootType.TEST_SOURCE))); - JpsTypedModuleSourceRoot> typedRoot = root.asTyped(JavaSourceRootType.SOURCE); + JpsTypedModuleSourceRoot typedRoot = root.asTyped(JavaSourceRootType.SOURCE); assertNotNull(typedRoot); - assertEquals("com.xxx", typedRoot.getProperties().getData().getPackagePrefix()); + assertEquals("com.xxx", typedRoot.getProperties().getPackagePrefix()); } public void testGetModulesOfType() { diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java index 4b2ae00b1b7d..0dfead17644f 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java @@ -56,6 +56,7 @@ public class JpsJavaModelSerializerExtension extends JpsModelSerializerExtension private static final String JAVADOC_PATHS_TAG = "javadoc-paths"; private static final String MODULE_LANGUAGE_LEVEL_ATTRIBUTE = "LANGUAGE_LEVEL"; public static final String ROOT_TAG = "root"; + private static final String IS_GENERATED_ATTRIBUTE = "generated"; public static final JavaSourceRootPropertiesSerializer JAVA_SOURCE_ROOT_PROPERTIES_SERIALIZER = new JavaSourceRootPropertiesSerializer(JavaSourceRootType.SOURCE, JpsModuleRootModelSerializer.JAVA_SOURCE_ROOT_TYPE_ID); @@ -301,25 +302,29 @@ public class JpsJavaModelSerializerExtension extends JpsModelSerializerExtension } } - private static class JavaSourceRootPropertiesSerializer extends JpsModuleSourceRootPropertiesSerializer> { - private JavaSourceRootPropertiesSerializer(JpsModuleSourceRootType> type, String typeId) { + private static class JavaSourceRootPropertiesSerializer extends JpsModuleSourceRootPropertiesSerializer { + private JavaSourceRootPropertiesSerializer(JpsModuleSourceRootType type, String typeId) { super(type, typeId); } @Override - public JpsSimpleElement loadProperties(@NotNull Element sourceRootTag) { + public JavaSourceRootProperties loadProperties(@NotNull Element sourceRootTag) { String packagePrefix = StringUtil.notNullize(sourceRootTag.getAttributeValue(JpsModuleRootModelSerializer.PACKAGE_PREFIX_ATTRIBUTE)); - return JpsElementFactory.getInstance().createSimpleElement(new JavaSourceRootProperties(packagePrefix)); + boolean isGenerated = Boolean.parseBoolean(sourceRootTag.getAttributeValue(IS_GENERATED_ATTRIBUTE)); + return getService().createSourceRootProperties(packagePrefix, isGenerated); } @Override - public void saveProperties(@NotNull JpsSimpleElement properties, @NotNull Element sourceRootTag) { + public void saveProperties(@NotNull JavaSourceRootProperties properties, @NotNull Element sourceRootTag) { String isTestSource = Boolean.toString(getType().equals(JavaSourceRootType.TEST_SOURCE)); sourceRootTag.setAttribute(JpsModuleRootModelSerializer.IS_TEST_SOURCE_ATTRIBUTE, isTestSource); - String packagePrefix = properties.getData().getPackagePrefix(); + String packagePrefix = properties.getPackagePrefix(); if (!packagePrefix.isEmpty()) { sourceRootTag.setAttribute(JpsModuleRootModelSerializer.PACKAGE_PREFIX_ATTRIBUTE, packagePrefix); } + if (properties.isForGeneratedSources()) { + sourceRootTag.setAttribute(IS_GENERATED_ATTRIBUTE, Boolean.TRUE.toString()); + } } } } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditor.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditor.java index 1a8b4ed4f861..b0281439cd37 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditor.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditor.java @@ -26,16 +26,15 @@ import com.intellij.util.EventDispatcher; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElement; -import org.jetbrains.jps.model.JpsElementFactory; -import org.jetbrains.jps.model.java.JavaSourceRootProperties; import org.jetbrains.jps.model.java.JavaSourceRootType; +import org.jetbrains.jps.model.java.JpsJavaExtensionService; import org.jetbrains.jps.model.module.JpsModuleSourceRootType; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.util.*; +import java.util.EventListener; import java.util.List; /** @@ -207,7 +206,7 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb @Nullable public SourceFolder addSourceFolder(@NotNull final VirtualFile file, boolean isTestSource, String packagePrefix) { return addSourceFolder(file, isTestSource ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE, - JpsElementFactory.getInstance().createSimpleElement(new JavaSourceRootProperties(packagePrefix))); + JpsJavaExtensionService.getInstance().createSourceRootProperties(packagePrefix)); } @Nullable diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/JavaSourceRootEditHandlerBase.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/JavaSourceRootEditHandlerBase.java index e17d4c5724f1..ce2fb6525bdb 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/JavaSourceRootEditHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/JavaSourceRootEditHandlerBase.java @@ -18,11 +18,14 @@ package com.intellij.openapi.roots.ui.configuration; import com.intellij.icons.AllIcons; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.roots.SourceFolder; -import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.roots.impl.SourceFolderImpl; +import com.intellij.openapi.ui.DialogWrapper; import com.intellij.ui.roots.IconActionComponent; +import com.intellij.util.ui.FormBuilder; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.JpsSimpleElement; +import org.jetbrains.jps.model.JpsElement; import org.jetbrains.jps.model.java.JavaSourceRootProperties; import org.jetbrains.jps.model.module.JpsModuleSourceRootType; @@ -32,16 +35,23 @@ import java.awt.*; /** * @author nik */ -public abstract class JavaSourceRootEditHandlerBase extends ModuleSourceRootEditHandler> { - public JavaSourceRootEditHandlerBase(JpsModuleSourceRootType> rootType) { +public abstract class JavaSourceRootEditHandlerBase extends ModuleSourceRootEditHandler { + public JavaSourceRootEditHandlerBase(JpsModuleSourceRootType rootType) { super(rootType); } @Nullable @Override - public String getPropertiesString(@NotNull JpsSimpleElement properties) { - String packagePrefix = properties.getData().getPackagePrefix(); - return packagePrefix.isEmpty() ? null : " (" + packagePrefix + ")"; + public String getPropertiesString(@NotNull JavaSourceRootProperties properties) { + StringBuilder buffer = new StringBuilder(); + if (properties.isForGeneratedSources()) { + buffer.append(" [generated]"); + } + String packagePrefix = properties.getPackagePrefix(); + if (!packagePrefix.isEmpty()) { + buffer.append(" (").append(packagePrefix).append(")"); + } + return buffer.length() > 0 ? buffer.toString() : null; } @Nullable @@ -51,16 +61,13 @@ public abstract class JavaSourceRootEditHandlerBase extends ModuleSourceRootEdit @NotNull final ContentRootPanel.ActionCallback callback) { final IconActionComponent iconComponent = new IconActionComponent(AllIcons.Modules.SetPackagePrefix, AllIcons.Modules.SetPackagePrefixRollover, - ProjectBundle.message("module.paths.package.prefix.tooltip"), new Runnable() { + ProjectBundle.message("module.paths.edit.properties.tooltip"), new Runnable() { @Override public void run() { - final String message = ProjectBundle.message("module.paths.package.prefix.prompt", - ContentRootPanel.toRelativeDisplayPath(folder.getUrl(), folder.getContentEntry().getUrl() + ":")); - final String prefix = Messages.showInputDialog(parentComponent, message, - ProjectBundle.message("module.paths.package.prefix.title"), - Messages.getQuestionIcon(), folder.getPackagePrefix(), null); - if (prefix != null) { - folder.setPackagePrefix(prefix); + JpsElement properties = ((SourceFolderImpl)folder).getJpsElement().getProperties(); + SourceRootPropertiesDialog dialog = new SourceRootPropertiesDialog(parentComponent, (JavaSourceRootProperties)properties); + dialog.show(); + if (dialog.isOK()) { callback.onSourceRootPropertiesChanged(folder); } } @@ -71,4 +78,46 @@ public abstract class JavaSourceRootEditHandlerBase extends ModuleSourceRootEdit panel.add(Box.createHorizontalStrut(3), BorderLayout.EAST); return panel; } + + private static class SourceRootPropertiesDialog extends DialogWrapper { + private final JTextField myPackagePrefixField; + private final JCheckBox myIsGeneratedCheckBox; + private final JPanel myMainPanel; + @NotNull private final JavaSourceRootProperties myProperties; + + private SourceRootPropertiesDialog(@NotNull JComponent parentComponent, @NotNull JavaSourceRootProperties properties) { + super(parentComponent, true); + myProperties = properties; + setTitle(ProjectBundle.message("module.paths.edit.properties.title")); + myPackagePrefixField = new JTextField(); + myIsGeneratedCheckBox = new JCheckBox(UIUtil.replaceMnemonicAmpersand("For &generated sources")); + myMainPanel = FormBuilder.createFormBuilder() + .addLabeledComponent("Package &prefix:", myPackagePrefixField) + .addComponent(myIsGeneratedCheckBox) + .getPanel(); + myPackagePrefixField.setText(myProperties.getPackagePrefix()); + myPackagePrefixField.setColumns(25); + myIsGeneratedCheckBox.setSelected(myProperties.isForGeneratedSources()); + init(); + } + + @Nullable + @Override + public JComponent getPreferredFocusedComponent() { + return myPackagePrefixField; + } + + @Override + protected void doOKAction() { + myProperties.setPackagePrefix(myPackagePrefixField.getText().trim()); + myProperties.setForGeneratedSources(myIsGeneratedCheckBox.isSelected()); + super.doOKAction(); + } + + @Nullable + @Override + protected JComponent createCenterPanel() { + return myMainPanel; + } + } } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/SourceFolderImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/SourceFolderImpl.java index 0a57f8cefeb4..4f088705df43 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/SourceFolderImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/SourceFolderImpl.java @@ -27,7 +27,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElement; import org.jetbrains.jps.model.JpsElementFactory; -import org.jetbrains.jps.model.JpsSimpleElement; import org.jetbrains.jps.model.java.JavaResourceRootType; import org.jetbrains.jps.model.java.JavaSourceRootProperties; import org.jetbrains.jps.model.java.JavaSourceRootType; @@ -77,12 +76,12 @@ public class SourceFolderImpl extends ContentFolderBaseImpl implements SourceFol @NotNull @Override public String getPackagePrefix() { - JpsSimpleElement properties = getJavaProperties(); - return properties != null ? properties.getData().getPackagePrefix() : DEFAULT_PACKAGE_PREFIX; + JavaSourceRootProperties properties = getJavaProperties(); + return properties != null ? properties.getPackagePrefix() : DEFAULT_PACKAGE_PREFIX; } @Nullable - private JpsSimpleElement getJavaProperties() { + private JavaSourceRootProperties getJavaProperties() { if (myJpsElement.getRootType() == JavaSourceRootType.SOURCE) { return myJpsElement.getProperties(JavaSourceRootType.SOURCE); } @@ -94,9 +93,9 @@ public class SourceFolderImpl extends ContentFolderBaseImpl implements SourceFol @Override public void setPackagePrefix(@NotNull String packagePrefix) { - JpsSimpleElement properties = getJavaProperties(); + JavaSourceRootProperties properties = getJavaProperties(); if (properties != null) { - properties.setData(new JavaSourceRootProperties(packagePrefix)); + properties.setPackagePrefix(packagePrefix); } } @@ -129,6 +128,12 @@ public class SourceFolderImpl extends ContentFolderBaseImpl implements SourceFol if (i!= 0) return i; i = Boolean.valueOf(isTestSource()).compareTo(sourceFolder.isTestSource()); if (i != 0) return i; + JavaSourceRootProperties properties1 = getJavaProperties(); + JavaSourceRootProperties properties2 = sourceFolder.getJavaProperties(); + if (properties1 != null && properties2 != null) { + i = Boolean.valueOf(properties1.isForGeneratedSources()).compareTo(properties2.isForGeneratedSources()); + if (i != 0) return i; + } //todo[nik] perhaps we should use LinkedSet instead of SortedSet and get rid of this method return myJpsElement.getRootType().getClass().getName().compareTo(sourceFolder.getRootType().getClass().getName()); } diff --git a/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsContentEntry.java b/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsContentEntry.java index 31c4c9f83631..27d737d776a1 100644 --- a/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsContentEntry.java +++ b/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsContentEntry.java @@ -33,10 +33,9 @@ import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElement; -import org.jetbrains.jps.model.JpsElementFactory; -import org.jetbrains.jps.model.JpsSimpleElement; import org.jetbrains.jps.model.java.JavaSourceRootProperties; import org.jetbrains.jps.model.java.JavaSourceRootType; +import org.jetbrains.jps.model.java.JpsJavaExtensionService; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModuleSourceRoot; import org.jetbrains.jps.model.module.JpsModuleSourceRootType; @@ -190,7 +189,7 @@ public class JpsContentEntry implements ContentEntry, Disposable { private SourceFolder addSourceFolder(final String url, boolean isTestSource, String packagePrefix) { final JavaSourceRootType rootType = isTestSource ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE; - JpsSimpleElement properties = JpsElementFactory.getInstance().createSimpleElement(new JavaSourceRootProperties(packagePrefix)); + JavaSourceRootProperties properties = JpsJavaExtensionService.getInstance().createSourceRootProperties(packagePrefix); return addSourceFolder(url, rootType, properties); } diff --git a/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsSourceFolder.java b/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsSourceFolder.java index 8bd6a93a3861..2616121cbae4 100644 --- a/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsSourceFolder.java +++ b/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsSourceFolder.java @@ -52,7 +52,7 @@ public class JpsSourceFolder extends JpsContentFolderBase implements SourceFolde } @Nullable - private JpsSimpleElement getJavaProperties() { + private JavaSourceRootProperties getJavaProperties() { if (mySourceRoot.getRootType() == JavaSourceRootType.SOURCE) { return mySourceRoot.getProperties(JavaSourceRootType.SOURCE); } @@ -64,9 +64,9 @@ public class JpsSourceFolder extends JpsContentFolderBase implements SourceFolde @Override public void setPackagePrefix(@NotNull String packagePrefix) { - JpsSimpleElement properties = getJavaProperties(); + JavaSourceRootProperties properties = getJavaProperties(); if (properties != null) { - properties.setData(new JavaSourceRootProperties(packagePrefix)); + properties.setPackagePrefix(packagePrefix); } } diff --git a/platform/projectModel-impl/src/messages/ProjectBundle.properties b/platform/projectModel-impl/src/messages/ProjectBundle.properties index d44173b65656..60001e65e687 100644 --- a/platform/projectModel-impl/src/messages/ProjectBundle.properties +++ b/platform/projectModel-impl/src/messages/ProjectBundle.properties @@ -107,15 +107,10 @@ module.paths.unmark.tests.tooltip=Unmark Tests module.paths.unmark.source.tooltip=Unmark Source module.paths.include.excluded.tooltip=Include module.paths.remove.tooltip=Remove -module.paths.package.prefix.tooltip=Set package prefix -module.paths.package.prefix.prompt=Enter package prefix for {0} -module.paths.package.prefix.title=Set Package Prefix -module.dependencies.title=Dependencies -module.dependencies.caption=Check modules this module depends on +module.paths.edit.properties.tooltip=Edit properties +module.paths.edit.properties.title=Edit Root Properties module.javadoc.title=JavaDoc -module.javadoc.add.path.button=&Add Path... module.javadoc.add.url.button=Add JavaDoc URL... -module.javadoc.remove.button=&Remove module.javadoc.add.path.title=Add Path To JavaDoc module.javadoc.add.path.prompt=Select jar/zip files or directories in which module javadoc documentation is located jdk.combo.box.project.item= @@ -128,9 +123,6 @@ module.libraries.target.jdk.select.title=Select Project SDK module.libraries.javadoc.url.button=Specify Documentation &URL... module.libraries.attach.sources.button=Attach &Sources... module.libraries.attach.sources.immediately.button=Attach &Sources -module.libraries.attach.more.button=Attach &More... -attach.annotations.button=Attach Anno&tations... -module.libraries.add.button=&Add Library... button.text.attach.files=Attach &Files or Directories... library.attach.files.action=Attach Files or Directories diff --git a/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsIdeaSpecificSettings.java b/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsIdeaSpecificSettings.java index 593ce86b4f0b..80393f7b4e4c 100644 --- a/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsIdeaSpecificSettings.java +++ b/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsIdeaSpecificSettings.java @@ -24,7 +24,7 @@ import org.jdom.Element; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.eclipse.IdeaXml; import org.jetbrains.idea.eclipse.conversion.AbstractIdeaSpecificSettings; -import org.jetbrains.jps.model.JpsSimpleElement; +import org.jetbrains.jps.model.JpsElement; import org.jetbrains.jps.model.java.*; import org.jetbrains.jps.model.library.sdk.JpsSdkType; import org.jetbrains.jps.model.module.JpsDependenciesList; @@ -167,7 +167,10 @@ class JpsIdeaSpecificSettings extends AbstractIdeaSpecificSettings