diff options
Diffstat (limited to 'plugins/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SearchCommand.java')
-rw-r--r-- | plugins/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SearchCommand.java | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/plugins/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SearchCommand.java b/plugins/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SearchCommand.java new file mode 100644 index 000000000000..7c51fa85af3b --- /dev/null +++ b/plugins/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/SearchCommand.java @@ -0,0 +1,145 @@ +package com.intellij.structuralsearch.plugin.ui; + +import com.intellij.notification.NotificationGroup; +import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.MessageType; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.wm.ToolWindowId; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiNameIdentifierOwner; +import com.intellij.structuralsearch.*; +import com.intellij.structuralsearch.impl.matcher.MatchResultImpl; +import com.intellij.structuralsearch.plugin.StructuralSearchPlugin; +import com.intellij.structuralsearch.plugin.ui.actions.DoSearchAction; +import com.intellij.usageView.UsageInfo; +import com.intellij.usages.Usage; +import com.intellij.usages.UsageInfo2UsageAdapter; +import com.intellij.util.Alarm; +import com.intellij.util.ObjectUtils; +import com.intellij.util.Processor; + +/** + * Created by IntelliJ IDEA. + * User: Maxim.Mossienko + * Date: Mar 15, 2004 + * Time: 4:49:07 PM + * To change this template use File | Settings | File Templates. + */ +public class SearchCommand { + protected UsageViewContext context; + private MatchingProcess process; + protected Project project; + + public SearchCommand(Project _project, UsageViewContext _context) { + project = _project; + context = _context; + } + + public void findUsages(final Processor<Usage> processor) { + final ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator(); + + try { + DoSearchAction.execute( + project, + new MatchResultSink() { + int count; + + public void setMatchingProcess(MatchingProcess _process) { + process = _process; + findStarted(); + } + + public void processFile(PsiFile element) { + final VirtualFile virtualFile = element.getVirtualFile(); + if (virtualFile != null) + progress.setText(SSRBundle.message("looking.in.progress.message", virtualFile.getPresentableName())); + } + + public void matchingFinished() { + findEnded(); + progress.setText(SSRBundle.message("found.progress.message", count)); + } + + public ProgressIndicator getProgressIndicator() { + return progress; + } + + public void newMatch(MatchResult result) { + UsageInfo info; + + if (MatchResult.MULTI_LINE_MATCH.equals(result.getName())) { + int start = -1; + int end = -1; + PsiElement parent = result.getMatchRef().getElement().getParent(); + + for (final MatchResult matchResult : ((MatchResultImpl)result).getMatches()) { + PsiElement el = matchResult.getMatchRef().getElement(); + final int elementStart = el.getTextRange().getStartOffset(); + + if (start == -1 || start > elementStart) { + start = elementStart; + } + final int newend = elementStart + el.getTextLength(); + + if (newend > end) { + end = newend; + } + } + + final int parentStart = parent.getTextRange().getStartOffset(); + int startOffset = start - parentStart; + info = new UsageInfo(parent, startOffset, end - parentStart); + } + else { + PsiElement element = result.getMatch(); + if (element instanceof PsiNameIdentifierOwner) { + element = ObjectUtils.notNull(((PsiNameIdentifierOwner)element).getNameIdentifier(), element); + } + info = new UsageInfo(element, result.getStart(), result.getEnd() == -1 ? element.getTextLength() : result.getEnd()); + } + + Usage usage = new UsageInfo2UsageAdapter(info); + processor.process(usage); + foundUsage(result, usage); + ++count; + } + }, + context.getConfiguration() + ); + } + catch (final StructuralSearchException e) { + final Alarm alarm = new Alarm(); + alarm.addRequest( + new Runnable() { + @Override + public void run() { + NotificationGroup.toolWindowGroup("Structural Search", ToolWindowId.FIND, true) + .createNotification(SSRBundle.message("problem", e.getMessage()), MessageType.ERROR).notify(project); + } + }, + 100, ModalityState.NON_MODAL + ); + } + } + + public void stopAsyncSearch() { + if (process!=null) process.stop(); + } + + protected void findStarted() { + StructuralSearchPlugin.getInstance(project).setSearchInProgress(true); + } + + protected void findEnded() { + if (!project.isDisposed()) { + StructuralSearchPlugin.getInstance(project).setSearchInProgress(false); + } + } + + protected void foundUsage(MatchResult result, Usage usage) { + } +} |