Skip to content

Commit ff92643

Browse files
committed
Fix lost cursor after accepted suggestion
1 parent b8a042a commit ff92643

File tree

1 file changed

+57
-13
lines changed

1 file changed

+57
-13
lines changed

plugin/src/de/hetzge/eclipse/aicoder/inline/AiCoderCodeCleanupUtils.java

Lines changed: 57 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,86 @@
11
package de.hetzge.eclipse.aicoder.inline;
22

33
import org.eclipse.core.runtime.CoreException;
4+
import org.eclipse.core.runtime.IStatus;
45
import org.eclipse.core.runtime.NullProgressMonitor;
56
import org.eclipse.core.runtime.OperationCanceledException;
7+
import org.eclipse.core.runtime.Status;
68
import org.eclipse.jdt.core.ICompilationUnit;
79
import org.eclipse.jdt.internal.corext.fix.CleanUpConstants;
810
import org.eclipse.jdt.internal.corext.fix.CleanUpRefactoring;
911
import org.eclipse.jdt.internal.ui.JavaPlugin;
1012
import org.eclipse.jdt.internal.ui.fix.AbstractCleanUp;
1113
import org.eclipse.jdt.ui.cleanup.CleanUpOptions;
1214
import org.eclipse.jdt.ui.cleanup.ICleanUp;
15+
import org.eclipse.jface.text.BadLocationException;
16+
import org.eclipse.jface.text.IDocument;
17+
import org.eclipse.jface.text.ITextSelection;
18+
import org.eclipse.jface.text.Position;
1319
import org.eclipse.ltk.core.refactoring.CheckConditionsOperation;
1420
import org.eclipse.ltk.core.refactoring.PerformRefactoringOperation;
1521
import org.eclipse.ltk.core.refactoring.Refactoring;
1622
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
23+
import org.eclipse.ui.IEditorPart;
24+
import org.eclipse.ui.PlatformUI;
25+
import org.eclipse.ui.texteditor.ITextEditor;
26+
27+
import de.hetzge.eclipse.aicoder.AiCoderActivator;
1728

1829
public final class AiCoderCodeCleanupUtils {
1930

2031
private AiCoderCodeCleanupUtils() {
2132
}
2233

2334
public static void triggerSaveActions(ICompilationUnit compilationUnit) throws OperationCanceledException, CoreException {
24-
final CleanUpOptions options = new CleanUpOptions();
25-
options.setOption(CleanUpConstants.ORGANIZE_IMPORTS, CleanUpOptions.TRUE);
26-
options.setOption(CleanUpConstants.FORMAT_SOURCE_CODE, CleanUpOptions.TRUE);
27-
28-
final ICleanUp[] cleanUps = JavaPlugin.getDefault().getCleanUpRegistry().createCleanUps();
29-
for (final ICleanUp cleanUp : cleanUps) {
30-
if (cleanUp instanceof AbstractCleanUp) {
31-
((AbstractCleanUp) cleanUp).setOptions(options);
35+
final IEditorPart activeEditor = PlatformUI.getWorkbench()
36+
.getActiveWorkbenchWindow()
37+
.getActivePage()
38+
.getActiveEditor();
39+
40+
Position cursorPosition = null;
41+
IDocument document = null;
42+
43+
if (activeEditor instanceof ITextEditor) {
44+
final ITextEditor textEditor = (ITextEditor) activeEditor;
45+
document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
46+
final ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection();
47+
48+
// Create a tracked position
49+
cursorPosition = new Position(selection.getOffset(), 0);
50+
try {
51+
document.addPosition(cursorPosition);
52+
} catch (final BadLocationException exception) {
53+
AiCoderActivator.getDefault().getLog().log(new Status(IStatus.ERROR, AiCoderActivator.PLUGIN_ID, "Failed to add cursor position", exception));
3254
}
3355
}
34-
final CleanUpRefactoring refactoring = new CleanUpRefactoring();
35-
refactoring.addCompilationUnit(compilationUnit);
36-
for (final ICleanUp cleanUp : cleanUps) {
37-
refactoring.addCleanUp(cleanUp);
56+
57+
try {
58+
final CleanUpOptions options = new CleanUpOptions();
59+
options.setOption(CleanUpConstants.ORGANIZE_IMPORTS, CleanUpOptions.TRUE);
60+
options.setOption(CleanUpConstants.FORMAT_SOURCE_CODE, CleanUpOptions.TRUE);
61+
62+
final ICleanUp[] cleanUps = JavaPlugin.getDefault().getCleanUpRegistry().createCleanUps();
63+
for (final ICleanUp cleanUp : cleanUps) {
64+
if (cleanUp instanceof AbstractCleanUp) {
65+
((AbstractCleanUp) cleanUp).setOptions(options);
66+
}
67+
}
68+
final CleanUpRefactoring refactoring = new CleanUpRefactoring();
69+
refactoring.addCompilationUnit(compilationUnit);
70+
for (final ICleanUp cleanUp : cleanUps) {
71+
refactoring.addCleanUp(cleanUp);
72+
}
73+
executeRefactoring(refactoring);
74+
} finally {
75+
// Restore cursor position
76+
if (cursorPosition != null && activeEditor instanceof ITextEditor) {
77+
final ITextEditor textEditor = (ITextEditor) activeEditor;
78+
final int newOffset = cursorPosition.getOffset();
79+
textEditor.selectAndReveal(newOffset, 0);
80+
textEditor.setFocus();
81+
document.removePosition(cursorPosition);
82+
}
3883
}
39-
executeRefactoring(refactoring);
4084
}
4185

4286
private static void executeRefactoring(Refactoring refactoring) throws OperationCanceledException, CoreException {

0 commit comments

Comments
 (0)