package fr.adrienbrault.idea.symfony2plugin.installer;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.ui.ValidationInfo;
import com.intellij.ui.ListCellRendererWrapper;
import com.intellij.util.ui.UIUtil;
import com.jetbrains.php.composer.InterpretersComboWithBrowseButton;
import fr.adrienbrault.idea.symfony2plugin.installer.dict.SymfonyInstallerVersion;
import org.apache.commons.lang.StringUtils;
import org.jdesktop.swingx.combobox.ListComboBoxModel;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.ItemEvent;
import java.util.ArrayList;
import java.util.List;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class SymfonyInstallerForm {
private JComboBox comboVersions;
private JButton buttonRefresh;
private JPanel mainPanel;
private JPanel panelInterpreter;
private JCheckBox checkBoxDemo;
private InterpretersComboWithBrowseButton interpretersComboWithBrowseButton;
public SymfonyInstallerForm() {
checkBoxDemo.addItemListener(e -> {
boolean state = e.getStateChange() != ItemEvent.SELECTED;
buttonRefresh.setEnabled(state);
comboVersions.setEnabled(state);
});
buttonRefresh.addActionListener(e -> appendSymfonyVersions());
// @TODO: use com.intellij.util.ui.ReloadableComboBoxPanel in Phpstorm9 api level
comboVersions.setRenderer(new ListCellRenderer());
appendSymfonyVersions();
}
@Nullable
private List<SymfonyInstallerVersion> getVersions() {
String content = SymfonyInstallerUtil.getDownloadVersions();
if(content == null) {
return null;
}
return SymfonyInstallerUtil.getVersions(content);
}
private void appendSymfonyVersions()
{
comboVersions.setModel(new ListComboBoxModel<>(new ArrayList<>()));
ApplicationManager.getApplication().executeOnPooledThread(() -> {
final List<SymfonyInstallerVersion> symfonyInstallerVersions1 = getVersions();
if (symfonyInstallerVersions1 != null) {
UIUtil.invokeLaterIfNeeded(() -> comboVersions.setModel(new ListComboBoxModel<>(symfonyInstallerVersions1)));
}
});
}
public JComponent getContentPane()
{
return this.mainPanel;
}
private void createUIComponents() {
panelInterpreter = interpretersComboWithBrowseButton = new InterpretersComboWithBrowseButton(ProjectManager.getInstance().getDefaultProject());
}
private static class ListCellRenderer extends ListCellRendererWrapper<SymfonyInstallerVersion> {
@Override
public void customize(JList list, SymfonyInstallerVersion value, int index, boolean selected, boolean hasFocus) {
if(value != null) {
setText(value.getPresentableName());
}
}
}
public SymfonyInstallerVersion getVersion() {
if(checkBoxDemo.isSelected()) {
return new SymfonyInstallerVersion("demo", "Demo Application");
}
Object selectedItem = this.comboVersions.getSelectedItem();
if(selectedItem instanceof SymfonyInstallerVersion) {
return ((SymfonyInstallerVersion) selectedItem);
}
return null;
}
public String getInterpreter() {
String text = interpretersComboWithBrowseButton.getText();
if(StringUtils.isNotBlank(text)) {
return text;
}
return this.interpretersComboWithBrowseButton.getPhpPath();
}
@Nullable
public ValidationInfo validate()
{
return this.interpretersComboWithBrowseButton.validatePhpPath(ProjectManager.getInstance().getDefaultProject());
}
}