package com.jaumard.sails; import com.intellij.ide.util.projectWizard.SettingsStep; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.ValidationInfo; import com.intellij.openapi.util.text.StringUtil; import com.intellij.platform.WebProjectGenerator; import com.intellij.ui.TextFieldWithHistoryWithBrowseButton; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.FormBuilder; import com.jaumard.sails.bundle.SailsJSBundle; import com.jaumard.sails.settings.SailsJSConfig; import com.jaumard.sails.utils.SailsJSCommandLine; import com.jaumard.sails.utils.SailsJSUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.List; import java.util.concurrent.ConcurrentMap; /** * Created by jaumard on 04/04/2015. */ public class SailsJSProjectPeer implements WebProjectGenerator.GeneratorPeer<SailsJSProjectGenerator.SailsJSProjectSettings> { private ComboBox ppCSS; private final List<WebProjectGenerator.SettingsStateListener> myStateListeners = ContainerUtil.createLockFreeCopyOnWriteList(); private TextFieldWithHistoryWithBrowseButton myExecutablePathField; private TextFieldWithHistoryWithBrowseButton myNPMExecutablePathField; private final ConcurrentMap<String, Boolean> myValidateCache = ContainerUtil.newConcurrentMap(); SailsJSProjectPeer() { } @NotNull @Override public JComponent getComponent() { setFields(); JPanel panel = FormBuilder.createFormBuilder() .addLabeledComponent(SailsJSBundle.message("sails.conf.name") + " :", myExecutablePathField) .addLabeledComponent(SailsJSBundle.message("sails.conf.npm.executable.name") + " :", myNPMExecutablePathField) .addLabeledComponent(SailsJSBundle.message("sails.conf.ppCSS") + " :", ppCSS) .getPanel(); return panel; } @Override public void buildUI(@NotNull SettingsStep settingsStep) { setFields(); settingsStep.addSettingsField(SailsJSBundle.message("sails.conf.executable.name") + " :", myExecutablePathField); settingsStep.addSettingsField(SailsJSBundle.message("sails.conf.npm.executable.name"), myNPMExecutablePathField); settingsStep.addSettingsField(SailsJSBundle.message("sails.conf.ppCSS") + " :", ppCSS); } @NotNull @Override public SailsJSProjectGenerator.SailsJSProjectSettings getSettings() { SailsJSProjectGenerator.SailsJSProjectSettings settings = new SailsJSProjectGenerator.SailsJSProjectSettings(); SailsJSConfig.getInstance().setExecutablePath(myExecutablePathField.getText()); SailsJSConfig.getInstance().setDefaultPPCSS((String) ppCSS.getSelectedItem()); SailsJSConfig.getInstance().setNpmExecutable(myNPMExecutablePathField.getText()); settings.setExecutable(myExecutablePathField.getText()); settings.setNpmExecutable(myNPMExecutablePathField.getText()); settings.setPpCSS((String) ppCSS.getSelectedItem()); return settings; } private void setFields() { if (ppCSS == null) { ppCSS = new ComboBox(new String[]{SailsJSProjectGenerator.SailsJSProjectSettings.PPCSS_SASS, SailsJSProjectGenerator.SailsJSProjectSettings.PPCSS_LESS}); ppCSS.setSelectedItem(SailsJSConfig.getInstance().getDefaultPPCSS()); } if (myNPMExecutablePathField == null) { myNPMExecutablePathField = SailsJSUtil.createNPMExecutableTextField(null); } if (myExecutablePathField == null) { myExecutablePathField = SailsJSUtil.createSailsJSExecutableTextField(null); } } @Nullable @Override public ValidationInfo validate() { String path = myExecutablePathField.getText(); boolean error; if (myValidateCache.containsKey(path)) { error = myValidateCache.get(path); } else { try { if (StringUtil.isEmpty(path)) { return new ValidationInfo("Please select path to executable"); } new SailsJSCommandLine(path, null).version(); error = false; } catch (Exception e) { error = true; } myValidateCache.put(path, error); } return error ? new ValidationInfo("Incorrect Sails/Treeline executable") : null; } @Override public boolean isBackgroundJobRunning() { return false; } @Override public void addSettingsStateListener(@NotNull WebProjectGenerator.SettingsStateListener listener) { myStateListeners.add(listener); } }