Formatter: cursor position is saved when invoking autoformat. Fixes #2293

This commit is contained in:
Federico Fissore 2014-09-30 17:17:13 +02:00
parent 170816181a
commit 1b783fa48c
5 changed files with 91 additions and 1 deletions

View File

@ -3,6 +3,7 @@ package cc.arduino.packages.formatter;
import processing.app.Base;
import processing.app.Editor;
import processing.app.helpers.FileUtils;
import processing.app.syntax.JEditTextArea;
import processing.app.tools.Tool;
import java.io.File;
@ -54,8 +55,13 @@ public class AStyle implements Tool {
return;
}
JEditTextArea textArea = editor.getTextArea();
int line = textArea.getLineOfOffset(textArea.getCaretPosition());
int lineOffset = textArea.getCaretPosition() - textArea.getLineStartOffset(line);
editor.setText(formattedText);
editor.getSketch().setModified(true);
textArea.setCaretPosition(Math.min(textArea.getLineStartOffset(line) + lineOffset, textArea.getSafeLineStopOffset(line) - 1));
// mark as finished
editor.statusNotice(_("Auto Format finished."));
}

View File

@ -3,6 +3,7 @@ package processing.app;
import org.fest.swing.edt.FailOnThreadViolationRepaintManager;
import org.fest.swing.edt.GuiActionRunner;
import org.fest.swing.edt.GuiQuery;
import org.junit.After;
import org.junit.Before;
import processing.app.helpers.ArduinoFrameFixture;
@ -32,4 +33,9 @@ public abstract class AbstractGUITest {
});
}
@After
public void stopTheIDE() {
window.cleanUp();
}
}

View File

@ -0,0 +1,46 @@
package processing.app;
import org.fest.swing.fixture.JMenuItemFixture;
import org.junit.Test;
import processing.app.helpers.JEditTextAreaFixture;
import static org.junit.Assert.assertEquals;
public class AutoformatSavesCaretPositionTest extends AbstractGUITest {
@Test
public void shouldSaveCaretPositionAfterAutoformat() {
JMenuItemFixture menuToolsAutoFormat = window.menuItem("menuToolsAutoFormat");
menuToolsAutoFormat.requireEnabled();
JEditTextAreaFixture editor = window.jEditTextArea("editor");
editor.setText("void setup() {\n" +
" // put your setup code here, to run once:\n" +
"\n" +
"}\n" +
"\n" +
"void loop() {\n" +
" // put your main code here, to run repeatedly:\n" +
"\n" +
"}");
editor.setCaretPosition(29); // right before the first // (double slash)
menuToolsAutoFormat.click();
String formattedText = editor.getText();
assertEquals("void setup() {\n" +
" // put your setup code here, to run once:\n" +
"\n" +
"}\n" +
"\n" +
"void loop() {\n" +
" // put your main code here, to run repeatedly:\n" +
"\n" +
"}", formattedText);
assertEquals(29, editor.getCaretPosition());
}
}

View File

@ -51,4 +51,29 @@ public class JEditTextAreaComponentDriver extends JComponentDriver {
});
}
public Integer getCaretPosition(final JEditTextArea target) {
focusAndWaitForFocusGain(target);
return GuiActionRunner.execute(new GuiQuery<Integer>() {
protected Integer executeInEDT() {
return target.getCaretPosition();
}
});
}
public void setCaretPosition(final JEditTextArea target, final int caretPosition) {
focusAndWaitForFocusGain(target);
GuiActionRunner.execute(new GuiQuery<JEditTextArea>() {
protected JEditTextArea executeInEDT() {
target.setCaretPosition(caretPosition);
return target;
}
});
robot.waitForIdle();
}
}

View File

@ -2,7 +2,6 @@ package processing.app.helpers;
import org.fest.swing.core.Robot;
import org.fest.swing.fixture.ComponentFixture;
import processing.app.syntax.JEditTextArea;
public class JEditTextAreaFixture extends ComponentFixture {
@ -42,4 +41,12 @@ public class JEditTextAreaFixture extends ComponentFixture {
driver.selectAll((JEditTextArea) target);
return this;
}
public int getCaretPosition() {
return driver.getCaretPosition((JEditTextArea) target);
}
public void setCaretPosition(int caretPosition) {
driver.setCaretPosition((JEditTextArea) target, caretPosition);
}
}