Package org.editorconfig.configmanagement

Source Code of org.editorconfig.configmanagement.LineEndingsManager

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));
            }
        }
    }
}
TOP

Related Classes of org.editorconfig.configmanagement.LineEndingsManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.