From 0ddecbcbf0f001f1f87aa1b8cf1d41d606345706 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 25 Aug 2014 18:21:08 +0400 Subject: [PATCH] todo by scopes: reuse scope chooser combo, exclude ClassHierarchy (place to clear inner cache?) (IDEA-126228) --- .../HierarchyScopeDescriptorProvider.java | 6 + .../ide/todo/ScopeBasedTodosPanel.java | 129 ++---------------- .../ide/todo/ScopeBasedTodosTreeBuilder.java | 5 +- .../todo/ScopeBasedTodosTreeStructure.java | 25 +--- .../util/scopeChooser/ScopeChooserCombo.java | 12 +- .../scopeChooser/ScopeDescriptorProvider.java | 1 + 6 files changed, 38 insertions(+), 140 deletions(-) diff --git a/java/java-impl/src/com/intellij/ide/util/scopeChooser/HierarchyScopeDescriptorProvider.java b/java/java-impl/src/com/intellij/ide/util/scopeChooser/HierarchyScopeDescriptorProvider.java index 36ee6dfcdb36..1eda5c607525 100644 --- a/java/java-impl/src/com/intellij/ide/util/scopeChooser/HierarchyScopeDescriptorProvider.java +++ b/java/java-impl/src/com/intellij/ide/util/scopeChooser/HierarchyScopeDescriptorProvider.java @@ -21,11 +21,17 @@ package com.intellij.ide.util.scopeChooser; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.wm.ToolWindowId; +import com.intellij.openapi.wm.ToolWindowManager; import org.jetbrains.annotations.NotNull; public class HierarchyScopeDescriptorProvider implements ScopeDescriptorProvider { @NotNull public ScopeDescriptor[] getScopeDescriptors(final Project project) { + if (Comparing.strEqual(ToolWindowManager.getInstance(project).getActiveToolWindowId(), ToolWindowId.TODO_VIEW)) { + return EMPTY; + } return new ScopeDescriptor[]{new ClassHierarchyScopeDescriptor(project)}; } } \ No newline at end of file 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,115 +45,33 @@ 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(){ - @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); } } }); rebuildWithAlarm(myAlarm); } - @Override - public void dispose() { - myNamedScopeManager.removeScopeListener(myScopeListener); - myValidationManager.removeScopeListener(myScopeListener); - super.dispose(); - } - - private void rebuildModel(Project project, String scopeName) { - final ArrayList scopes = new ArrayList(); - final DependencyValidationManager manager = DependencyValidationManager.getInstance(project); - - scopes.add(new ScopeWrapper("Predefined Scopes")); - List 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 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 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/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 EP_NAME = ExtensionPointName.create("com.intellij.scopeDescriptorProvider"); @NotNull