package org.intellij.plugins.markdown.settings; import com.intellij.ide.ui.LafManager; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; import com.intellij.util.messages.Topic; import com.intellij.util.xmlb.XmlSerializerUtil; import com.intellij.util.xmlb.annotations.Property; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @State( name = "MarkdownApplicationSettings", storages = @Storage("markdown.xml") ) public class MarkdownApplicationSettings implements PersistentStateComponent<MarkdownApplicationSettings.State>, MarkdownCssSettings.Holder, MarkdownPreviewSettings.Holder { private State myState = new State(); public MarkdownApplicationSettings() { final MarkdownLAFListener lafListener = new MarkdownLAFListener(); LafManager.getInstance().addLafManagerListener(lafListener); // Let's init proper CSS scheme ApplicationManager.getApplication().invokeLater( () -> lafListener.updateCssSettingsForced(MarkdownLAFListener.isDarcula())); } @NotNull public static MarkdownApplicationSettings getInstance() { return ServiceManager.getService(MarkdownApplicationSettings.class); } @Nullable @Override public State getState() { return myState; } @Override public void loadState(State state) { XmlSerializerUtil.copyBean(state, myState); } @Override public void setMarkdownCssSettings(@NotNull MarkdownCssSettings settings) { myState.myCssSettings = settings; ApplicationManager.getApplication().getMessageBus().syncPublisher(SettingsChangedListener.TOPIC).onSettingsChange(this); } @NotNull @Override public MarkdownCssSettings getMarkdownCssSettings() { return myState.myCssSettings; } @Override public void setMarkdownPreviewSettings(@NotNull MarkdownPreviewSettings settings) { myState.myPreviewSettings = settings; ApplicationManager.getApplication().getMessageBus().syncPublisher(SettingsChangedListener.TOPIC).onSettingsChange(this); } @NotNull @Override public MarkdownPreviewSettings getMarkdownPreviewSettings() { return myState.myPreviewSettings; } public static class State { @Property(surroundWithTag = false) @NotNull private MarkdownCssSettings myCssSettings = MarkdownCssSettings.DEFAULT; @Property(surroundWithTag = false) @NotNull private MarkdownPreviewSettings myPreviewSettings = MarkdownPreviewSettings.DEFAULT; } public interface SettingsChangedListener { Topic<SettingsChangedListener> TOPIC = Topic.create("MarkdownApplicationSettingsChanged", SettingsChangedListener.class); void onSettingsChange(@NotNull MarkdownApplicationSettings settings); } }