package fr.adrienbrault.idea.symfony2plugin.action.ui;
import com.intellij.openapi.project.Project;
import fr.adrienbrault.idea.symfony2plugin.Settings;
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
import fr.adrienbrault.idea.symfony2plugin.action.generator.naming.JavascriptServiceNameStrategy;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import javax.script.ScriptException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class SymfonyJavascriptServiceNameForm extends JDialog {
@NotNull
private final Project project;
private JPanel contentPane;
private JButton buttonOK;
private JButton buttonCancel;
private JTextField textClass;
private JTextArea textJavascript;
private JButton buttonTest;
private JButton buttonExample;
private JTextField textResult;
public SymfonyJavascriptServiceNameForm(@NotNull Project project, String className) {
this(project);
textClass.setText(className);
}
public SymfonyJavascriptServiceNameForm(@NotNull final Project project) {
this.project = project;
setContentPane(contentPane);
setModal(true);
getRootPane().setDefaultButton(buttonOK);
buttonOK.addActionListener(e -> onSave());
buttonCancel.addActionListener(e -> onCancel());
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);
buttonTest.addActionListener(e -> {
try {
Object eval = JavascriptServiceNameStrategy.run(project, textClass.getText(), textJavascript.getText());
if(!(eval instanceof String)) {
textResult.setText("Error: invalid string response");
return;
}
textResult.setText((String) eval);
} catch (ScriptException e1) {
textResult.setText("Error: " + e1.getMessage());
}
});
buttonExample.addActionListener(e -> textJavascript.setText("" +
"var className = args.className;\n" +
"var projectName = args.projectName;\n" +
"var projectBasePath = args.projectBasePath;\n" +
"var defaultNaming = args.defaultNaming;\n" +
"\n" +
"// nullable\n" +
"var relativePath = args.relativePath;\n" +
"var absolutePath = args.absolutePath;\n" +
"\n" +
"return className.replace(/\\\\/g, '.').toLowerCase();"));
String jsText = Settings.getInstance(project).serviceJsNameStrategy;
if(StringUtils.isNotBlank(jsText)) {
textJavascript.setText(jsText);
}
}
private void onSave() {
String text = textJavascript.getText();
if(StringUtils.isBlank(text)) {
text = null;
}
Settings.getInstance(project).serviceJsNameStrategy = text;
dispose();
}
private void onCancel() {
dispose();
}
public static void create(@NotNull Component c, @NotNull Project project, @NotNull String className) {
SymfonyJavascriptServiceNameForm dialog = new SymfonyJavascriptServiceNameForm(project, className);
dialog.setMinimumSize(new Dimension(500, 400));
dialog.setTitle("Symfony: Service Generator - JavaScript Naming");
dialog.pack();
dialog.setIconImage(Symfony2Icons.getImage(Symfony2Icons.SYMFONY));
dialog.setLocationRelativeTo(c);
dialog.setVisible(true);
}
}