diff options
Diffstat (limited to 'plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java')
-rw-r--r-- | plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java | 95 |
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)); + } + } + } +} |