diff --git a/platform/core-api/src/com/intellij/psi/search/PsiSearchScopeUtil.java b/platform/core-api/src/com/intellij/psi/search/PsiSearchScopeUtil.java index a66198e29216..70da9baa76b9 100644 --- a/platform/core-api/src/com/intellij/psi/search/PsiSearchScopeUtil.java +++ b/platform/core-api/src/com/intellij/psi/search/PsiSearchScopeUtil.java @@ -20,8 +20,15 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class PsiSearchScopeUtil { + + @Nullable + public static SearchScope union(@Nullable SearchScope a, @Nullable SearchScope b) { + return a == null ? b : b == null ? a : a.union(b); + } + /** * @deprecated * Use com.intellij.psi.search.SearchScope#union(com.intellij.psi.search.SearchScope) diff --git a/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java b/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java index bd10302226e8..003325aee3ae 100644 --- a/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java +++ b/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java @@ -74,7 +74,7 @@ public class AnalysisScope { protected List myModules; protected Module myModule; protected PsiElement myElement; - private final SearchScope myScope; + private SearchScope myScope; private boolean mySearchInLibraries = false; protected int myType; @@ -147,6 +147,10 @@ public class AnalysisScope { myType = VIRTUAL_FILES; } + public void setScope(SearchScope scope) { + myScope = scope; + } + public void setSearchInLibraries(final boolean searchInLibraries) { mySearchInLibraries = searchInLibraries; } diff --git a/platform/lang-impl/src/com/intellij/analysis/BaseAnalysisActionDialog.java b/platform/lang-impl/src/com/intellij/analysis/BaseAnalysisActionDialog.java index acbd5a51b2eb..4536b9fe18f8 100644 --- a/platform/lang-impl/src/com/intellij/analysis/BaseAnalysisActionDialog.java +++ b/platform/lang-impl/src/com/intellij/analysis/BaseAnalysisActionDialog.java @@ -301,6 +301,7 @@ public class BaseAnalysisActionDialog extends DialogWrapper { } uiOptions.ANALYZE_TEST_SOURCES = isInspectTestSources(); scope.setIncludeTestSource(isInspectTestSources()); + scope.setScope(getCustomScope()); FindSettings.getInstance().setDefaultScopeName(scope.getDisplayName()); return scope; diff --git a/platform/lang-impl/src/com/intellij/codeInspection/actions/FileFilterPanel.form b/platform/lang-impl/src/com/intellij/codeInspection/actions/FileFilterPanel.form new file mode 100644 index 000000000000..22f0689d379b --- /dev/null +++ b/platform/lang-impl/src/com/intellij/codeInspection/actions/FileFilterPanel.form @@ -0,0 +1,35 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/platform/lang-impl/src/com/intellij/codeInspection/actions/FileFilterPanel.java b/platform/lang-impl/src/com/intellij/codeInspection/actions/FileFilterPanel.java new file mode 100644 index 000000000000..2e6d7e4964fe --- /dev/null +++ b/platform/lang-impl/src/com/intellij/codeInspection/actions/FileFilterPanel.java @@ -0,0 +1,74 @@ +/* + * Copyright 2000-2011 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.codeInspection.actions; + +import com.intellij.find.impl.FindDialog; +import com.intellij.find.impl.FindInProjectUtil; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.SearchScope; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.regex.Pattern; + +/** + * @author Dmitry Avdeev + * Date: 10/11/11 + */ +class FileFilterPanel { + private JCheckBox myUseFileMask; + private JComboBox myFileMask; + private JPanel myPanel; + + void init() { + FindDialog.initFileFilter(myFileMask, myUseFileMask); + } + + @Nullable + SearchScope getSearchScope() { + if (!myUseFileMask.isSelected()) return null; + String text = myUseFileMask.getText(); + final Pattern pattern = FindInProjectUtil.createFileMaskRegExp(text); + return new GlobalSearchScope() { + @Override + public boolean contains(VirtualFile file) { + return pattern == null || pattern.matcher(file.getName()).matches(); + } + + @Override + public int compare(VirtualFile file1, VirtualFile file2) { + return 0; + } + + @Override + public boolean isSearchInModuleContent(@NotNull Module aModule) { + return true; + } + + @Override + public boolean isSearchInLibraries() { + return true; + } + }; + } + + JPanel getPanel() { + return myPanel; + } +} diff --git a/platform/lang-impl/src/com/intellij/codeInspection/actions/RunInspectionAction.java b/platform/lang-impl/src/com/intellij/codeInspection/actions/RunInspectionAction.java index 5ace790cdcd9..eef5a68fe193 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/actions/RunInspectionAction.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/actions/RunInspectionAction.java @@ -37,9 +37,12 @@ import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.psi.search.PsiSearchScopeUtil; +import com.intellij.psi.search.SearchScope; import org.jdom.Element; import org.jetbrains.annotations.NotNull; +import javax.swing.*; import java.util.Arrays; /** @@ -100,6 +103,10 @@ public class RunInspectionAction extends GotoActionBase { analysisScope = new AnalysisScope(project, Arrays.asList(virtualFile)); } } + + final FileFilterPanel fileFilterPanel = new FileFilterPanel(); + fileFilterPanel.init(); + final BaseAnalysisActionDialog dlg = new BaseAnalysisActionDialog( AnalysisScopeBundle.message("specify.analysis.scope", InspectionsBundle.message("inspection.action.title")), AnalysisScopeBundle.message("analysis.scope.title", InspectionsBundle.message("inspection.action.noun")), @@ -108,7 +115,19 @@ public class RunInspectionAction extends GotoActionBase { module != null ? module.getName() : null, true, AnalysisUIOptions.getInstance(project), - psiElement); + psiElement) { + + @Override + protected JComponent getAdditionalActionSettings(Project project) { + return fileFilterPanel.getPanel(); + } + + @Override + public SearchScope getCustomScope() { + return PsiSearchScopeUtil.union(fileFilterPanel.getSearchScope(), super.getCustomScope()); + } + }; + AnalysisScope scope = analysisScope; dlg.show(); if (!dlg.isOK()) return; diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java b/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java index 595e9ab0dc48..097ced0bdfa0 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java @@ -71,7 +71,7 @@ import java.util.Map; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -class FindDialog extends DialogWrapper { +public class FindDialog extends DialogWrapper { private static final Logger LOG = Logger.getInstance("#com.intellij.find.impl.FindDialog"); private ComboBox myInputComboBox; @@ -392,28 +392,33 @@ class FindDialog extends DialogWrapper { initCombobox(myFileFilter); filterPanel.add(myUseFileFilter = createCheckbox(FindBundle.message("find.filter.file.mask.checkbox")),BorderLayout.WEST); filterPanel.add(myFileFilter,BorderLayout.CENTER); - myFileFilter.setEditable(true); + initFileFilter(myFileFilter, myUseFileFilter); + + return filterPanel; + } + + public static void initFileFilter(final JComboBox fileFilter, final JCheckBox useFileFilter) { + fileFilter.setEditable(true); String[] fileMasks = FindSettings.getInstance().getRecentFileMasks(); for(int i=fileMasks.length-1; i >= 0; i--) { - myFileFilter.addItem(fileMasks [i]); + fileFilter.addItem(fileMasks[i]); } - myFileFilter.setEnabled(false); + fileFilter.setEnabled(false); - myUseFileFilter.addActionListener( + useFileFilter.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { - if (!myUseFileFilter.isSelected()) { - myFileFilter.setEnabled(false); - } else { - myFileFilter.setEnabled(true); - myFileFilter.getEditor().selectAll(); - myFileFilter.getEditor().getEditorComponent().requestFocusInWindow(); + if (!useFileFilter.isSelected()) { + fileFilter.setEnabled(false); + } + else { + fileFilter.setEnabled(true); + fileFilter.getEditor().selectAll(); + fileFilter.getEditor().getEditorComponent().requestFocusInWindow(); } } } ); - - return filterPanel; } public void doOKAction() {