diff --git a/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java b/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java index 61901d74d..04854b7c7 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiScriptTextArea.java @@ -351,10 +351,10 @@ public class GuiScriptTextArea extends GuiNpcTextField { } @Override - public void pushUndoState(String textState) { + public void pushUndoState(String textState, int cursor) { // Push a specific text state to the undo list if (!undoing) { - undoList.add(new UndoData(textState, selection.getCursorPosition())); + undoList.add(new UndoData(textState, cursor)); redoList.clear(); } } diff --git a/src/main/java/noppes/npcs/client/gui/util/script/RenameRefactorHandler.java b/src/main/java/noppes/npcs/client/gui/util/script/RenameRefactorHandler.java index f025a8b23..423de9821 100644 --- a/src/main/java/noppes/npcs/client/gui/util/script/RenameRefactorHandler.java +++ b/src/main/java/noppes/npcs/client/gui/util/script/RenameRefactorHandler.java @@ -55,7 +55,7 @@ public class RenameRefactorHandler { void setTextWithoutUndo(String text); // Set text without creating undo entry - void pushUndoState(String text); // Push an undo state + void pushUndoState(String text, int cursor); // Push an undo state List getLines(); @@ -198,10 +198,13 @@ public class RenameRefactorHandler { return; } - // Final text is already applied - push as single undo state - // The text was modified via setTextWithoutUndo, so push final state - String finalText = callback.getText(); - callback.pushUndoState(finalText); + // Push the original text (pre-rename) so the first undo will restore the + // document to its state before the refactor. + // During live editing we used setTextWithoutUndo to avoid creating intermediate + // undo entries; pushing the original snapshot here gives a single predictable + // undo step back to the pre-rename state. + if (originalText != null && !originalText.isEmpty()) + callback.pushUndoState(originalText, originalCursorPos); // Calculate cursor position relative to primary occurrence int cursorInWord = callback.getCursorPosition() - primaryOccurrenceStart;