summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/ide
diff options
context:
space:
mode:
Diffstat (limited to 'platform/lang-impl/src/com/intellij/ide')
-rw-r--r--platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/ExportableFileTemplateSettings.java15
-rw-r--r--platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateConfigurable.java69
-rw-r--r--platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarModel.java7
-rw-r--r--platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java7
-rw-r--r--platform/lang-impl/src/com/intellij/ide/projectView/ProjectViewSettings.java23
-rw-r--r--platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewPane.java81
-rw-r--r--platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java33
-rw-r--r--platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosPanel.java129
-rw-r--r--platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeBuilder.java5
-rw-r--r--platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeStructure.java25
-rw-r--r--platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java15
-rw-r--r--platform/lang-impl/src/com/intellij/ide/util/PsiElementListCellRenderer.java2
-rw-r--r--platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java22
-rw-r--r--platform/lang-impl/src/com/intellij/ide/util/gotoByName/ContributorsBasedGotoByModel.java9
-rw-r--r--platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java12
-rw-r--r--platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeDescriptorProvider.java1
16 files changed, 230 insertions, 225 deletions
diff --git a/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/ExportableFileTemplateSettings.java b/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/ExportableFileTemplateSettings.java
index b601f0542dab..29cf1b18644a 100644
--- a/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/ExportableFileTemplateSettings.java
+++ b/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/ExportableFileTemplateSettings.java
@@ -40,7 +40,6 @@ import java.util.Locale;
)}
)
public class ExportableFileTemplateSettings extends FileTemplatesLoader implements PersistentStateComponent<Element>, ExportableComponent {
-
public final static String EXPORTABLE_SETTINGS_FILE = "file.template.settings.xml";
static final String ELEMENT_TEMPLATE = "template";
@@ -58,7 +57,6 @@ public class ExportableFileTemplateSettings extends FileTemplatesLoader implemen
return ServiceManager.getService(ExportableFileTemplateSettings.class);
}
-
@NotNull
@Override
public File[] getExportFiles() {
@@ -76,10 +74,9 @@ public class ExportableFileTemplateSettings extends FileTemplatesLoader implemen
@Nullable
@Override
public Element getState() {
- Element element = new Element("fileTemplateSettings");
+ Element element = null;
for (FTManager manager : getAllManagers()) {
- final Element templatesGroup = new Element(getXmlElementGroupName(manager));
- element.addContent(templatesGroup);
+ Element templatesGroup = null;
for (FileTemplateBase template : manager.getAllTemplates(true)) {
// save only those settings that differ from defaults
boolean shouldSave = template.isReformatCode() != FileTemplateBase.DEFAULT_REFORMAT_CODE_VALUE;
@@ -95,6 +92,14 @@ public class ExportableFileTemplateSettings extends FileTemplatesLoader implemen
if (template instanceof BundledFileTemplate) {
templateElement.setAttribute(ATTRIBUTE_ENABLED, Boolean.toString(((BundledFileTemplate)template).isEnabled()));
}
+
+ if (templatesGroup == null) {
+ templatesGroup = new Element(getXmlElementGroupName(manager));
+ if (element == null) {
+ element = new Element("fileTemplateSettings");
+ }
+ element.addContent(templatesGroup);
+ }
templatesGroup.addContent(templateElement);
}
}
diff --git a/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateConfigurable.java b/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateConfigurable.java
index be3be30fc247..21702dc68f4f 100644
--- a/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateConfigurable.java
+++ b/platform/lang-impl/src/com/intellij/ide/fileTemplates/impl/FileTemplateConfigurable.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,6 @@ import com.intellij.ide.DataManager;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.fileTemplates.FileTemplate;
import com.intellij.ide.fileTemplates.FileTemplateManager;
-import com.intellij.lexer.CompositeLexer;
import com.intellij.lexer.FlexAdapter;
import com.intellij.lexer.Lexer;
import com.intellij.lexer.MergingLexerAdapter;
@@ -38,7 +37,8 @@ import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.event.DocumentAdapter;
import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.editor.ex.EditorEx;
-import com.intellij.openapi.editor.ex.util.LexerEditorHighlighter;
+import com.intellij.openapi.editor.ex.util.LayerDescriptor;
+import com.intellij.openapi.editor.ex.util.LayeredLexerEditorHighlighter;
import com.intellij.openapi.editor.highlighter.EditorHighlighter;
import com.intellij.openapi.editor.highlighter.EditorHighlighterFactory;
import com.intellij.openapi.fileTypes.*;
@@ -99,7 +99,7 @@ public class FileTemplateConfigurable implements Configurable, Configurable.NoSc
private URL myDefaultDescriptionUrl;
private final Project myProject;
- private final List<ChangeListener> myChangeListeners = ContainerUtil.createLockFreeCopyOnWriteList();;
+ private final List<ChangeListener> myChangeListeners = ContainerUtil.createLockFreeCopyOnWriteList();
private Splitter mySplitter;
private final FileType myVelocityFileType = FileTypeManager.getInstance().getFileTypeByExtension("ft");
private JPanel myDescriptionPanel;
@@ -205,13 +205,13 @@ public class FileTemplateConfigurable implements Configurable, Configurable.NoSc
myNameField.addFocusListener(new FocusAdapter() {
@Override
- public void focusLost(FocusEvent e) {
+ public void focusLost(@NotNull FocusEvent e) {
onNameChanged();
}
});
myExtensionField.addFocusListener(new FocusAdapter() {
@Override
- public void focusLost(FocusEvent e) {
+ public void focusLost(@NotNull FocusEvent e) {
onNameChanged();
}
});
@@ -221,8 +221,11 @@ public class FileTemplateConfigurable implements Configurable, Configurable.NoSc
private Editor createEditor() {
EditorFactory editorFactory = EditorFactory.getInstance();
- Document doc = myFile == null ? editorFactory.createDocument(myTemplate == null ? "" : myTemplate.getText()) : PsiDocumentManager.getInstance(myFile.getProject()).getDocument(myFile);
- Editor editor = myProject == null ? editorFactory.createEditor(doc) : editorFactory.createEditor(doc, myProject);
+ Document doc = myFile == null
+ ? editorFactory.createDocument(myTemplate == null ? "" : myTemplate.getText())
+ : PsiDocumentManager.getInstance(myFile.getProject()).getDocument(myFile);
+ assert doc != null;
+ Editor editor = editorFactory.createEditor(doc, myProject);
EditorSettings editorSettings = editor.getSettings();
editorSettings.setVirtualSpace(false);
@@ -367,7 +370,7 @@ public class FileTemplateConfigurable implements Configurable, Configurable.NoSc
@Nullable
private PsiFile createFile(final String text, final String name) {
- if (myTemplate == null || myProject == null) return null;
+ if (myTemplate == null) return null;
final FileType fileType = myVelocityFileType;
if (fileType == FileTypes.UNKNOWN) return null;
@@ -388,7 +391,7 @@ public class FileTemplateConfigurable implements Configurable, Configurable.NoSc
}
private EditorHighlighter createHighlighter() {
- if (myTemplate != null && myProject != null && myVelocityFileType != FileTypes.UNKNOWN) {
+ if (myTemplate != null && myVelocityFileType != FileTypes.UNKNOWN) {
return EditorHighlighterFactory.getInstance().createEditorHighlighter(myProject, new LightVirtualFile("aaa." + myTemplate.getExtension() + ".ft"));
}
@@ -399,38 +402,27 @@ public class FileTemplateConfigurable implements Configurable, Configurable.NoSc
if (fileType == null) {
fileType = FileTypes.PLAIN_TEXT;
}
+
SyntaxHighlighter originalHighlighter = SyntaxHighlighterFactory.getSyntaxHighlighter(fileType, null, null);
- if (originalHighlighter == null) originalHighlighter = new PlainSyntaxHighlighter();
- return new LexerEditorHighlighter(new TemplateHighlighter(originalHighlighter), EditorColorsManager.getInstance().getGlobalScheme());
+ if (originalHighlighter == null) {
+ originalHighlighter = new PlainSyntaxHighlighter();
+ }
+
+ final EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme();
+ LayeredLexerEditorHighlighter highlighter = new LayeredLexerEditorHighlighter(new TemplateHighlighter(), scheme);
+ highlighter.registerLayer(FileTemplateTokenType.TEXT, new LayerDescriptor(originalHighlighter, ""));
+ return highlighter;
}
- private final static TokenSet TOKENS_TO_MERGE = TokenSet.create(FileTemplateTokenType.TEXT);
-
private static class TemplateHighlighter extends SyntaxHighlighterBase {
private final Lexer myLexer;
- private final SyntaxHighlighter myOriginalHighlighter;
-
- public TemplateHighlighter(SyntaxHighlighter original) {
- myOriginalHighlighter = original;
- Lexer originalLexer = original.getHighlightingLexer();
- Lexer templateLexer = new FlexAdapter(new FileTemplateTextLexer());
- templateLexer = new MergingLexerAdapter(templateLexer, TOKENS_TO_MERGE);
-
- myLexer = new CompositeLexer(originalLexer, templateLexer) {
- @Override
- protected IElementType getCompositeTokenType(IElementType type1, IElementType type2) {
- if (type2 == FileTemplateTokenType.MACRO || type2 == FileTemplateTokenType.DIRECTIVE) {
- return type2;
- }
- else {
- return type1;
- }
- }
- };
+
+ public TemplateHighlighter() {
+ myLexer = new MergingLexerAdapter(new FlexAdapter(new FileTemplateTextLexer()), TokenSet.create(FileTemplateTokenType.TEXT));
}
- @Override
@NotNull
+ @Override
public Lexer getHighlightingLexer() {
return myLexer;
}
@@ -438,14 +430,11 @@ public class FileTemplateConfigurable implements Configurable, Configurable.NoSc
@Override
@NotNull
public TextAttributesKey[] getTokenHighlights(IElementType tokenType) {
- if (tokenType == FileTemplateTokenType.MACRO) {
- return pack(myOriginalHighlighter.getTokenHighlights(tokenType), TemplateColors.TEMPLATE_VARIABLE_ATTRIBUTES);
- }
- else if (tokenType == FileTemplateTokenType.DIRECTIVE) {
- return pack(myOriginalHighlighter.getTokenHighlights(tokenType), TemplateColors.TEMPLATE_VARIABLE_ATTRIBUTES);
+ if (tokenType == FileTemplateTokenType.MACRO || tokenType == FileTemplateTokenType.DIRECTIVE) {
+ return pack(TemplateColors.TEMPLATE_VARIABLE_ATTRIBUTES);
}
- return myOriginalHighlighter.getTokenHighlights(tokenType);
+ return EMPTY;
}
}
diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarModel.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarModel.java
index a27ad87f70e4..9a80f455e4e1 100644
--- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarModel.java
+++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarModel.java
@@ -222,9 +222,8 @@ public class NavBarModel {
psiElement = getOriginalElement(psiElement);
PsiElement resultElement = psiElement;
- for (final NavBarModelExtension modelExtension : Extensions.getExtensions(NavBarModelExtension.EP_NAME)) {
- resultElement = modelExtension.adjustElement(resultElement);
- }
+ resultElement = normalize(resultElement);
+ if (resultElement == null) return;
boolean foundByExtension = false;
for (final NavBarModelExtension modelExtension : Extensions.getExtensions(NavBarModelExtension.EP_NAME)) {
@@ -326,7 +325,7 @@ public class NavBarModel {
}
@Nullable
- private static PsiElement normalize(PsiElement child) {
+ private static PsiElement normalize(@Nullable PsiElement child) {
if (child == null) return null;
for (NavBarModelExtension modelExtension : Extensions.getExtensions(NavBarModelExtension.EP_NAME)) {
child = modelExtension.adjustElement(child);
diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java
index d565c69f9df4..6c0374a5d744 100644
--- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java
+++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java
@@ -27,6 +27,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.ui.*;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.components.JBList;
+import com.intellij.ui.popup.HintUpdateSupply;
import com.intellij.ui.speedSearch.ListWithFilter;
import com.intellij.util.Function;
import com.intellij.util.NotNullFunction;
@@ -92,10 +93,8 @@ public class NavBarPopup extends LightweightHint implements Disposable{
protected void onPopupCancel() {
final JComponent component = getComponent();
if (component != null) {
- final Object o = component.getClientProperty(JBLIST_KEY);
- if (o instanceof JBListWithHintProvider) {
- ((JBListWithHintProvider)o).hideHint();
- }
+ Object o = component.getClientProperty(JBLIST_KEY);
+ if (o instanceof JComponent) HintUpdateSupply.hideHint((JComponent)o);
}
//noinspection unchecked
for (Disposable disposable : ((List<Disposable>)getList().getClientProperty(DISPOSED_OBJECTS))) {
diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/ProjectViewSettings.java b/platform/lang-impl/src/com/intellij/ide/projectView/ProjectViewSettings.java
new file mode 100644
index 000000000000..64e374097635
--- /dev/null
+++ b/platform/lang-impl/src/com/intellij/ide/projectView/ProjectViewSettings.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.ide.projectView;
+
+/**
+ * @author nik
+ */
+public interface ProjectViewSettings extends ViewSettings {
+ boolean isShowExcludedFiles();
+}
diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewPane.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewPane.java
index 52e79d208147..bc2e509e085a 100644
--- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewPane.java
+++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewPane.java
@@ -23,15 +23,25 @@ import com.intellij.icons.AllIcons;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.SelectInTarget;
import com.intellij.ide.impl.ProjectPaneSelectInTarget;
+import com.intellij.ide.projectView.ProjectView;
+import com.intellij.ide.projectView.ProjectViewSettings;
import com.intellij.ide.projectView.ViewSettings;
import com.intellij.ide.projectView.impl.nodes.ProjectViewDirectoryHelper;
import com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode;
import com.intellij.ide.util.treeView.AbstractTreeBuilder;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.ide.util.treeView.AbstractTreeUpdater;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
+import com.intellij.openapi.actionSystem.Presentation;
+import com.intellij.openapi.actionSystem.ToggleAction;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.InvalidDataException;
+import com.intellij.openapi.util.JDOMExternalizerUtil;
+import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.psi.PsiDirectory;
+import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -42,6 +52,8 @@ import java.awt.*;
public class ProjectViewPane extends AbstractProjectViewPSIPane {
@NonNls public static final String ID = "ProjectPane";
+ public static final String SHOW_EXCLUDED_FILES_OPTION = "show-excluded-files";
+ private boolean myShowExcludedFiles = true;
public ProjectViewPane(Project project) {
super(project);
@@ -76,12 +88,7 @@ public class ProjectViewPane extends AbstractProjectViewPSIPane {
@Override
protected ProjectAbstractTreeStructureBase createStructure() {
- return new ProjectTreeStructure(myProject, ID){
- @Override
- protected AbstractTreeNode createRoot(final Project project, ViewSettings settings) {
- return new ProjectViewProjectNode(project, settings);
- }
- };
+ return new ProjectViewPaneTreeStructure();
}
@Override
@@ -111,6 +118,25 @@ public class ProjectViewPane extends AbstractProjectViewPSIPane {
return "ProjectPane";
}
+ @Override
+ public void readExternal(Element element) throws InvalidDataException {
+ super.readExternal(element);
+ String showExcludedOption = JDOMExternalizerUtil.readField(element, SHOW_EXCLUDED_FILES_OPTION);
+ myShowExcludedFiles = showExcludedOption == null || Boolean.parseBoolean(showExcludedOption);
+ }
+
+ @Override
+ public void writeExternal(Element element) throws WriteExternalException {
+ super.writeExternal(element);
+ if (!myShowExcludedFiles) {
+ JDOMExternalizerUtil.writeField(element, SHOW_EXCLUDED_FILES_OPTION, String.valueOf(false));
+ }
+ }
+
+ @Override
+ public void addToolbarActions(DefaultActionGroup actionGroup) {
+ actionGroup.addAction(new ShowExcludedFilesAction()).setAsSecondary(true);
+ }
// should be first
@Override
@@ -148,4 +174,47 @@ public class ProjectViewPane extends AbstractProjectViewPSIPane {
return super.addSubtreeToUpdateByElement(element);
}
}
+
+ private class ProjectViewPaneTreeStructure extends ProjectTreeStructure implements ProjectViewSettings {
+ public ProjectViewPaneTreeStructure() {
+ super(ProjectViewPane.this.myProject, ID);
+ }
+
+ @Override
+ protected AbstractTreeNode createRoot(final Project project, ViewSettings settings) {
+ return new ProjectViewProjectNode(project, settings);
+ }
+
+ @Override
+ public boolean isShowExcludedFiles() {
+ return myShowExcludedFiles;
+ }
+ }
+
+ private final class ShowExcludedFilesAction extends ToggleAction {
+ private ShowExcludedFilesAction() {
+ super(IdeBundle.message("action.show.excluded.files"), IdeBundle.message("action.show.hide.excluded.files"), null);
+ }
+
+ @Override
+ public boolean isSelected(AnActionEvent event) {
+ return myShowExcludedFiles;
+ }
+
+ @Override
+ public void setSelected(AnActionEvent event, boolean flag) {
+ if (myShowExcludedFiles != flag) {
+ myShowExcludedFiles = flag;
+ updateFromRoot(true);
+ }
+ }
+
+ @Override
+ public void update(AnActionEvent e) {
+ super.update(e);
+ final Presentation presentation = e.getPresentation();
+ final ProjectView projectView = ProjectView.getInstance(myProject);
+ presentation.setVisible(projectView.getCurrentProjectViewPane() == ProjectViewPane.this);
+ }
+ }
}
diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java
index 13ba91900521..36c09aff2218 100644
--- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java
+++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/ProjectViewDirectoryHelper.java
@@ -21,6 +21,7 @@
package com.intellij.ide.projectView.impl.nodes;
import com.intellij.ide.projectView.ProjectViewNode;
+import com.intellij.ide.projectView.ProjectViewSettings;
import com.intellij.ide.projectView.ViewSettings;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.openapi.components.ServiceManager;
@@ -37,10 +38,8 @@ import com.intellij.openapi.roots.impl.DirectoryInfo;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.PsiDirectory;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
-import com.intellij.psi.PsiManager;
+import com.intellij.psi.*;
+import com.intellij.psi.search.PsiElementProcessor;
import com.intellij.psi.util.PsiUtilCore;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
@@ -126,7 +125,7 @@ public class ProjectViewDirectoryHelper {
final Module module = fileIndex.getModuleForFile(psiDirectory.getVirtualFile());
final ModuleFileIndex moduleFileIndex = module == null ? null : ModuleRootManager.getInstance(module).getFileIndex();
if (!settings.isFlattenPackages() || skipDirectory(psiDirectory)) {
- processPsiDirectoryChildren(psiDirectory, directoryChildrenInProject(fileIndex, psiDirectory),
+ processPsiDirectoryChildren(psiDirectory, directoryChildrenInProject(psiDirectory, settings),
children, fileIndex, null, settings, withSubDirectories);
}
else { // source directory in "flatten packages" mode
@@ -172,10 +171,20 @@ public class ProjectViewDirectoryHelper {
return topLevelContentRoots;
}
- private PsiElement[] directoryChildrenInProject(ProjectFileIndex fileIndex, PsiDirectory psiDirectory) {
- VirtualFile dir = psiDirectory.getVirtualFile();
- if (isInProject(dir)) {
- return psiDirectory.getChildren();
+ private PsiElement[] directoryChildrenInProject(PsiDirectory psiDirectory, final ViewSettings settings) {
+ final VirtualFile dir = psiDirectory.getVirtualFile();
+ if (shouldBeShown(dir, settings)) {
+ final List<PsiElement> children = new ArrayList<PsiElement>();
+ psiDirectory.processChildren(new PsiElementProcessor<PsiFileSystemItem>() {
+ @Override
+ public boolean execute(@NotNull PsiFileSystemItem element) {
+ if (shouldBeShown(element.getVirtualFile(), settings)) {
+ children.add(element);
+ }
+ return true;
+ }
+ });
+ return PsiUtilCore.toPsiElementArray(children);
}
PsiManager manager = psiDirectory.getManager();
@@ -198,11 +207,11 @@ public class ProjectViewDirectoryHelper {
return PsiUtilCore.toPsiElementArray(directoriesOnTheWayToContentRoots);
}
- private boolean isInProject(VirtualFile dir) {
+ private boolean shouldBeShown(VirtualFile dir, ViewSettings settings) {
DirectoryInfo directoryInfo = myIndex.getInfoForFile(dir);
if (directoryInfo.isInProject()) return true;
- if (!Registry.is("ide.hide.excluded.files")) {
+ if (!Registry.is("ide.hide.excluded.files") && settings instanceof ProjectViewSettings && ((ProjectViewSettings)settings).isShowExcludedFiles()) {
return directoryInfo.isExcluded();
}
return false;
@@ -230,7 +239,7 @@ public class ProjectViewDirectoryHelper {
vFile = dir.getVirtualFile();
if (!vFile.equals(projectFileIndex.getSourceRootForFile(vFile))) { // if is not a source root
if (viewSettings.isHideEmptyMiddlePackages() && !skipDirectory(psiDir) && isEmptyMiddleDirectory(dir, true)) {
- processPsiDirectoryChildren(dir, directoryChildrenInProject(projectFileIndex, dir),
+ processPsiDirectoryChildren(dir, directoryChildrenInProject(dir, viewSettings),
container, projectFileIndex, moduleFileIndex, viewSettings, withSubDirectories); // expand it recursively
continue;
}
diff --git a/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosPanel.java b/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosPanel.java
index 97b3f8720f60..057082105eeb 100644
--- a/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosPanel.java
+++ b/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosPanel.java
@@ -22,6 +22,7 @@ package com.intellij.ide.todo;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.ide.util.scopeChooser.IgnoringComboBox;
+import com.intellij.ide.util.scopeChooser.ScopeChooserCombo;
import com.intellij.openapi.project.Project;
import com.intellij.packageDependencies.DependencyValidationManager;
import com.intellij.psi.search.scope.NonProjectFilesScope;
@@ -44,47 +45,18 @@ import java.util.List;
public class ScopeBasedTodosPanel extends TodoPanel {
private static final String SELECTED_SCOPE = "TODO_SCOPE";
private final Alarm myAlarm;
- private JComboBox myScopes;
- private final NamedScopesHolder.ScopeListener myScopeListener;
- private final NamedScopeManager myNamedScopeManager;
- private final DependencyValidationManager myValidationManager;
+ private ScopeChooserCombo myScopes;
public ScopeBasedTodosPanel(final Project project, TodoPanelSettings settings, Content content){
super(project,settings,false,content);
myAlarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD, project);
- final String scopeName = PropertiesComponent.getInstance(project).getValue(SELECTED_SCOPE);
- rebuildModel(project, scopeName);
-
- myScopeListener = new NamedScopesHolder.ScopeListener() {
- @Override
- public void scopesChanged() {
- final ScopeWrapper scope = (ScopeWrapper)myScopes.getSelectedItem();
- rebuildModel(project, scope != null ? scope.getName() : null);
- }
- };
-
- myNamedScopeManager = NamedScopeManager.getInstance(project);
- myNamedScopeManager.addScopeListener(myScopeListener);
-
- myValidationManager = DependencyValidationManager.getInstance(project);
- myValidationManager.addScopeListener(myScopeListener);
-
- myScopes.setRenderer(new ListCellRendererWrapper<ScopeWrapper>(){
- @Override
- public void customize(JList list, ScopeWrapper value, int index, boolean selected, boolean hasFocus) {
- setText(value.getName());
- if (value.isSeparator()) {
- setSeparator();
- }
- }
- });
- myScopes.addActionListener(new ActionListener() {
+ myScopes.getChildComponent().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
rebuildWithAlarm(ScopeBasedTodosPanel.this.myAlarm);
- final ScopeWrapper selectedItem = (ScopeWrapper)myScopes.getSelectedItem();
- if (selectedItem != null) {
- PropertiesComponent.getInstance(myProject).setValue(SELECTED_SCOPE, selectedItem.getName());
+ final String selectedItemName = myScopes.getSelectedScopeName();
+ if (selectedItemName != null) {
+ PropertiesComponent.getInstance(myProject).setValue(SELECTED_SCOPE, selectedItemName);
}
}
});
@@ -92,67 +64,14 @@ public class ScopeBasedTodosPanel extends TodoPanel {
}
@Override
- public void dispose() {
- myNamedScopeManager.removeScopeListener(myScopeListener);
- myValidationManager.removeScopeListener(myScopeListener);
- super.dispose();
- }
-
- private void rebuildModel(Project project, String scopeName) {
- final ArrayList<ScopeWrapper> scopes = new ArrayList<ScopeWrapper>();
- final DependencyValidationManager manager = DependencyValidationManager.getInstance(project);
-
- scopes.add(new ScopeWrapper("Predefined Scopes"));
- List<NamedScope> predefinedScopesList = manager.getPredefinedScopes();
- NamedScope[] predefinedScopes = predefinedScopesList.toArray(new NamedScope[predefinedScopesList.size()]);
- predefinedScopes = NonProjectFilesScope.removeFromList(predefinedScopes);
- for (NamedScope predefinedScope : predefinedScopes) {
- scopes.add(new ScopeWrapper(predefinedScope));
- }
-
- collectEditableScopes(scopes, manager, "Custom Project Scopes");
- collectEditableScopes(scopes, NamedScopeManager.getInstance(project), "Custom Local Scopes");
-
- myScopes.setModel(new DefaultComboBoxModel(scopes.toArray(new ScopeWrapper[scopes.size()])));
- setSelection(scopeName, scopes);
- }
-
- private void setSelection(@Nullable String scopeName, ArrayList<ScopeWrapper> scopes) {
- boolean hasNonSeparators = false;
- for (ScopeWrapper scope : scopes) {
- if (!scope.isSeparator()) {
- hasNonSeparators = true;
- if (scopeName == null || scopeName.equals(scope.getName())) {
- myScopes.setSelectedItem(scope);
- return;
- }
- }
- }
- assert hasNonSeparators;
- setSelection(null, scopes);
- }
-
- private static void collectEditableScopes(ArrayList<ScopeWrapper> scopes, NamedScopesHolder manager, String separatorTitle) {
- NamedScope[] editableScopes = manager.getEditableScopes();
- if (editableScopes.length > 0) {
- scopes.add(new ScopeWrapper(separatorTitle));
- for (NamedScope scope : editableScopes) {
- scopes.add(new ScopeWrapper(scope));
- }
- }
- }
-
- @Override
protected JComponent createCenterComponent() {
JPanel panel = new JPanel(new BorderLayout());
final JComponent component = super.createCenterComponent();
panel.add(component, BorderLayout.CENTER);
- myScopes = new IgnoringComboBox() {
- @Override
- protected boolean isIgnored(Object item) {
- return item instanceof ScopeWrapper && ((ScopeWrapper)item).isSeparator();
- }
- };
+ String preselect = PropertiesComponent.getInstance(myProject).getValue(SELECTED_SCOPE);
+ myScopes = new ScopeChooserCombo(myProject, false, true, preselect);
+ myScopes.setCurrentSelection(false);
+ myScopes.setUsageView(false);
JPanel chooserPanel = new JPanel(new GridBagLayout());
final JLabel scopesLabel = new JLabel("Scope:");
@@ -177,32 +96,4 @@ public class ScopeBasedTodosPanel extends TodoPanel {
builder.init();
return builder;
}
-
- public static class ScopeWrapper {
- private final String myName;
- private final boolean mySeparator;
- private NamedScope myNamedScope;
-
- private ScopeWrapper(NamedScope namedScope) {
- mySeparator = false;
- myNamedScope = namedScope;
- myName = myNamedScope.getName();
- }
- private ScopeWrapper(String name) {
- mySeparator = true;
- myName = name;
- }
-
- public String getName() {
- return myName;
- }
-
- public NamedScope getNamedScope() {
- return myNamedScope;
- }
-
- public boolean isSeparator() {
- return mySeparator;
- }
- }
} \ No newline at end of file
diff --git a/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeBuilder.java b/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeBuilder.java
index 2d7163a0d5b1..0dc79f911852 100644
--- a/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeBuilder.java
+++ b/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeBuilder.java
@@ -19,6 +19,7 @@
*/
package com.intellij.ide.todo;
+import com.intellij.ide.util.scopeChooser.ScopeChooserCombo;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
@@ -26,9 +27,9 @@ import javax.swing.*;
import javax.swing.tree.DefaultTreeModel;
public class ScopeBasedTodosTreeBuilder extends TodoTreeBuilder{
- private final JComboBox myScopes;
+ private final ScopeChooserCombo myScopes;
- public ScopeBasedTodosTreeBuilder(JTree tree, DefaultTreeModel treeModel, Project project, JComboBox scopes){
+ public ScopeBasedTodosTreeBuilder(JTree tree, DefaultTreeModel treeModel, Project project, ScopeChooserCombo scopes){
super(tree,treeModel,project);
myScopes = scopes;
}
diff --git a/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeStructure.java b/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeStructure.java
index 322cc44bc99c..500e17b56534 100644
--- a/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeStructure.java
+++ b/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeStructure.java
@@ -24,22 +24,14 @@ import com.intellij.ide.todo.nodes.ToDoRootNode;
import com.intellij.ide.util.scopeChooser.ScopeChooserCombo;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.vcs.changes.Change;
-import com.intellij.openapi.vcs.changes.ChangeListManager;
-import com.intellij.openapi.vfs.VfsUtil;
-import com.intellij.packageDependencies.DependencyValidationManager;
import com.intellij.psi.PsiFile;
-import com.intellij.psi.search.scope.packageSet.NamedScope;
-import com.intellij.psi.search.scope.packageSet.NamedScopesHolder;
-import com.intellij.psi.search.scope.packageSet.PackageSet;
-
-import javax.swing.*;
-import java.util.Collection;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.search.SearchScope;
public class ScopeBasedTodosTreeStructure extends TodoTreeStructure {
- private final JComboBox myScopes;
+ private final ScopeChooserCombo myScopes;
- public ScopeBasedTodosTreeStructure(Project project, JComboBox scopes) {
+ public ScopeBasedTodosTreeStructure(Project project, ScopeChooserCombo scopes) {
super(project);
myScopes = scopes;
}
@@ -48,12 +40,9 @@ public class ScopeBasedTodosTreeStructure extends TodoTreeStructure {
public boolean accept(final PsiFile psiFile) {
if (!psiFile.isValid()) return false;
boolean isAffected = false;
- final ScopeBasedTodosPanel.ScopeWrapper scope = (ScopeBasedTodosPanel.ScopeWrapper)myScopes.getSelectedItem();
- if (scope != null) {
- final PackageSet value = scope.getNamedScope().getValue();
- if (value != null) {
- isAffected = value.contains(psiFile, NamedScopesHolder.getHolder(myProject, scope.getName(), DependencyValidationManager.getInstance(myProject)));
- }
+ SearchScope scope = myScopes.getSelectedScope();
+ if (scope instanceof GlobalSearchScope) {
+ isAffected = ((GlobalSearchScope)scope).contains(psiFile.getVirtualFile());
}
return isAffected && (myTodoFilter != null && myTodoFilter.accept(mySearchHelper, psiFile) ||
(myTodoFilter == null && mySearchHelper.getTodoItemsCount(psiFile) > 0));
diff --git a/platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java b/platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java
index eb22b72eb810..37248fe8a909 100644
--- a/platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java
+++ b/platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,7 +26,7 @@ import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.impl.ActionManagerImpl;
import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.application.ApplicationStarter;
+import com.intellij.openapi.application.ApplicationStarterEx;
import com.intellij.openapi.application.ex.ApplicationEx;
import com.intellij.openapi.keymap.impl.ui.KeymapPanel;
import com.intellij.openapi.options.SearchableConfigurable;
@@ -50,8 +50,7 @@ import java.util.TreeSet;
* Pass corresponding -Didea.platform.prefix=YOUR_IDE_PREFIX to vm options and choose main_YOUR_IDE module
*/
@SuppressWarnings({"CallToPrintStackTrace", "SynchronizeOnThis"})
-public class TraverseUIStarter implements ApplicationStarter {
- private String OUTPUT_PATH;
+public class TraverseUIStarter extends ApplicationStarterEx {
@NonNls private static final String OPTIONS = "options";
@NonNls private static final String CONFIGURABLE = "configurable";
@NonNls private static final String ID = "id";
@@ -61,13 +60,19 @@ public class TraverseUIStarter implements ApplicationStarter {
@NonNls private static final String PATH = "path";
@NonNls private static final String HIT = "hit";
+ private String OUTPUT_PATH;
+
+ @Override
+ public boolean isHeadless() {
+ return true;
+ }
+
@Override
@NonNls
public String getCommandName() {
return "traverseUI";
}
-
@Override
public void premain(String[] args) {
OUTPUT_PATH = args[1];
diff --git a/platform/lang-impl/src/com/intellij/ide/util/PsiElementListCellRenderer.java b/platform/lang-impl/src/com/intellij/ide/util/PsiElementListCellRenderer.java
index f51ec554485a..d0a0648285d6 100644
--- a/platform/lang-impl/src/com/intellij/ide/util/PsiElementListCellRenderer.java
+++ b/platform/lang-impl/src/com/intellij/ide/util/PsiElementListCellRenderer.java
@@ -102,7 +102,7 @@ public abstract class PsiElementListCellRenderer<T extends PsiElement> extends J
setPaintFocusBorder(hasFocus && UIUtil.isToUseDottedCellBorder() && myFocusBorderEnabled);
if (value instanceof PsiElement) {
T element = (T)value;
- String name = getElementText(element);
+ String name = element.isValid() ? getElementText(element) : "INVALID";
PsiFile psiFile = element.isValid() ? element.getContainingFile() : null;
boolean isProblemFile = false;
diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java
index 3e90f2310884..53d71d9794fa 100644
--- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java
+++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java
@@ -54,6 +54,8 @@ import com.intellij.openapi.util.*;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.wm.IdeFocusManager;
+import com.intellij.openapi.wm.ToolWindow;
+import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.openapi.wm.ex.WindowManagerEx;
import com.intellij.psi.PsiElement;
@@ -518,23 +520,33 @@ public abstract class ChooseByNameBase {
else {
Component oppositeComponent = e.getOppositeComponent();
if (oppositeComponent == myCheckBox) {
- myTextField.requestFocus();
+ IdeFocusManager.getInstance(myProject).requestFocus(myTextField, true);
return;
}
if (oppositeComponent != null && !(oppositeComponent instanceof JFrame) &&
myList.isShowing() &&
(oppositeComponent == myList || SwingUtilities.isDescendingFrom(myList, oppositeComponent))) {
- myTextField.requestFocus();// Otherwise me may skip some KeyEvents
+ IdeFocusManager.getInstance(myProject).requestFocus(myTextField, true);// Otherwise me may skip some KeyEvents
return;
}
+ if (oppositeComponent != null) {
+ ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(myProject);
+ ToolWindow toolWindow = toolWindowManager.getToolWindow(toolWindowManager.getActiveToolWindowId());
+ if (toolWindow != null) {
+ JComponent toolWindowComponent = toolWindow.getComponent();
+ if (SwingUtilities.isDescendingFrom(oppositeComponent, toolWindowComponent)) {
+ return; // Allow toolwindows to gain focus (used by QuickDoc shown in a toolwindow)
+ }
+ }
+ }
+
EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
if (queue instanceof IdeEventQueue) {
if (!((IdeEventQueue)queue).wasRootRecentlyClicked(oppositeComponent)) {
Component root = SwingUtilities.getRoot(myTextField);
if (root != null && root.isShowing()) {
- root.requestFocus();
- myTextField.requestFocus();
+ IdeFocusManager.getInstance(myProject).requestFocus(myTextField, true);
return;
}
}
@@ -641,7 +653,7 @@ public abstract class ChooseByNameBase {
@Override
public boolean onClick(@NotNull MouseEvent e, int clickCount) {
if (!myTextField.hasFocus()) {
- myTextField.requestFocus();
+ IdeFocusManager.getInstance(myProject).requestFocus(myTextField, true);
}
if (clickCount == 2) {
diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ContributorsBasedGotoByModel.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ContributorsBasedGotoByModel.java
index c40831d276de..c26bd353de50 100644
--- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ContributorsBasedGotoByModel.java
+++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ContributorsBasedGotoByModel.java
@@ -62,6 +62,7 @@ public abstract class ContributorsBasedGotoByModel implements ChooseByNameModelE
protected ContributorsBasedGotoByModel(@NotNull Project project, @NotNull ChooseByNameContributor[] contributors) {
myProject = project;
myContributors = contributors;
+ assert !Arrays.asList(contributors).contains(null);
}
@Override
@@ -95,7 +96,7 @@ public abstract class ContributorsBasedGotoByModel implements ChooseByNameModelE
ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator();
Processor<ChooseByNameContributor> processor = new ReadActionProcessor<ChooseByNameContributor>() {
@Override
- public boolean processInReadAction(ChooseByNameContributor contributor) {
+ public boolean processInReadAction(@NotNull ChooseByNameContributor contributor) {
try {
if (!myProject.isDisposed()) {
long contributorStarted = System.currentTimeMillis();
@@ -185,13 +186,15 @@ public abstract class ContributorsBasedGotoByModel implements ChooseByNameModelE
}
@NotNull
- public Object[] getElementsByName(final String name, final FindSymbolParameters parameters, @NotNull final ProgressIndicator canceled) {
+ public Object[] getElementsByName(@NotNull final String name,
+ @NotNull final FindSymbolParameters parameters,
+ @NotNull final ProgressIndicator canceled) {
long elementByNameStarted = System.currentTimeMillis();
final List<NavigationItem> items = Collections.synchronizedList(new ArrayList<NavigationItem>());
Processor<ChooseByNameContributor> processor = new Processor<ChooseByNameContributor>() {
@Override
- public boolean process(ChooseByNameContributor contributor) {
+ public boolean process(@NotNull ChooseByNameContributor contributor) {
if (myProject.isDisposed()) {
return true;
}
diff --git a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java
index aef7c9a17e74..8297a3db8e1f 100644
--- a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java
+++ b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java
@@ -71,6 +71,8 @@ public class ScopeChooserCombo extends ComboboxWithBrowseButton implements Dispo
private NamedScopesHolder.ScopeListener myScopeListener;
private NamedScopeManager myNamedScopeManager;
private DependencyValidationManager myValidationManager;
+ private boolean myCurrentSelection = true;
+ private boolean myUsageView = true;
public ScopeChooserCombo() {
super(new IgnoringComboBox(){
@@ -118,6 +120,14 @@ public class ScopeChooserCombo extends ComboboxWithBrowseButton implements Dispo
selectScope(preselect);
}
+ public void setCurrentSelection(boolean currentSelection) {
+ myCurrentSelection = currentSelection;
+ }
+
+ public void setUsageView(boolean usageView) {
+ myUsageView = usageView;
+ }
+
@Override
public void dispose() {
super.dispose();
@@ -220,7 +230,7 @@ public class ScopeChooserCombo extends ComboboxWithBrowseButton implements Dispo
private void createPredefinedScopeDescriptors(DefaultComboBoxModel model) {
@SuppressWarnings("deprecation") final DataContext context = DataManager.getInstance().getDataContext();
- for (SearchScope scope : getPredefinedScopes(myProject, context, mySuggestSearchInLibs, myPrevSearchFiles, true, true)) {
+ for (SearchScope scope : getPredefinedScopes(myProject, context, mySuggestSearchInLibs, myPrevSearchFiles, myCurrentSelection, myUsageView)) {
model.addElement(new ScopeDescriptor(scope));
}
for (ScopeDescriptorProvider provider : Extensions.getExtensions(ScopeDescriptorProvider.EP_NAME)) {
diff --git a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeDescriptorProvider.java b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeDescriptorProvider.java
index fb879abd2595..44baafa0b86e 100644
--- a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeDescriptorProvider.java
+++ b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeDescriptorProvider.java
@@ -25,6 +25,7 @@ import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
public interface ScopeDescriptorProvider {
+ ScopeDescriptor[] EMPTY = new ScopeDescriptor[0];
ExtensionPointName<ScopeDescriptorProvider> EP_NAME = ExtensionPointName.create("com.intellij.scopeDescriptorProvider");
@NotNull