Merge remote-tracking branch 'origin/master' into mark_folder_as
authorAnton Makeev <Anton.Makeev@jetbrains.com>
Fri, 13 Nov 2015 16:17:33 +0000 (17:17 +0100)
committerAnton Makeev <Anton.Makeev@jetbrains.com>
Fri, 13 Nov 2015 16:17:33 +0000 (17:17 +0100)
java/java-impl/src/com/intellij/ide/projectView/actions/MarkGeneratedSourceRootAction.java
java/java-impl/src/com/intellij/ide/projectView/actions/UnmarkGeneratedSourceRootAction.java
java/java-impl/src/com/intellij/ide/projectView/impl/JavaProjectViewDirectoryHelper.java
platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkExcludeRootAction.java
platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkRootActionBase.java
platform/lang-impl/src/com/intellij/ide/projectView/actions/MarkSourceRootAction.java
platform/lang-impl/src/com/intellij/ide/projectView/actions/UnmarkRootAction.java
platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java
platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java
platform/platform-resources-en/src/messages/LangBundle.properties
platform/projectModel-impl/src/messages/ProjectBundle.properties

index 59d36b88ce70b4a6cd44ac203c7919d4d6580a52..de0ea969c0869026f6f2c365eee077a64ac77ff3 100644 (file)
@@ -68,7 +68,7 @@ public class MarkGeneratedSourceRootAction extends MarkRootActionBase {
   }
 
   @Override
