diff --git a/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java b/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java index bfd283667e94..516bdaac1f41 100644 --- a/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java +++ b/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java @@ -166,8 +166,6 @@ public class EditorSearchComponent extends JPanel implements DataProvider, Selec myEditor.getCaretModel().moveToOffset(range.getEndOffset()); myEditor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); - myEditor.getCaretModel().moveToOffset(range.getStartOffset()); - myEditor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); } myToChangeSelection = false; } @@ -528,6 +526,13 @@ public class EditorSearchComponent extends JPanel implements DataProvider, Selec } } + public void replaceCurrent() { + if (mySearchResults.getCursor() != null) { + String replacement = myLivePreviewController.getReplacementPreviewText(myEditor, mySearchResults.getCursor()); + myLivePreviewController.performReplace(mySearchResults.getCursor(), replacement, myEditor); + } + } + private static void setSmallerFontAndOpaque(final JComponent component) { setSmallerFont(component); component.setOpaque(false); diff --git a/platform/lang-impl/src/com/intellij/find/impl/livePreview/SearchResults.java b/platform/lang-impl/src/com/intellij/find/impl/livePreview/SearchResults.java index d6925ef5d915..2381f31aaa3e 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/livePreview/SearchResults.java +++ b/platform/lang-impl/src/com/intellij/find/impl/livePreview/SearchResults.java @@ -237,6 +237,17 @@ public class SearchResults { return firstVisibleOccurrence != null ? firstVisibleOccurrence : firstOccurrence; } + @Nullable + private LiveOccurrence firstOccurrenceBeforeCaret() { + int offset = getEditor().getCaretModel().getOffset(); + for (int i = getOccurrences().size()-1; i >= 0; --i) { + if (getOccurrences().get(i).getPrimaryRange().getEndOffset() < offset) { + return getOccurrences().get(i); + } + } + return null; + } + @Nullable private LiveOccurrence firstOccurrenceAfterCaret() { LiveOccurrence afterCaret = null; @@ -294,7 +305,7 @@ public class SearchResults { } public void prevOccurrence() { - LiveOccurrence prev = prevOccurrence(myCursor); + LiveOccurrence prev = firstOccurrenceBeforeCaret(); if (prev == null && !getOccurrences().isEmpty()) { prev = getOccurrences().get(getOccurrences().size() - 1); } @@ -302,7 +313,7 @@ public class SearchResults { } public void nextOccurrence() { - LiveOccurrence next = nextOccurrence(myCursor); + LiveOccurrence next = firstOccurrenceAfterCaret(); if (next == null && !getOccurrences().isEmpty()) { next = getOccurrences().get(0); } diff --git a/platform/lang-impl/src/com/intellij/openapi/editor/actions/IncrementalFindAction.java b/platform/lang-impl/src/com/intellij/openapi/editor/actions/IncrementalFindAction.java index a8d73ba7d634..2f2535ff5e9f 100644 --- a/platform/lang-impl/src/com/intellij/openapi/editor/actions/IncrementalFindAction.java +++ b/platform/lang-impl/src/com/intellij/openapi/editor/actions/IncrementalFindAction.java @@ -42,8 +42,12 @@ public class IncrementalFindAction extends EditorAction { if (!editor.isOneLineMode()) { final JComponent headerComponent = editor.getHeaderComponent(); if (headerComponent instanceof EditorSearchComponent) { - ((EditorSearchComponent) headerComponent).setInitialText(editor.getSelectionModel().getSelectedText()); - headerComponent.requestFocus(); + if (myReplace) { + ((EditorSearchComponent)headerComponent).replaceCurrent(); + } else { + ((EditorSearchComponent) headerComponent).setInitialText(editor.getSelectionModel().getSelectedText()); + headerComponent.requestFocus(); + } } else { final EditorSearchComponent header = new EditorSearchComponent(editor, project, myReplace);