private boolean getStringToReplace( int textOffset, int textEndOffset, Document document, FindModel findModel, Ref<String> stringToReplace) throws FindManager.MalformedReplacementStringException { if (textOffset < 0 || textOffset >= document.getTextLength()) { return false; } if (textEndOffset < 0 || textOffset > document.getTextLength()) { return false; } FindManager findManager = FindManager.getInstance(myProject); final CharSequence foundString = document.getCharsSequence().subSequence(textOffset, textEndOffset); PsiFile file = PsiDocumentManager.getInstance(myProject).getPsiFile(document); FindResult findResult = findManager.findString( document.getCharsSequence(), textOffset, findModel, file != null ? file.getVirtualFile() : null); if (!findResult.isStringFound()) { return false; } stringToReplace.set( FindManager.getInstance(myProject) .getStringToReplace(foundString.toString(), findModel, textOffset, document.getText())); return true; }
@Override public void doExecute(Editor editor, @Nullable Caret c, DataContext dataContext) { Caret caret = c == null ? editor.getCaretModel().getPrimaryCaret() : c; TextRange wordSelectionRange = getSelectionRange(editor, caret); boolean notFoundPreviously = getAndResetNotFoundStatus(editor); boolean wholeWordSearch = isWholeWordSearch(editor); if (caret.hasSelection()) { Project project = editor.getProject(); String selectedText = caret.getSelectedText(); if (project == null || selectedText == null) { return; } FindManager findManager = FindManager.getInstance(project); FindModel model = getFindModel(selectedText, wholeWordSearch); findManager.setSelectNextOccurrenceWasPerformed(); findManager.setFindNextModel(model); int searchStartOffset = notFoundPreviously ? 0 : caret.getSelectionEnd(); FindResult findResult = findManager.findString( editor.getDocument().getCharsSequence(), searchStartOffset, model); if (findResult.isStringFound()) { boolean caretAdded = FindUtil.selectSearchResultInEditor( editor, findResult, caret.getOffset() - caret.getSelectionStart()); if (!caretAdded) { // this means that the found occurence is already selected if (notFoundPreviously) { setNotFoundStatus( editor); // to make sure we won't show hint anymore if there are no more // occurrences } } } else { setNotFoundStatus(editor); showHint(editor); } } else { if (wordSelectionRange == null) { return; } setSelection(editor, caret, wordSelectionRange); setWholeWordSearch(editor, true); } editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); }
private static int addToUsages( @NotNull Document document, @NotNull Processor<UsageInfo> consumer, @NotNull FindModel findModel, @NotNull final PsiFile psiFile, @NotNull int[] offsetRef, int maxUsages) { int count = 0; CharSequence text = document.getCharsSequence(); int textLength = document.getTextLength(); int offset = offsetRef[0]; Project project = psiFile.getProject(); FindManager findManager = FindManager.getInstance(project); while (offset < textLength) { FindResult result = findManager.findString(text, offset, findModel, psiFile.getVirtualFile()); if (!result.isStringFound()) break; final SearchScope customScope = findModel.getCustomScope(); if (customScope instanceof LocalSearchScope) { final TextRange range = new TextRange(result.getStartOffset(), result.getEndOffset()); if (!((LocalSearchScope) customScope).containsRange(psiFile, range)) break; } UsageInfo info = new FindResultUsageInfo(findManager, psiFile, offset, findModel, result); if (!consumer.process(info)) { throw new ProcessCanceledException(); } count++; final int prevOffset = offset; offset = result.getEndOffset(); if (prevOffset == offset) { // for regular expr the size of the match could be zero -> could be infinite loop in finding // usages! ++offset; } if (maxUsages > 0 && count >= maxUsages) { break; } } offsetRef[0] = offset; return count; }
@Override public void doExecute(Editor editor, @Nullable Caret c, DataContext dataContext) { Caret caret = c == null ? editor.getCaretModel().getPrimaryCaret() : c; if (!caret.hasSelection()) { TextRange wordSelectionRange = getSelectionRange(editor, caret); if (wordSelectionRange != null) { setSelection(editor, caret, wordSelectionRange); } } String selectedText = caret.getSelectedText(); Project project = editor.getProject(); if (project == null || selectedText == null) { return; } int caretShiftFromSelectionStart = caret.getOffset() - caret.getSelectionStart(); FindManager findManager = FindManager.getInstance(project); FindModel model = new FindModel(); model.setStringToFind(selectedText); model.setCaseSensitive(true); model.setWholeWordsOnly(true); int searchStartOffset = 0; FindResult findResult = findManager.findString(editor.getDocument().getCharsSequence(), searchStartOffset, model); while (findResult.isStringFound()) { int newCaretOffset = caretShiftFromSelectionStart + findResult.getStartOffset(); EditorActionUtil.makePositionVisible(editor, newCaretOffset); Caret newCaret = editor.getCaretModel().addCaret(editor.offsetToVisualPosition(newCaretOffset)); if (newCaret != null) { setSelection(editor, newCaret, findResult); } findResult = findManager.findString( editor.getDocument().getCharsSequence(), findResult.getEndOffset(), model); } editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); }