| // Open simple dialogs on top of an editor. Relies on dialog.css. |
| |
| (function() { |
| function dialogDiv(cm, template) { |
| var wrap = cm.getWrapperElement(); |
| var dialog = wrap.insertBefore(document.createElement("div"), wrap.firstChild); |
| dialog.className = "CodeMirror-dialog"; |
| dialog.innerHTML = '<div>' + template + '</div>'; |
| return dialog; |
| } |
| |
| CodeMirror.defineExtension("openDialog", function(template, callback) { |
| var dialog = dialogDiv(this, template); |
| var closed = false, me = this; |
| function close() { |
| if (closed) return; |
| closed = true; |
| dialog.parentNode.removeChild(dialog); |
| } |
| var inp = dialog.getElementsByTagName("input")[0]; |
| if (inp) { |
| CodeMirror.connect(inp, "keydown", function(e) { |
| if (e.keyCode == 13 || e.keyCode == 27) { |
| CodeMirror.e_stop(e); |
| close(); |
| me.focus(); |
| if (e.keyCode == 13) callback(inp.value); |
| } |
| }); |
| inp.focus(); |
| CodeMirror.connect(inp, "blur", close); |
| } |
| return close; |
| }); |
| |
| CodeMirror.defineExtension("openConfirm", function(template, callbacks) { |
| var dialog = dialogDiv(this, template); |
| var buttons = dialog.getElementsByTagName("button"); |
| var closed = false, me = this, blurring = 1; |
| function close() { |
| if (closed) return; |
| closed = true; |
| dialog.parentNode.removeChild(dialog); |
| me.focus(); |
| } |
| buttons[0].focus(); |
| for (var i = 0; i < buttons.length; ++i) { |
| var b = buttons[i]; |
| (function(callback) { |
| CodeMirror.connect(b, "click", function(e) { |
| CodeMirror.e_preventDefault(e); |
| close(); |
| if (callback) callback(me); |
| }); |
| })(callbacks[i]); |
| CodeMirror.connect(b, "blur", function() { |
| --blurring; |
| setTimeout(function() { if (blurring <= 0) close(); }, 200); |
| }); |
| CodeMirror.connect(b, "focus", function() { ++blurring; }); |
| } |
| }); |
| })(); |