package org.elixir_lang.settings;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.TitledSeparator;
import org.elixir_lang.mix.settings.MixConfigurationForm;
import org.elixir_lang.mix.settings.MixSettings;
import org.elixir_lang.sdk.ElixirSdkForSmallIdes;
import org.elixir_lang.sdk.ElixirSdkType;
import org.elixir_lang.sdk.ElixirSystemUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
/**
* Created by zyuyou on 2015/5/26.
*/
public class ElixirExternalToolsConfigurable implements SearchableConfigurable, Configurable.NoScroll{
public static final String ELIXIR_RELATED_TOOLS = "Elixir External Tools";
/* Form Values */
private JPanel myPanel;
private MixConfigurationForm myMixConfigurationForm;
private TitledSeparator mySdkTitledSeparator;
private JLabel mySdkPathLabel;
private TextFieldWithBrowseButton mySdkPathSelector;
/* Self Defined Values */
private final Project myProject;
private MixSettings myMixSettings;
public ElixirExternalToolsConfigurable(@NotNull Project project){
myProject = project;
myMixSettings = MixSettings.getInstance(project);
mySdkPathSelector.addBrowseFolderListener("Select Elixir SDK path", "", null,
FileChooserDescriptorFactory.createSingleFolderDescriptor().withTitle("Elixir SDK Root"));
if(StringUtil.isEmpty(myMixSettings.getMixPath())){
VirtualFile baseDir = project.getBaseDir();
if(baseDir != null){
VirtualFile mix = baseDir.findChild("mix");
if(mix != null){
String canonicalPath = mix.getCanonicalPath();
if(canonicalPath != null){
myMixSettings.setMixPath(canonicalPath);
}
}
}
}
if(!ElixirSystemUtil.isSmallIde()){
mySdkPathLabel.setVisible(false);
mySdkPathSelector.setVisible(false);
mySdkTitledSeparator.setVisible(false);
}
reset();
}
@Nullable
@Override
public JComponent createComponent() {
myMixConfigurationForm.createComponent();
return myPanel;
}
@NotNull
@Override
public String getId() {
return ELIXIR_RELATED_TOOLS;
}
@Nls
@Override
public String getDisplayName() {
return ELIXIR_RELATED_TOOLS;
}
@Nullable
@Override
public String getHelpTopic() {
return null;
}
@Nullable
@Override
public Runnable enableSearch(String option) {
return null;
}
@Override
public void apply() throws ConfigurationException {
myMixSettings.setMixPath(myMixConfigurationForm.getPath());
myMixSettings.setSupportsFormatterOption(myMixConfigurationForm.getSupportsFormatterOption());
if(ElixirSystemUtil.isSmallIde()){
ElixirSdkForSmallIdes.setUpOrUpdateSdk(myProject, mySdkPathSelector.getText());
}
}
@Override
public boolean isModified() {
return !myMixSettings.getMixPath().equals(myMixConfigurationForm.getPath())
|| !StringUtil.notNullize(ElixirSdkType.getSdkPath(myProject)).equals(mySdkPathSelector.getText());
}
@Override
public void disposeUIResources() {
}
@Override
public void reset() {
myMixConfigurationForm.setPath(myMixSettings.getMixPath());
mySdkPathSelector.setText(StringUtil.notNullize(ElixirSdkType.getSdkPath(myProject)));
}
}