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));
}
}