package com.intellij.lang.javascript.flex.sdk; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.projectRoots.AdditionalDataConfigurable; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.ui.LabeledComponent; import com.intellij.openapi.ui.TextComponentAccessor; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.util.Collection; import java.util.Collections; public class FlexmojosSdkDataConfigurable implements AdditionalDataConfigurable { private Sdk mySdk; private final FlexmojosSdkForm myFlexmojosSdkForm; public FlexmojosSdkDataConfigurable() { myFlexmojosSdkForm = new FlexmojosSdkForm(); } public void setSdk(final Sdk sdk) { mySdk = sdk; } public JComponent createComponent() { return myFlexmojosSdkForm.getMainPanel(); } public boolean isModified() { final FlexmojosSdkAdditionalData data = (FlexmojosSdkAdditionalData)mySdk.getSdkAdditionalData(); if (data != null) { if (!myFlexmojosSdkForm.getAdlPath().equals(data.getAdlPath())) return true; if (!myFlexmojosSdkForm.getAirRuntimePath().equals(data.getAirRuntimePath())) return true; } return false; } public void apply() throws ConfigurationException { final FlexmojosSdkAdditionalData data = (FlexmojosSdkAdditionalData)mySdk.getSdkAdditionalData(); if (data != null) { data.setAdlPath(myFlexmojosSdkForm.getAdlPath()); data.setAirRuntimePath(myFlexmojosSdkForm.getAirRuntimePath()); } } public void reset() { final FlexmojosSdkAdditionalData data = (FlexmojosSdkAdditionalData)mySdk.getSdkAdditionalData(); myFlexmojosSdkForm.setFlexCompilerClasspath(data == null ? Collections.emptyList() : data.getFlexCompilerClasspath()); myFlexmojosSdkForm.setAdlPath(data == null ? "" : data.getAdlPath()); myFlexmojosSdkForm.setAirRuntimePath(data == null ? "" : data.getAirRuntimePath()); } public void disposeUIResources() { } private static class FlexmojosSdkForm { private JComponent myMainPanel; private JTextArea myClasspathTextArea; private LabeledComponent<TextFieldWithBrowseButton> myAdlComponent; private LabeledComponent<TextFieldWithBrowseButton> myAirRuntimeComponent; private FlexmojosSdkForm() { initAdlChooser(); initAirRuntimeChooser(); } private void initAdlChooser() { final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false) { public boolean isFileVisible(final VirtualFile file, final boolean showHiddenFiles) { return super.isFileVisible(file, showHiddenFiles) && (file.isDirectory() || (file.getName().startsWith("adl") && isExecutableExtension(file.getExtension()))); } private boolean isExecutableExtension(final String extension) { return SystemInfo.isWindows ? "exe".equalsIgnoreCase(extension) : extension == null || "uexe".equalsIgnoreCase(extension); } }; myAdlComponent.getComponent() .addBrowseFolderListener("Select ADL executable file", null, null, descriptor, new TextComponentAccessor<JTextField>() { public void setText(final JTextField component, @NotNull final String text) { component.setText(text); final String adlPath = FileUtil.toSystemDependentName(text); if (adlPath.endsWith(FlexSdkUtils.ADL_RELATIVE_PATH)) { final String runtimePath = adlPath.substring(0, adlPath.length() - FlexSdkUtils.ADL_RELATIVE_PATH.length()) + FlexSdkUtils.AIR_RUNTIME_RELATIVE_PATH; myAirRuntimeComponent.getComponent().setText(runtimePath); } } public String getText(final JTextField component) { return component.getText(); } }); } private void initAirRuntimeChooser() { final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, true, false, false, false) { public boolean isFileVisible(final VirtualFile file, final boolean showHiddenFiles) { return super.isFileVisible(file, showHiddenFiles) && (file.isDirectory() || ("zip".equalsIgnoreCase(file.getExtension()))); } }; myAirRuntimeComponent.getComponent().addBrowseFolderListener("Select AIR Runtime", "Select AIR Runtime as a directory like <Flex SDK>/runtimes/AIR/win/ or as a .zip file", null, descriptor); } JComponent getMainPanel() { return myMainPanel; } void setFlexCompilerClasspath(final Collection<String> classpathEntries) { myClasspathTextArea.setText(StringUtil.join(classpathEntries, s -> FileUtil.toSystemDependentName(s), "\n")); } void setAdlPath(final String adlPath) { myAdlComponent.getComponent().setText(FileUtil.toSystemDependentName(adlPath)); } String getAdlPath() { return FileUtil.toSystemIndependentName(myAdlComponent.getComponent().getText().trim()); } void setAirRuntimePath(final String airRuntimePath) { myAirRuntimeComponent.getComponent().setText(FileUtil.toSystemDependentName(airRuntimePath)); } String getAirRuntimePath() { return FileUtil.toSystemIndependentName(myAirRuntimeComponent.getComponent().getText().trim()); } } }