From 69b125db10a7fc59a003e1a4a04dfa6ad7a904f5 Mon Sep 17 00:00:00 2001 From: Robert Krahn Date: Sun, 17 Mar 2013 17:38:33 -0700 Subject: [PATCH] [incremental search] isearch highlight cleanup --- lib/ace/css/editor.css | 8 ++++++ lib/ace/incremental_search.js | 41 +++++++++++++++++++----------- lib/ace/incremental_search_test.js | 16 +++++++++++- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/lib/ace/css/editor.css b/lib/ace/css/editor.css index 81f8fbe6..3aebfb17 100644 --- a/lib/ace/css/editor.css +++ b/lib/ace/css/editor.css @@ -209,6 +209,14 @@ box-sizing: border-box; } +.ace_marker-layer .ace_isearch-result { + position: absolute; + z-index: 6; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +}} + .ace_line .ace_fold { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; diff --git a/lib/ace/incremental_search.js b/lib/ace/incremental_search.js index 24f68bc8..5564aa81 100644 --- a/lib/ace/incremental_search.js +++ b/lib/ace/incremental_search.js @@ -34,6 +34,7 @@ define(function(require, exports, module) { var oop = require("./lib/oop"); var Range = require("./range").Range; var Search = require("./search").Search; +var SearchHighlight = require("./search_highlight").SearchHighlight; var iSearchCommandModule = require("./commands/incremental_search_commands"); var ISearchKbd = iSearchCommandModule.IncrementalSearchKeyboardHandler; @@ -65,14 +66,14 @@ oop.inherits(IncrementalSearch, Search); ;(function() { - this.activate = function(editor, backwards) { - this.$editor = editor; - this.$startPos = this.$currentPos = editor.getCursorPosition(); + this.activate = function(ed, backwards) { + this.$editor = ed; + this.$startPos = this.$currentPos = ed.getCursorPosition(); this.$options.needle = ''; this.$options.backwards = backwards; - editor.keyBinding.addKeyboardHandler(this.$keyboardHandler); - this.$mousedownHandler = editor.addEventListener('mousedown', this.onMouseDown.bind(this)); - this.selectionFix(editor); + ed.keyBinding.addKeyboardHandler(this.$keyboardHandler); + this.$mousedownHandler = ed.addEventListener('mousedown', this.onMouseDown.bind(this)); + this.selectionFix(ed); this.statusMessage(true); } @@ -97,6 +98,14 @@ oop.inherits(IncrementalSearch, Search); } } + this.highlight = function(regexp) { + var sess = this.$editor.session, + hl = sess.$isearchHighlight = sess.$isearchHighlight || sess.addDynamicMarker( + new SearchHighlight(null, "ace_isearch-result", "text")); + hl.setRegexp(regexp); + sess._emit("changeBackMarker"); // force highlight layer redraw + } + this.cancelSearch = function(reset) { var e = this.$editor; this.$prevNeedle = this.$options.needle; @@ -105,8 +114,7 @@ oop.inherits(IncrementalSearch, Search); e.moveCursorToPosition(this.$startPos); this.$currentPos = this.$startPos; } - e.session.highlight(null); - e.session._emit("changeBackMarker"); // force highlight layer redraw + this.highlight(null); return Range.fromPoints(this.$currentPos, this.$currentPos); } @@ -132,9 +140,7 @@ oop.inherits(IncrementalSearch, Search); this.$editor.moveCursorToPosition(found.end); if (moveToNext) this.$currentPos = found.end; // highlight after cursor move, so selection works properly - // also force highlight layer redraw - session.highlight(options.re); - session._emit("changeBackMarker"); + this.highlight(options.re) } this.statusMessage(found); @@ -205,10 +211,15 @@ exports.IncrementalSearch = IncrementalSearch; var dom = require('./lib/dom'); function patchHighlightMarkerStyling(options) { options = options || {}; - var id = 'incremental-search-highlight-style-patch', - css = 'div.ace_selected-word {\n' - + ' background-color: orange !important;\n' - + ' border: 0 !important;\n' + var id = 'incremental-search-highlighting', + css = 'div.ace_isearch-result {\n' + + " border-radius: 4px;\n" + + " border: 8px solid rgba(255, 200, 0, 0.5);\n" + + " box-shadow: 0 0 4px rgb(255, 200, 0);\n" + + "}\n" + + '.ace_dark div.ace_isearch-result {\n' + + " border: 8px solid rgb(100, 110, 160);\n" + + " box-shadow: 0 0 4px rgb(80, 90, 140);\n" + '}\n' dom.importCssString(css, id); } diff --git a/lib/ace/incremental_search_test.js b/lib/ace/incremental_search_test.js index 1f8d78c0..c351d8e2 100644 --- a/lib/ace/incremental_search_test.js +++ b/lib/ace/incremental_search_test.js @@ -57,7 +57,7 @@ function callHighlighterUpdate() { ranges = ranges.concat(markerRanges); } } - session.$searchHighlight.update([], mockMarkerLayer, session, { + session.$isearchHighlight.update([], mockMarkerLayer, session, { firstRow: 0, lastRow: session.getRowLength()}); return ranges; } @@ -79,6 +79,20 @@ module.exports = { assert.notEqual(editor.getKeyboardHandler(), iSearch.$keyboardHandler); }, + "test: isearch highlight setup" : function() { + var sess = editor.session; + iSearch.activate(editor); + iSearch.highlight('foo'); + var highl = sess.$isearchHighlight.id; + assert.ok(sess.$isearchHighlight, 'session has no isearch highlighter'); + assert.equal(sess.getMarkers()[highl.id], highl.id, 'isearch highlight not in markers'); + iSearch.deactivate(); + iSearch.activate(editor); + iSearch.highlight('bar'); + var highl2 = sess.$isearchHighlight.id; + assert.equal(highl2, highl, 'multiple isearch highlights'); + }, + "test: find simple text incrementally" : function() { iSearch.activate(editor); var range = iSearch.addChar('1'), // "1"