diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/TrailingSpacesStripper.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/TrailingSpacesStripper.java index 5c1c53bfc893..dc32e98a138f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/TrailingSpacesStripper.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/TrailingSpacesStripper.java @@ -73,7 +73,8 @@ public final class TrailingSpacesStripper extends FileDocumentManagerAdapter { final String overrideStripTrailingSpacesData = file.getUserData(OVERRIDE_STRIP_TRAILING_SPACES_KEY); final Boolean overrideEnsureNewlineData = file.getUserData(OVERRIDE_ENSURE_NEWLINE_KEY); - final String stripTrailingSpaces = overrideStripTrailingSpacesData != null ? overrideStripTrailingSpacesData : settings.getStripTrailingSpaces(); + @EditorSettingsExternalizable.StripTrailingSpaces + String stripTrailingSpaces = overrideStripTrailingSpacesData != null ? overrideStripTrailingSpacesData : settings.getStripTrailingSpaces(); final boolean doStrip = !stripTrailingSpaces.equals(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE); final boolean ensureEOL = overrideEnsureNewlineData != null ? overrideEnsureNewlineData.booleanValue() : settings.isEnsureNewLineAtEOF(); @@ -120,10 +121,7 @@ public final class TrailingSpacesStripper extends FileDocumentManagerAdapter { return; } - Component focusOwner = IdeFocusManager.getGlobalInstance().getFocusOwner(); - DataContext dataContext = DataManager.getInstance().getDataContext(focusOwner); - boolean isDisposeInProgress = ApplicationManager.getApplication().isDisposeInProgress(); // ignore caret placing when exiting - Editor activeEditor = isDisposeInProgress ? null : CommonDataKeys.EDITOR.getData(dataContext); + Editor activeEditor = getActiveEditor(document); // when virtual space enabled, we can strip whitespace anywhere boolean isVirtualSpaceEnabled = activeEditor == null || activeEditor.getSettings().isVirtualSpace(); @@ -151,6 +149,17 @@ public final class TrailingSpacesStripper extends FileDocumentManagerAdapter { ((DocumentImpl)document).clearLineModificationFlagsExcept(caretLines); } + private static Editor getActiveEditor(@NotNull Document document) { + Component focusOwner = IdeFocusManager.getGlobalInstance().getFocusOwner(); + DataContext dataContext = DataManager.getInstance().getDataContext(focusOwner); + boolean isDisposeInProgress = ApplicationManager.getApplication().isDisposeInProgress(); // ignore caret placing when exiting + Editor activeEditor = isDisposeInProgress ? null : CommonDataKeys.EDITOR.getData(dataContext); + if (activeEditor != null && activeEditor.getDocument() != document) { + activeEditor = null; + } + return activeEditor; + } + public static boolean stripIfNotCurrentLine(@NotNull Document document, boolean inChangedLinesOnly) { if (document instanceof DocumentWindow) { document = ((DocumentWindow)document).getDelegate(); @@ -158,9 +167,7 @@ public final class TrailingSpacesStripper extends FileDocumentManagerAdapter { if (!(document instanceof DocumentImpl)) { return true; } - DataContext dataContext = DataManager.getInstance().getDataContext(IdeFocusManager.getGlobalInstance().getFocusOwner()); - boolean isDisposeInProgress = ApplicationManager.getApplication().isDisposeInProgress(); // ignore caret placing when exiting - Editor activeEditor = isDisposeInProgress ? null : CommonDataKeys.EDITOR.getData(dataContext); + Editor activeEditor = getActiveEditor(document); // when virtual space enabled, we can strip whitespace anywhere boolean isVirtualSpaceEnabled = activeEditor == null || activeEditor.getSettings().isVirtualSpace(); diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/StripTrailingSpacesTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/TrailingSpacesStripperTest.java similarity index 81% rename from platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/StripTrailingSpacesTest.java rename to platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/TrailingSpacesStripperTest.java index 5189252e3530..8c974641663e 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/StripTrailingSpacesTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/TrailingSpacesStripperTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -19,11 +19,16 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.impl.ApplicationImpl; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.testFramework.EditorTestUtil; import com.intellij.testFramework.LightPlatformCodeInsightTestCase; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; @@ -32,7 +37,7 @@ import java.io.IOException; /** * User: cdr */ -public class StripTrailingSpacesTest extends LightPlatformCodeInsightTestCase { +public class TrailingSpacesStripperTest extends LightPlatformCodeInsightTestCase { private EditorSettingsExternalizable.OptionSet oldSettings; @Override @@ -196,4 +201,31 @@ public class StripTrailingSpacesTest extends LightPlatformCodeInsightTestCase { FileDocumentManager.getInstance().saveAllDocuments(); checkResultByText("XXX \nYYY\n"); } + + public void testModifySameLineInTwoFilesAndSaveAllShouldStripAtLeastOneFile() throws IOException { + EditorSettingsExternalizable settings = EditorSettingsExternalizable.getInstance(); + settings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED); + + Editor editor1 = createHeavyEditor("x1.txt", "x11 \nyyy\n"); + Editor editor2 = createHeavyEditor("x2.txt", "x22 \nyyy\n"); + + type(' ', editor1, getProject()); + type(' ', editor2, getProject()); + FileDocumentManager.getInstance().saveAllDocuments(); + assertEquals("x11\nyyy\n", editor1.getDocument().getText()); + assertEquals("x22 \nyyy\n", editor2.getDocument().getText()); // caret in the way in second but not in the first + } + + @NotNull + private static Editor createHeavyEditor(@NotNull String name, @NotNull String text) throws IOException { + VirtualFile myVFile = getSourceRoot().createChildData(null, name); + VfsUtil.saveText(myVFile, text); + final FileDocumentManager manager = FileDocumentManager.getInstance(); + final Document document = manager.getDocument(myVFile); + manager.reloadFromDisk(document); + Editor editor = createEditor(myVFile); + EditorTestUtil.CaretAndSelectionState caretsState = EditorTestUtil.extractCaretAndSelectionMarkers(document); + EditorTestUtil.setCaretsAndSelection(editor, caretsState); + return editor; + } } \ No newline at end of file