-  protected void modifyRoots(VirtualFile vFile, ContentEntry entry) {
+  protected void modifyRoots(@NotNull VirtualFile vFile, @NotNull ContentEntry entry) {
     JavaSourceRootProperties properties = JpsJavaExtensionService.getInstance().createSourceRootProperties("", true);
     entry.addSourceFolder(vFile, JavaSourceRootType.SOURCE, properties);
   }
index 0af8706ab38c3e4b4b03772314e4984abc51479c..c79d844411e5adbbd52dc2c3b59901be97d7bb99 100644 (file)
@@ -49,7 +49,7 @@ public class UnmarkGeneratedSourceRootAction extends MarkRootActionBase {
   }
 
   @Override
-  protected void modifyRoots(VirtualFile vFile, ContentEntry entry) {
+  protected void modifyRoots(@NotNull VirtualFile vFile, @NotNull ContentEntry entry) {
     entry.addSourceFolder(vFile, JavaSourceRootType.SOURCE);
   }
 }
index c5ad4b06700fd650bc41f3ac7c6e70c17f996a22..a08df2d952783b62455ee0aeead0d283ae14dad7 100644 (file)
@@ -23,10 +23,12 @@ import com.intellij.ide.util.treeView.TreeViewUtil;
 import com.intellij.lang.LangBundle;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.impl.DirectoryIndex;
+import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vfs.impl.jrt.JrtFileSystem;
 import com.intellij.psi.JavaDirectoryService;
 import com.intellij.psi.PsiDirectory;
 import com.intellij.psi.PsiPackage;
+import com.intellij.util.FontUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -41,13 +43,18 @@ public class JavaProjectViewDirectoryHelper extends ProjectViewDirectoryHelper {
     super(project, index);
   }
 
+  @Nullable
   @Override
-  public String getLocationString(@NotNull final PsiDirectory directory) {
+  public String getLocationString(@NotNull PsiDirectory directory, boolean includeUrl, boolean includeRootType) {
+    String result = null;
     PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directory);
     if (ProjectRootsUtil.isSourceRoot(directory) && aPackage != null) {   //package prefix
-      return aPackage.getQualifiedName();
+      result = StringUtil.nullize(aPackage.getQualifiedName(), true);
     }
-    return super.getLocationString(directory);
+    String baseString = super.getLocationString(directory, includeUrl, includeRootType);
+    if (result == null) return baseString;
+    if (baseString == null) return result;
+    return result  + "," + FontUtil.spaceAndThinSpace() + baseString;
   }
 
   @Override
index 2e55b4aee11a254a8c244435ee42b0b57062147a..7fbb9c3b9eca8362711377a62f3eb26da38cd411 100644 (file)
@@ -49,7 +49,7 @@ public class MarkExcludeRootAction extends MarkRootActionBase {
            " from the project?\nYou can restore excluded directories later using the Project Structure dialog.";
   }
 
-  protected void modifyRoots(VirtualFile vFile, ContentEntry entry) {
+  protected void modifyRoots(@NotNull VirtualFile vFile, @NotNull ContentEntry entry) {
     entry.addExcludeFolder(vFile);
   }
 
index 79553d1d331ffba2b283615b486ec595115b5334..633f677e9dee06979d96e53beed02e6a9220f634 100644 (file)
@@ -33,6 +33,7 @@ import com.intellij.openapi.vfs.VirtualFile;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import javax.swing.*;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -40,6 +41,17 @@ import java.util.List;
  * @author yole
  */
 public abstract class MarkRootActionBase extends DumbAwareAction {
+  public MarkRootActionBase() {
+  }
+
+  public MarkRootActionBase(@Nullable String text) {
+    super(text);
+  }
+
+  public MarkRootActionBase(@Nullable String text, @Nullable String description, @Nullable Icon icon) {
+    super(text, description, icon);
+  }
+
   @Override
   public void actionPerformed(AnActionEvent e) {
     VirtualFile[] files = e.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY);
@@ -47,7 +59,10 @@ public abstract class MarkRootActionBase extends DumbAwareAction {
     if (module == null) {
       return;
     }
+    modifyRoots(e, module, files);
+  }
 
+  protected void modifyRoots(@NotNull  AnActionEvent e, @NotNull final Module module, @NotNull VirtualFile[] files) {
     final ModifiableRootModel model = ModuleRootManager.getInstance(module).getModifiableModel();
     for (VirtualFile file : files) {
       ContentEntry entry = findContentEntry(model, file);
@@ -167,7 +182,7 @@ public abstract class MarkRootActionBase extends DumbAwareAction {
     return result;
   }
 
-  protected static class RootsSelection {
+  public static class RootsSelection {
     public static final RootsSelection EMPTY = new RootsSelection();
 
     public List<SourceFolder> mySelectedRoots = new ArrayList<SourceFolder>();
index d1219d72cb74d2d86f165cd20bcb8fab5f41a335..d8add5e8708d7027cd58b4e9015d9dca60104de8 100644 (file)
@@ -44,7 +44,7 @@ public class MarkSourceRootAction extends MarkRootActionBase {
     presentation.setDescription(ProjectBundle.message("module.toggle.sources.action.description", editHandler.getRootTypeName()));
   }
 
-  protected void modifyRoots(VirtualFile vFile, ContentEntry entry) {
+  protected void modifyRoots(@NotNull VirtualFile vFile, @NotNull ContentEntry entry) {
     entry.addSourceFolder(vFile, myRootType);
   }
 
index 9131ae53aeef3288dc8b8d8bccae827a6abcd8a3..1fe2eb6721996b90088753be5679a7baf1e73ea4 100644 (file)
@@ -15,6 +15,7 @@
  */
 package com.intellij.ide.projectView.actions;
 
+import com.intellij.lang.LangBundle;
 import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.roots.ContentEntry;
@@ -40,25 +41,31 @@ public class UnmarkRootAction extends MarkRootActionBase {
     if (!Registry.is("ide.hide.excluded.files") && !selection.mySelectedExcludeRoots.isEmpty()
         && selection.mySelectedDirectories.isEmpty() && selection.mySelectedRoots.isEmpty()) {
       e.getPresentation().setEnabledAndVisible(true);
-      e.getPresentation().setText("Cancel Exclusion");
+      e.getPresentation().setText(LangBundle.message("mark.as.unmark.excluded"));
       return;
     }
 
     super.doUpdate(e, module, selection);
 
+    String text = getActionText(e, module, selection);
+    if (text != null) e.getPresentation().setText(text);
+  }
+
+  @Nullable
+  protected String getActionText(@NotNull AnActionEvent e, @Nullable Module module, @NotNull RootsSelection selection) {
     Set<ModuleSourceRootEditHandler<?>> selectedRootHandlers = getHandlersForSelectedRoots(selection);
 
     if (!selectedRootHandlers.isEmpty()) {
-      String text;
       if (selectedRootHandlers.size() == 1) {
         ModuleSourceRootEditHandler<?> handler = selectedRootHandlers.iterator().next();
-        text = "Unmark as " + handler.getRootTypeName() + " " + StringUtil.pluralize("Root", selection.mySelectedRoots.size());
+        return LangBundle.message("mark.as.unmark", 
+                                  handler.getRootTypeName() + " " + StringUtil.pluralize("Root", selection.mySelectedRoots.size()));
       }
       else {
-        text = "Unmark Roots";
+        return LangBundle.message("mark.as.unmark.several");
       }
-      e.getPresentation().setText(text);
     }
+    return null;
   }
 
   @NotNull
@@ -75,7 +82,7 @@ public class UnmarkRootAction extends MarkRootActionBase {
     return selection.mySelectedDirectories.isEmpty() && !getHandlersForSelectedRoots(selection).isEmpty();
   }
 
-  protected void modifyRoots(VirtualFile file, ContentEntry entry) {
+  protected void modifyRoots(@NotNull VirtualFile file, @NotNull ContentEntry entry) {
     for (ExcludeFolder excludeFolder : entry.getExcludeFolders()) {
       if (file.equals(excludeFolder.getFile())) {
         entry.removeExcludeFolder(excludeFolder);
index 4edc11eca068bf8c0e51ae3c983d394ed410c691..86b70f093ff789444e1ddd89cd4351b2b588ee4d 100644 (file)
@@ -29,26 +29,25 @@ import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.fileTypes.FileTypeRegistry;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.ModuleFileIndex;
-import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.openapi.roots.ProjectFileIndex;
-import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.project.ProjectBundle;
+import com.intellij.openapi.roots.*;
 import com.intellij.openapi.roots.impl.DirectoryIndex;
 import com.intellij.openapi.roots.impl.DirectoryInfo;
+import com.intellij.openapi.roots.ui.configuration.ModuleSourceRootEditHandler;
 import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.util.registry.Registry;
+import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.*;
 import com.intellij.psi.search.PsiElementProcessor;
 import com.intellij.psi.util.PsiUtilCore;
+import com.intellij.util.FontUtil;
 import gnu.trove.THashSet;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 public class ProjectViewDirectoryHelper {
   protected static final Logger LOG = Logger.getInstance("#" + ProjectViewDirectoryHelper.class.getName());
@@ -69,21 +68,41 @@ public class ProjectViewDirectoryHelper {
     return myProject;
   }
 
+
   @Nullable
   public String getLocationString(@NotNull PsiDirectory psiDirectory) {
+    return getLocationString(psiDirectory, false, false);
+  }
+
+  @Nullable
+  public String getLocationString(@NotNull PsiDirectory psiDirectory, boolean includeUrl, boolean includeRootType) {
+    StringBuilder result = new StringBuilder();
+
     final VirtualFile directory = psiDirectory.getVirtualFile();
-    
+
     if (ProjectRootsUtil.isLibraryRoot(directory, psiDirectory.getProject())) {
-      return "library home";
+      result.append(ProjectBundle.message("module.paths.root.node", "library"));
     }
-    
-    final VirtualFile contentRootForFile = ProjectRootManager.getInstance(myProject).getFileIndex().getContentRootForFile(directory);
-    if (Comparing.equal(contentRootForFile, psiDirectory)) {
-      return directory.getPresentableUrl();
+    else if (includeRootType) {
+      SourceFolder sourceRoot = ProjectRootsUtil.getModuleSourceRoot(psiDirectory.getVirtualFile(), psiDirectory.getProject());
+      if (sourceRoot != null) {
+        ModuleSourceRootEditHandler<?> handler = ModuleSourceRootEditHandler.getEditHandler(sourceRoot.getRootType());
+        if (handler != null) {
+          String rootType = handler.getRootTypeName().toLowerCase(Locale.getDefault());
+          String unpluralized = StringUtil.unpluralize(rootType);
+          if (unpluralized != null) rootType = unpluralized;
+          result.append(ProjectBundle.message("module.paths.root.node", rootType));
+        }
+      }
     }
-    return null;
-  }
 
+    if (includeUrl || ProjectRootsUtil.isModuleContentRoot(directory, psiDirectory.getProject())) {
+      if (result.length() > 0) result.append(",").append(FontUtil.spaceAndThinSpace());
+      result.append(FileUtil.getLocationRelativeToUserHome(directory.getPresentableUrl()));
+    }
+    
+    return result.length() == 0 ? null : result.toString();
+  }
 
 
   public boolean isShowFQName(ViewSettings settings, Object parentValue, PsiDirectory value) {
index 72f58eeac8a2f34edeaa40a9f1c8db217fcc7154..6c523128f83f666c9408844ff9393d170a2250a6 100644 (file)
@@ -33,12 +33,9 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.OrderEntry;
 import com.intellij.openapi.roots.ProjectFileIndex;
 import com.intellij.openapi.roots.ProjectRootManager;
-import com.intellij.openapi.roots.SourceFolder;
 import com.intellij.openapi.roots.libraries.LibraryUtil;
-import com.intellij.openapi.roots.ui.configuration.ModuleSourceRootEditHandler;
 import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService;
 import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.util.registry.Registry;
 import com.intellij.openapi.vfs.LocalFileSystem;
 import com.intellij.openapi.vfs.VFileProperty;
@@ -51,12 +48,14 @@ import com.intellij.psi.impl.file.PsiDirectoryFactory;
 import com.intellij.ui.LayeredIcon;
 import com.intellij.ui.RowIcon;
 import com.intellij.ui.SimpleTextAttributes;
-import com.intellij.util.*;
+import com.intellij.util.IconUtil;
+import com.intellij.util.PathUtil;
+import com.intellij.util.PlatformIcons;
+import com.intellij.util.PlatformUtils;
 import org.jetbrains.annotations.NotNull;
 
 import javax.swing.*;
 import java.util.Collection;
-import java.util.Locale;
 
 public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements NavigatableWithText {
   public PsiDirectoryNode(Project project, PsiDirectory value, ViewSettings viewSettings) {
@@ -102,21 +101,7 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements Navig
           data.addText(directoryFile.getName(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
         }
 
-        if (parentValue instanceof Module || parentValue instanceof Project) {
-          final String location = FileUtil.getLocationRelativeToUserHome(directoryFile.getPresentableUrl());
-          data.addText(FontUtil.spaceAndThinSpace() + location, SimpleTextAttributes.GRAYED_ATTRIBUTES);
-        }
-        else if (shouldShowSourcesRoot()) {
-          SourceFolder sourceRoot = ProjectRootsUtil.getModuleSourceRoot(directoryFile, project);
-          if (sourceRoot != null) {
-            ModuleSourceRootEditHandler<?> handler = ModuleSourceRootEditHandler.getEditHandler(sourceRoot.getRootType());
-            if (handler != null) {
-              String rootTypeName = handler.getRootTypeName();
-              data.addText(FontUtil.spaceAndThinSpace() + rootTypeName.toLowerCase(Locale.getDefault()) + " root",  SimpleTextAttributes.GRAYED_ATTRIBUTES);
-            }
-          }
-        }
-
+        data.setLocationString(ProjectViewDirectoryHelper.getInstance(project).getLocationString(psiDirectory, true, shouldShowSourcesRoot()));
         setupIcon(data, psiDirectory);
 
         return;
@@ -132,7 +117,7 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements Navig
     }
 
     data.setPresentableText(name);
-    data.setLocationString(ProjectViewDirectoryHelper.getInstance(project).getLocationString(psiDirectory));
+    data.setLocationString(ProjectViewDirectoryHelper.getInstance(project).getLocationString(psiDirectory, false, false));
 
     setupIcon(data, psiDirectory);
   }
index 4379559848a0fc65724817f3db223e555d1cbb82..9d140ebe16d8ec6124bda8301745e9898ba2ae47 100644 (file)
@@ -58,3 +58,7 @@ jrt.not.available.message=You need to run IDEA on Java 8 to be able to use modul
 jrt.not.available.title=Unsupported JDK ''{0}'' detected
 
 compound.run.configuration.cycle={0} ''{1}'' causes dependency cycle and cannot be added
+
+mark.as.unmark=Unmark as {0}
+mark.as.unmark.excluded=Cancel Exclusion
+mark.as.unmark.several=Unmark Roots
\ No newline at end of file
index 7514198998ed3206398ec917c21d6e566a995d7c..8e576fd822bf048df151bf2a8df10f79b40665c1 100644 (file)
@@ -95,6 +95,7 @@ module.paths.validation.source.root.belongs.to.another.module.error=Source root
 module.paths.remove.content.prompt=Remove content root \"{0}\"?
 module.paths.remove.content.title=Remove Content Root
 module.paths.empty.node=<empty>
+module.paths.root.node={0} root
 module.paths.sources.group=Source Folders
 module.paths.test.sources.group=Test Source Folders
 module.paths.excluded.group=Excluded Folders