package com.intellij.lang.javascript.flex.wizard;
import com.intellij.flex.model.bc.OutputType;
import com.intellij.flex.model.bc.TargetPlatform;
import com.intellij.lang.javascript.flex.FlexBundle;
import com.intellij.lang.javascript.flex.FlexModuleBuilder;
import com.intellij.lang.javascript.flex.projectStructure.options.BCUtils;
import com.intellij.lang.javascript.flex.sdk.FlexSdkComboBoxWithBrowseButton;
import com.intellij.lang.javascript.flex.sdk.FlexSdkUtils;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.NonFocusableCheckBox;
import com.intellij.util.ui.UIUtil;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class FlexModuleWizardForm {
private JPanel myMainPanel;
private JComboBox myTargetPlatformCombo;
private NonFocusableCheckBox myPureActionScriptCheckBox;
private JComboBox myOutputTypeCombo;
private JLabel myTargetDevicesLabel;
private JCheckBox myAndroidCheckBox;
private JCheckBox myIOSCheckBox;
private JLabel mySdkLabel;
private FlexSdkComboBoxWithBrowseButton mySdkCombo;
private JLabel myTargetPlayerLabel;
private JComboBox myTargetPlayerCombo;
private JCheckBox mySampleAppCheckBox;
private JTextField mySampleAppTextField;
private JCheckBox myHtmlWrapperCheckBox;
private JCheckBox myEnableHistoryCheckBox;
private JCheckBox myCheckPlayerVersionCheckBox;
private JCheckBox myExpressInstallCheckBox;
public FlexModuleWizardForm() {
mySdkLabel.setLabelFor(mySdkCombo.getChildComponent());
BCUtils.initTargetPlatformCombo(myTargetPlatformCombo);
BCUtils.initOutputTypeCombo(myOutputTypeCombo);
final ActionListener listener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
updateControls();
}
};
myTargetPlatformCombo.addActionListener(listener);
myOutputTypeCombo.addActionListener(listener);
mySampleAppCheckBox.addActionListener(listener);
myHtmlWrapperCheckBox.addActionListener(listener);
myCheckPlayerVersionCheckBox.addActionListener(listener);
mySdkCombo.addComboboxListener(new FlexSdkComboBoxWithBrowseButton.Listener() {
public void stateChanged() {
BCUtils.updateAvailableTargetPlayers(mySdkCombo.getSelectedSdk(), myTargetPlayerCombo);
updateControls();
}
});
myPureActionScriptCheckBox.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
final String sampleApp = mySampleAppTextField.getText().trim();
if (sampleApp.endsWith(".as") || sampleApp.endsWith(".mxml")) {
mySampleAppTextField
.setText(FileUtil.getNameWithoutExtension(sampleApp) + (myPureActionScriptCheckBox.isSelected() ? ".as" : ".mxml"));
}
}
});
reset();
}
public JPanel getMainPanel() {
return myMainPanel;
}
public void setEnabled(final boolean enabled) {
UIUtil.setEnabled(myMainPanel, enabled, true);
if (enabled) {
updateControls();
}
}
private void reset() {
myTargetPlayerCombo.setSelectedItem(TargetPlatform.Web);
myPureActionScriptCheckBox.setSelected(false);
myOutputTypeCombo.setSelectedItem(OutputType.Application);
myAndroidCheckBox.setSelected(true);
myIOSCheckBox.setSelected(true);
BCUtils.updateAvailableTargetPlayers(mySdkCombo.getSelectedSdk(), myTargetPlayerCombo);
mySampleAppCheckBox.setSelected(true);
mySampleAppTextField.setText("Main.mxml");
myHtmlWrapperCheckBox.setSelected(true);
myEnableHistoryCheckBox.setSelected(true);
myCheckPlayerVersionCheckBox.setSelected(true);
myExpressInstallCheckBox.setSelected(true);
updateControls();
}
private void updateControls() {
final Sdk sdk = mySdkCombo.getSelectedSdk();
final boolean sdkSet = sdk != null;
final boolean web = myTargetPlatformCombo.getSelectedItem() == TargetPlatform.Web;
final boolean mobile = myTargetPlatformCombo.getSelectedItem() == TargetPlatform.Mobile;
final boolean app = myOutputTypeCombo.getSelectedItem() == OutputType.Application;
final boolean createSampleAppWasEnabled = mySampleAppCheckBox.isEnabled();
final boolean createHtmlWrapperWasEnabled = myHtmlWrapperCheckBox.isEnabled();
final boolean targetDeviceWasEnabled = myTargetDevicesLabel.isEnabled();
myTargetDevicesLabel.setEnabled(mobile && app);
myAndroidCheckBox.setEnabled(mobile && app);
myIOSCheckBox.setEnabled(mobile && app);
myTargetPlayerLabel.setEnabled(web && sdkSet);
myTargetPlayerCombo.setEnabled(web && sdkSet);
mySampleAppCheckBox.setEnabled(app && sdkSet);
mySampleAppTextField.setEnabled(app && sdkSet);
myHtmlWrapperCheckBox.setEnabled(web && app && sdkSet);
if (myTargetDevicesLabel.isEnabled() && !targetDeviceWasEnabled) {
myAndroidCheckBox.setSelected(true);
myIOSCheckBox.setSelected(true);
}
if (!myTargetDevicesLabel.isEnabled()) {
// disabled but checked for mobile library
myAndroidCheckBox.setSelected(mobile);
myIOSCheckBox.setSelected(mobile);
}
if (!mySampleAppCheckBox.isEnabled() || !createSampleAppWasEnabled) {
mySampleAppCheckBox.setSelected(mySampleAppCheckBox.isEnabled());
}
mySampleAppTextField.setEnabled(mySampleAppCheckBox.isEnabled() && mySampleAppCheckBox.isSelected());
if (!myHtmlWrapperCheckBox.isEnabled() || !createHtmlWrapperWasEnabled) {
myHtmlWrapperCheckBox.setSelected(myHtmlWrapperCheckBox.isEnabled());
}
myEnableHistoryCheckBox.setEnabled(myHtmlWrapperCheckBox.isSelected() && web && app);
myCheckPlayerVersionCheckBox.setEnabled(myHtmlWrapperCheckBox.isSelected() && web && app);
myExpressInstallCheckBox.setEnabled(myHtmlWrapperCheckBox.isSelected() && myCheckPlayerVersionCheckBox.isSelected() && web && app);
}
public void applyTo(final FlexModuleBuilder moduleBuilder) {
moduleBuilder.setTargetPlatform((TargetPlatform)myTargetPlatformCombo.getSelectedItem());
moduleBuilder.setPureActionScript(myPureActionScriptCheckBox.isSelected());
moduleBuilder.setOutputType((OutputType)myOutputTypeCombo.getSelectedItem());
moduleBuilder.setAndroidEnabled(myAndroidCheckBox.isSelected());
moduleBuilder.setIOSEnabled(myIOSCheckBox.isSelected());
moduleBuilder.setFlexSdk(mySdkCombo.getSelectedSdk());
moduleBuilder.setTargetPlayer((String)myTargetPlayerCombo.getSelectedItem());
moduleBuilder.setCreateSampleApp(mySampleAppCheckBox.isEnabled() && mySampleAppCheckBox.isSelected());
moduleBuilder.setSampleAppName(mySampleAppTextField.getText().trim());
moduleBuilder.setCreateHtmlWrapperTemplate(myHtmlWrapperCheckBox.isEnabled() && myHtmlWrapperCheckBox.isSelected());
moduleBuilder.setHtmlWrapperTemplateParameters(myEnableHistoryCheckBox.isSelected(), myCheckPlayerVersionCheckBox.isSelected(),
myExpressInstallCheckBox.isEnabled() && myExpressInstallCheckBox.isSelected());
}
public boolean validate() throws ConfigurationException {
final Sdk sdk = mySdkCombo.getSelectedSdk();
if (sdk != null) {
if (myTargetPlatformCombo.getSelectedItem() == TargetPlatform.Mobile &&
!FlexSdkUtils.isAirSdkWithoutFlex(sdk) &&
StringUtil.compareVersionNumbers(sdk.getVersionString(), "4.5") < 0) {
throw new ConfigurationException(FlexBundle.message("sdk.does.not.support.air.mobile", sdk.getVersionString()));
}
if (FlexSdkUtils.isAirSdkWithoutFlex(sdk) && !myPureActionScriptCheckBox.isSelected()) {
throw new ConfigurationException(StringUtil.capitalize(FlexBundle.message("air.sdk.requires.pure.as", sdk.getName())));
}
if (mySampleAppCheckBox.isSelected()) {
final String fileName = mySampleAppTextField.getText().trim();
if (fileName.isEmpty()) {
throw new ConfigurationException(FlexBundle.message("sample.app.name.empty"));
}
final String extension = FileUtilRt.getExtension(fileName).toLowerCase();
if (!"mxml".equals(extension) && !"as".equals(extension)) {
throw new ConfigurationException(FlexBundle.message("sample.app.incorrect.extension"));
}
}
}
return true;
}
}