diff options
Diffstat (limited to 'plugins/editorconfig/src/org/editorconfig/configmanagement/EditorSettingsManager.java')
-rw-r--r-- | plugins/editorconfig/src/org/editorconfig/configmanagement/EditorSettingsManager.java | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/plugins/editorconfig/src/org/editorconfig/configmanagement/EditorSettingsManager.java b/plugins/editorconfig/src/org/editorconfig/configmanagement/EditorSettingsManager.java new file mode 100644 index 000000000000..0a062d4d6e04 --- /dev/null +++ b/plugins/editorconfig/src/org/editorconfig/configmanagement/EditorSettingsManager.java @@ -0,0 +1,85 @@ +package org.editorconfig.configmanagement; + +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; +import com.intellij.openapi.editor.impl.TrailingSpacesStripper; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.fileEditor.FileDocumentManagerAdapter; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.vfs.VirtualFile; +import org.editorconfig.Utils; +import org.editorconfig.core.EditorConfig; +import org.editorconfig.plugincomponents.SettingsProviderComponent; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class EditorSettingsManager extends FileDocumentManagerAdapter { + // Handles the following EditorConfig settings: + private static final String trimTrailingWhitespaceKey = "trim_trailing_whitespace"; + private static final String insertFinalNewlineKey = "insert_final_newline"; + private static final Map<String, String> trimMap; + + static { + Map<String, String> map = new HashMap<String, String>(); + map.put("true", EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE); + map.put("false", EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE); + trimMap = Collections.unmodifiableMap(map); + } + + private static final Map<String, Boolean> newlineMap; + + static { + Map<String, Boolean> map = new HashMap<String, Boolean>(); + map.put("true", Boolean.TRUE); + map.put("false", Boolean.FALSE); + newlineMap = Collections.unmodifiableMap(map); + } + + private static final Logger LOG = Logger.getInstance("#org.editorconfig.configmanagement.EditorSettingsManager"); + + @Override + public void beforeDocumentSaving(@NotNull Document document) { + // This is fired when any document is saved, regardless of whether it is part of a save-all or + // a save-one operation + final VirtualFile file = FileDocumentManager.getInstance().getFile(document); + applySettings(file); + } + + private static void applySettings(VirtualFile file) { + if (file == null || !file.isInLocalFileSystem()) return; + // Get editorconfig settings + final String filePath = file.getCanonicalPath(); + final SettingsProviderComponent settingsProvider = SettingsProviderComponent.getInstance(); + final List<EditorConfig.OutPair> outPairs = settingsProvider.getOutPairs(filePath); + // Apply trailing spaces setting + final String trimTrailingWhitespace = Utils.configValueForKey(outPairs, trimTrailingWhitespaceKey); + applyConfigValueToUserData(file, TrailingSpacesStripper.OVERRIDE_STRIP_TRAILING_SPACES_KEY, + trimTrailingWhitespaceKey, trimTrailingWhitespace, trimMap); + // Apply final newline setting + final String insertFinalNewline = Utils.configValueForKey(outPairs, insertFinalNewlineKey); + applyConfigValueToUserData(file, TrailingSpacesStripper.OVERRIDE_ENSURE_NEWLINE_KEY, + insertFinalNewlineKey, insertFinalNewline, newlineMap); + } + + private static <T> void applyConfigValueToUserData(VirtualFile file, Key<T> userDataKey, String editorConfigKey, + String configValue, Map<String, T> configMap) { + if (configValue.isEmpty()) { + file.putUserData(userDataKey, null); + } + else { + final T data = configMap.get(configValue); + if (data == null) { + LOG.warn(Utils.invalidConfigMessage(configValue, editorConfigKey, file.getCanonicalPath())); + } + else { + file.putUserData(userDataKey, data); + LOG.debug("Applied " + editorConfigKey + " settings for: " + file.getCanonicalPath()); + } + } + } +} |