package fr.adrienbrault.idea.symfony2plugin.ui;
import com.intellij.openapi.project.Project;
import com.intellij.ui.ColoredListCellRenderer;
import com.intellij.ui.table.TableView;
import fr.adrienbrault.idea.symfony2plugin.assistant.signature.MethodSignatureSetting;
import fr.adrienbrault.idea.symfony2plugin.assistant.signature.PhpTypeSignatureInterface;
import fr.adrienbrault.idea.symfony2plugin.assistant.signature.PhpTypeSignatureTypes;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class MethodSignatureTypeDialog extends JDialog {
private JPanel contentPane;
private JButton buttonOK;
private JButton buttonCancel;
private JComboBox comboProvider;
private JTextField textCallTo;
private JTextField textMethodName;
private JTextField textIndex;
private MethodSignatureSetting methodParameterSetting;
private TableView<MethodSignatureSetting> tableView;
private Project project;
class ComboBoxRenderer extends ColoredListCellRenderer {
@Override
protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus) {
append((String) value);
}
}
public MethodSignatureTypeDialog(Project project, TableView<MethodSignatureSetting> tableView) {
this.tableView = tableView;
this.project = project;
setContentPane(contentPane);
setModal(true);
getRootPane().setDefaultButton(buttonOK);
buttonOK.addActionListener(e -> onOK());
buttonCancel.addActionListener(e -> onCancel());
this.textCallTo.getDocument().addDocumentListener(new ChangeDocumentListener());
this.textMethodName.getDocument().addDocumentListener(new ChangeDocumentListener());
this.textIndex.getDocument().addDocumentListener(new ChangeDocumentListener());
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
onCancel();
}
});
contentPane.registerKeyboardAction(e -> onCancel(), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
// allow only number values to indexes
// simple?
this.textIndex.addKeyListener(new KeyAdapter() {
private String allowedRegex = "[^0-9]";
@Override
public void keyReleased(KeyEvent e) {
String curText = ((JTextComponent) e.getSource()).getText();
curText = curText.replaceAll(allowedRegex, "");
((JTextComponent) e.getSource()).setText(curText);
}
});
this.attachComboBoxValues(project);
}
private void attachComboBoxValues(Project project) {
for(PhpTypeSignatureInterface provider: PhpTypeSignatureTypes.DEFAULT_PROVIDER) {
comboProvider.addItem(provider.getName());
}
}
public MethodSignatureTypeDialog(Project project, TableView<MethodSignatureSetting> tableView, MethodSignatureSetting methodParameterSetting) {
this(project, tableView);
this.textCallTo.setText(methodParameterSetting.getCallTo());
this.textMethodName.setText(methodParameterSetting.getMethodName());
this.textIndex.setText(String.valueOf(methodParameterSetting.getIndexParameter()));
this.methodParameterSetting = methodParameterSetting;
if(methodParameterSetting.getReferenceProviderName() != null) {
this.comboProvider.setSelectedItem(methodParameterSetting.getReferenceProviderName());
}
}
private void onOK() {
int index;
try {
index = Integer.parseInt(this.textIndex.getText());
} catch (NumberFormatException e) {
index = 0;
}
MethodSignatureSetting twigPath = new MethodSignatureSetting(this.textCallTo.getText(), this.textMethodName.getText(), index, (String) this.comboProvider.getSelectedItem());
// re-add old item to not use public setter wor twigpaths
// update ?
if(this.methodParameterSetting != null) {
int row = this.tableView.getSelectedRows()[0];
this.tableView.getListTableModel().removeRow(row);
this.tableView.getListTableModel().insertRow(row, twigPath);
this.tableView.setRowSelectionInterval(row, row);
} else {
int row = this.tableView.getRowCount();
this.tableView.getListTableModel().addRow(twigPath);
this.tableView.setRowSelectionInterval(row, row);
}
dispose();
}
private void setOkState() {
this.buttonOK.setEnabled(
this.textCallTo.getText().length() > 0 &&
this.textMethodName.getText().length() > 0 &&
this.textIndex.getText().length() > 0
);
}
private class ChangeDocumentListener implements DocumentListener {
@Override
public void insertUpdate(DocumentEvent e) {
setOkState();
}
@Override
public void removeUpdate(DocumentEvent e) {
setOkState();
}
@Override
public void changedUpdate(DocumentEvent e) {
setOkState();
}
}
private void onCancel() {
dispose();
}
}