diff options
Diffstat (limited to 'plugins/editorconfig/src/org/editorconfig/configmanagement/EncodingManager.java')
-rw-r--r-- | plugins/editorconfig/src/org/editorconfig/configmanagement/EncodingManager.java | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/plugins/editorconfig/src/org/editorconfig/configmanagement/EncodingManager.java b/plugins/editorconfig/src/org/editorconfig/configmanagement/EncodingManager.java new file mode 100644 index 000000000000..919f0861055f --- /dev/null +++ b/plugins/editorconfig/src/org/editorconfig/configmanagement/EncodingManager.java @@ -0,0 +1,73 @@ +package org.editorconfig.configmanagement; + +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.fileEditor.FileDocumentManagerAdapter; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.encoding.EncodingProjectManager; +import org.editorconfig.Utils; +import org.editorconfig.core.EditorConfig.OutPair; +import org.editorconfig.plugincomponents.SettingsProviderComponent; +import org.jetbrains.annotations.NotNull; + +import java.nio.charset.Charset; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class EncodingManager extends FileDocumentManagerAdapter { + // Handles the following EditorConfig settings: + private static final String charsetKey = "charset"; + + private final Logger LOG = Logger.getInstance("#org.editorconfig.codestylesettings.EncodingManager"); + private final Project project; + + private static final Map<String, Charset> encodingMap; + + static { + Map<String, Charset> map = new HashMap<String, Charset>(); + map.put("latin1", Charset.forName("ISO-8859-1")); + map.put("utf-8", Charset.forName("UTF-8")); + map.put("utf-16be", Charset.forName("UTF-16BE")); + map.put("utf-16le", Charset.forName("UTF-16LE")); + encodingMap = Collections.unmodifiableMap(map); + } + + private boolean isApplyingSettings; + + public EncodingManager(Project project) { + this.project = project; + isApplyingSettings = false; + } + + @Override + public void beforeDocumentSaving(@NotNull Document document) { + final VirtualFile file = FileDocumentManager.getInstance().getFile(document); + if (!isApplyingSettings) { + applySettings(file); + } + } + + private void applySettings(VirtualFile file) { + if (file == null || !file.isInLocalFileSystem()) return; + // Prevent "setEncoding" calling "saveAll" from causing an endless loop + isApplyingSettings = true; + final String filePath = file.getCanonicalPath(); + final List<OutPair> outPairs = SettingsProviderComponent.getInstance().getOutPairs(filePath); + final EncodingProjectManager encodingProjectManager = EncodingProjectManager.getInstance(project); + final String charset = Utils.configValueForKey(outPairs, charsetKey); + if (!charset.isEmpty()) { + if (encodingMap.containsKey(charset)) { + encodingProjectManager.setEncoding(file, encodingMap.get(charset)); + LOG.debug(Utils.appliedConfigMessage(charset, charsetKey, filePath)); + } + else { + LOG.warn(Utils.invalidConfigMessage(charset, charsetKey, filePath)); + } + } + isApplyingSettings = false; + } +} |