search and replace: navigation through occurrences

This commit is contained in:
andrey zaytsev
2011-02-21 20:22:45 +03:00
parent 308455ec70
commit 18bca98e5f
3 changed files with 26 additions and 6 deletions
@@ -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);
@@ -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);
}
@@ -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);