package com.intellij.lang.javascript.flex.run; import com.intellij.execution.ExecutionBundle; import com.intellij.flex.model.bc.OutputType; import com.intellij.flex.model.bc.TargetPlatform; import com.intellij.ide.util.PropertiesComponent; import com.intellij.lang.javascript.flex.FlexBundle; import com.intellij.lang.javascript.flex.build.FlexCompilerConfigFileUtil; import com.intellij.lang.javascript.flex.build.InfoFromConfigFile; import com.intellij.lang.javascript.flex.projectStructure.model.AirPackagingOptions; import com.intellij.lang.javascript.flex.projectStructure.model.AndroidPackagingOptions; import com.intellij.lang.javascript.flex.projectStructure.model.FlexBuildConfiguration; import com.intellij.lang.javascript.flex.projectStructure.model.IosPackagingOptions; import com.intellij.lang.javascript.flex.projectStructure.options.BCUtils; import com.intellij.lang.javascript.flex.sdk.FlexSdkComboBoxWithBrowseButton; import com.intellij.lang.javascript.psi.ecmal4.JSClass; import com.intellij.lang.javascript.refactoring.ui.JSReferenceEditor; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.event.DocumentListener; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.module.Module; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Conditions; import com.intellij.openapi.util.NullableComputable; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.ui.ListCellRendererWrapper; import com.intellij.ui.RawCommandLineEditor; import com.intellij.ui.components.JBLabel; import com.intellij.util.PathUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import static com.intellij.lang.javascript.flex.run.FlashRunnerParameters.*; public class FlashRunConfigurationForm extends SettingsEditor<FlashRunConfiguration> { private static final String LATEST_SELECTED_IOS_SIMULATOR_SDK_PATH_KEY = "LatestSelectedIosSimulatorSdk"; // Application Main Class must inherit from this class public static final String SPRITE_CLASS_NAME = "flash.display.Sprite"; // The base class for ActionScript-based dynamically-loadable modules public static final String MODULE_BASE_CLASS_NAME = "mx.modules.ModuleBase"; private JPanel myMainPanel; private BCCombo myBCCombo; private JCheckBox myOverrideMainClassCheckBox; private Condition<JSClass> myMainClassFilter; private JSReferenceEditor myMainClassComponent; private JLabel myOutputFileNameLabel; private JTextField myOutputFileNameTextField; private JPanel myLaunchPanel; private JRadioButton myBCOutputRadioButton; private JLabel myBCOutputLabel; private JRadioButton myUrlOrFileRadioButton; private TextFieldWithBrowseButton myUrlOrFileTextWithBrowse; private JPanel myWebOptionsPanel; private JLabel myLauncherParametersLabel; private TextFieldWithBrowseButton myLauncherParametersTextWithBrowse; private JLabel mySdkForDebuggingLabel; private FlexSdkComboBoxWithBrowseButton mySdkForDebuggingCombo; private JCheckBox myRunTrustedCheckBox; private JPanel myDesktopOptionsPanel; private RawCommandLineEditor myAdlOptionsEditor; private RawCommandLineEditor myAirProgramParametersEditor; private JPanel myMobileRunPanel; private JRadioButton myOnEmulatorRadioButton; private JRadioButton myOnAndroidDeviceRadioButton; private JRadioButton myOnIOSSimulatorRadioButton; private TextFieldWithBrowseButton myIOSSimulatorSdkTextWithBrowse; private JRadioButton myOnIOSDeviceRadioButton; private JCheckBox myFastPackagingCheckBox; private JComboBox myEmulatorCombo; private JPanel myEmulatorScreenSizePanel; private JTextField myScreenWidth; private JTextField myScreenHeight; private JTextField myFullScreenWidth; private JTextField myFullScreenHeight; private JTextField myScreenDpi; private JPanel myMobileOptionsPanel; private JPanel myDebugTransportPanel; private JLabel myDebugOverLabel; private JRadioButton myDebugOverNetworkRadioButton; private JRadioButton myDebugOverUSBRadioButton; private JTextField myUsbDebugPortTextField; private JBLabel myEmulatorAdlOptionsLabel; private RawCommandLineEditor myEmulatorAdlOptionsEditor; private JLabel myAppDescriptorForEmulatorLabel; private JComboBox myAppDescriptorForEmulatorCombo; private final Project myProject; private LauncherParameters myLauncherParameters; private boolean myResetting = false; public FlashRunConfigurationForm(final Project project) { myProject = project; initBCCombo(); initMainClassRelatedControls(); initRadioButtons(); initLaunchWithTextWithBrowse(); initMobileControls(); mySdkForDebuggingLabel.setLabelFor(mySdkForDebuggingCombo.getChildComponent()); myEmulatorAdlOptionsLabel.setLabelFor(myEmulatorAdlOptionsEditor.getTextField()); } private void initBCCombo() { myBCCombo.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { updateMainClassField(); myAppDescriptorForEmulatorCombo.repaint(); final FlexBuildConfiguration bc = myBCCombo.getBC(); mySdkForDebuggingCombo.setBCSdk(bc == null ? null : bc.getSdk()); updateControls(); } }); } private void updateMainClassField() { final Module module = myBCCombo.getModule(); if (module != null) { myMainClassComponent.setScope(module.getModuleScope(true)); myMainClassFilter = BCUtils.getMainClassFilter(module, myBCCombo.getBC(), false, true, true); myMainClassComponent.setChooserBlockingMessage(null); } else { myMainClassComponent.setScope(GlobalSearchScope.EMPTY_SCOPE); myMainClassFilter = Conditions.alwaysFalse(); myMainClassComponent.setChooserBlockingMessage("Build configuration not selected"); } } private void initMainClassRelatedControls() { myOverrideMainClassCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { if (myOverrideMainClassCheckBox.isSelected()) { updateOutputFileName(myOutputFileNameTextField, false); } updateControls(); if (myMainClassComponent.isEnabled()) { IdeFocusManager.getInstance(myProject).requestFocus(myMainClassComponent.getChildComponent(), true); } } }); myMainClassComponent.addDocumentListener(new DocumentListener() { @Override public void documentChanged(final DocumentEvent e) { final String shortName = StringUtil.getShortName(myMainClassComponent.getText().trim()); if (!shortName.isEmpty()) { myOutputFileNameTextField.setText(shortName + ".swf"); } } }); myOutputFileNameTextField.getDocument().addDocumentListener(new com.intellij.ui.DocumentAdapter() { @Override protected void textChanged(final javax.swing.event.DocumentEvent e) { final FlexBuildConfiguration bc = myBCCombo.getBC(); if (bc != null && bc.getTargetPlatform() == TargetPlatform.Web) { updateBCOutputLabel(bc); } } }); } private void initRadioButtons() { myBCOutputRadioButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { updateControls(); } }); myUrlOrFileRadioButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { updateControls(); if (myUrlOrFileTextWithBrowse.isEnabled()) { IdeFocusManager.getInstance(myProject).requestFocus(myUrlOrFileTextWithBrowse.getTextField(), true); } } }); myUrlOrFileTextWithBrowse .addBrowseFolderListener(null, null, myProject, FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor()); } private void initLaunchWithTextWithBrowse() { myLauncherParametersTextWithBrowse.getButton().setMnemonic(myLauncherParametersLabel.getDisplayedMnemonic()); myLauncherParametersTextWithBrowse.getTextField().setEditable(false); myLauncherParametersTextWithBrowse.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final FlexLauncherDialog dialog = new FlexLauncherDialog(myProject, myLauncherParameters); if (dialog.showAndGet()) { myLauncherParameters = dialog.getLauncherParameters(); updateControls(); } } }); } private void initMobileControls() { initEmulatorRelatedControls(); if (!SystemInfo.isMac) { myOnIOSSimulatorRadioButton.setEnabled(false); myOnIOSSimulatorRadioButton.setText(FlexBundle.message("ios.simulator.on.mac.only.button.text")); myIOSSimulatorSdkTextWithBrowse.setVisible(false); } myIOSSimulatorSdkTextWithBrowse .addBrowseFolderListener(null, null, myProject, FileChooserDescriptorFactory.createSingleFolderDescriptor()); final ActionListener debugTransportListener = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { updateDebugTransportRelatedControls(); } }; myDebugOverNetworkRadioButton.addActionListener(debugTransportListener); myDebugOverUSBRadioButton.addActionListener(debugTransportListener); initAppDescriptorForEmulatorCombo(myAppDescriptorForEmulatorCombo, () -> myBCCombo.getBC()); } public static void initAppDescriptorForEmulatorCombo(final JComboBox appDescriptorForEmulatorCombo, final NullableComputable<FlexBuildConfiguration> bcComputable) { appDescriptorForEmulatorCombo.setModel(new DefaultComboBoxModel(AppDescriptorForEmulator.values())); appDescriptorForEmulatorCombo .setRenderer(new ListCellRendererWrapper<AppDescriptorForEmulator>() { @Override public void customize(JList list, AppDescriptorForEmulator value, int index, boolean selected, boolean hasFocus) { final FlexBuildConfiguration bc = bcComputable.compute(); switch (value) { case Android: setText(getDescriptorForEmulatorText("Android", bc == null ? null : bc.getAndroidPackagingOptions())); break; case IOS: setText(getDescriptorForEmulatorText("iOS", bc == null ? null : bc.getIosPackagingOptions())); break; } } }); } private static String getDescriptorForEmulatorText(final String mobilePlatform, final @Nullable AirPackagingOptions packagingOptions) { final String prefix = "as set for " + mobilePlatform; if (packagingOptions == null) return prefix; if (packagingOptions instanceof AndroidPackagingOptions && !((AndroidPackagingOptions)packagingOptions).isEnabled() || packagingOptions instanceof IosPackagingOptions && !((IosPackagingOptions)packagingOptions).isEnabled()) { return prefix + ": <" + mobilePlatform + " support is not enabled>"; } if (packagingOptions.isUseGeneratedDescriptor()) return prefix + ": generated"; final String descriptorPath = packagingOptions.getCustomDescriptorPath(); if (descriptorPath.isEmpty()) return prefix + ": <custom descriptor is not set>"; return prefix + ": " + PathUtil.getFileName(descriptorPath); } private void initEmulatorRelatedControls() { myEmulatorCombo.setModel(new DefaultComboBoxModel(Emulator.ALL_EMULATORS.toArray())); myEmulatorCombo.setRenderer(new ListCellRendererWrapper<Emulator>() { @Override public void customize(JList list, Emulator value, int index, boolean selected, boolean hasFocus) { setText(value.name); } }); myEmulatorCombo.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateEmulatorRelatedControls(); } }); final ActionListener targetDeviceListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateControls(); if (myOnEmulatorRadioButton.isSelected()) { IdeFocusManager.getInstance(myProject).requestFocus(myEmulatorCombo, true); } if (myOnIOSSimulatorRadioButton.isSelected()) { IdeFocusManager.getInstance(myProject).requestFocus(myIOSSimulatorSdkTextWithBrowse.getTextField(), true); } } }; myOnEmulatorRadioButton.addActionListener(targetDeviceListener); myOnAndroidDeviceRadioButton.addActionListener(targetDeviceListener); myOnIOSSimulatorRadioButton.addActionListener(targetDeviceListener); myOnIOSDeviceRadioButton.addActionListener(targetDeviceListener); final int preferredWidth = new JLabel("999999").getPreferredSize().width; myScreenWidth.setPreferredSize(new Dimension(preferredWidth, myScreenWidth.getPreferredSize().height)); myScreenHeight.setPreferredSize(new Dimension(preferredWidth, myScreenHeight.getPreferredSize().height)); myFullScreenWidth.setPreferredSize(new Dimension(preferredWidth, myFullScreenWidth.getPreferredSize().height)); myFullScreenHeight.setPreferredSize(new Dimension(preferredWidth, myFullScreenHeight.getPreferredSize().height)); myScreenDpi.setPreferredSize(new Dimension(preferredWidth, myScreenDpi.getPreferredSize().height)); } private void updateControls() { final FlexBuildConfiguration bc = myBCCombo.getBC(); final Module module = myBCCombo.getModule(); final boolean overrideMainClass = myOverrideMainClassCheckBox.isSelected(); myMainClassComponent.setEnabled(overrideMainClass); myOutputFileNameLabel.setEnabled(overrideMainClass); myOutputFileNameTextField.setEnabled(overrideMainClass); if (!overrideMainClass && bc != null && module != null) { final InfoFromConfigFile info = FlexCompilerConfigFileUtil.getInfoFromConfigFile(bc.getCompilerOptions().getAdditionalConfigFilePath()); myMainClassComponent.setText(StringUtil.notNullize(info.getMainClass(module), bc.getMainClass())); myOutputFileNameTextField.setText(StringUtil.notNullize(info.getOutputFileName(), bc.getOutputFileName())); } final boolean web = bc != null && bc.getTargetPlatform() == TargetPlatform.Web; final boolean desktop = bc != null && bc.getTargetPlatform() == TargetPlatform.Desktop; final boolean mobile = bc != null && bc.getTargetPlatform() == TargetPlatform.Mobile; myLaunchPanel.setVisible(web); myWebOptionsPanel.setVisible(web); myDesktopOptionsPanel.setVisible(desktop); myMobileRunPanel.setVisible(mobile); myMobileOptionsPanel.setVisible(mobile); if (web) { updateBCOutputLabel(bc); myUrlOrFileTextWithBrowse.setEnabled(myUrlOrFileRadioButton.isSelected()); myLauncherParametersTextWithBrowse.getTextField().setText(myLauncherParameters.getPresentableText()); myRunTrustedCheckBox.setEnabled(!myUrlOrFileRadioButton.isSelected()); } if (mobile) { final boolean runOnEmulator = myOnEmulatorRadioButton.isSelected(); final boolean app = bc.getOutputType() == OutputType.Application; myEmulatorCombo.setEnabled(runOnEmulator); UIUtil.setEnabled(myEmulatorScreenSizePanel, runOnEmulator, true); myFastPackagingCheckBox.setEnabled(myOnIOSDeviceRadioButton.isSelected()); myEmulatorAdlOptionsLabel.setEnabled(runOnEmulator); myEmulatorAdlOptionsEditor.setEnabled(runOnEmulator); myAppDescriptorForEmulatorLabel.setEnabled(app && runOnEmulator); myAppDescriptorForEmulatorCombo.setEnabled(app && runOnEmulator); if (runOnEmulator) { updateEmulatorRelatedControls(); } myIOSSimulatorSdkTextWithBrowse.setEnabled(myOnIOSSimulatorRadioButton.isSelected()); if (myIOSSimulatorSdkTextWithBrowse.isEnabled() && myIOSSimulatorSdkTextWithBrowse.getText().isEmpty() && SystemInfo.isMac) { final String latestSelected = PropertiesComponent.getInstance().getValue(LATEST_SELECTED_IOS_SIMULATOR_SDK_PATH_KEY); myIOSSimulatorSdkTextWithBrowse .setText(FileUtil.toSystemDependentName(StringUtil.notNullize(latestSelected, guessIosSimulatorSdkPath()))); } updateDebugTransportRelatedControls(); } } private void updateBCOutputLabel(final FlexBuildConfiguration bc) { if (bc.getOutputType() == OutputType.Application || myOverrideMainClassCheckBox.isSelected()) { String outputFileName = myOverrideMainClassCheckBox.isSelected() ? myOutputFileNameTextField.getText().trim() : PathUtil.getFileName(bc.getActualOutputFilePath()); if (!outputFileName.isEmpty() && bc.isUseHtmlWrapper()) { outputFileName += " via HTML wrapper"; } myBCOutputLabel.setText(outputFileName); } else { myBCOutputLabel.setText(""); } } private void updateEmulatorRelatedControls() { final Emulator emulator = (Emulator)myEmulatorCombo.getSelectedItem(); if (emulator.adlAlias == null) { myScreenWidth.setEditable(true); myScreenHeight.setEditable(true); myFullScreenWidth.setEditable(true); myFullScreenHeight.setEditable(true); if (!myResetting && !myScreenDpi.isEditable()) { myScreenDpi.setText(""); // User have selected 'Custom...' screen size. Let him select dpi explicitly if needed. } myScreenDpi.setEditable(true); } else { myScreenWidth.setEditable(false); myScreenHeight.setEditable(false); myFullScreenWidth.setEditable(false); myFullScreenHeight.setEditable(false); myScreenDpi.setEditable(false); myScreenWidth.setText(String.valueOf(emulator.screenWidth)); myScreenHeight.setText(String.valueOf(emulator.screenHeight)); myFullScreenWidth.setText(String.valueOf(emulator.fullScreenWidth)); myFullScreenHeight.setText(String.valueOf(emulator.fullScreenHeight)); myScreenDpi.setText(emulator.screenDPI > 0 ? String.valueOf(emulator.screenDPI) : ""); } } private void updateDebugTransportRelatedControls() { final boolean onDevice = myOnAndroidDeviceRadioButton.isSelected() || myOnIOSDeviceRadioButton.isSelected(); myDebugOverLabel.setEnabled(onDevice); UIUtil.setEnabled(myDebugTransportPanel, onDevice, true); if (onDevice) { myUsbDebugPortTextField.setEnabled(myDebugOverUSBRadioButton.isSelected()); } } private void createUIComponents() { myBCCombo = new BCCombo(myProject); myMainClassFilter = Conditions.alwaysFalse(); myMainClassComponent = JSReferenceEditor.forClassName("", myProject, null, GlobalSearchScope.EMPTY_SCOPE, null, Conditions.alwaysTrue(), // no filtering until IDEA-83046 ExecutionBundle.message("choose.main.class.dialog.title")); mySdkForDebuggingCombo = new FlexSdkComboBoxWithBrowseButton(FlexSdkComboBoxWithBrowseButton.FLEX_OR_FLEXMOJOS_SDK); mySdkForDebuggingCombo.showBCSdk(true); } @Override @NotNull protected JComponent createEditor() { return myMainPanel; } @Override protected void resetEditorFrom(@NotNull final FlashRunConfiguration configuration) { myResetting = true; try { doResetEditorFrom(configuration); } finally { myResetting = false; } } private void doResetEditorFrom(final FlashRunConfiguration configuration) { final FlashRunnerParameters params = configuration.getRunnerParameters(); myLauncherParameters = params.getLauncherParameters().clone(); // must be before myBCsCombo.setModel() myBCCombo.resetFrom(params); myOverrideMainClassCheckBox.setSelected(params.isOverrideMainClass()); if (params.isOverrideMainClass()) { myMainClassComponent.setText(params.getOverriddenMainClass()); myOutputFileNameTextField.setText(params.getOverriddenOutputFileName()); } myBCOutputRadioButton.setSelected(!params.isLaunchUrl()); myUrlOrFileRadioButton.setSelected(params.isLaunchUrl()); final String url = params.getUrl(); final boolean windowsLocalFile = SystemInfo.isWindows && url.length() >= 2 && Character.isLetter(url.charAt(0)) && ':' == url.charAt(1); myUrlOrFileTextWithBrowse.setText(windowsLocalFile ? FileUtil.toSystemDependentName(url) : url); myRunTrustedCheckBox.setSelected(params.isRunTrusted()); myAdlOptionsEditor.setText(params.getAdlOptions()); myAirProgramParametersEditor.setText(params.getAirProgramParameters()); myOnEmulatorRadioButton.setSelected(params.getMobileRunTarget() == AirMobileRunTarget.Emulator); myEmulatorCombo.setSelectedItem(params.getEmulator()); if (params.getEmulator().adlAlias == null) { myScreenWidth.setText(String.valueOf(params.getScreenWidth())); myScreenHeight.setText(String.valueOf(params.getScreenHeight())); myFullScreenWidth.setText(String.valueOf(params.getFullScreenWidth())); myFullScreenHeight.setText(String.valueOf(params.getFullScreenHeight())); myScreenDpi.setText(params.getScreenDpi() > 0 ? String.valueOf(params.getScreenDpi()) : ""); } myOnAndroidDeviceRadioButton.setSelected(params.getMobileRunTarget() == AirMobileRunTarget.AndroidDevice); myOnIOSSimulatorRadioButton.setSelected(params.getMobileRunTarget() == AirMobileRunTarget.iOSSimulator); myIOSSimulatorSdkTextWithBrowse.setText(FileUtil.toSystemDependentName(params.getIOSSimulatorSdkPath())); myOnIOSDeviceRadioButton.setSelected(params.getMobileRunTarget() == AirMobileRunTarget.iOSDevice); myFastPackagingCheckBox.setSelected(params.isFastPackaging()); myDebugOverNetworkRadioButton.setSelected(params.getDebugTransport() == AirMobileDebugTransport.Network); myDebugOverUSBRadioButton.setSelected(params.getDebugTransport() == AirMobileDebugTransport.USB); myUsbDebugPortTextField.setText(String.valueOf(params.getUsbDebugPort())); myEmulatorAdlOptionsEditor.setText(params.getEmulatorAdlOptions()); myAppDescriptorForEmulatorCombo.setSelectedItem(params.getAppDescriptorForEmulator()); final FlexBuildConfiguration bc = myBCCombo.getBC(); mySdkForDebuggingCombo.setBCSdk(bc == null ? null : bc.getSdk()); mySdkForDebuggingCombo.setSelectedSdkRaw(params.getDebuggerSdkRaw()); updateControls(); } private static String guessIosSimulatorSdkPath() { final File appDir = new File("/Applications"); if (appDir.isDirectory()) { final String relPath = "/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs"; final File[] xCodeDirs = appDir.listFiles(file -> { final String name = file.getName().toLowerCase(); return file.isDirectory() && name.startsWith("xcode") && name.endsWith(".app") && new File(file.getPath() + relPath).isDirectory(); }); if (xCodeDirs.length > 0) { final File sdksDir = new File(xCodeDirs[0] + relPath); final File[] simulatorSdkDirs = sdksDir.listFiles(file -> { final String filename = file.getName().toLowerCase(); return file.isDirectory() && filename.startsWith("iphonesimulator") && filename.endsWith(".sdk"); }); if (simulatorSdkDirs.length > 0) { return simulatorSdkDirs[0].getPath(); } } } return ""; } @Override protected void applyEditorTo(@NotNull final FlashRunConfiguration configuration) throws ConfigurationException { final FlashRunnerParameters params = configuration.getRunnerParameters(); myBCCombo.applyTo(params); final boolean overrideMainClass = myOverrideMainClassCheckBox.isSelected(); params.setOverrideMainClass(overrideMainClass); params.setOverriddenMainClass(overrideMainClass ? myMainClassComponent.getText().trim() : ""); params.setOverriddenOutputFileName(overrideMainClass ? myOutputFileNameTextField.getText().trim() : ""); params.setLaunchUrl(myUrlOrFileRadioButton.isSelected()); final String url = myUrlOrFileTextWithBrowse.getText().trim(); final boolean windowsLocalFile = SystemInfo.isWindows && url.length() >= 2 && Character.isLetter(url.charAt(0)) && ':' == url.charAt(1); params.setUrl(windowsLocalFile ? FileUtil.toSystemIndependentName(url) : url); params.setLauncherParameters(myLauncherParameters); params.setRunTrusted(myRunTrustedCheckBox.isSelected()); params.setAdlOptions(myAdlOptionsEditor.getText().trim()); params.setAirProgramParameters(myAirProgramParametersEditor.getText().trim()); final AirMobileRunTarget mobileRunTarget = myOnEmulatorRadioButton.isSelected() ? AirMobileRunTarget.Emulator : myOnAndroidDeviceRadioButton.isSelected() ? AirMobileRunTarget.AndroidDevice : myOnIOSSimulatorRadioButton.isSelected() ? AirMobileRunTarget.iOSSimulator : AirMobileRunTarget.iOSDevice; params.setMobileRunTarget(mobileRunTarget); final Emulator emulator = (Emulator)myEmulatorCombo.getSelectedItem(); params.setEmulator(emulator); if (emulator.adlAlias == null) { try { params.setScreenWidth(Integer.parseInt(myScreenWidth.getText().trim())); params.setScreenHeight(Integer.parseInt(myScreenHeight.getText().trim())); params.setFullScreenWidth(Integer.parseInt(myFullScreenWidth.getText().trim())); params.setFullScreenHeight(Integer.parseInt(myFullScreenHeight.getText().trim())); } catch (NumberFormatException e) {/**/} try { params.setScreenDpi(Integer.parseInt(myScreenDpi.getText().trim())); } catch (NumberFormatException e) { params.setScreenDpi(0); } } final FlexBuildConfiguration bc = myBCCombo.getBC(); if (SystemInfo.isMac && bc != null && bc.getTargetPlatform() == TargetPlatform.Mobile && myOnIOSSimulatorRadioButton.isSelected()) { final String path = FileUtil.toSystemIndependentName(myIOSSimulatorSdkTextWithBrowse.getText().trim()); if (!path.isEmpty()) { PropertiesComponent.getInstance().setValue(LATEST_SELECTED_IOS_SIMULATOR_SDK_PATH_KEY, path); } } params.setIOSSimulatorSdkPath(FileUtil.toSystemIndependentName(myIOSSimulatorSdkTextWithBrowse.getText().trim())); params.setFastPackaging(myFastPackagingCheckBox.isSelected()); params.setDebugTransport(myDebugOverNetworkRadioButton.isSelected() ? AirMobileDebugTransport.Network : AirMobileDebugTransport.USB); try { final int port = Integer.parseInt(myUsbDebugPortTextField.getText().trim()); if (port > 0 && port < 65535) { params.setUsbDebugPort(port); } } catch (NumberFormatException ignore) {/*ignore*/} params.setEmulatorAdlOptions(myEmulatorAdlOptionsEditor.getText().trim()); params.setAppDescriptorForEmulator((AppDescriptorForEmulator)myAppDescriptorForEmulatorCombo.getSelectedItem()); params.setDebuggerSdkRaw(mySdkForDebuggingCombo.getSelectedSdkRaw()); } @Override protected void disposeEditor() { myBCCombo.dispose(); } public static void updateOutputFileName(final JTextField textField, final boolean isLib) { final String outputFileName = textField.getText(); final String lowercase = outputFileName.toLowerCase(); final String withoutExtension = lowercase.endsWith(".swf") || lowercase.endsWith(".swc") ? outputFileName.substring(0, outputFileName.length() - ".sw_".length()) : outputFileName; textField.setText(withoutExtension + (isLib ? ".swc" : ".swf")); } }