summaryrefslogtreecommitdiff
path: root/plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java')
-rw-r--r--plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java95
1 files changed, 95 insertions, 0 deletions
diff --git a/plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java b/plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java
new file mode 100644
index 000000000000..1291ffd297f0
--- /dev/null
+++ b/plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java
@@ -0,0 +1,95 @@
+package org.editorconfig.configmanagement;
+
+import com.intellij.openapi.application.ApplicationManager;
+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.fileEditor.FileEditorManager;
+import com.intellij.openapi.fileEditor.FileEditorManagerEvent;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.wm.IdeFrame;
+import com.intellij.openapi.wm.StatusBar;
+import com.intellij.openapi.wm.StatusBarWidget;
+import com.intellij.openapi.wm.WindowManager;
+import com.intellij.openapi.wm.impl.status.LineSeparatorPanel;
+import com.intellij.util.LineSeparator;
+import org.editorconfig.Utils;
+import org.editorconfig.core.EditorConfig;
+import org.editorconfig.plugincomponents.SettingsProviderComponent;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * @author Dennis.Ushakov
+ */
+public class LineEndingsManager extends FileDocumentManagerAdapter {
+ // Handles the following EditorConfig settings:
+ private static final String lineEndingsKey = "end_of_line";
+
+ private final Logger LOG = Logger.getInstance("#org.editorconfig.codestylesettings.LineEndingsManager");
+ private final Project project;
+ private boolean statusBarUpdated = false;
+
+ public LineEndingsManager(Project project) {
+ this.project = project;
+ }
+
+ @Override
+ public void beforeAllDocumentsSaving() {
+ statusBarUpdated = false;
+ }
+
+ private void updateStatusBar() {
+ ApplicationManager.getApplication().invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ IdeFrame frame = WindowManager.getInstance().getIdeFrame(project);
+ StatusBar statusBar = frame.getStatusBar();
+ StatusBarWidget widget = statusBar != null ? statusBar.getWidget("LineSeparator") : null;
+
+ if (widget instanceof LineSeparatorPanel) {
+ FileEditorManagerEvent event = new FileEditorManagerEvent(FileEditorManager.getInstance(project),
+ null, null, null, null);
+ ((LineSeparatorPanel)widget).selectionChanged(event);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void beforeDocumentSaving(@NotNull Document document) {
+ VirtualFile file = FileDocumentManager.getInstance().getFile(document);
+ applySettings(file);
+ }
+
+ private void applySettings(VirtualFile file) {
+ if (file == null || !file.isInLocalFileSystem()) return;
+
+ final String filePath = file.getCanonicalPath();
+ final List<EditorConfig.OutPair> outPairs = SettingsProviderComponent.getInstance().getOutPairs(filePath);
+ final String lineEndings = Utils.configValueForKey(outPairs, lineEndingsKey);
+ if (!lineEndings.isEmpty()) {
+ try {
+ LineSeparator separator = LineSeparator.valueOf(lineEndings.toUpperCase(Locale.US));
+ String oldSeparator = file.getDetectedLineSeparator();
+ String newSeparator = separator.getSeparatorString();
+ if (!StringUtil.equals(oldSeparator, newSeparator)) {
+ file.setDetectedLineSeparator(newSeparator);
+ if (!statusBarUpdated) {
+ statusBarUpdated = true;
+ updateStatusBar();
+ }
+ LOG.debug(Utils.appliedConfigMessage(lineEndings, lineEndingsKey, filePath));
+ }
+ }
+ catch (IllegalArgumentException e) {
+ LOG.warn(Utils.invalidConfigMessage(lineEndings, lineEndingsKey, filePath));
+ }
+ }
+ }
+}