diff options
Diffstat (limited to 'platform/lang-impl/src/com/intellij/ide')
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 |