package org.elixir_lang.configuration;
import com.intellij.compiler.options.CompilerConfigurable;
import com.intellij.ide.DataManager;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.ex.Settings;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.ObjectUtils;
import org.elixir_lang.mix.settings.MixSettings;
import org.elixir_lang.settings.ElixirExternalToolsConfigurable;
import org.elixir_lang.utils.AncestorAdapter;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.event.AncestorEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* Created by zyuyou on 15/7/6.
*/
public class ElixirCompilerOptionsConfigurable extends CompilerConfigurable {
private JPanel myRootPanel;
private JCheckBox myUseMixCompilerCheckBox;
private JCheckBox myAttachDebugInfoCheckBox;
private JButton myConfigureMixButton;
private JCheckBox myIgnoreModuleConflictCheckBox;
private JCheckBox myAttachDocsCheckBox;
private JCheckBox myWarningsAsErrorsCheckBox;
private final ElixirCompilerSettings mySettings;
private final Project myProject;
public ElixirCompilerOptionsConfigurable(Project project) {
super(project);
myProject = project;
mySettings = ElixirCompilerSettings.getInstance(project);
/*
* for now, --warnings-as-errors not like erlang's warn_as_error, it just return non-zero exit code
* @see https://github.com/elixir-lang/elixir/issues/3116#issuecomment-87316125
* */
myWarningsAsErrorsCheckBox.setVisible(false);
setupUiListeners();
}
private void setupUiListeners(){
myConfigureMixButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DataContext context = DataManager.getInstance().getDataContext(myConfigureMixButton);
Settings settings = ObjectUtils.assertNotNull(Settings.KEY.getData(context));
Configurable configurable = settings.find(ElixirExternalToolsConfigurable.ELIXIR_RELATED_TOOLS);
if(configurable != null){
settings.select(configurable);
}
}
});
myRootPanel.addAncestorListener(new AncestorAdapter(){
@Override
public void ancestorAdded(AncestorEvent event) {
reset();
}
});
}
@NotNull
@Override
public String getId() {
return "Elixir compiler";
}
@Override
public String getDisplayName() {
return "Elixir Compiler";
}
@Override
public JComponent createComponent() {
return myRootPanel;
}
@Override
public void reset() {
boolean mixPathIsSet = StringUtil.isNotEmpty(MixSettings.getInstance(myProject).getMixPath());
myConfigureMixButton.setVisible(!mixPathIsSet);
myUseMixCompilerCheckBox.setEnabled(mixPathIsSet);
myUseMixCompilerCheckBox.setSelected(mixPathIsSet && mySettings.isUseMixCompilerEnabled());
myAttachDocsCheckBox.setSelected(mySettings.isAttachDocsEnabled());
myAttachDebugInfoCheckBox.setSelected(mySettings.isAttachDebugInfoEnabled());
myWarningsAsErrorsCheckBox.setSelected(mySettings.isWarningsAsErrorsEnabled());
myIgnoreModuleConflictCheckBox.setSelected(mySettings.isIgnoreModuleConflictEnabled());
}
@Override
public void apply() throws ConfigurationException {
mySettings.setUseMixCompilerEnabled(myUseMixCompilerCheckBox.isSelected());
mySettings.setAttachDocsEnabled(myAttachDocsCheckBox.isSelected());
mySettings.setAttachDebugInfoEnabled(myAttachDebugInfoCheckBox.isSelected());
mySettings.setWarningsAsErrorsEnabled(myWarningsAsErrorsCheckBox.isSelected());
mySettings.setIgnoreModuleConflictEnabled(myIgnoreModuleConflictCheckBox.isSelected());
}
@Override
public boolean isModified() {
return myUseMixCompilerCheckBox.isSelected() != mySettings.isUseMixCompilerEnabled() ||
myAttachDocsCheckBox.isSelected() != mySettings.isAttachDocsEnabled() ||
myAttachDebugInfoCheckBox.isSelected() != mySettings.isAttachDebugInfoEnabled() ||
myWarningsAsErrorsCheckBox.isSelected() != mySettings.isWarningsAsErrorsEnabled() ||
myIgnoreModuleConflictCheckBox.isSelected() != mySettings.isIgnoreModuleConflictEnabled();
}
}