package org.intellij.plugins.markdown.settings;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.ui.CollectionComboBoxModel;
import com.intellij.ui.EnumComboBoxModel;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import org.intellij.plugins.markdown.ui.preview.MarkdownHtmlPanelProvider;
import org.intellij.plugins.markdown.ui.split.SplitFileEditor;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.List;
public class MarkdownPreviewSettingsForm implements MarkdownPreviewSettings.Holder {
private Object myLastItem;
private ComboBox myPreviewProvider;
private ComboBox myDefaultSplitLayout;
private JPanel myMainPanel;
private JBCheckBox myUseGrayscaleRenderingForJBCheckBox;
private EnumComboBoxModel<SplitFileEditor.SplitEditorLayout> mySplitLayoutModel;
private CollectionComboBoxModel<MarkdownHtmlPanelProvider.ProviderInfo> myPreviewPanelModel;
public JComponent getComponent() {
return myMainPanel;
}
private void createUIComponents() {
//noinspection unchecked
final List<MarkdownHtmlPanelProvider.ProviderInfo> providerInfos =
ContainerUtil.mapNotNull(MarkdownHtmlPanelProvider.getProviders(),
provider -> {
if (provider.isAvailable() == MarkdownHtmlPanelProvider.AvailabilityInfo.UNAVAILABLE) {
return null;
}
return provider.getProviderInfo();
});
myPreviewPanelModel = new CollectionComboBoxModel<>(providerInfos, providerInfos.get(0));
myPreviewProvider = new ComboBox(myPreviewPanelModel);
mySplitLayoutModel = new EnumComboBoxModel<>(SplitFileEditor.SplitEditorLayout.class);
myDefaultSplitLayout = new ComboBox(mySplitLayoutModel);
myLastItem = myPreviewProvider.getSelectedItem();
myPreviewProvider.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
final Object item = e.getItem();
if (e.getStateChange() != ItemEvent.SELECTED || !(item instanceof MarkdownHtmlPanelProvider.ProviderInfo)) {
return;
}
final MarkdownHtmlPanelProvider provider = MarkdownHtmlPanelProvider.createFromInfo((MarkdownHtmlPanelProvider.ProviderInfo)item);
final MarkdownHtmlPanelProvider.AvailabilityInfo availability = provider.isAvailable();
if (!availability.checkAvailability(myMainPanel)) {
myPreviewProvider.setSelectedItem(myLastItem);
}
else {
myLastItem = item;
updateUseGrayscaleEnabled();
}
}
});
}
private void updateUseGrayscaleEnabled() {
final MarkdownHtmlPanelProvider.ProviderInfo selected = myPreviewPanelModel.getSelected();
myUseGrayscaleRenderingForJBCheckBox.setEnabled(selected != null && selected.getClassName().contains("JavaFxHtmlPanelProvider"));
}
@Override
public void setMarkdownPreviewSettings(@NotNull MarkdownPreviewSettings settings) {
if (myPreviewPanelModel.contains(settings.getHtmlPanelProviderInfo())) {
myPreviewPanelModel.setSelectedItem(settings.getHtmlPanelProviderInfo());
}
mySplitLayoutModel.setSelectedItem(settings.getSplitEditorLayout());
myUseGrayscaleRenderingForJBCheckBox.setSelected(settings.isUseGrayscaleRendering());
updateUseGrayscaleEnabled();
}
@NotNull
@Override
public MarkdownPreviewSettings getMarkdownPreviewSettings() {
if (myPreviewPanelModel.getSelected() == null) {
throw new IllegalStateException("Should be selected always");
}
return new MarkdownPreviewSettings(mySplitLayoutModel.getSelectedItem(),
myPreviewPanelModel.getSelected(),
myUseGrayscaleRenderingForJBCheckBox.isSelected());
}
}