From 8146eb81ece957d9a478d85aaf8a932992b15928 Mon Sep 17 00:00:00 2001 From: Maxim Mossienko Date: Wed, 2 Mar 2005 15:15:25 +0300 Subject: [PATCH] replace in project works with new usage view, find in path has 'skip with one usage' is with subdirectories is saved / restored across find calls --- .../usages/UsageInfo2UsageAdapter.java | 12 +- .../src/com/intellij/usages/UsageView.java | 4 + .../com/intellij/usages/UsageViewManager.java | 17 +- .../com/intellij/usages/impl/GroupNode.java | 30 ++ .../intellij/usages/impl/UsageViewImpl.java | 44 ++- .../usages/impl/UsageViewManagerImpl.java | 34 +- .../findInProject/FindInProjectManager.java | 168 +-------- source/com/intellij/find/impl/FindDialog.java | 38 +- .../intellij/find/impl/FindInProjectUtil.java | 103 +++++- .../intellij/find/impl/FindManagerImpl.java | 4 + .../ReplaceInProjectManager.java | 349 +++++++++--------- 11 files changed, 423 insertions(+), 380 deletions(-) diff --git a/UsageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java b/UsageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java index 8774f3fb9753..7e395fd5ac1b 100644 --- a/UsageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java +++ b/UsageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java @@ -109,18 +109,22 @@ public class UsageInfo2UsageAdapter implements Usage, UsageInModule, UsageInLibr public void selectInEditor() { if (!isValid()) return; Editor editor = openTextEditor(false); - RangeMarker marker = myRangeMarkers.get(0); + RangeMarker marker = getRangeMarker(); editor.getSelectionModel().setSelection(marker.getStartOffset(), marker.getEndOffset()); } public void highlightInEditor() { if (!isValid()) return; - RangeMarker marker = myRangeMarkers.get(0); + RangeMarker marker = getRangeMarker(); SelectInEditorManager.getInstance(getProject()) .selectInEditor(getFile(), marker.getStartOffset(), marker.getEndOffset(), false, false); } + public final RangeMarker getRangeMarker() { + return myRangeMarkers.get(0); + } + public void navigate(boolean focus) { if (canNavigate()) { openTextEditor(focus); @@ -141,7 +145,7 @@ public class UsageInfo2UsageAdapter implements Usage, UsageInModule, UsageInLibr } private OpenFileDescriptor getDescriptor() { - return isValid() ? new OpenFileDescriptor(getProject(), getFile(), myRangeMarkers.get(0).getStartOffset()) : null; + return isValid() ? new OpenFileDescriptor(getProject(), getFile(), getRangeMarker().getStartOffset()) : null; } private Project getProject() { @@ -217,7 +221,7 @@ public class UsageInfo2UsageAdapter implements Usage, UsageInModule, UsageInLibr public void reset() { if (myRangeMarkers.size() > 1) { - RangeMarker marker = myRangeMarkers.get(0); + RangeMarker marker = getRangeMarker(); myRangeMarkers = new ArrayList(); myRangeMarkers.add(marker); initChunks(); diff --git a/UsageView/src/com/intellij/usages/UsageView.java b/UsageView/src/com/intellij/usages/UsageView.java index ea6523836fcd..568ca9854d44 100644 --- a/UsageView/src/com/intellij/usages/UsageView.java +++ b/UsageView/src/com/intellij/usages/UsageView.java @@ -25,8 +25,10 @@ public interface UsageView extends Disposeable { String USAGE_VIEW = "UsageView.new"; void appendUsage(Usage usage); + void removeUsage(Usage usage); void includeUsages(Usage[] usages); void excludeUsages(Usage[] usages); + void selectUsages(Usage[] usages); void close(); boolean isSearchInProgress(); @@ -36,6 +38,8 @@ public interface UsageView extends Disposeable { UsageViewPresentation getPresentation(); Set getExcludedUsages(); + Set getSelectedUsages(); + Set getUsages(); JComponent getComponent(); } diff --git a/UsageView/src/com/intellij/usages/UsageViewManager.java b/UsageView/src/com/intellij/usages/UsageViewManager.java index 8480c28ce308..363053633cf3 100644 --- a/UsageView/src/com/intellij/usages/UsageViewManager.java +++ b/UsageView/src/com/intellij/usages/UsageViewManager.java @@ -21,9 +21,16 @@ public interface UsageViewManager { boolean showPanelIfOnlyOneUsage, boolean showNotFoundMessage, UsageViewPresentation presentation); - UsageView searchAndShowUsages(UsageTarget[] searchFor, - Factory searcherFactory, - boolean showPanelIfOnlyOneUsage, - boolean showNotFoundMessage, UsageViewPresentation presentation, - Factory progressIndicatorFactory); + interface UsageViewStateListener { + void usageViewCreated(UsageView usageView); + void findingUsagesFinished(); + } + + void searchAndShowUsages(UsageTarget[] searchFor, + Factory searcherFactory, + boolean showPanelIfOnlyOneUsage, + boolean showNotFoundMessage, + UsageViewPresentation presentation, + Factory progressIndicatorFactory, + UsageViewStateListener listener); } diff --git a/UsageView/src/com/intellij/usages/impl/GroupNode.java b/UsageView/src/com/intellij/usages/impl/GroupNode.java index 2c5c573ce309..7f5292b08811 100644 --- a/UsageView/src/com/intellij/usages/impl/GroupNode.java +++ b/UsageView/src/com/intellij/usages/impl/GroupNode.java @@ -72,6 +72,36 @@ class GroupNode extends Node implements Navigatable { return null; } + public boolean removeUsage(UsageNode usage) { + final Collection groupNodes = mySubgroupNodes.values(); + + for(Iterator i = groupNodes.iterator();i.hasNext();) { + final GroupNode groupNode = i.next(); + + if(groupNode.removeUsage(usage)) { + doUpdate(); + + if (groupNode.getRecursiveUsageCount() == 0) { + myTreeModel.removeNodeFromParent(groupNode); + mySubgroupNodes.remove(groupNode); + } + return true; + } + } + + if (myUsageNodes.remove(usage)) { + doUpdate(); + return true; + } + + return false; + } + + private void doUpdate() { + --myRecursiveUsageCount; + myTreeModel.reload(this); + } + public UsageNode addUsage(Usage usage) { try { UsageNode mergedWith = tryMerge(usage); diff --git a/UsageView/src/com/intellij/usages/impl/UsageViewImpl.java b/UsageView/src/com/intellij/usages/impl/UsageViewImpl.java index 8e3d05cda73f..cf373bcddd29 100644 --- a/UsageView/src/com/intellij/usages/impl/UsageViewImpl.java +++ b/UsageView/src/com/intellij/usages/impl/UsageViewImpl.java @@ -28,9 +28,7 @@ import com.intellij.util.ui.tree.TreeUtil; import com.intellij.util.ui.Tree; import javax.swing.*; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; +import javax.swing.tree.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -473,6 +471,16 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra } } + public void removeUsage(Usage usage) { + final UsageNode node = myUsageNodes.get(usage); + + if (node != null) { + ((DefaultTreeModel)myTree.getModel()).removeNodeFromParent (node); + myUsageNodes.remove(usage); + ((GroupNode)myTree.getModel().getRoot()).removeUsage(node); + } + } + public void includeUsages(Usage[] usages) { for (int i = 0; i < usages.length; i++) { final UsageNode node = myUsageNodes.get(usages[i]); @@ -493,6 +501,23 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra updateImmediately(); } + public void selectUsages(Usage[] usages) { + if (usages == null) return; + + List pathes = new LinkedList(); + + for (int i = 0; i < usages.length; i++) { + final UsageNode node = myUsageNodes.get(usages[i]); + + if (node != null) { + pathes.add(new TreePath(node.getPath())); + } + } + + myTree.setSelectionPaths(pathes.toArray(new TreePath[pathes.size()])); + if (pathes.size() > 0) myTree.scrollPathToVisible(pathes.get(0)); + } + public JComponent getComponent() { return myRootPanel; } @@ -710,7 +735,7 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra return node instanceof Node ? (Node)node : null; } - private Usage[] getSelectedUsages() { + public Set getSelectedUsages() { TreePath[] selectionPaths = myTree.getSelectionPaths(); if (selectionPaths == null) return null; @@ -721,7 +746,13 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra collectUsages(node, usages); } - return usages.toArray(new Usage[usages.size()]); + return usages; + } + + public Set getUsages() { + final LinkedHashSet usages = new LinkedHashSet(); + collectUsages((DefaultMutableTreeNode)myTree.getModel().getRoot(), usages); + return usages; } private void collectUsages(DefaultMutableTreeNode node, Set usages) { @@ -837,7 +868,8 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra } if (dataId.equals(USAGES)) { - return getSelectedUsages(); + final Set selectedUsages = getSelectedUsages(); + return selectedUsages.toArray(new Usage[selectedUsages.size()]); } if (dataId.equals(USAGE_TARGETS)) { diff --git a/UsageView/src/com/intellij/usages/impl/UsageViewManagerImpl.java b/UsageView/src/com/intellij/usages/impl/UsageViewManagerImpl.java index 67ddc0a08fa5..0a6222d9306e 100644 --- a/UsageView/src/com/intellij/usages/impl/UsageViewManagerImpl.java +++ b/UsageView/src/com/intellij/usages/impl/UsageViewManagerImpl.java @@ -67,7 +67,7 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent final Application application = ApplicationManager.getApplication(); application.runProcessWithProgressSynchronously( - createSearchRunnable(usageView, presentation, searchFor, searcherFactory, showNotFoundMessage, showPanelIfOnlyOneUsage, application), + createSearchRunnable(usageView, presentation, searchFor, searcherFactory, showNotFoundMessage, showPanelIfOnlyOneUsage, null), getProgressTitle(presentation), true, myProject @@ -82,19 +82,22 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent final Factory searcherFactory, final boolean showNotFoundMessage, final boolean showPanelIfOnlyOneUsage, - final Application application) { - return new SearchForUsagesRunnable(usageView, presentation, searchFor, searcherFactory, showNotFoundMessage, showPanelIfOnlyOneUsage, application); + final UsageViewManager.UsageViewStateListener listener) { + return new SearchForUsagesRunnable(usageView, presentation, searchFor, searcherFactory, showNotFoundMessage, showPanelIfOnlyOneUsage, listener); } - public UsageView searchAndShowUsages(UsageTarget[] searchFor, + public void searchAndShowUsages(UsageTarget[] searchFor, Factory searcherFactory, boolean showPanelIfOnlyOneUsage, boolean showNotFoundMessage, UsageViewPresentation presentation, - final Factory progressIndicatorFactory) { + final Factory progressIndicatorFactory, + UsageViewManager.UsageViewStateListener listener + ) { final UsageViewImpl[] usageView = new UsageViewImpl[]{null}; - final Application application = ApplicationManager.getApplication(); - final SearchForUsagesRunnable runnable = (SearchForUsagesRunnable)createSearchRunnable(usageView, presentation, searchFor, searcherFactory, showNotFoundMessage, showPanelIfOnlyOneUsage, application); + final SearchForUsagesRunnable runnable = (SearchForUsagesRunnable)createSearchRunnable( + usageView, presentation, searchFor, searcherFactory, showNotFoundMessage, showPanelIfOnlyOneUsage, listener + ); UsageViewImplUtil.runProcessWithProgress( progressIndicatorFactory.create(), @@ -110,8 +113,6 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent } } ); - - return usageView[0]; } static String getProgressTitle(UsageViewPresentation presentation) { @@ -122,7 +123,7 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent private void activateToolwindow() { ToolWindow toolWindow = ToolWindowManager.getInstance(myProject).getToolWindow(ToolWindowId.FIND); - if (!toolWindow.isActive()) toolWindow.activate(null); + if (!toolWindow.isActive()) toolWindow.show(null); } private void appendUsages(Usage[] foundUsages, UsageViewImpl usageView) { @@ -154,7 +155,7 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent private final Factory mySearcherFactory; private final boolean myShowNotFoundMessage; private final boolean myShowPanelIfOnlyOneUsage; - private final Application myApplication; + private UsageViewManager.UsageViewStateListener myListener; public SearchForUsagesRunnable(final UsageViewImpl[] usageView, final UsageViewPresentation presentation, @@ -162,14 +163,14 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent final Factory searcherFactory, final boolean showNotFoundMessage, final boolean showPanelIfOnlyOneUsage, - final Application application) { + final UsageViewManager.UsageViewStateListener listener) { myUsageView = usageView; myPresentation = presentation; mySearchFor = searchFor; mySearcherFactory = searcherFactory; myShowNotFoundMessage = showNotFoundMessage; myShowPanelIfOnlyOneUsage = showPanelIfOnlyOneUsage; - myApplication = application; + myListener = listener; } private void activateView() { @@ -179,6 +180,7 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent SwingUtilities.invokeLater(new Runnable() { public void run() { addContent(myUsageView[0], myPresentation); + if (myListener!=null) myListener.usageViewCreated(myUsageView[0]); activateToolwindow(); } }); @@ -222,7 +224,7 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent private void endSearchForUsages() { if (myUsageCount == 0 && myShowNotFoundMessage) { - myApplication.invokeLater(new Runnable() { + ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { Messages.showMessageDialog(myProject, "No " + myPresentation.getUsagesString() + " found in " + myPresentation.getScopeText(), "Information", Messages.getInformationIcon()); @@ -241,6 +243,10 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent else { myUsageView[0].setSearchInProgress(false); } + + if (myListener != null) { + myListener.findingUsagesFinished(); + } } } } diff --git a/source/com/intellij/find/findInProject/FindInProjectManager.java b/source/com/intellij/find/findInProject/FindInProjectManager.java index 3fab91b9b14e..c4c8cd377548 100644 --- a/source/com/intellij/find/findInProject/FindInProjectManager.java +++ b/source/com/intellij/find/findInProject/FindInProjectManager.java @@ -3,6 +3,7 @@ package com.intellij.find.findInProject; import com.intellij.find.FindManager; import com.intellij.find.FindModel; import com.intellij.find.FindProgressIndicator; +import com.intellij.find.FindSettings; import com.intellij.find.impl.FindInProjectUtil; import com.intellij.find.replaceInProject.ReplaceInProjectManager; import com.intellij.openapi.actionSystem.DataConstants; @@ -12,19 +13,14 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; -import com.intellij.openapi.fileEditor.FileEditor; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vcs.FileStatus; import com.intellij.openapi.util.Factory; import com.intellij.psi.PsiDirectory; import com.intellij.ui.content.Content; import com.intellij.usageView.*; import com.intellij.usageView.UsageViewManager; import com.intellij.usages.*; -import com.intellij.navigation.ItemPresentation; import com.intellij.util.Processor; -import javax.swing.*; import java.util.ArrayList; public class FindInProjectManager implements ProjectComponent { @@ -108,88 +104,14 @@ public class FindInProjectManager implements ProjectComponent { } com.intellij.usages.UsageViewManager manager = myProject.getComponent(com.intellij.usages.UsageViewManager.class); - class StringUsageTarget implements UsageTarget { - private String myStringToFind; - private ItemPresentation myItemPresentation = new ItemPresentation() { - public String getPresentableText() { - return "String '" + myStringToFind + "'"; - } - - public String getLocationString() { - return myStringToFind + "!!"; - } - - public TextAttributesKey getTextAttributesKey() { - return null; - } - - public Icon getIcon(boolean open) { - return null; - } - }; - - public StringUsageTarget(String _stringToFind) { - myStringToFind = _stringToFind; - } - - public void findUsages() { - throw new UnsupportedOperationException(); - } - - public void findUsagesInEditor(FileEditor editor) { - throw new UnsupportedOperationException(); - } - - public boolean isValid() { - return true; - } - - public boolean isReadOnly() { - return true; - } - - public VirtualFile[] getFiles() { - throw new UnsupportedOperationException(); - } - - public String getName() { - return myStringToFind; - } - - public ItemPresentation getPresentation() { - return myItemPresentation; - } - - public FileStatus getFileStatus() { - return null; - } - - public void navigate(boolean requestFocus) { - throw new UnsupportedOperationException(); - } - - public boolean canNavigate() { - return false; - } - - public boolean canNavigateToSource() { - return false; - } - } if (manager!=null) { findManager.getFindInProjectModel().copyFrom(findModel); final FindModel findModelCopy = (FindModel)findModel.clone(); - - final UsageViewPresentation presentation = new UsageViewPresentation(); - - presentation.setScopeText(FindInProjectUtil.getTitleForScope(findModelCopy)); - presentation.setUsagesString("occurrences of '" + findModelCopy.getStringToFind() + "'"); - presentation.setOpenInNewTab(myToOpenInNewTab); - presentation.setCodeUsages(false); + final UsageViewPresentation presentation = FindInProjectUtil.setupViewPresentation(myToOpenInNewTab, findModelCopy); manager.searchAndShowUsages( - new UsageTarget[] { new StringUsageTarget(findModel.getStringToFind()) }, + new UsageTarget[] { new FindInProjectUtil.StringUsageTarget(findModel.getStringToFind()) }, new Factory() { public UsageSearcher create() { return new UsageSearcher() { @@ -217,89 +139,19 @@ public class FindInProjectManager implements ProjectComponent { }; } }, - false, + !FindSettings.getInstance().isSkipResultsWithOneUsage(), true, presentation, new Factory() { - public ProgressIndicator create() { - return new FindProgressIndicator(myProject, FindInProjectUtil.getTitleForScope(findModelCopy)); - } - } + public ProgressIndicator create() { + return new FindProgressIndicator(myProject, FindInProjectUtil.getTitleForScope(findModelCopy)); + } + }, + null ); } - - //AsyncFindUsagesCommand command = new AsyncFindUsagesCommand() { - // FindProgressIndicator progress; - // - // public void findUsages(final AsyncFindUsagesProcessListener consumer) { - // myIsFindInProgress = true; - // findManager.getFindInProjectModel().copyFrom(findModel); - // - // // [jeka] should use a _copy_ of findModel, because of RefreshCommand, findModel is reused by later FindUsages commands!!!! - // final FindModel findModelCopy = (FindModel)findModel.clone(); - // progress = new FindProgressIndicator(myProject, FindInProjectUtil.getTitleForScope(findModelCopy)); - // final Runnable findUsagesRunnable = new Runnable() { - // public void run() { - // FindInProjectUtil.findUsages(findModelCopy, psiDirectory, myProject, consumer); - // } - // }; - // - // Runnable showUsagesPanelRunnable = new Runnable() { - // public void run() { - // myIsFindInProgress = false; - // if (consumer.getCount()==0) { - // if (!progress.isCanceled()) { - // String title = "No occurrences of '" + findModel.getStringToFind() + "' found in " + FindInProjectUtil.getTitleForScope(findModelCopy); - // - // Messages.showMessageDialog( - // myProject, - // title, - // "Find in Path", - // Messages.getInformationIcon() - // ); - // } - // } - // } - // }; - // - // FindInProjectUtil.runProcessWithProgress(progress, findUsagesRunnable, showUsagesPanelRunnable, myProject); - // } - // - // public void stopAsyncSearch() { - // progress.cancel(); - // } - //}; - // - //showUsagesPanel( - // new FindInProjectViewDescriptor(findModel,command), - // toOpenInNewTab[0] - //); } - //private void showUsagesPanel(final FindInProjectViewDescriptor viewDescriptor, boolean toOpenInNewTab) { - // String stringToFind = viewDescriptor.getFindModel().getStringToFind(); - // String name = "Search result"; - // if (stringToFind != null) { - // if (stringToFind.length() > 15) { - // stringToFind = stringToFind.substring(0, 15) + "..."; - // } - // name = "Occurrences of '"+stringToFind + "'"; - // } - // - // if (viewDescriptor.getFindModel().isMultipleFiles() ) { - // name += " in " +FindInProjectUtil.getTitleForScope(viewDescriptor.getFindModel()); - // } - // UsageViewManager.getInstance(myProject).addContent(name, viewDescriptor, true, toOpenInNewTab, true, new ProgressFactory () { - // public ProgressIndicator createProgress() { - // return new FindProgressIndicator(myProject, FindInProjectUtil.getTitleForScope(viewDescriptor.getFindModel())); - // } - // - // public boolean continueOnCancel() { - // return true; - // } - // }); - //} - public boolean isWorkInProgress() { return myIsFindInProgress; } @@ -307,4 +159,4 @@ public class FindInProjectManager implements ProjectComponent { public boolean isEnabled () { return !myIsFindInProgress && !ReplaceInProjectManager.getInstance(myProject).isWorkInProgress(); } -} \ No newline at end of file +} diff --git a/source/com/intellij/find/impl/FindDialog.java b/source/com/intellij/find/impl/FindDialog.java index 4e8f8b3dc29b..38558ee77228 100644 --- a/source/com/intellij/find/impl/FindDialog.java +++ b/source/com/intellij/find/impl/FindDialog.java @@ -9,7 +9,6 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.*; import com.intellij.openapi.util.IconLoader; -import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.PatternUtil; import com.intellij.openapi.module.ModuleManager; @@ -17,7 +16,6 @@ import com.intellij.openapi.module.Module; import com.intellij.psi.PsiDirectory; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.StateRestoringCheckBox; -import com.intellij.util.PatternUtil; import javax.swing.*; import java.awt.*; @@ -52,6 +50,7 @@ final class FindDialog extends DialogWrapper { private FixedSizeButton mySelectDirectoryButton; private StateRestoringCheckBox useFileFilter; private ComboBox myFileFilter; + protected JCheckBox myCbToSkipResultsWhenOneUsage; private final Project myProject; public FindDialog(Project project, FindModel model){ @@ -234,6 +233,15 @@ final class FindDialog extends DialogWrapper { gbConstraints.gridwidth = GridBagConstraints.REMAINDER; optionsPanel.add(createFilterPanel(),gbConstraints); + + if (!myModel.isReplaceState()) { + myCbToSkipResultsWhenOneUsage = new StateRestoringCheckBox( + "Skip results tab with one usage", + FindSettings.getInstance().isSkipResultsWithOneUsage() + ); + myCbToSkipResultsWhenOneUsage.setMnemonic('k'); + optionsPanel.add(myCbToSkipResultsWhenOneUsage, gbConstraints); + } } if (myModel.isOpenInNewTabVisible()){ @@ -353,9 +361,20 @@ final class FindDialog extends DialogWrapper { } } + if (myCbToSkipResultsWhenOneUsage != null){ + FindSettings.getInstance().setSkipResultsWithOneUsage( + isSkipResultsWhenOneUsage() + ); + } + super.doOKAction(); } + public boolean isSkipResultsWhenOneUsage() { + return myCbToSkipResultsWhenOneUsage!=null && + myCbToSkipResultsWhenOneUsage.isSelected(); + } + private JPanel createFindOptionsPanel() { JPanel findOptionsPanel = new JPanel(); findOptionsPanel.setBorder(IdeBorderFactory.createTitledBorder("Options")); @@ -668,15 +687,18 @@ final class FindDialog extends DialogWrapper { FindSettings findSettings = FindSettings.getInstance(); model.setCaseSensitive(myCbCaseSensitive.isSelected()); findSettings.setCaseSensitive(myCbCaseSensitive.isSelected()); + if (model.isReplaceState()) { model.setPreserveCase(myCbPreserveCase.isSelected()); findSettings.setPreserveCase(myCbPreserveCase.isSelected()); } + model.setWholeWordsOnly(myCbWholeWordsOnly.isSelected()); findSettings.setWholeWordsOnly(myCbWholeWordsOnly.isSelected()); model.setRegularExpressions(myCbRegularExpressions.isSelected()); findSettings.setRegularExpressions(myCbRegularExpressions.isSelected()); model.setStringToFind((String)myInputComboBox.getSelectedItem()); + if (model.isReplaceState()){ model.setPromptOnReplace(true); model.setReplaceAll(false); @@ -686,6 +708,7 @@ final class FindDialog extends DialogWrapper { } model.setStringToReplace(stringToReplace); } + if (!model.isMultipleFiles()){ model.setForward(myRbForward.isSelected()); findSettings.setForward(myRbForward.isSelected()); @@ -698,8 +721,7 @@ final class FindDialog extends DialogWrapper { if (myCbToOpenInNewTab != null){ model.setOpenInNewTab(myCbToOpenInNewTab.isSelected()); } - model.setWithSubdirectories(myCbWithSubdirectories.isSelected()); - findSettings.setWithSubdirectories(myCbWithSubdirectories.isSelected()); + model.setProjectScope(myRbProject.isSelected()); model.setDirectoryName(null); model.setModuleName(null); @@ -707,10 +729,8 @@ final class FindDialog extends DialogWrapper { if (myRbDirectory.isSelected()){ String directory = getDirectory(); model.setDirectoryName(directory == null ? "" : directory); - if (directory==null) { - //model.setWithSubdirectories(myCbWithSubdirectories.isSelected()); - //findSettings.setWithSubdirectories(myCbWithSubdirectories.isSelected()); - } + model.setWithSubdirectories(myCbWithSubdirectories.isSelected()); + findSettings.setWithSubdirectories(myCbWithSubdirectories.isSelected()); } else if (myRbModule.isSelected()) { model.setModuleName((String)myModuleComboBox.getSelectedItem()); } @@ -776,7 +796,7 @@ final class FindDialog extends DialogWrapper { myModuleComboBox.setEnabled(true); myModuleComboBox.setSelectedItem(myModel.getModuleName()); } - + myCbWithSubdirectories.setSelected(myModel.isWithSubdirectories()); if (myModel.getFileFilter()!=null && myModel.getFileFilter().length() > 0) { diff --git a/source/com/intellij/find/impl/FindInProjectUtil.java b/source/com/intellij/find/impl/FindInProjectUtil.java index b2d399dbddae..3d75c165036c 100644 --- a/source/com/intellij/find/impl/FindInProjectUtil.java +++ b/source/com/intellij/find/impl/FindInProjectUtil.java @@ -1,7 +1,11 @@ package com.intellij.find.impl; import com.intellij.Patches; +import com.intellij.navigation.ItemPresentation; import com.intellij.usages.impl.UsageViewImplUtil; +import com.intellij.usages.UsageTarget; +import com.intellij.usages.UsageViewPresentation; +import com.intellij.usages.Usage; import com.intellij.find.FindManager; import com.intellij.find.FindModel; import com.intellij.find.FindResult; @@ -9,9 +13,10 @@ import com.intellij.openapi.actionSystem.DataConstants; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.ex.DataConstantsEx; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; @@ -28,14 +33,18 @@ import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vcs.FileStatus; import com.intellij.psi.*; import com.intellij.usageView.AsyncFindUsagesProcessListener; import com.intellij.usageView.UsageInfo; import com.intellij.util.PatternUtil; +import javax.swing.*; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.Iterator; import java.util.regex.Pattern; public class FindInProjectUtil { @@ -294,4 +303,96 @@ public class FindInProjectUtil { return result.toString(); } + + public static UsageViewPresentation setupViewPresentation(final boolean toOpenInNewTab, final FindModel findModelCopy) { + final UsageViewPresentation presentation = new UsageViewPresentation(); + + presentation.setScopeText(getTitleForScope(findModelCopy)); + presentation.setTabText("Occurrences of '" + findModelCopy.getStringToFind() + "'"); + presentation.setUsagesString("occurrences of '" + findModelCopy.getStringToFind() + "'"); + presentation.setOpenInNewTab(toOpenInNewTab); + presentation.setCodeUsages(false); + + return presentation; + } + + public static boolean hasReadOnlyUsages(final Set usages) { + for (Iterator iterator = usages.iterator(); iterator.hasNext();) { + Usage usage = iterator.next(); + + if (usage.isReadOnly()) return true; + } + + return false; + } + + public static class StringUsageTarget implements UsageTarget { + private String myStringToFind; + + private ItemPresentation myItemPresentation = new ItemPresentation() { + public String getPresentableText() { + return "String '" + myStringToFind + "'"; + } + + public String getLocationString() { + return myStringToFind + "!!"; + } + + public Icon getIcon(boolean open) { + return null; + } + + public TextAttributesKey getTextAttributesKey() { + return null; + } + }; + + public StringUsageTarget(String _stringToFind) { + myStringToFind = _stringToFind; + } + + public void findUsages() { + throw new UnsupportedOperationException(); + } + + public void findUsagesInEditor(FileEditor editor) { + throw new UnsupportedOperationException(); + } + + public boolean isValid() { + return true; + } + + public boolean isReadOnly() { + return true; + } + + public VirtualFile[] getFiles() { + throw new UnsupportedOperationException(); + } + + public String getName() { + return myStringToFind; + } + + public ItemPresentation getPresentation() { + return myItemPresentation; + } + + public FileStatus getFileStatus() { + return null; + } + + public void navigate(boolean requestFocus) { + throw new UnsupportedOperationException(); + } + + public boolean canNavigate() { + return false; + } + + public boolean canNavigateToSource() { + return false; + } + } } \ No newline at end of file diff --git a/source/com/intellij/find/impl/FindManagerImpl.java b/source/com/intellij/find/impl/FindManagerImpl.java index 6504067ea93d..6ff78e4f96a3 100644 --- a/source/com/intellij/find/impl/FindManagerImpl.java +++ b/source/com/intellij/find/impl/FindManagerImpl.java @@ -122,6 +122,10 @@ public class FindManagerImpl extends FindManager implements ProjectComponent { } if (model.isMultipleFiles() && !model.isProjectScope()){ FindSettings.getInstance().addDirectory(model.getDirectoryName()); + + if (model.getDirectoryName()!=null) { + myFindInProjectModel.setWithSubdirectories(model.isWithSubdirectories()); + } } return true; } diff --git a/source/com/intellij/find/replaceInProject/ReplaceInProjectManager.java b/source/com/intellij/find/replaceInProject/ReplaceInProjectManager.java index 94e6fc82a1ef..794a3cc6b1ba 100644 --- a/source/com/intellij/find/replaceInProject/ReplaceInProjectManager.java +++ b/source/com/intellij/find/replaceInProject/ReplaceInProjectManager.java @@ -4,8 +4,6 @@ package com.intellij.find.replaceInProject; import com.intellij.find.*; import com.intellij.find.findInProject.FindInProjectManager; import com.intellij.find.impl.FindInProjectUtil; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataConstants; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.application.ApplicationManager; @@ -13,22 +11,26 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.fileEditor.FileEditorManager; -import com.intellij.openapi.fileEditor.OpenFileDescriptor; +import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Factory; +import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.WindowManager; import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.usageView.*; +import com.intellij.usages.*; +import com.intellij.usages.UsageViewManager; +import com.intellij.usages.UsageView; +import com.intellij.util.Processor; import javax.swing.*; -import javax.swing.tree.TreePath; +import java.util.Set; +import java.util.Iterator; public class ReplaceInProjectManager implements ProjectComponent { private Project myProject; @@ -54,6 +56,30 @@ public class ReplaceInProjectManager implements ProjectComponent { myProject = project; } + static class ReplaceContext { + private com.intellij.usages.UsageView usageView; + private FindModel findModel; + private Set excludedSet; + + ReplaceContext(com.intellij.usages.UsageView _usageView, FindModel _findModel) { + usageView = _usageView; + findModel = _findModel; + } + + public FindModel getFindModel() { + return findModel; + } + + public com.intellij.usages.UsageView getUsageView() { + return usageView; + } + + public Set getExcludedSet() { + if (excludedSet == null) excludedSet = usageView.getExcludedUsages(); + return excludedSet; + } + } + public void replaceInProject(DataContext dataContext) { final FindManager findManager = FindManager.getInstance(myProject); final FindModel findModel = (FindModel) findManager.getFindInProjectModel().clone(); @@ -75,66 +101,88 @@ public class ReplaceInProjectManager implements ProjectComponent { return; } - class AsyncFindUsagesCommandImpl implements AsyncFindUsagesCommand { - ReplaceInProjectViewDescriptor viewDescriptor; - UsageView usagesPanel; - ProgressIndicator progress; + com.intellij.usages.UsageViewManager manager = myProject.getComponent(com.intellij.usages.UsageViewManager.class); - public void findUsages(final AsyncFindUsagesProcessListener consumer) { - progress = new FindProgressIndicator (myProject, FindInProjectUtil.getTitleForScope(findModel)); - final Runnable findUsagesRunnable = new Runnable() { - public void run() { - FindInProjectUtil.findUsages(findManager.getFindInProjectModel(), psiDirectory, myProject, consumer); - } - }; - final Runnable showUsagesPanelRunnable = new Runnable() { - public void run() { - myIsFindInProgress = false; + if (manager!=null) { + final UsageViewPresentation presentation = FindInProjectUtil.setupViewPresentation(true, findModel); - if (consumer.getCount()!=0 && findManager.getFindInProjectModel().isPromptOnReplace()){ - replaceWithPrompt(usagesPanel, viewDescriptor); + final ReplaceContext context[] = new ReplaceContext[1]; + + manager.searchAndShowUsages( + new UsageTarget[] { new FindInProjectUtil.StringUsageTarget(findModel.getStringToFind()) }, + new Factory() { + public UsageSearcher create() { + return new UsageSearcher() { + + public void generate(final Processor processor) { + myIsFindInProgress = true; + + FindInProjectUtil.findUsages(findModel, psiDirectory, myProject, new AsyncFindUsagesProcessListener() { + int count; + + public void foundUsage(UsageInfo info) { + ++count; + processor.process(new UsageInfo2UsageAdapter(info)); + } + + public void findUsagesCompleted() { + } + + public int getCount() { + return count; + } + }); + myIsFindInProgress = false; } + }; } - }; - - Runnable showUsagesPanelRunnable1 = new Runnable() { - public void run() { - // This is important since not all usages are flushed during async processing! - SwingUtilities.invokeLater(showUsagesPanelRunnable); + }, + true, + true, + presentation, + new Factory() { + public ProgressIndicator create() { + return new FindProgressIndicator(myProject, FindInProjectUtil.getTitleForScope(findModel)); + } + }, + new UsageViewManager.UsageViewStateListener() { + public void usageViewCreated(UsageView usageView) { + context[0] = new ReplaceContext(usageView,findModel); + addReplaceActions(context[0]); } - }; - myIsFindInProgress = true; - findManager.getFindInProjectModel().copyFrom(findModel); - FindInProjectUtil.runProcessWithProgress(progress, findUsagesRunnable, showUsagesPanelRunnable1, myProject); + public void findingUsagesFinished() { + if (context[0]!=null && findManager.getFindInProjectModel().isPromptOnReplace()){ + SwingUtilities.invokeLater(new Runnable() { + public void run() { + replaceWithPrompt(context[0]); + } + }); + } + } } - - public void stopAsyncSearch() { - progress.cancel(); - } - }; - - AsyncFindUsagesCommandImpl findUsagesCommand = new AsyncFindUsagesCommandImpl(); - ReplaceInProjectViewDescriptor viewDescriptor = new ReplaceInProjectViewDescriptor(findModel, findUsagesCommand); - UsageView usagesPanel = showUsagesPanel(viewDescriptor); - - findUsagesCommand.viewDescriptor = viewDescriptor; - findUsagesCommand.usagesPanel = usagesPanel; + ); + } } - private void replaceWithPrompt(final UsageView usageView, final ReplaceInProjectViewDescriptor viewDescriptor) { - final UsageInfo[] usages = usageView.getUsages(); + private void replaceWithPrompt(final ReplaceContext replaceContext) { + final Set _usages = replaceContext.getUsageView().getUsages(); - if (UsageViewUtil.hasReadOnlyUsages(usages)){ + if (FindInProjectUtil.hasReadOnlyUsages(_usages)){ WindowManager.getInstance().getStatusBar(myProject).setInfo("Occurrences found in read-only files"); return; } - usageView.expandAll(); - for(int i = 0; i < usages.length; i++){ - final PsiFile psiFile = usages[i].getElement().getContainingFile(); + final Usage[] usages; + _usages.toArray(usages = new Usage[_usages.size()]); + + //usageView.expandAll(); + for(int i = 0; i < usages.length; ++i){ + final Usage usage = usages[i]; + final UsageInfo usageInfo = ((UsageInfo2UsageAdapter)usage).getUsageInfo(); + + final PsiFile psiFile = usageInfo.getElement().getContainingFile(); if (!psiFile.isWritable()) continue; - final UsageInfo usageInfo = usages[i]; Runnable selectOnEditorRunnable = new Runnable() { public void run() { @@ -147,27 +195,18 @@ public class ReplaceInProjectManager implements ProjectComponent { } } ).booleanValue()) { - int startOffset = usageView.getTextOffset(usageInfo); - int endOffset = usageView.getTextEndOffset(usageInfo); - Document document = FileDocumentManager.getInstance().getDocument(virtualFile); - if (endOffset <= document.getTextLength()) { - OpenFileDescriptor descriptor = new OpenFileDescriptor(myProject, virtualFile, startOffset); - FileEditorManager.getInstance(myProject).openTextEditor(descriptor, false); - descriptor = new OpenFileDescriptor(myProject, virtualFile, endOffset); - Editor editor = FileEditorManager.getInstance(myProject).openTextEditor(descriptor, false); - if (editor != null) { - editor.getSelectionModel().setSelection(startOffset, endOffset); - } - usageView.selectUsage(usageInfo); + + if (usage.isValid()) { + usage.highlightInEditor(); + replaceContext.getUsageView().selectUsages(new Usage[]{usage}); } } } }; + CommandProcessor.getInstance().executeCommand(myProject, selectOnEditorRunnable, "Select on Editor", null); - - String title = "Replace Usage " + (i + 1) + " of " + usages.length + " Found"; - - int result = FindManager.getInstance(myProject).showPromptDialog(viewDescriptor.getFindModel(), title); + String title = "Replace Usage " + (i+1) + " of " + usages.length + " Found"; + int result = FindManager.getInstance(myProject).showPromptDialog(replaceContext.getFindModel(), title); if (result == PromptResult.CANCEL){ return; @@ -180,68 +219,54 @@ public class ReplaceInProjectManager implements ProjectComponent { if (result == PromptResult.OK){ Runnable runnable = new Runnable() { public void run() { - doReplace(usageView, usages[currentNumber], viewDescriptor); - usageView.removeUsage(usages[currentNumber]); + doReplace(replaceContext, usage); + replaceContext.getUsageView().removeUsage(usage); } }; CommandProcessor.getInstance().executeCommand(myProject, runnable, "Replace", null); - if (usageView.getUsagesNodeCount() == 0){ - UsageViewManager.getInstance(myProject).closeContent(usageView); + if ((i + 1) == usages.length){ + replaceContext.getUsageView().close(); return; } } if (result == PromptResult.ALL_IN_THIS_FILE){ final int[] nextNumber = new int[1]; + Runnable runnable = new Runnable() { public void run() { int j = currentNumber; + for(; j < usages.length; j++){ - PsiFile otherPsiFile = usages[j].getElement().getContainingFile(); + final Usage usage = usages[j]; + final UsageInfo usageInfo = ((UsageInfo2UsageAdapter)usage).getUsageInfo(); + + PsiFile otherPsiFile = usageInfo.getElement().getContainingFile(); if (!otherPsiFile.equals(psiFile)){ break; } - doReplace(usageView, usages[j], viewDescriptor); - usageView.removeUsage(usages[j]); + doReplace(replaceContext, usage); + replaceContext.getUsageView().removeUsage(usage); } - if (j >= usages.length){ - UsageViewManager.getInstance(myProject).closeContent(usageView); + if (j == usages.length){ + replaceContext.getUsageView().close(); } nextNumber[0] = j; } }; + CommandProcessor.getInstance().executeCommand(myProject, runnable, "Replace", null); - if (usageView.getUsagesNodeCount() == 0){ - UsageViewManager.getInstance(myProject).closeContent(usageView); - return; - } i = nextNumber[0] - 1; } - if (result == PromptResult.ALL_FILES){ - /* - Runnable process = new Runnable() { - public void run() { - for(int j = currentNumber; j < usages.length; j++){ - doReplace(usageView, usages[j], viewDescriptor); - } - } - }; - Runnable finishProcess = new Runnable() { - public void run() { - ExternalUISupport.getInstance(myProject).closeContent(usageView); - } - }; - ProgressUtil.runPsiCommandWithProgress(myProject, process, finishProcess, "Replacing...", "Replace", false); - */ - + if (result == PromptResult.ALL_FILES) { CommandProcessor.getInstance().executeCommand( myProject, new Runnable() { public void run() { - for(int j = currentNumber; j < usages.length; j++){ - doReplace(usageView, usages[j], viewDescriptor); + for(int i = 0;i < usages.length;++i){ + doReplace(replaceContext, usages[i]); } - UsageViewManager.getInstance(myProject).closeContent(usageView); + replaceContext.getUsageView().close(); } }, "Replace", @@ -252,116 +277,74 @@ public class ReplaceInProjectManager implements ProjectComponent { } } - private UsageView showUsagesPanel(final ReplaceInProjectViewDescriptor viewDescriptor) { - String name = "Search result"; - String stringToFind = viewDescriptor.getFindModel().getStringToFind(); - if (stringToFind != null) { - if (stringToFind.length() > 15) { - stringToFind = stringToFind.substring(0, 15) + "..."; - } - name = "Occurrences of '" + stringToFind + "'"; - if (viewDescriptor.getFindModel().isMultipleFiles() ) { - name += " in " + FindInProjectUtil.getTitleForScope(viewDescriptor.getFindModel()); - } - } - UsageView usagesPanel = UsageViewManager.getInstance(myProject).addContent(name, viewDescriptor, false, false, false, new ProgressFactory() { - public ProgressIndicator createProgress() { - return new FindProgressIndicator(myProject, FindInProjectUtil.getTitleForScope(viewDescriptor.getFindModel())); - } - - public boolean continueOnCancel() { - return true; - } - }); - usagesPanel.addButton(0, new ReplaceSelectedAction(usagesPanel, viewDescriptor)); - addReplaceAllAction(usagesPanel, viewDescriptor); - return usagesPanel; - - } - - private void addReplaceAllAction(final UsageView usageView, final ReplaceInProjectViewDescriptor viewDescriptor) { + private void addReplaceActions(final ReplaceContext replaceContext) { final Runnable replaceRunnable = new Runnable() { public void run() { - doReplace(usageView, usageView.getUsages(), viewDescriptor); + doReplace(replaceContext, replaceContext.getUsageView().getUsages()); } }; - usageView.addDoProcessAction(replaceRunnable, "Replace All",null,"&Do Replace All"); + replaceContext.getUsageView().addPerformOperationAction(replaceRunnable, "Replace All",null,"Do Replace All", SystemInfo.isMac ? 0 : 'D'); + + final Runnable replaceSelectedRunnable = new Runnable() { + public void run() { + doReplaceSelected(replaceContext); + } + }; + + replaceContext.getUsageView().addPerformOperationAction( + replaceSelectedRunnable, + "Replace Selected", + null, + "Replace selected occurrences of \"" + replaceContext.getFindModel().getStringToFind() + "\" to \"" + replaceContext.getFindModel().getStringToReplace() + "\"", + SystemInfo.isMac ? 0 : 'l' + ); } - private class ReplaceSelectedAction extends AnAction { - private UsageView myUsagesPanel; - private ReplaceInProjectViewDescriptor myTreeInfo; - - public ReplaceSelectedAction(UsageView usagesPanel, ReplaceInProjectViewDescriptor treeInfo){ - super( - "Rep&lace Selected", - "Replace selected occurrences of \"" + treeInfo.getFindModel().getStringToFind() + "\" to \"" + treeInfo.getFindModel().getStringToReplace() + "\"", - null - ); - myUsagesPanel=usagesPanel; - myTreeInfo=treeInfo; - } - - public void actionPerformed(AnActionEvent event) { - doReplaceSelected(myUsagesPanel, myTreeInfo); - } - - public void update(AnActionEvent e) { - e.getPresentation().setEnabled(!myIsFindInProgress); - super.update(e); + private void doReplace(final ReplaceContext replaceContext, Set usages) { + for(Iterator i = usages.iterator(); i.hasNext();){ + doReplace(replaceContext, i.next()); } } - private void doReplace(UsageView usageView, UsageInfo[] usages, ReplaceInProjectViewDescriptor treeInfo) { - for(int i = 0; i < usages.length; i++){ - doReplace(usageView, usages[i], treeInfo); - } - } - - private void doReplace(final UsageView usageView, final UsageInfo usage, final ReplaceInProjectViewDescriptor treeInfo) { + private void doReplace(final ReplaceContext replaceContext, final Usage usage) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { - if (usageView.isExcluded(usage)){ + if (replaceContext.getExcludedSet().contains(usage)){ return; } - PsiFile file = (PsiFile)usage.getElement(); - Project project = file.getProject(); - Document document = PsiDocumentManager.getInstance(project).getDocument(file); + + RangeMarker marker = ((UsageInfo2UsageAdapter)usage).getRangeMarker(); + Document document = marker.getDocument(); if (!document.isWritable()) return; - final int textOffset = usageView.getTextOffset(usage); + final int textOffset = marker.getStartOffset(); if (textOffset < 0 || textOffset >= document.getTextLength()){ return; } - final int textEndOffset = usageView.getTextEndOffset(usage); + final int textEndOffset = marker.getEndOffset(); if (textEndOffset < 0 || textOffset > document.getTextLength()){ return; } FindManager findManager = FindManager.getInstance(myProject); final CharSequence foundString = document.getCharsSequence().subSequence(textOffset, textEndOffset); - FindResult findResult = findManager.findString(foundString, 0, treeInfo.getFindModel()); + FindResult findResult = findManager.findString(foundString, 0, replaceContext.getFindModel()); if (findResult == null || !findResult.isStringFound()){ return; } - String stringToReplace = findManager.getStringToReplace(foundString.toString(), treeInfo.getFindModel()); + String stringToReplace = findManager.getStringToReplace(foundString.toString(), replaceContext.getFindModel()); document.replaceString(textOffset, textEndOffset, stringToReplace); } }); } - private void doReplaceSelected(final UsageView usageView, final ReplaceInProjectViewDescriptor treeInfo) { - TreePath[] paths = usageView.getTree().getSelectionPaths(); - if (paths == null || paths.length == 0){ + private void doReplaceSelected(final ReplaceContext replaceContext) { + final Set selectedUsages = replaceContext.getUsageView().getSelectedUsages(); + if(selectedUsages == null){ return; } - - final UsageInfo[] usages = usageView.getSelectedUsages(); - if(usages == null){ - return; - } - if (UsageViewUtil.hasReadOnlyUsages(usages)){ + if (FindInProjectUtil.hasReadOnlyUsages(selectedUsages)){ int result = Messages.showOkCancelDialog( - usageView.getTree(), + replaceContext.getUsageView().getComponent(), "Occurrences found in read-only files.\n" + "The operation will not affect them.\n" + "Continue anyway?", @@ -376,16 +359,16 @@ public class ReplaceInProjectManager implements ProjectComponent { CommandProcessor.getInstance().executeCommand( myProject, new Runnable() { public void run() { - doReplace(usageView, usages, treeInfo); - for (int i = 0; i < usages.length; i++) { - usageView.removeUsage(usages[i]); + doReplace(replaceContext, selectedUsages); + for (Iterator i = selectedUsages.iterator(); i.hasNext(); ) { + replaceContext.getUsageView().removeUsage(i.next()); } - if (usageView.getUsagesNodeCount() == 0){ - UsageViewManager.getInstance(myProject).closeContent(usageView); + if (replaceContext.getUsageView().getUsages().size() == 0){ + replaceContext.getUsageView().close(); return; } - usageView.setFocused(); + replaceContext.getUsageView().getComponent().requestFocus(); } }, "Replace",