From 7ca69e61dae80b6d66c934f273c4dfeaad433b87 Mon Sep 17 00:00:00 2001 From: tophf Date: Wed, 28 Oct 2015 01:37:19 +0300 Subject: [PATCH 1/2] Editor: sticky .CodeMirror-active class for code boxes It is retained when a child search/jump minidialog is focused unlike the built-in .CodeMirror-focused --- edit.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/edit.js b/edit.js index d884fd44..94522ad3 100644 --- a/edit.js +++ b/edit.js @@ -310,8 +310,16 @@ function setupCodeMirror(textarea, index) { cm.on("blur", function(cm) { editors.lastActive = cm; hotkeyRerouter.setState(true); + setTimeout(function() { + var cm = editors.lastActive; + var childFocused = cm.display.wrapper.contains(document.activeElement); + cm.display.wrapper.classList.toggle("CodeMirror-active", childFocused); + }, 0); + }); + cm.on("focus", function() { + hotkeyRerouter.setState(false); + cm.display.wrapper.classList.add("CodeMirror-active"); }); - cm.on("focus", hotkeyRerouter.setState.bind(null, false)); var resizeGrip = cm.display.wrapper.appendChild(document.createElement("div")); resizeGrip.className = "resize-grip"; From 3837ef5f623840c9b236215fdd50fc4fd5f8674c Mon Sep 17 00:00:00 2001 From: tophf Date: Thu, 29 Oct 2015 21:20:05 +0300 Subject: [PATCH 2/2] Editor: focus the minidialog when switching find/replace Previously, when a search minidialog was displayed and we pressed a hotkey to switch to another kind of minidialog (search -> replace, etc), the focus wasn't correctly preserved --- edit.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/edit.js b/edit.js index 94522ad3..d587cd09 100644 --- a/edit.js +++ b/edit.js @@ -608,6 +608,7 @@ function setupGlobalSearch() { originalOpenDialog.call(cm, template.innerHTML, callback.bind(cb), opt); }; setTimeout(function() { cm.openDialog = originalOpenDialog; }, 0); + refocusMinidialog(cm); } function focusClosestCM(activeCM) { @@ -794,6 +795,7 @@ function setupGlobalSearch() { function jumpToLine(cm) { var cur = cm.getCursor(); + refocusMinidialog(cm); cm.openDialog(template.jumpToLine.innerHTML, function(str) { var m = str.match(/^\s*(\d+)(?:\s*:\s*(\d+))?\s*$/); if (m) { @@ -802,6 +804,19 @@ function jumpToLine(cm) { }, {value: cur.line+1}); } +function refocusMinidialog(cm) { + var section = getSectionForCodeMirror(cm); + if (!section.querySelector(".CodeMirror-dialog")) { + return; + } + // close the currently opened minidialog + cm.focus(); + // make sure to focus the input in newly opened minidialog + setTimeout(function() { + section.querySelector(".CodeMirror-dialog").focus(); + }, 0); +} + function nextPrevEditor(cm, direction) { cm = editors[(editors.indexOf(cm) + direction + editors.length) % editors.length]; makeSectionVisible(cm);