dialog.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Open simple dialogs on top of an editor. Relies on dialog.css.
  2. (function() {
  3. function dialogDiv(cm, template) {
  4. var wrap = cm.getWrapperElement();
  5. var dialog = wrap.insertBefore(document.createElement("div"), wrap.firstChild);
  6. dialog.className = "CodeMirror-dialog";
  7. dialog.innerHTML = '<div>' + template + '</div>';
  8. return dialog;
  9. }
  10. CodeMirror.defineExtension("openDialog", function(template, callback) {
  11. var dialog = dialogDiv(this, template);
  12. var closed = false, me = this;
  13. function close() {
  14. if (closed) return;
  15. closed = true;
  16. dialog.parentNode.removeChild(dialog);
  17. }
  18. var inp = dialog.getElementsByTagName("input")[0], button;
  19. if (inp) {
  20. CodeMirror.connect(inp, "keydown", function(e) {
  21. if (e.keyCode == 13 || e.keyCode == 27) {
  22. CodeMirror.e_stop(e);
  23. close();
  24. me.focus();
  25. if (e.keyCode == 13) callback(inp.value);
  26. }
  27. });
  28. inp.focus();
  29. CodeMirror.connect(inp, "blur", close);
  30. } else if (button = dialog.getElementsByTagName("button")[0]) {
  31. CodeMirror.connect(button, "click", function() {
  32. close();
  33. me.focus();
  34. });
  35. button.focus();
  36. CodeMirror.connect(button, "blur", close);
  37. }
  38. return close;
  39. });
  40. CodeMirror.defineExtension("openConfirm", function(template, callbacks) {
  41. var dialog = dialogDiv(this, template);
  42. var buttons = dialog.getElementsByTagName("button");
  43. var closed = false, me = this, blurring = 1;
  44. function close() {
  45. if (closed) return;
  46. closed = true;
  47. dialog.parentNode.removeChild(dialog);
  48. me.focus();
  49. }
  50. buttons[0].focus();
  51. for (var i = 0; i < buttons.length; ++i) {
  52. var b = buttons[i];
  53. (function(callback) {
  54. CodeMirror.connect(b, "click", function(e) {
  55. CodeMirror.e_preventDefault(e);
  56. close();
  57. if (callback) callback(me);
  58. });
  59. })(callbacks[i]);
  60. CodeMirror.connect(b, "blur", function() {
  61. --blurring;
  62. setTimeout(function() { if (blurring <= 0) close(); }, 200);
  63. });
  64. CodeMirror.connect(b, "focus", function() { ++blurring; });
  65. }
  66. });
  67. })();