package org.intellij.plugins.markdown.settings; import com.intellij.ide.highlighter.HighlighterFactory; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.EditorSettings; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.fileTypes.UnknownFileType; import com.intellij.ui.ColorUtil; import com.intellij.ui.components.JBCheckBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MarkdownCssSettingsForm implements MarkdownCssSettings.Holder, Disposable { private JPanel myMainPanel; private JBCheckBox myCssFromURIEnabled; private JTextField myCssURI; private JBCheckBox myApplyCustomCssText; private JPanel myEditorPanel; @NotNull private String myCssText = ""; @Nullable private Editor myEditor; @NotNull private final ActionListener myUpdateListener; public MarkdownCssSettingsForm() { myUpdateListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { myCssURI.setEnabled(myCssFromURIEnabled.isSelected()); if (myEditor != null && !myEditor.isDisposed()) { final boolean canEditCss = myApplyCustomCssText.isSelected(); myEditor.getDocument().setReadOnly(!canEditCss); myEditor.getSettings().setCaretRowShown(canEditCss); Color baseColor = myEditor.getColorsScheme().getDefaultBackground(); if (canEditCss) { ((EditorEx)myEditor).setBackgroundColor(baseColor); } else { ((EditorEx)myEditor).setBackgroundColor(ColorUtil.isDark(baseColor) ? ColorUtil.brighter(baseColor, 1) : ColorUtil.darker(baseColor, 1)); } } } }; myCssFromURIEnabled.addActionListener(myUpdateListener); myApplyCustomCssText.addActionListener(myUpdateListener); } public JComponent getComponent() { return myMainPanel; } private void createUIComponents() { myEditorPanel = new JPanel(new BorderLayout()); myEditor = createEditor(); myEditorPanel.add(myEditor.getComponent(), BorderLayout.CENTER); } @NotNull private static Editor createEditor() { EditorFactory editorFactory = EditorFactory.getInstance(); Document editorDocument = editorFactory.createDocument(""); EditorEx editor = (EditorEx)editorFactory.createEditor(editorDocument); fillEditorSettings(editor.getSettings()); setHighlighting(editor); return editor; } private static void setHighlighting(EditorEx editor) { final FileType cssFileType = FileTypeManager.getInstance().getFileTypeByExtension("css"); if (cssFileType == UnknownFileType.INSTANCE) { return; } final EditorHighlighter editorHighlighter = HighlighterFactory.createHighlighter(cssFileType, EditorColorsManager.getInstance().getGlobalScheme(), null); editor.setHighlighter(editorHighlighter); } private static void fillEditorSettings(final EditorSettings editorSettings) { editorSettings.setWhitespacesShown(false); editorSettings.setLineMarkerAreaShown(false); editorSettings.setIndentGuidesShown(false); editorSettings.setLineNumbersShown(true); editorSettings.setFoldingOutlineShown(false); editorSettings.setAdditionalColumnsCount(1); editorSettings.setAdditionalLinesCount(1); editorSettings.setUseSoftWraps(false); } @Override public void setMarkdownCssSettings(@NotNull MarkdownCssSettings settings) { myCssFromURIEnabled.setSelected(settings.isUriEnabled()); myCssURI.setText(settings.getStylesheetUri()); myApplyCustomCssText.setSelected(settings.isTextEnabled()); myCssText = settings.getStylesheetText(); if (myEditor != null && !myEditor.isDisposed()) { ApplicationManager.getApplication().runWriteAction(() -> myEditor.getDocument().setText(myCssText)); } //noinspection ConstantConditions myUpdateListener.actionPerformed(null); } @NotNull @Override public MarkdownCssSettings getMarkdownCssSettings() { if (myEditor != null && !myEditor.isDisposed()) { myCssText = ReadAction.compute(() -> myEditor.getDocument().getText()); } return new MarkdownCssSettings(myCssFromURIEnabled.isSelected(), myCssURI.getText(), myApplyCustomCssText.isSelected(), myCssText); } @Override public void dispose() { if (myEditor != null && !myEditor.isDisposed()) { EditorFactory.getInstance().releaseEditor(myEditor); } myEditor = null; } }