migrated to artifacts
[fedora-idea.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / JavaContentEntriesEditor.java
blobab6e80152f6d7543b6e4eb8e9dd9abae558d2047
1 package com.intellij.openapi.roots.ui.configuration;
3 import com.intellij.Patches;
4 import com.intellij.ide.util.JavaUtil;
5 import com.intellij.openapi.module.Module;
6 import com.intellij.openapi.progress.ProgressIndicator;
7 import com.intellij.openapi.progress.ProgressManager;
8 import com.intellij.openapi.progress.util.ProgressWindow;
9 import com.intellij.openapi.progress.util.SmoothProgressAdapter;
10 import com.intellij.openapi.project.Project;
11 import com.intellij.openapi.project.ProjectBundle;
12 import com.intellij.openapi.roots.ContentEntry;
13 import com.intellij.openapi.roots.ModifiableRootModel;
14 import com.intellij.openapi.util.Pair;
15 import com.intellij.openapi.vfs.LocalFileSystem;
16 import com.intellij.openapi.vfs.VfsUtil;
17 import com.intellij.openapi.vfs.VirtualFile;
18 import com.intellij.util.concurrency.SwingWorker;
20 import javax.swing.*;
21 import java.awt.*;
22 import java.io.File;
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Map;
27 public class JavaContentEntriesEditor extends CommonContentEntriesEditor {
28 public JavaContentEntriesEditor(Project project, String moduleName, ModifiableRootModel model, ModulesProvider modulesProvider) {
29 super(project, moduleName, model, modulesProvider);
32 protected ContentEntryEditor createContentEntryEditor(ContentEntry contentEntry) {
33 return new JavaContentEntryEditor(contentEntry, myModel);
36 protected ContentEntryTreeEditor createContentEntryTreeEditor(Project project) {
37 return new JavaContentEntryTreeEditor(project);
40 @Override
41 protected List<ContentEntry> addContentEntries(VirtualFile[] files) {
42 List<ContentEntry> contentEntries = super.addContentEntries(files);
43 if (contentEntries.size() > 0) {
44 final ContentEntry[] contentEntriesArray = contentEntries.toArray(new ContentEntry[contentEntries.size()]);
45 addSourceRoots(myProject, contentEntriesArray, new Runnable() {
46 public void run() {
47 addContentEntryPanels(contentEntriesArray);
49 });
51 return contentEntries;
54 private static void addSourceRoots(final Project project, final ContentEntry[] contentEntries, final Runnable finishRunnable) {
55 final HashMap<ContentEntry, List<Pair<File, String>>> entryToRootMap = new HashMap<ContentEntry, List<Pair<File, String>>>();
56 final Map<File, ContentEntry> fileToEntryMap = new HashMap<File, ContentEntry>();
57 for (final ContentEntry contentEntry : contentEntries) {
58 final VirtualFile file = contentEntry.getFile();
59 if (file != null) {
60 entryToRootMap.put(contentEntry, null);
61 fileToEntryMap.put(VfsUtil.virtualToIoFile(file), contentEntry);
65 final ProgressWindow progressWindow = new ProgressWindow(true, project);
66 final ProgressIndicator progressIndicator = Patches.MAC_HIDE_QUIT_HACK
67 ? progressWindow
68 : new SmoothProgressAdapter(progressWindow, project);
70 final Runnable searchRunnable = new Runnable() {
71 public void run() {
72 final Runnable process = new Runnable() {
73 public void run() {
74 for (final File file : fileToEntryMap.keySet()) {
75 progressIndicator.setText(ProjectBundle.message("module.paths.searching.source.roots.progress", file.getPath()));
76 final List<Pair<File, String>> roots = JavaUtil.suggestRoots(file);
77 entryToRootMap.put(fileToEntryMap.get(file), roots);
81 progressWindow.setTitle(ProjectBundle.message("module.paths.searching.source.roots.title"));
82 ProgressManager.getInstance().runProcess(process, progressIndicator);
86 final Runnable addSourcesRunnable = new Runnable() {
87 public void run() {
88 for (final ContentEntry contentEntry : contentEntries) {
89 final List<Pair<File, String>> suggestedRoots = entryToRootMap.get(contentEntry);
90 if (suggestedRoots != null) {
91 for (final Pair<File, String> suggestedRoot : suggestedRoots) {
92 final VirtualFile sourceRoot = LocalFileSystem.getInstance().findFileByIoFile(suggestedRoot.first);
93 final VirtualFile fileContent = contentEntry.getFile();
94 if (sourceRoot != null && fileContent != null && VfsUtil.isAncestor(fileContent, sourceRoot, false)) {
95 contentEntry.addSourceFolder(sourceRoot, false, suggestedRoot.getSecond());
100 if (finishRunnable != null) {
101 finishRunnable.run();
106 new SwingWorker() {
107 public Object construct() {
108 searchRunnable.run();
109 return null;
112 public void finished() {
113 addSourcesRunnable.run();
115 }.start();
118 protected JPanel createBottomControl(Module module) {
119 final JPanel innerPanel = new JPanel(new GridBagLayout());
120 innerPanel.setBorder(BorderFactory.createEmptyBorder(6, 0, 0, 6));
121 return innerPanel;