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