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
;
23 import java
.util
.HashMap
;
24 import java
.util
.List
;
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
);
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() {
47 addContentEntryPanels(contentEntriesArray
);
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();
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
68 : new SmoothProgressAdapter(progressWindow
, project
);
70 final Runnable searchRunnable
= new Runnable() {
72 final Runnable process
= new Runnable() {
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() {
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();
107 public Object
construct() {
108 searchRunnable
.run();
112 public void finished() {
113 addSourcesRunnable
.run();
118 protected JPanel
createBottomControl(Module module
) {
119 final JPanel innerPanel
= new JPanel(new GridBagLayout());
120 innerPanel
.setBorder(BorderFactory
.createEmptyBorder(6, 0, 0, 6));