package com.intellij.lang.javascript.flex.projectStructure.ui; import com.intellij.flex.model.bc.BuildConfigurationNature; import com.intellij.flex.model.bc.OutputType; import com.intellij.flex.model.bc.TargetPlatform; import com.intellij.ide.ui.UISettings; import com.intellij.lang.javascript.flex.FlexBundle; import com.intellij.lang.javascript.flex.projectStructure.options.BCUtils; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CustomShortcutSet; import com.intellij.openapi.actionSystem.KeyboardShortcut; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.ValidationInfo; import com.intellij.ui.NonFocusableCheckBox; import com.intellij.util.PlatformIcons; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.text.MessageFormat; import java.util.Collection; public class AddBuildConfigurationDialog extends DialogWrapper { private JPanel myMainPanel; private JTextField myBCNameTextField; private JLabel myUpDownHint; private JComboBox myTargetPlatformCombo; private NonFocusableCheckBox myPureActionScriptCheckBox; private JComboBox myOutputTypeCombo; private JLabel myTargetDevicesLabel; private JCheckBox myAndroidCheckBox; private JCheckBox myIOSCheckBox; private final Collection<String> myUsedNames; public AddBuildConfigurationDialog(final Project project, final String dialogTitle, final Collection<String> usedNames, final BuildConfigurationNature defaultNature, final boolean bcNameEditable) { super(project); myUsedNames = usedNames; setTitle(dialogTitle); initCombos(); myTargetPlatformCombo.setSelectedItem(defaultNature.targetPlatform); myPureActionScriptCheckBox.setSelected(defaultNature.pureAS); myOutputTypeCombo.setSelectedItem(defaultNature.outputType); myBCNameTextField.setEditable(bcNameEditable); myUpDownHint.setVisible(bcNameEditable); if (bcNameEditable) { myUpDownHint.setIcon(PlatformIcons.UP_DOWN_ARROWS); myUpDownHint.setToolTipText(FlexBundle.message("bc.dialog.up.down.tooltip")); final AnAction arrow = new AnAction() { @Override public void actionPerformed(AnActionEvent e) { if (e.getInputEvent() instanceof KeyEvent) { KeyEvent keyEvent = (KeyEvent)e.getInputEvent(); final int code = keyEvent.getKeyCode(); scrollBy(code == KeyEvent.VK_DOWN ? 1 : code == KeyEvent.VK_UP ? -1 : 0, (keyEvent.getModifiers() & Event.SHIFT_MASK) != 0); } } }; final KeyboardShortcut up = new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), null); final KeyboardShortcut upShift = new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_UP, InputEvent.SHIFT_DOWN_MASK), null); final KeyboardShortcut down = new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), null); final KeyboardShortcut downShift = new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, InputEvent.SHIFT_DOWN_MASK), null); arrow.registerCustomShortcutSet(new CustomShortcutSet(up, down, upShift, downShift), myBCNameTextField); } init(); updateControls(); } private void updateControls() { final boolean mobile = myTargetPlatformCombo.getSelectedItem() == TargetPlatform.Mobile; final boolean app = myOutputTypeCombo.getSelectedItem() == OutputType.Application; final boolean targetDeviceWasEnabled = myTargetDevicesLabel.isEnabled(); myTargetDevicesLabel.setEnabled(mobile && app); myAndroidCheckBox.setEnabled(mobile && app); myIOSCheckBox.setEnabled(mobile && app); 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); } } private void scrollBy(final int delta, boolean shiftPressed) { if (delta == 0) return; JComboBox combo = shiftPressed ? myOutputTypeCombo : myTargetPlatformCombo; final int size = combo.getModel().getSize(); int next = combo.getSelectedIndex() + delta; if (next < 0 || next >= size) { if (!UISettings.getInstance().getCycleScrolling()) { return; } next = (next + size) % size; } combo.setSelectedIndex(next); } private void initCombos() { BCUtils.initTargetPlatformCombo(myTargetPlatformCombo); BCUtils.initOutputTypeCombo(myOutputTypeCombo); final ActionListener actionListener = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { updateControls(); } }; myTargetPlatformCombo.addActionListener(actionListener); myOutputTypeCombo.addActionListener(actionListener); } public void reset(final String bcName, final boolean androidEnabled, final boolean iosEnabled) { myBCNameTextField.setText(bcName); myAndroidCheckBox.setSelected(androidEnabled); myIOSCheckBox.setSelected(iosEnabled); updateControls(); } @Override public JComponent getPreferredFocusedComponent() { return myBCNameTextField.isEditable() ? myBCNameTextField : myTargetPlatformCombo; } @Override protected JComponent createCenterPanel() { return myMainPanel; } @Override protected ValidationInfo doValidate() { final String name = getBCName(); if (name.isEmpty()) { return new ValidationInfo("Empty name", myBCNameTextField); } for (final String usedName : myUsedNames) { if (name.equals(usedName)) { return new ValidationInfo(MessageFormat.format("Name ''{0}'' is already used", name), myBCNameTextField); } } return null; } public String getBCName() { return myBCNameTextField.getText().trim(); } public BuildConfigurationNature getNature() { TargetPlatform targetPlatform = (TargetPlatform)myTargetPlatformCombo.getSelectedItem(); boolean isPureAs = myPureActionScriptCheckBox.isSelected(); OutputType outputType = (OutputType)myOutputTypeCombo.getSelectedItem(); return new BuildConfigurationNature(targetPlatform, isPureAs, outputType); } public boolean isAndroidEnabled() { return myAndroidCheckBox.isSelected(); } public boolean isIOSEnabled() { return myIOSCheckBox.isSelected(); } }