diff --git a/platform/lang-impl/src/com/intellij/codeInsight/actions/ReformatCodeProcessor.java b/platform/lang-impl/src/com/intellij/codeInsight/actions/ReformatCodeProcessor.java index 0e27a8bbe850..4bf4864316a1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/actions/ReformatCodeProcessor.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/actions/ReformatCodeProcessor.java @@ -20,9 +20,8 @@ import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.formatting.FormattingProgressTask; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.SelectionModel; +import com.intellij.openapi.editor.ex.util.CaretVisualPositionKeeper; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; @@ -37,11 +36,8 @@ import com.intellij.util.diff.FilesTooBigForDiffException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.awt.*; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; import java.util.concurrent.FutureTask; public class ReformatCodeProcessor extends AbstractLayoutCodeProcessor { @@ -172,32 +168,4 @@ public class ReformatCodeProcessor extends AbstractLayoutCodeProcessor { return !myRanges.isEmpty() ? myRanges : ContainerUtil.newArrayList(file.getTextRange()); } - - private static class CaretVisualPositionKeeper { - private final Map myCaretRelativeVerticalPositions = new HashMap<>(); - - private CaretVisualPositionKeeper(@Nullable Document document) { - if (document == null) return; - - Editor[] editors = EditorFactory.getInstance().getEditors(document); - for (Editor editor : editors) { - Rectangle visibleArea = editor.getScrollingModel().getVisibleArea(); - Point pos = editor.visualPositionToXY(editor.getCaretModel().getVisualPosition()); - int relativePosition = pos.y - visibleArea.y; - myCaretRelativeVerticalPositions.put(editor, relativePosition); - } - } - - private void restoreOriginalLocation() { - for (Map.Entry e : myCaretRelativeVerticalPositions.entrySet()) { - Editor editor = e.getKey(); - int relativePosition = e.getValue(); - Point caretLocation = editor.visualPositionToXY(editor.getCaretModel().getVisualPosition()); - int scrollOffset = caretLocation.y - relativePosition; - editor.getScrollingModel().disableAnimation(); - editor.getScrollingModel().scrollVertically(scrollOffset); - editor.getScrollingModel().enableAnimation(); - } - } - } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hints/ParameterHintsPassFactory.java b/platform/lang-impl/src/com/intellij/codeInsight/hints/ParameterHintsPassFactory.java index fcd21aaf9b58..fd49d5736ed5 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hints/ParameterHintsPassFactory.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/hints/ParameterHintsPassFactory.java @@ -29,6 +29,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Inlay; import com.intellij.openapi.editor.VisualPosition; import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; +import com.intellij.openapi.editor.ex.util.CaretVisualPositionKeeper; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; @@ -107,6 +108,7 @@ public class ParameterHintsPassFactory extends AbstractProjectComponent implemen ParameterHintsPresentationManager presentationManager = ParameterHintsPresentationManager.getInstance(); Set removedHints = new HashSet<>(); TIntObjectHashMap caretMap = new TIntObjectHashMap<>(); + CaretVisualPositionKeeper keeper = new CaretVisualPositionKeeper(myEditor); for (Caret caret : myEditor.getCaretModel().getAllCarets()) { caretMap.put(caret.getOffset(), caret); } @@ -131,6 +133,7 @@ public class ParameterHintsPassFactory extends AbstractProjectComponent implemen String text = e.getValue(); presentationManager.addHint(myEditor, offset, text, !firstTime && !removedHints.contains(text)); } + keeper.restoreOriginalLocation(); myEditor.putUserData(REPEATED_PASS, Boolean.TRUE); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/CaretVisualPositionKeeper.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/CaretVisualPositionKeeper.java new file mode 100644 index 000000000000..c919ed5690c8 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/CaretVisualPositionKeeper.java @@ -0,0 +1,62 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.editor.ex.util; + +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.EditorFactory; +import org.jetbrains.annotations.Nullable; + +import java.awt.*; +import java.util.HashMap; +import java.util.Map; + +/** + * Allows to keep caret's position in editor window at the same vertical position for operations, that can potentially move caret. + * An instance of this class is to be created before the operation, method {@link #restoreOriginalLocation()} should be called after it. + */ +public class CaretVisualPositionKeeper { + private final Map myCaretRelativeVerticalPositions = new HashMap<>(); + + public CaretVisualPositionKeeper(@Nullable Editor editor) { + this(editor == null ? Editor.EMPTY_ARRAY : new Editor[]{editor}); + } + + public CaretVisualPositionKeeper(@Nullable Document document) { + this(document == null ? Editor.EMPTY_ARRAY : EditorFactory.getInstance().getEditors(document)); + } + + private CaretVisualPositionKeeper(Editor[] editors) { + for (Editor editor : editors) { + Rectangle visibleArea = editor.getScrollingModel().getVisibleArea(); + Point pos = editor.visualPositionToXY(editor.getCaretModel().getVisualPosition()); + int relativePosition = pos.y - visibleArea.y; + myCaretRelativeVerticalPositions.put(editor, relativePosition); + } + } + + public void restoreOriginalLocation() { + for (Map.Entry e : myCaretRelativeVerticalPositions.entrySet()) { + Editor editor = e.getKey(); + int relativePosition = e.getValue(); + Point caretLocation = editor.visualPositionToXY(editor.getCaretModel().getVisualPosition()); + int scrollOffset = caretLocation.y - relativePosition; + editor.getScrollingModel().disableAnimation(); + editor.getScrollingModel().scrollVertically(scrollOffset); + editor.getScrollingModel().enableAnimation(); + } + } +}