IDEADEV-89

This commit is contained in:
Eugene Vigdorchik
2005-03-25 21:57:51 +03:00
parent 2fae4c1e87
commit bc27881cca
6 changed files with 60 additions and 22 deletions
@@ -18,11 +18,12 @@ public interface UsageViewManager {
UsageView searchAndShowUsages(UsageTarget[] searchFor,
Factory<UsageSearcher> searcherFactory,
boolean showPanelIfOnlyOneUsage,
boolean showNotFoundMessage, UsageViewPresentation presentation);
boolean showNotFoundMessage, UsageViewPresentation presentation,
UsageViewStateListener listener);
interface UsageViewStateListener {
void usageViewCreated(UsageView usageView);
void findingUsagesFinished();
void findingUsagesFinished(final UsageView usageView);
}
void searchAndShowUsages(UsageTarget[] searchFor,
@@ -24,11 +24,16 @@ import com.intellij.usages.rules.*;
import com.intellij.util.Alarm;
import com.intellij.util.EditSourceOnDoubleClickHandler;
import com.intellij.util.Processor;
import com.intellij.util.ui.tree.TreeUtil;
import com.intellij.util.containers.HashMap;
import com.intellij.util.containers.HashSet;
import com.intellij.util.ui.Tree;
import com.intellij.util.ui.tree.TreeUtil;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -36,7 +41,6 @@ import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.*;
import java.util.List;
/**
* Created by IntelliJ IDEA.
* User: max
@@ -62,6 +66,7 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra
private Alarm myFlushAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD);
private UsageModelTracker myModelTracker;
Set<Usage> myUsages = new HashSet<Usage>();
private Map<Usage, UsageNode> myUsageNodes = new HashMap<Usage, UsageNode>();
private ButtonPanel myButtonPanel = new ButtonPanel();
@@ -428,6 +433,7 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra
}
public void appendUsageLater(final Usage usage) {
myUsages.add(usage);
ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator();
if (indicator != null) {
myFlushAlarm.cancelAllRequests();
@@ -463,6 +469,7 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra
private boolean myIsFirstVisibleUsageFound = false;
public void appendUsage(Usage usage) {
myUsages.add(usage);
final UsageNode node = myBuilder.appendUsage(usage);
myUsageNodes.put(usage, node);
if (!myIsFirstVisibleUsageFound && node != null) { //first visible usage found;
@@ -768,9 +775,7 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra
}
public Set<Usage> getUsages() {
final LinkedHashSet<Usage> usages = new LinkedHashSet<Usage>();
collectUsages((DefaultMutableTreeNode)myTree.getModel().getRoot(), usages);
return usages;
return myUsages;
}
private void collectUsages(DefaultMutableTreeNode node, Set<Usage> usages) {
@@ -65,7 +65,8 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent
public UsageView searchAndShowUsages(final UsageTarget[] searchFor,
final Factory<UsageSearcher> searcherFactory,
final boolean showPanelIfOnlyOneUsage,
final boolean showNotFoundMessage, final UsageViewPresentation presentation) {
final boolean showNotFoundMessage, final UsageViewPresentation presentation,
UsageViewStateListener listener) {
final UsageViewImpl[] usageView = new UsageViewImpl[]{null};
@@ -75,7 +76,7 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent
final Application application = ApplicationManager.getApplication();
application.runProcessWithProgressSynchronously(
new SearchForUsagesRunnable(usageView, presentation, searchFor, searcherFactory, processPresentation, null),
new SearchForUsagesRunnable(usageView, presentation, searchFor, searcherFactory, processPresentation, listener),
getProgressTitle(presentation),
true,
myProject
@@ -155,14 +156,14 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent
private final UsageTarget[] mySearchFor;
private final Factory<UsageSearcher> mySearcherFactory;
private final FindUsagesProcessPresentation myProcessPresentation;
private UsageViewManager.UsageViewStateListener myListener;
private UsageViewStateListener myListener;
public SearchForUsagesRunnable(final UsageViewImpl[] usageView,
final UsageViewPresentation presentation,
final UsageTarget[] searchFor,
final Factory<UsageSearcher> searcherFactory,
FindUsagesProcessPresentation processPresentation,
final UsageViewManager.UsageViewStateListener listener) {
final UsageViewPresentation presentation,
final UsageTarget[] searchFor,
final Factory<UsageSearcher> searcherFactory,
FindUsagesProcessPresentation processPresentation,
final UsageViewManager.UsageViewStateListener listener) {
myUsageView = usageView;
myPresentation = presentation;
mySearchFor = searchFor;
@@ -279,7 +280,7 @@ public class UsageViewManagerImpl implements UsageViewManager, ProjectComponent
}
if (myListener != null) {
myListener.findingUsagesFinished();
myListener.findingUsagesFinished(myUsageView[0]);
}
}
}
@@ -536,7 +536,7 @@ public class FindUsagesManager {
}
};
final PsiElement2UsageTargetAdapter[] targets = convertToUsageTargets(descriptor.getPrimaryElements(), descriptor.getAdditionalElements());
myAnotherManager.searchAndShowUsages(targets, searcherFactory, !toSkipUsagePanelWhenOneUsage, true, presentation);
myAnotherManager.searchAndShowUsages(targets, searcherFactory, !toSkipUsagePanelWhenOneUsage, true, presentation, null);
}
private UsageViewPresentation createPresentation(PsiElement psiElement, final FindUsagesOptions findUsagesOptions, boolean toOpenInNewTab) {
@@ -140,7 +140,7 @@ public class ReplaceInProjectManager implements ProjectComponent {
addReplaceActions(context[0]);
}
public void findingUsagesFinished() {
public void findingUsagesFinished(final UsageView usageView) {
if (context[0]!=null && findManager.getFindInProjectModel().isPromptOnReplace()){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -26,6 +26,7 @@ import com.intellij.usageView.UsageInfo;
import com.intellij.usageView.UsageViewDescriptor;
import com.intellij.usageView.UsageViewUtil;
import com.intellij.usages.*;
import com.intellij.usages.rules.PsiElementUsage;
import com.intellij.util.Processor;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.HashSet;
@@ -187,8 +188,6 @@ public abstract class BaseRefactoringProcessor {
presentation.setTargetsNodeText(descriptor.getProcessedElementsHeader());
presentation.setShowReadOnlyStatusAsRed(true);
presentation.setShowCancelButton(true);
presentation.setCodeUsagesString(descriptor.getCodeReferencesText(1, 1)); //TODO
presentation.setNonCodeUsagesString(descriptor.getCommentReferencesText(1, 1)); //TODO
presentation.setUsagesString("usages");
return presentation;
}
@@ -244,7 +243,39 @@ public abstract class BaseRefactoringProcessor {
}
};
final UsageView usageView = viewManager.searchAndShowUsages(targets, searcherFactory, true, false, createPresentation(viewDescriptor));
final UsageViewPresentation presentation = createPresentation(viewDescriptor);
final UsageView usageView = viewManager.searchAndShowUsages(targets, searcherFactory, true, false, presentation,
new UsageViewManager.UsageViewStateListener() {
public void usageViewCreated(UsageView usageView) {}
public void findingUsagesFinished(final UsageView usageView) {
if (usageView == null) return;
final Set<Usage> usages = usageView.getUsages();
int codeUsageCount = 0;
int nonCodeUsageCount = 0;
Set<PsiFile> codeFiles = new HashSet<PsiFile>();
Set<PsiFile> nonCodeFiles = new HashSet<PsiFile>();
for (Iterator<Usage> iterator = usages.iterator(); iterator.hasNext();) {
Usage usage = iterator.next();
if (usage instanceof PsiElementUsage) {
final PsiElementUsage elementUsage = ((PsiElementUsage)usage);
if (elementUsage.isNonCodeUsage()) {
nonCodeUsageCount++;
nonCodeFiles.add(elementUsage.getElement().getContainingFile());
} else {
codeUsageCount++;
codeFiles.add(elementUsage.getElement().getContainingFile());
}
}
}
codeFiles.remove(null);
nonCodeFiles.remove(null);
presentation.setCodeUsagesString(viewDescriptor.getCodeReferencesText(codeUsageCount, codeFiles.size()));
presentation.setNonCodeUsagesString(viewDescriptor.getCommentReferencesText(nonCodeUsageCount, nonCodeFiles.size()));
}
});
final Runnable refactoringRunnable = new Runnable() {
public void run() {