package org.asciidoc.intellij.settings;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.ui.CollectionComboBoxModel;
import com.intellij.ui.EnumComboBoxModel;
import com.intellij.ui.components.JBLabel;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.UIUtil;
import org.asciidoc.intellij.editor.AsciiDocHtmlPanel;
import org.asciidoc.intellij.editor.AsciiDocHtmlPanelProvider;
import org.asciidoc.intellij.editor.AsciiDocPreviewEditor;
import org.asciidoc.intellij.ui.SplitFileEditor;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.event.ItemEvent;
import java.util.List;
public class AsciiDocPreviewSettingsForm implements AsciiDocPreviewSettings.Holder {
private Object myLastItem;
private ComboBox myPreviewProvider;
private ComboBox myDefaultSplitLayout;
private ComboBox myPreviewThemeLayout;
private JPanel myMainPanel;
private EnumComboBoxModel<SplitFileEditor.SplitEditorLayout> mySplitLayoutModel;
private EnumComboBoxModel<AsciiDocHtmlPanel.PreviewTheme> myPreviewThemeModel;
private CollectionComboBoxModel<AsciiDocHtmlPanelProvider.ProviderInfo> myPreviewPanelModel;
public JComponent getComponent() {
return myMainPanel;
}
private void createUIComponents() {
//noinspection unchecked
final List<AsciiDocHtmlPanelProvider.ProviderInfo> providerInfos =
ContainerUtil.mapNotNull(AsciiDocHtmlPanelProvider.getProviders(),
provider -> {
if (provider.isAvailable() == AsciiDocHtmlPanelProvider.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);
myPreviewThemeModel = new EnumComboBoxModel<>(AsciiDocHtmlPanel.PreviewTheme.class);
myPreviewThemeLayout = new ComboBox(myPreviewThemeModel);
myLastItem = myPreviewProvider.getSelectedItem();
myPreviewProvider.addItemListener(e -> {
final Object item = e.getItem();
if (e.getStateChange() != ItemEvent.SELECTED || !(item instanceof AsciiDocHtmlPanelProvider.ProviderInfo)) {
return;
}
final AsciiDocHtmlPanelProvider provider = AsciiDocHtmlPanelProvider.createFromInfo((AsciiDocHtmlPanelProvider.ProviderInfo)item);
final AsciiDocHtmlPanelProvider.AvailabilityInfo availability = provider.isAvailable();
if (!availability.checkAvailability(myMainPanel)) {
myPreviewProvider.setSelectedItem(myLastItem);
}
else {
myLastItem = item;
}
});
}
@Override
public void setAsciiDocPreviewSettings(@NotNull AsciiDocPreviewSettings settings) {
if (myPreviewPanelModel.contains(settings.getHtmlPanelProviderInfo())) {
myPreviewPanelModel.setSelectedItem(settings.getHtmlPanelProviderInfo());
}
mySplitLayoutModel.setSelectedItem(settings.getSplitEditorLayout());
myPreviewThemeModel.setSelectedItem(settings.getPreviewTheme());
}
@NotNull
@Override
public AsciiDocPreviewSettings getAsciiDocPreviewSettings() {
if (myPreviewPanelModel.getSelected() == null) {
throw new IllegalStateException("Should be selected always");
}
return new AsciiDocPreviewSettings(mySplitLayoutModel.getSelectedItem(),
myPreviewPanelModel.getSelected(), myPreviewThemeModel.getSelectedItem());
}
}