package jetbrains.mps.build.mps.pluginSolution.plugin; /*Generated by MPS */ import com.intellij.openapi.project.Project; import javax.swing.JTextField; import java.awt.Color; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JPanel; import java.awt.GridBagLayout; import javax.swing.JLabel; import javax.swing.AbstractAction; import java.awt.event.ActionEvent; import javax.swing.event.CaretListener; import javax.swing.event.CaretEvent; import javax.swing.ComboBoxModel; import java.util.Arrays; import java.util.List; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import javax.swing.DefaultComboBoxModel; public abstract class TwoOptionsStep<M> extends AbstractStep { protected final AbstractBuildGenerator myGenerator; protected final Project myProject; private JTextField myTextField; private Color myDefaultTextFieldColor; private JCheckBox myOptionsCheckBox; private JComboBox mySelectComboBox; private IErrorHandler myHandler; protected M[] myVariantsArray; public TwoOptionsStep(Project project, AbstractBuildGenerator buildGenerator, IErrorHandler handler) { this.myGenerator = buildGenerator; this.myHandler = handler; this.myProject = project; } protected abstract M[] getVariants(); protected abstract String getCheckBoxName(); protected abstract String getVariantName(M variant); protected abstract String getTextFieldName(); protected abstract boolean isValid(String text); protected abstract String getWarningText(String text); protected abstract String getComboBoxName(); protected abstract boolean getChecked(); protected abstract String getTextFieldText(); protected abstract void setChecked(boolean checked); protected abstract void setTextFieldText(String text); protected abstract void setVariant(M m); protected abstract boolean isCheckBoxEnabled(); @Override public JComponent createMainComponent() { JPanel panel = new JPanel(new GridBagLayout()); // this.myOptionsCheckBox = this.createOptionsCheckBox(); this.mySelectComboBox = this.createSelectComboBox(); this.myTextField = this.createTextField(); // panel.add(this.myOptionsCheckBox, this.createConstraint(0, 0)); panel.add(new JLabel(this.getTextFieldName()), this.createConstraint(1, 0)); panel.add(this.myTextField, this.createConstraint(2, 0)); panel.add(new JLabel(this.getComboBoxName()), this.createConstraint(3, 0)); panel.add(this.mySelectComboBox, this.createConstraint(4, 0)); return panel; } @Override public void _init() { this.mySelectComboBox.setModel(this.updateComboBoxModel()); this.myOptionsCheckBox.setSelected(this.getChecked()); this.myOptionsCheckBox.setEnabled(this.isCheckBoxEnabled()); this.myTextField.setText(this.getTextFieldText()); this.setEnabledState(this.myOptionsCheckBox.isSelected()); } @Override public void _commit(boolean finish) { this.setChecked(this.myOptionsCheckBox.isSelected()); this.setTextFieldText(this.myTextField.getText()); int index = this.mySelectComboBox.getSelectedIndex(); if (index >= 0) { this.setVariant(this.myVariantsArray[index]); } } private JCheckBox createOptionsCheckBox() { return new JCheckBox(new AbstractAction(TwoOptionsStep.this.getCheckBoxName()) { @Override public void actionPerformed(ActionEvent event) { boolean checkBoxSelected = TwoOptionsStep.this.myOptionsCheckBox.isSelected(); TwoOptionsStep.this.setEnabledState(checkBoxSelected); TwoOptionsStep.this.checkTextField(TwoOptionsStep.this.myTextField); } }); } private JComboBox createSelectComboBox() { return new JComboBox(this.updateComboBoxModel()); } private JTextField createTextField() { final JTextField textField = new JTextField(); this.myDefaultTextFieldColor = textField.getForeground(); textField.addCaretListener(new CaretListener() { @Override public void caretUpdate(CaretEvent p0) { TwoOptionsStep.this.checkTextField(textField); } }); return textField; } private void checkTextField(JTextField textField) { String text = textField.getText(); if (!(this.isValid(text)) && this.myOptionsCheckBox.isSelected()) { this.myTextField.setForeground(Color.red); this.myHandler.setErrorText(TwoOptionsStep.this.getWarningText(text)); } else { this.myTextField.setForeground(this.myDefaultTextFieldColor); this.myHandler.setErrorText(null); } this.myTextField.repaint(); } private void setEnabledState(boolean checkBoxSelected) { this.myTextField.setEnabled(checkBoxSelected); this.mySelectComboBox.setEnabled(!(checkBoxSelected)); } private ComboBoxModel updateComboBoxModel() { M[] newVariants = this.getVariants(); if (!((this.mySelectComboBox == null)) && Arrays.deepEquals(newVariants, this.myVariantsArray)) { return this.mySelectComboBox.getModel(); } this.myVariantsArray = newVariants; List<String> items = ListSequence.fromList(new ArrayList<String>()); for (M variant : this.myVariantsArray) { ListSequence.fromList(items).addElement(TwoOptionsStep.this.getVariantName(variant)); } return new DefaultComboBoxModel(ListSequence.fromList(items).toGenericArray(String.class)); } }