From caf9a2d4abed402965e34c373d21a4da249c18aa Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Mon, 19 Oct 2009 15:14:46 +0400 Subject: [PATCH] modifiable root model: stateless content entry editor --- .../JavaContentEntriesEditor.java | 10 ++- .../configuration/JavaContentEntryEditor.java | 27 +++--- .../configuration/JavaContentRootPanel.java | 22 ++--- .../CommonContentEntriesEditor.java | 78 +++++++++-------- .../ui/configuration/ContentEntryEditor.java | 84 ++++++++++++------- .../ui/configuration/ContentRootPanel.java | 34 ++++---- 6 files changed, 155 insertions(+), 100 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentEntriesEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentEntriesEditor.java index 70492ad3ab8f..127cf945ee6f 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentEntriesEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentEntriesEditor.java @@ -25,6 +25,7 @@ import com.intellij.openapi.progress.util.SmoothProgressAdapter; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.roots.ContentEntry; +import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; @@ -43,8 +44,13 @@ public class JavaContentEntriesEditor extends CommonContentEntriesEditor { super(moduleName, state); } - protected ContentEntryEditor createContentEntryEditor(ContentEntry contentEntry) { - return new JavaContentEntryEditor(contentEntry, getModel()); + protected ContentEntryEditor createContentEntryEditor(final String contentEntryUrl) { + return new JavaContentEntryEditor(contentEntryUrl) { + @Override + protected ModifiableRootModel getModel() { + return JavaContentEntriesEditor.this.getModel(); + } + }; } protected ContentEntryTreeEditor createContentEntryTreeEditor(Project project) { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentEntryEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentEntryEditor.java index cde7f8ae3170..52583a151a8a 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentEntryEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentEntryEditor.java @@ -17,22 +17,27 @@ package com.intellij.openapi.roots.ui.configuration; import com.intellij.openapi.roots.CompilerModuleExtension; import com.intellij.openapi.roots.ContentEntry; -import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ExcludeFolder; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.Nullable; -public class JavaContentEntryEditor extends ContentEntryEditor { +public abstract class JavaContentEntryEditor extends ContentEntryEditor { private final CompilerModuleExtension myCompilerExtension; - public JavaContentEntryEditor(ContentEntry contentEntry, ModifiableRootModel rootModel) { - super(contentEntry, rootModel); - myCompilerExtension = rootModel.getModuleExtension(CompilerModuleExtension.class); + public JavaContentEntryEditor(final String contentEntryUrl) { + super(contentEntryUrl); + myCompilerExtension = getModel().getModuleExtension(CompilerModuleExtension.class); } protected ContentRootPanel createContentRootPane() { - return new JavaContentRootPanel(myContentEntry, this); + return new JavaContentRootPanel(this) { + @Nullable + @Override + protected ContentEntry getContentEntry() { + return JavaContentEntryEditor.this.getContentEntry(); + } + }; } @Nullable @@ -45,7 +50,7 @@ public class JavaContentEntryEditor extends ContentEntryEditor { myCompilerExtension.setExcludeOutput(true); } if (isExplodedDirectory) { - myRootModel.setExcludeExplodedDirectory(true); + getModel().setExcludeExplodedDirectory(true); } return null; } @@ -58,7 +63,7 @@ public class JavaContentEntryEditor extends ContentEntryEditor { myCompilerExtension.setExcludeOutput(false); } if (isExplodedDirectory(file)) { - myRootModel.setExcludeExplodedDirectory(false); + getModel().setExcludeExplodedDirectory(false); } super.doRemoveExcludeFolder(excludeFolder, file); } @@ -79,7 +84,7 @@ public class JavaContentEntryEditor extends ContentEntryEditor { } if (myCompilerExtension.isCompilerOutputPathInherited()) { - final String compilerOutput = ProjectStructureConfigurable.getInstance(myRootModel.getModule().getProject()).getProjectConfig().getCompilerOutputUrl(); + final String compilerOutput = ProjectStructureConfigurable.getInstance(getModel().getModule().getProject()).getProjectConfig().getCompilerOutputUrl(); if (file != null && Comparing.equal(compilerOutput, file.getUrl())) { return true; } @@ -89,7 +94,7 @@ public class JavaContentEntryEditor extends ContentEntryEditor { } private boolean isExplodedDirectory(VirtualFile file) { - final VirtualFile explodedDir = myRootModel.getExplodedDirectory(); + final VirtualFile explodedDir = getModel().getExplodedDirectory(); if (explodedDir != null) { if (explodedDir.equals(file)) { return true; diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentRootPanel.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentRootPanel.java index 2e54148008ea..d875a699f408 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentRootPanel.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentRootPanel.java @@ -16,10 +16,9 @@ package com.intellij.openapi.roots.ui.configuration; import com.intellij.openapi.project.ProjectBundle; -import com.intellij.openapi.roots.ContentEntry; import com.intellij.openapi.roots.ContentFolder; -import com.intellij.openapi.roots.SourceFolder; import com.intellij.openapi.roots.ExcludeFolder; +import com.intellij.openapi.roots.SourceFolder; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; @@ -29,14 +28,15 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.util.ArrayList; +import java.util.List; -public class JavaContentRootPanel extends ContentRootPanel { +public abstract class JavaContentRootPanel extends ContentRootPanel { private static final Color SOURCES_COLOR = new Color(0x0A50A1); private static final Icon ADD_PREFIX_ICON = IconLoader.getIcon("/modules/setPackagePrefix.png"); private static final Icon ADD_PREFIX_ROLLOVER_ICON = IconLoader.getIcon("/modules/setPackagePrefixRollover.png"); - public JavaContentRootPanel(ContentEntry contentEntry, ActionCallback callback) { - super(contentEntry, callback); + public JavaContentRootPanel(ActionCallback callback) { + super(callback); } @Nullable @@ -52,7 +52,7 @@ public class JavaContentRootPanel extends ContentRootPanel { ProjectBundle.message("module.paths.package.prefix.tooltip"), new Runnable() { public void run() { final String message = ProjectBundle.message("module.paths.package.prefix.prompt", - toRelativeDisplayPath(folder.getUrl(), myContentEntry.getUrl() + ":")); + toRelativeDisplayPath(folder.getUrl(), getContentEntry().getUrl() + ":")); final String prefix = Messages.showInputDialog(JavaContentRootPanel.this, message, ProjectBundle.message("module.paths.package.prefix.title"), Messages.getQuestionIcon(), folder.getPackagePrefix(), null); if (prefix != null) { @@ -68,10 +68,10 @@ public class JavaContentRootPanel extends ContentRootPanel { } protected void addFolderGroupComponents() { - final java.util.List sources = new ArrayList(); - final java.util.List testSources = new ArrayList(); - final java.util.List excluded = new ArrayList(); - final SourceFolder[] sourceFolders = myContentEntry.getSourceFolders(); + final List sources = new ArrayList(); + final List testSources = new ArrayList(); + final List excluded = new ArrayList(); + final SourceFolder[] sourceFolders = getContentEntry().getSourceFolders(); for (SourceFolder folder : sourceFolders) { if (folder.isSynthetic()) { continue; @@ -88,7 +88,7 @@ public class JavaContentRootPanel extends ContentRootPanel { } } - final ExcludeFolder[] excludeFolders = myContentEntry.getExcludeFolders(); + final ExcludeFolder[] excludeFolders = getContentEntry().getExcludeFolders(); for (final ExcludeFolder excludeFolder : excludeFolders) { if (!excludeFolder.isSynthetic()) { excluded.add(excludeFolder); diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/CommonContentEntriesEditor.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/CommonContentEntriesEditor.java index 4a12bc19a0c8..5048f1910bd8 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/CommonContentEntriesEditor.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/CommonContentEntriesEditor.java @@ -69,8 +69,8 @@ public abstract class CommonContentEntriesEditor extends ModuleElementsEditor { private ContentEntryTreeEditor myRootTreeEditor; private MyContentEntryEditorListener myContentEntryEditorListener; protected JPanel myEditorsPanel; - private final Map myEntryToEditorMap = new HashMap(); - private ContentEntry mySelectedEntry; + private final Map myEntryToEditorMap = new HashMap(); + private String mySelectedEntryUrl; private VirtualFile myLastSelectedDir = null; private final String myModuleName; @@ -86,7 +86,7 @@ public abstract class CommonContentEntriesEditor extends ModuleElementsEditor { public void afterRefreshFinish(boolean asynchronous) { final Module module = getModule(); if (module == null || module.isDisposed() || module.getProject().isDisposed()) return; - for (final ContentEntry contentEntry : myEntryToEditorMap.keySet()) { + for (final String contentEntry : myEntryToEditorMap.keySet()) { final ContentEntryEditor editor = myEntryToEditorMap.get(contentEntry); if (editor != null) { editor.update(); @@ -173,9 +173,9 @@ public abstract class CommonContentEntriesEditor extends ModuleElementsEditor { final ContentEntry[] contentEntries = getModel().getContentEntries(); if (contentEntries.length > 0) { for (final ContentEntry contentEntry : contentEntries) { - addContentEntryPanel(contentEntry); + addContentEntryPanel(contentEntry.getUrl()); } - selectContentEntry(contentEntries[0]); + selectContentEntry(contentEntries[0].getUrl()); } return mainPanel; @@ -195,7 +195,7 @@ public abstract class CommonContentEntriesEditor extends ModuleElementsEditor { return myModulesProvider.getModule(myModuleName); } - protected void addContentEntryPanel(final ContentEntry contentEntry) { + protected void addContentEntryPanel(final String contentEntry) { final ContentEntryEditor contentEntryEditor = createContentEntryEditor(contentEntry); contentEntryEditor.initUI(); contentEntryEditor.addContentEntryEditorListener(myContentEntryEditorListener); @@ -215,22 +215,22 @@ public abstract class CommonContentEntriesEditor extends ModuleElementsEditor { myEditorsPanel.add(component); } - protected abstract ContentEntryEditor createContentEntryEditor(ContentEntry contentEntry); + protected abstract ContentEntryEditor createContentEntryEditor(String contentEntryUrl); - void selectContentEntry(ContentEntry contentEntry) { - if (mySelectedEntry != null && mySelectedEntry.equals(contentEntry)) { + void selectContentEntry(final String contentEntryUrl) { + if (mySelectedEntryUrl != null && mySelectedEntryUrl.equals(contentEntryUrl)) { return; } try { - if (mySelectedEntry != null) { - ContentEntryEditor editor = myEntryToEditorMap.get(mySelectedEntry); + if (mySelectedEntryUrl != null) { + ContentEntryEditor editor = myEntryToEditorMap.get(mySelectedEntryUrl); if (editor != null) { editor.setSelected(false); } } - if (contentEntry != null) { - ContentEntryEditor editor = myEntryToEditorMap.get(contentEntry); + if (contentEntryUrl != null) { + ContentEntryEditor editor = myEntryToEditorMap.get(contentEntryUrl); if (editor != null) { editor.setSelected(true); final JComponent component = editor.getComponent(); @@ -246,7 +246,7 @@ public abstract class CommonContentEntriesEditor extends ModuleElementsEditor { } } finally { - mySelectedEntry = contentEntry; + mySelectedEntryUrl = contentEntryUrl; } } @@ -257,21 +257,21 @@ public abstract class CommonContentEntriesEditor extends ModuleElementsEditor { } @Nullable - private ContentEntry getNextContentEntry(ContentEntry contentEntry) { - return getAdjacentContentEntry(contentEntry, 1); + private String getNextContentEntry(final String contentEntryUrl) { + return getAdjacentContentEntry(contentEntryUrl, 1); } @Nullable - private ContentEntry getAdjacentContentEntry(ContentEntry contentEntry, int delta) { + private String getAdjacentContentEntry(final String contentEntryUrl, int delta) { final ContentEntry[] contentEntries = getModel().getContentEntries(); for (int idx = 0; idx < contentEntries.length; idx++) { ContentEntry entry = contentEntries[idx]; - if (contentEntry.equals(entry)) { + if (contentEntryUrl.equals(entry.getUrl())) { int nextEntryIndex = (idx + delta) % contentEntries.length; if (nextEntryIndex < 0) { nextEntryIndex += contentEntries.length; } - return nextEntryIndex == idx ? null : contentEntries[nextEntryIndex]; + return nextEntryIndex == idx ? null : contentEntries[nextEntryIndex].getUrl(); } } return null; @@ -304,46 +304,46 @@ public abstract class CommonContentEntriesEditor extends ModuleElementsEditor { protected void addContentEntryPanels(ContentEntry[] contentEntriesArray) { for (ContentEntry contentEntry : contentEntriesArray) { - addContentEntryPanel(contentEntry); + addContentEntryPanel(contentEntry.getUrl()); } myEditorsPanel.revalidate(); myEditorsPanel.repaint(); - selectContentEntry(contentEntriesArray[contentEntriesArray.length - 1]); + selectContentEntry(contentEntriesArray[contentEntriesArray.length - 1].getUrl()); } private final class MyContentEntryEditorListener extends ContentEntryEditorListenerAdapter { public void editingStarted(ContentEntryEditor editor) { - selectContentEntry(editor.getContentEntry()); + selectContentEntry(editor.getContentEntryUrl()); } public void beforeEntryDeleted(ContentEntryEditor editor) { - final ContentEntry entry = editor.getContentEntry(); - if (mySelectedEntry != null && mySelectedEntry.equals(entry)) { + final String entryUrl = editor.getContentEntryUrl(); + if (mySelectedEntryUrl != null && mySelectedEntryUrl.equals(entryUrl)) { myRootTreeEditor.setContentEntryEditor(null); } - final ContentEntry nextContentEntry = getNextContentEntry(entry); - removeContentEntryPanel(entry); - selectContentEntry(nextContentEntry); + final String nextContentEntryUrl = getNextContentEntry(entryUrl); + removeContentEntryPanel(entryUrl); + selectContentEntry(nextContentEntryUrl); editor.removeContentEntryEditorListener(this); } public void navigationRequested(ContentEntryEditor editor, VirtualFile file) { - if (mySelectedEntry != null && mySelectedEntry.equals(editor.getContentEntry())) { + if (mySelectedEntryUrl != null && mySelectedEntryUrl.equals(editor.getContentEntryUrl())) { myRootTreeEditor.requestFocus(); myRootTreeEditor.select(file); } else { - selectContentEntry(editor.getContentEntry()); + selectContentEntry(editor.getContentEntryUrl()); myRootTreeEditor.requestFocus(); myRootTreeEditor.select(file); } } - private void removeContentEntryPanel(final ContentEntry contentEntry) { - ContentEntryEditor editor = myEntryToEditorMap.get(contentEntry); + private void removeContentEntryPanel(final String contentEntryUrl) { + ContentEntryEditor editor = myEntryToEditorMap.get(contentEntryUrl); if (editor != null) { myEditorsPanel.remove(editor.getComponent()); - myEntryToEditorMap.remove(contentEntry); + myEntryToEditorMap.remove(contentEntryUrl); myEditorsPanel.revalidate(); myEditorsPanel.repaint(); } @@ -374,10 +374,22 @@ public abstract class CommonContentEntriesEditor extends ModuleElementsEditor { } } + @Nullable + private ContentEntry getContentEntry(final String url) { + final ContentEntry[] entries = getModel().getContentEntries(); + for (final ContentEntry entry : entries) { + if (entry.getUrl().equals(url)) return entry; + } + + return null; + } + private void validateContentEntriesCandidates(VirtualFile[] files) throws Exception { for (final VirtualFile file : files) { // check for collisions with already existing entries - for (final ContentEntry contentEntry : myEntryToEditorMap.keySet()) { + for (final String contentEntryUrl : myEntryToEditorMap.keySet()) { + final ContentEntry contentEntry = getContentEntry(contentEntryUrl); + if (contentEntry == null) continue; final VirtualFile contentEntryFile = contentEntry.getFile(); if (contentEntryFile == null) { continue; // skip invalid entry 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 723ed2664c3b..b01384dc68d4 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 @@ -39,14 +39,13 @@ import java.util.EventListener; */ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallback { - protected final ContentEntry myContentEntry; - protected final ModifiableRootModel myRootModel; private boolean myIsSelected; private ContentRootPanel myContentRootPanel; private JPanel myMainPanel; protected EventDispatcher myEventDispatcher; + private String myContentEntryUrl; - public static interface ContentEntryEditorListener extends EventListener{ + public interface ContentEntryEditorListener extends EventListener{ void editingStarted(ContentEntryEditor editor); void beforeEntryDeleted(ContentEntryEditor editor); void sourceFolderAdded(ContentEntryEditor editor, SourceFolder folder); @@ -57,9 +56,12 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb void packagePrefixSet(ContentEntryEditor editor, SourceFolder folder); } - public ContentEntryEditor(ContentEntry contentEntry, ModifiableRootModel rootModel) { - myContentEntry = contentEntry; - myRootModel = rootModel; + public ContentEntryEditor(final String contentEntryUrl) { + myContentEntryUrl = contentEntryUrl; + } + + public String getContentEntryUrl() { + return myContentEntryUrl; } public void initUI() { @@ -85,16 +87,27 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb update(); } + @Nullable + protected ContentEntry getContentEntry() { + final ContentEntry[] entries = getModel().getContentEntries(); + for (ContentEntry entry : entries) { + if (entry.getUrl().equals(myContentEntryUrl)) return entry; + } + + return null; + } + + protected abstract ModifiableRootModel getModel(); public void deleteContentEntry() { final int answer = Messages.showYesNoDialog(ProjectBundle.message("module.paths.remove.content.prompt", - VirtualFileManager.extractPath(myContentEntry.getUrl()).replace('/', File.separatorChar)), + VirtualFileManager.extractPath(myContentEntryUrl).replace('/', File.separatorChar)), ProjectBundle.message("module.paths.remove.content.title"), Messages.getQuestionIcon()); if (answer != 0) { // no return; } myEventDispatcher.getMulticaster().beforeEntryDeleted(this); - myRootModel.removeContentEntry(myContentEntry); + getModel().removeContentEntry(getContentEntry()); } public void deleteContentFolder(ContentEntry contentEntry, ContentFolder folder) { @@ -147,10 +160,6 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb return myMainPanel; } - public ContentEntry getContentEntry() { - return myContentEntry; - } - public void update() { if (myContentRootPanel != null) { myMainPanel.remove(myContentRootPanel); @@ -164,15 +173,21 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb protected abstract ContentRootPanel createContentRootPane(); + @Nullable public SourceFolder addSourceFolder(VirtualFile file, boolean isTestSource) { - final SourceFolder sourceFolder = myContentEntry.addSourceFolder(file, isTestSource); - try { - return sourceFolder; - } - finally { - myEventDispatcher.getMulticaster().sourceFolderAdded(this, sourceFolder); - update(); + final ContentEntry contentEntry = getContentEntry(); + if (contentEntry != null) { + final SourceFolder sourceFolder = contentEntry.addSourceFolder(file, isTestSource); + try { + return sourceFolder; + } + finally { + myEventDispatcher.getMulticaster().sourceFolderAdded(this, sourceFolder); + update(); + } } + + return null; } public void removeSourceFolder(SourceFolder sourceFolder) { @@ -188,9 +203,11 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb } protected void doRemoveSourceFolder(SourceFolder sourceFolder) { - myContentEntry.removeSourceFolder(sourceFolder); + final ContentEntry contentEntry = getContentEntry(); + if (contentEntry != null) contentEntry.removeSourceFolder(sourceFolder); } + @Nullable public ExcludeFolder addExcludeFolder(VirtualFile file) { try { return doAddExcludeFolder(file); @@ -203,7 +220,12 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb @Nullable protected ExcludeFolder doAddExcludeFolder(VirtualFile file) { - return myContentEntry.addExcludeFolder(file); + final ContentEntry contentEntry = getContentEntry(); + if (contentEntry != null) { + return contentEntry.addExcludeFolder(file); + } + + return null; } public void removeExcludeFolder(ExcludeFolder excludeFolder) { @@ -219,7 +241,8 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb protected void doRemoveExcludeFolder(ExcludeFolder excludeFolder, VirtualFile file) { if (!excludeFolder.isSynthetic()) { - myContentEntry.removeExcludeFolder(excludeFolder); + final ContentEntry contentEntry = getContentEntry(); + if (contentEntry != null) contentEntry.removeExcludeFolder(excludeFolder); } } @@ -238,10 +261,11 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb } public boolean isUnderExcludedDirectory(final VirtualFile file) { - if (myContentEntry == null) { + final ContentEntry contentEntry = getContentEntry(); + if (contentEntry == null) { return false; } - final ExcludeFolder[] excludeFolders = myContentEntry.getExcludeFolders(); + final ExcludeFolder[] excludeFolders = contentEntry.getExcludeFolders(); for (ExcludeFolder excludeFolder : excludeFolders) { final VirtualFile excludedDir = excludeFolder.getFile(); if (excludedDir == null) { @@ -254,11 +278,13 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb return false; } + @Nullable public ExcludeFolder getExcludeFolder(VirtualFile file) { - if (myContentEntry == null) { + final ContentEntry contentEntry = getContentEntry(); + if (contentEntry == null) { return null; } - final ExcludeFolder[] excludeFolders = myContentEntry.getExcludeFolders(); + final ExcludeFolder[] excludeFolders = contentEntry.getExcludeFolders(); for (final ExcludeFolder excludeFolder : excludeFolders) { final VirtualFile f = excludeFolder.getFile(); if (f == null) { @@ -271,11 +297,13 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb return null; } + @Nullable public SourceFolder getSourceFolder(VirtualFile file) { - if (myContentEntry == null) { + final ContentEntry contentEntry = getContentEntry(); + if (contentEntry == null) { return null; } - final SourceFolder[] sourceFolders = myContentEntry.getSourceFolders(); + final SourceFolder[] sourceFolders = contentEntry.getSourceFolders(); for (SourceFolder sourceFolder : sourceFolders) { final VirtualFile f = sourceFolder.getFile(); if (f == null) { diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentRootPanel.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentRootPanel.java index 85606fb85ece..f8d09d474f24 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentRootPanel.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentRootPanel.java @@ -62,25 +62,26 @@ public abstract class ContentRootPanel extends JPanel { private static final Icon DELETE_FOLDER_ICON = IconLoader.getIcon("/modules/deleteContentFolder.png"); private static final Icon DELETE_FOLDER_ROLLOVER_ICON = IconLoader.getIcon("/modules/deleteContentFolderRollover.png"); - protected final ContentEntry myContentEntry; protected final ActionCallback myCallback; private JComponent myHeader; private JComponent myBottom; private final Map myComponentToForegroundMap = new HashMap(); - public static interface ActionCallback { + public interface ActionCallback { void deleteContentEntry(); void deleteContentFolder(ContentEntry contentEntry, ContentFolder contentFolder); void navigateFolder(ContentEntry contentEntry, ContentFolder contentFolder); void setPackagePrefix(SourceFolder folder, String prefix); } - public ContentRootPanel(ContentEntry contentEntry, ActionCallback callback) { + public ContentRootPanel(ActionCallback callback) { super(new GridBagLayout()); - myContentEntry = contentEntry; myCallback = callback; } + @Nullable + protected abstract ContentEntry getContentEntry(); + public void initUI() { myHeader = createHeader(); this.add(myHeader, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 8, 0), 0, 0)); @@ -98,10 +99,10 @@ public abstract class ContentRootPanel extends JPanel { private JComponent createHeader() { final JPanel panel = new JPanel(new GridBagLayout()); - final JLabel headerLabel = new JLabel(toDisplayPath(myContentEntry.getUrl())); + final JLabel headerLabel = new JLabel(toDisplayPath(getContentEntry().getUrl())); headerLabel.setFont(headerLabel.getFont().deriveFont(Font.BOLD)); headerLabel.setOpaque(false); - if (myContentEntry.getFile() == null) { + if (getContentEntry().getFile() == null) { headerLabel.setForeground(Color.RED); } final IconActionComponent deleteIconComponent = new IconActionComponent(DELETE_ROOT_ICON, DELETE_ROOT_ROLLOVER_ICON, @@ -163,7 +164,7 @@ public abstract class ContentRootPanel extends JPanel { private JComponent createFolderComponent(final ContentFolder folder, Color foreground) { final VirtualFile folderFile = folder.getFile(); - final VirtualFile contentEntryFile = myContentEntry.getFile(); + final VirtualFile contentEntryFile = getContentEntry().getFile(); final String packagePrefix = folder instanceof SourceFolder? ((SourceFolder)folder).getPackagePrefix() : ""; if (folderFile != null && contentEntryFile != null) { String path = folderFile.equals(contentEntryFile)? "." :VfsUtil.getRelativePath(folderFile, contentEntryFile, File.separatorChar); @@ -174,14 +175,14 @@ public abstract class ContentRootPanel extends JPanel { hyperlinkLabel.setMinimumSize(new Dimension(0, 0)); hyperlinkLabel.addHyperlinkListener(new HyperlinkListener() { public void hyperlinkUpdate(HyperlinkEvent e) { - myCallback.navigateFolder(myContentEntry, folder); + myCallback.navigateFolder(getContentEntry(), folder); } }); registerTextComponent(hyperlinkLabel, foreground); return new UnderlinedPathLabel(hyperlinkLabel); } else { - String path = toRelativeDisplayPath(folder.getUrl(), myContentEntry.getUrl()); + String path = toRelativeDisplayPath(folder.getUrl(), getContentEntry().getUrl()); if (packagePrefix.length() > 0) { path = path + " (" + packagePrefix + ")"; } @@ -195,7 +196,7 @@ public abstract class ContentRootPanel extends JPanel { private JComponent createFolderDeleteComponent(final ContentFolder folder) { final String tooltipText; - if (folder.getFile() != null && myContentEntry.getFile() != null) { + if (folder.getFile() != null && getContentEntry().getFile() != null) { if (folder instanceof SourceFolder) { tooltipText = ((SourceFolder)folder).isTestSource() ? ProjectBundle.message("module.paths.unmark.tests.tooltip") @@ -213,7 +214,7 @@ public abstract class ContentRootPanel extends JPanel { } return new IconActionComponent(DELETE_FOLDER_ICON, DELETE_FOLDER_ROLLOVER_ICON, tooltipText, new Runnable() { public void run() { - myCallback.deleteContentFolder(myContentEntry, folder); + myCallback.deleteContentFolder(getContentEntry(), folder); } }); } @@ -223,10 +224,11 @@ public abstract class ContentRootPanel extends JPanel { } public boolean isUnderExcludedDirectory(final VirtualFile file) { - if (myContentEntry == null) { + final ContentEntry contentEntry = getContentEntry(); + if (contentEntry == null) { return false; } - final ExcludeFolder[] excludeFolders = myContentEntry.getExcludeFolders(); + final ExcludeFolder[] excludeFolders = contentEntry.getExcludeFolders(); for (ExcludeFolder excludeFolder : excludeFolders) { final VirtualFile excludedDir = excludeFolder.getFile(); if (excludedDir == null) { @@ -239,11 +241,13 @@ public abstract class ContentRootPanel extends JPanel { return false; } + @Nullable public ExcludeFolder getExcludeFolder(VirtualFile file) { - if (myContentEntry == null) { + final ContentEntry contentEntry = getContentEntry(); + if (contentEntry == null) { return null; } - final ExcludeFolder[] excludeFolders = myContentEntry.getExcludeFolders(); + final ExcludeFolder[] excludeFolders = contentEntry.getExcludeFolders(); for (final ExcludeFolder excludeFolder : excludeFolders) { final VirtualFile f = excludeFolder.getFile(); if (f == null) {