diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.form b/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.form index 8e7b1e34d8ac..c196a467cd5a 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.form +++ b/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.form @@ -337,7 +337,7 @@ - + @@ -350,7 +350,7 @@ - + @@ -372,7 +372,7 @@ - + @@ -380,7 +380,7 @@ - + @@ -390,7 +390,7 @@ - + @@ -399,12 +399,12 @@ - + - + @@ -412,12 +412,20 @@ - + + + + + + + + + diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.java b/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.java index 8cf9700be9c0..6717077957d6 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.java @@ -55,6 +55,8 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; @@ -103,6 +105,7 @@ public class EditorOptionsPanel implements SearchableConfigurable { private JCheckBox myCbEnableRichCopyByDefault; private JCheckBox myShowLSTInGutterCheckBox; private JCheckBox myShowWhitespacesModificationsInLSTGutterCheckBox; + private JCheckBox myCbKeepTrailingSpacesOnCaretLine; private static final String ACTIVE_COLOR_SCHEME = ApplicationBundle.message("combobox.richcopy.color.scheme.active"); private static final UINumericRange RECENT_FILES_RANGE = new UINumericRange(50, 1, 500); @@ -119,6 +122,13 @@ public class EditorOptionsPanel implements SearchableConfigurable { myStripTrailingSpacesCombo.addItem(STRIP_CHANGED); myStripTrailingSpacesCombo.addItem(STRIP_ALL); myStripTrailingSpacesCombo.addItem(STRIP_NONE); + + myStripTrailingSpacesCombo.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + myCbKeepTrailingSpacesOnCaretLine.setEnabled(!STRIP_NONE.equals(myStripTrailingSpacesCombo.getSelectedItem())); + } + }); myHighlightSettingsPanel.setLayout(new BorderLayout()); @@ -191,6 +201,7 @@ public class EditorOptionsPanel implements SearchableConfigurable { else if (EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE.equals(stripTrailingSpaces)) { myStripTrailingSpacesCombo.setSelectedItem(STRIP_ALL); } + myCbKeepTrailingSpacesOnCaretLine.setSelected(editorSettings.isKeepTrailingSpacesOnCaretLine()); myCbEnsureBlankLineBeforeCheckBox.setSelected(editorSettings.isEnsureNewLineAtEOF()); myCbShowQuickDocOnMouseMove.setSelected(editorSettings.isShowQuickDocOnMouseOverElement()); @@ -290,6 +301,7 @@ public class EditorOptionsPanel implements SearchableConfigurable { else { editorSettings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE); } + editorSettings.setKeepTrailingSpacesOnCaretLine(myCbKeepTrailingSpacesOnCaretLine.isSelected()); editorSettings.setEnsureNewLineAtEOF(myCbEnsureBlankLineBeforeCheckBox.isSelected()); @@ -439,6 +451,8 @@ public class EditorOptionsPanel implements SearchableConfigurable { // Strip trailing spaces, ensure EOL on EOF on save isModified |= !getStripTrailingSpacesValue().equals(editorSettings.getStripTrailingSpaces()); + isModified |= isModified(myCbKeepTrailingSpacesOnCaretLine, editorSettings.isKeepTrailingSpacesOnCaretLine()); + isModified |= isModified(myCbEnsureBlankLineBeforeCheckBox, editorSettings.isEnsureNewLineAtEOF()); isModified |= isModified(myCbShowQuickDocOnMouseMove, editorSettings.isShowQuickDocOnMouseOverElement()); diff --git a/platform/platform-impl/src/com/intellij/ide/actions/SaveAllAction.java b/platform/platform-impl/src/com/intellij/ide/actions/SaveAllAction.java index caced485e9cc..d5cb3935c92c 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/SaveAllAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/SaveAllAction.java @@ -35,12 +35,14 @@ public class SaveAllAction extends AnAction implements DumbAware { } ApplicationManager.getApplication().saveAll(); } - + private static void stripSpacesFromCaretLines(@NotNull Editor editor) { - final String stripSpacesSetting = EditorSettingsExternalizable.getInstance().getStripTrailingSpaces(); - if (!EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE.equals(stripSpacesSetting)) { + final EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance(); + if (!EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE.equals(editorSettings.getStripTrailingSpaces()) + && !editorSettings.isKeepTrailingSpacesOnCaretLine()) { Document document = editor.getDocument(); - final boolean inChangedLinesOnly = EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED.equals(stripSpacesSetting); + final boolean inChangedLinesOnly = + EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED.equals(editorSettings.getStripTrailingSpaces()); TrailingSpacesStripper.strip(document, inChangedLinesOnly, false); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorSettingsExternalizable.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorSettingsExternalizable.java index fb3268ecdcd7..91e498429a3e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorSettingsExternalizable.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorSettingsExternalizable.java @@ -94,6 +94,8 @@ public class EditorSettingsExternalizable implements PersistentStateComponent carets = activeEditor == null ? Collections.emptyList() : activeEditor.getCaretModel().getAllCarets(); + final List carets = activeEditor == null ? Collections.emptyList() : activeEditor.getCaretModel().getAllCarets(); final List visualCarets = new ArrayList<>(carets.size()); int[] caretOffsets = new int[carets.size()]; for (int i = 0; i < carets.size(); i++) { @@ -184,7 +181,7 @@ public final class TrailingSpacesStripper extends FileDocumentManagerAdapter { boolean markAsNeedsStrippingLater = ((DocumentImpl)document).stripTrailingSpaces(getProject(document, activeEditor), - inChangedLinesOnly, !isVirtualSpaceEnabled && skipCaretLines, caretOffsets); + inChangedLinesOnly, skipCaretLines, caretOffsets); if (activeEditor != null && !ShutDownTracker.isShutdownHookRunning()) { activeEditor.getCaretModel().runBatchCaretOperation(() -> { diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index ee4332d1802e..dceef907270b 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -770,6 +770,7 @@ color.scheme.reset.title=Scheme Reset settings.code.style.reset.to.defaults.message=Change all code style settings to their default values?\nNote: all the changes you have made to the scheme will be lost. settings.code.style.reset.to.defaults.title=Scheme Reset +editor.settings.keep.trailing.spaces.on.caret.line=Always keep trailing spaces on caret line settings.editor.scheme.copy=Duplicate settings.editor.scheme.delete=Delete settings.editor.scheme.import=Import Scheme diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/TrailingSpacesStripperTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/TrailingSpacesStripperTest.java index a73eea7dad1f..5d694071799c 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/TrailingSpacesStripperTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/TrailingSpacesStripperTest.java @@ -219,6 +219,7 @@ public class TrailingSpacesStripperTest extends LightPlatformCodeInsightTestCase public void testStripTrailingSpacesAtCaretLineOnExplicitSave() { EditorSettingsExternalizable settings = EditorSettingsExternalizable.getInstance(); settings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE); + settings.setKeepTrailingSpacesOnCaretLine(false); configureFromFileText( "x.txt", "xxx \nyyy "