From 544cb0949903350357df48e6bf47eaee46c8df17 Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 13 Apr 2012 21:06:18 +0400 Subject: [PATCH 01/12] fix typo in split.js --- lib/ace/split.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/ace/split.js b/lib/ace/split.js index 068d5269..fc5ae07d 100644 --- a/lib/ace/split.js +++ b/lib/ace/split.js @@ -56,7 +56,7 @@ var Split = function(container, theme, splits) { this.$splits = 0; this.$editorCSS = ""; this.$editors = []; - this.$oriantation = this.BESIDE; + this.$orientation = this.BESIDE; this.setSplits(splits || 1); this.$cEditor = this.$editors[0]; @@ -213,15 +213,15 @@ var Split = function(container, theme, splits) { return session; }; - this.getOriantation = function() { - return this.$oriantation; + this.getOrientation = function() { + return this.$orientation; }; - this.setOriantation = function(oriantation) { - if (this.$oriantation == oriantation) { + this.setOrientation = function(orientation) { + if (this.$orientation == orientation) { return; } - this.$oriantation = oriantation; + this.$orientation = orientation; this.resize(); }; @@ -230,7 +230,7 @@ var Split = function(container, theme, splits) { var height = this.$container.clientHeight; var editor; - if (this.$oriantation == this.BESIDE) { + if (this.$orientation == this.BESIDE) { var editorWidth = width / this.$splits; for (var i = 0; i < this.$splits; i++) { editor = this.$editors[i]; From 6a781ad9d3ebb0c7db0fb4f753bc3a2f13cbc2b5 Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 13 Apr 2012 22:14:45 +0400 Subject: [PATCH 02/12] show crosshair cursor when alt is pressed --- lib/ace/multi_select.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js index 716bc0fc..b1104775 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -623,6 +623,33 @@ function MultiSelect(editor) { editor.on("mousedown", onMouseDown); editor.commands.addCommands(exports.commands.defaultCommands); + + addAltCursorListeners(editor); +} + +function addAltCursorListeners(editor){ + var el = editor.textInput.getElement(); + var altCursor = false; + var contentEl = editor.renderer.content; + el.addEventListener("keydown", function(e) { + if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) { + if (!altCursor) { + contentEl.style.cursor = "crosshair"; + altCursor = true; + } + } else if (altCursor) { + contentEl.style.cursor = ""; + } + }); + + el.addEventListener("keyup", reset); + el.addEventListener("blur", reset); + function reset() { + if (altCursor) { + contentEl.style.cursor = ""; + altCursor = false; + } + } } exports.MultiSelect = MultiSelect; From d91c9f707464c04c5f5b7ee1d0083ba90d3cbf84 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 14 Apr 2012 15:54:23 +0400 Subject: [PATCH 03/12] use 1px cursor only in multiselect mode --- lib/ace/css/editor.css | 4 ++++ lib/ace/theme/clouds.js | 2 +- lib/ace/theme/clouds_midnight.js | 2 +- lib/ace/theme/cobalt.js | 2 +- lib/ace/theme/dawn.js | 2 +- lib/ace/theme/eclipse.js | 2 +- lib/ace/theme/idle_fingers.js | 2 +- lib/ace/theme/kr_theme.js | 2 +- lib/ace/theme/merbivore.js | 2 +- lib/ace/theme/merbivore_soft.js | 2 +- lib/ace/theme/mono_industrial.js | 2 +- lib/ace/theme/monokai.js | 2 +- lib/ace/theme/pastel_on_dark.js | 2 +- lib/ace/theme/solarized_dark.js | 2 +- lib/ace/theme/solarized_light.js | 2 +- lib/ace/theme/textmate.js | 2 +- lib/ace/theme/tomorrow.js | 2 +- lib/ace/theme/tomorrow_night.js | 2 +- lib/ace/theme/tomorrow_night_blue.js | 2 +- lib/ace/theme/tomorrow_night_bright.js | 2 +- lib/ace/theme/tomorrow_night_eighties.js | 2 +- lib/ace/theme/twilight.js | 2 +- lib/ace/theme/vibrant_ink.js | 2 +- 23 files changed, 26 insertions(+), 22 deletions(-) diff --git a/lib/ace/css/editor.css b/lib/ace/css/editor.css index 0d596052..83c21130 100644 --- a/lib/ace/css/editor.css +++ b/lib/ace/css/editor.css @@ -151,6 +151,10 @@ opacity: 0.2; } +.ace_editor.multiselect .ace_cursor { + border-left-width: 1px; +} + .ace_line { white-space: nowrap; } diff --git a/lib/ace/theme/clouds.js b/lib/ace/theme/clouds.js index 8d827f97..389c82e3 100644 --- a/lib/ace/theme/clouds.js +++ b/lib/ace/theme/clouds.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-clouds .ace_cursor {\ - border-left: 1px solid #000000;\ + border-left: 2px solid #000000;\ }\ \ .ace-clouds .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/clouds_midnight.js b/lib/ace/theme/clouds_midnight.js index be2673c7..de6fea2e 100644 --- a/lib/ace/theme/clouds_midnight.js +++ b/lib/ace/theme/clouds_midnight.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-clouds-midnight .ace_cursor {\ - border-left: 1px solid #7DA5DC;\ + border-left: 2px solid #7DA5DC;\ }\ \ .ace-clouds-midnight .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/cobalt.js b/lib/ace/theme/cobalt.js index b678a5cf..4631fef2 100644 --- a/lib/ace/theme/cobalt.js +++ b/lib/ace/theme/cobalt.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-cobalt .ace_cursor {\ - border-left: 1px solid #FFFFFF;\ + border-left: 2px solid #FFFFFF;\ }\ \ .ace-cobalt .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/dawn.js b/lib/ace/theme/dawn.js index 9fd4f22f..3967d959 100644 --- a/lib/ace/theme/dawn.js +++ b/lib/ace/theme/dawn.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-dawn .ace_cursor {\ - border-left: 1px solid #000000;\ + border-left: 2px solid #000000;\ }\ \ .ace-dawn .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/eclipse.js b/lib/ace/theme/eclipse.js index ed2376a0..8f0bc7c9 100644 --- a/lib/ace/theme/eclipse.js +++ b/lib/ace/theme/eclipse.js @@ -67,7 +67,7 @@ exports.cssText = ".ace-eclipse .ace_editor {\ }\ \ .ace-eclipse .ace_cursor {\ - border-left: 1px solid black;\ + border-left: 2px solid black;\ }\ \ .ace-eclipse .ace_line .ace_storage,\ diff --git a/lib/ace/theme/idle_fingers.js b/lib/ace/theme/idle_fingers.js index b1acacb7..551e7811 100644 --- a/lib/ace/theme/idle_fingers.js +++ b/lib/ace/theme/idle_fingers.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-idle-fingers .ace_cursor {\ - border-left: 1px solid #91FF00;\ + border-left: 2px solid #91FF00;\ }\ \ .ace-idle-fingers .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/kr_theme.js b/lib/ace/theme/kr_theme.js index bcd31b67..56313438 100644 --- a/lib/ace/theme/kr_theme.js +++ b/lib/ace/theme/kr_theme.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-kr-theme .ace_cursor {\ - border-left: 1px solid #FF9900;\ + border-left: 2px solid #FF9900;\ }\ \ .ace-kr-theme .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/merbivore.js b/lib/ace/theme/merbivore.js index 59a78d6d..ddc09766 100644 --- a/lib/ace/theme/merbivore.js +++ b/lib/ace/theme/merbivore.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-merbivore .ace_cursor {\ - border-left: 1px solid #FFFFFF;\ + border-left: 2px solid #FFFFFF;\ }\ \ .ace-merbivore .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/merbivore_soft.js b/lib/ace/theme/merbivore_soft.js index 1ffedc14..d684ff63 100644 --- a/lib/ace/theme/merbivore_soft.js +++ b/lib/ace/theme/merbivore_soft.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-merbivore-soft .ace_cursor {\ - border-left: 1px solid #FFFFFF;\ + border-left: 2px solid #FFFFFF;\ }\ \ .ace-merbivore-soft .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/mono_industrial.js b/lib/ace/theme/mono_industrial.js index 85c7313a..ae4274cb 100644 --- a/lib/ace/theme/mono_industrial.js +++ b/lib/ace/theme/mono_industrial.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-mono-industrial .ace_cursor {\ - border-left: 1px solid #FFFFFF;\ + border-left: 2px solid #FFFFFF;\ }\ \ .ace-mono-industrial .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/monokai.js b/lib/ace/theme/monokai.js index 98782855..2794ff45 100644 --- a/lib/ace/theme/monokai.js +++ b/lib/ace/theme/monokai.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-monokai .ace_cursor {\ - border-left: 1px solid #F8F8F0;\ + border-left: 2px solid #F8F8F0;\ }\ \ .ace-monokai .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/pastel_on_dark.js b/lib/ace/theme/pastel_on_dark.js index 3a95a36f..d0ad8bd6 100644 --- a/lib/ace/theme/pastel_on_dark.js +++ b/lib/ace/theme/pastel_on_dark.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-pastel-on-dark .ace_cursor {\ - border-left: 1px solid #A7A7A7;\ + border-left: 2px solid #A7A7A7;\ }\ \ .ace-pastel-on-dark .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/solarized_dark.js b/lib/ace/theme/solarized_dark.js index 159f17bd..fcf0ae42 100644 --- a/lib/ace/theme/solarized_dark.js +++ b/lib/ace/theme/solarized_dark.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-solarized-dark .ace_cursor {\ - border-left: 1px solid #D30102;\ + border-left: 2px solid #D30102;\ }\ \ .ace-solarized-dark .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/solarized_light.js b/lib/ace/theme/solarized_light.js index dc635f59..9191e556 100644 --- a/lib/ace/theme/solarized_light.js +++ b/lib/ace/theme/solarized_light.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-solarized-light .ace_cursor {\ - border-left: 1px solid #000000;\ + border-left: 2px solid #000000;\ }\ \ .ace-solarized-light .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/textmate.js b/lib/ace/theme/textmate.js index 71885186..8931e60a 100644 --- a/lib/ace/theme/textmate.js +++ b/lib/ace/theme/textmate.js @@ -67,7 +67,7 @@ exports.cssText = ".ace-tm .ace_editor {\ }\ \ .ace-tm .ace_cursor {\ - border-left: 1px solid black;\ + border-left: 2px solid black;\ }\ \ .ace-tm .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/tomorrow.js b/lib/ace/theme/tomorrow.js index 3447769a..a891f06a 100644 --- a/lib/ace/theme/tomorrow.js +++ b/lib/ace/theme/tomorrow.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-tomorrow .ace_cursor {\ - border-left: 1px solid #AEAFAD;\ + border-left: 2px solid #AEAFAD;\ }\ \ .ace-tomorrow .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/tomorrow_night.js b/lib/ace/theme/tomorrow_night.js index 141912de..bb8e3a21 100644 --- a/lib/ace/theme/tomorrow_night.js +++ b/lib/ace/theme/tomorrow_night.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-tomorrow-night .ace_cursor {\ - border-left: 1px solid #AEAFAD;\ + border-left: 2px solid #AEAFAD;\ }\ \ .ace-tomorrow-night .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/tomorrow_night_blue.js b/lib/ace/theme/tomorrow_night_blue.js index eae9284d..f8e5c0d8 100644 --- a/lib/ace/theme/tomorrow_night_blue.js +++ b/lib/ace/theme/tomorrow_night_blue.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-tomorrow-night-blue .ace_cursor {\ - border-left: 1px solid #FFFFFF;\ + border-left: 2px solid #FFFFFF;\ }\ \ .ace-tomorrow-night-blue .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/tomorrow_night_bright.js b/lib/ace/theme/tomorrow_night_bright.js index a03817d8..d294cbfc 100644 --- a/lib/ace/theme/tomorrow_night_bright.js +++ b/lib/ace/theme/tomorrow_night_bright.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-tomorrow-night-bright .ace_cursor {\ - border-left: 1px solid #9F9F9F;\ + border-left: 2px solid #9F9F9F;\ }\ \ .ace-tomorrow-night-bright .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/tomorrow_night_eighties.js b/lib/ace/theme/tomorrow_night_eighties.js index 09ad2839..6c4efbd8 100644 --- a/lib/ace/theme/tomorrow_night_eighties.js +++ b/lib/ace/theme/tomorrow_night_eighties.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-tomorrow-night-eighties .ace_cursor {\ - border-left: 1px solid #CCCCCC;\ + border-left: 2px solid #CCCCCC;\ }\ \ .ace-tomorrow-night-eighties .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/twilight.js b/lib/ace/theme/twilight.js index 633ab66c..728b9922 100644 --- a/lib/ace/theme/twilight.js +++ b/lib/ace/theme/twilight.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-twilight .ace_cursor {\ - border-left: 1px solid #A7A7A7;\ + border-left: 2px solid #A7A7A7;\ }\ \ .ace-twilight .ace_cursor.ace_overwrite {\ diff --git a/lib/ace/theme/vibrant_ink.js b/lib/ace/theme/vibrant_ink.js index 4d497b03..6ac945c3 100644 --- a/lib/ace/theme/vibrant_ink.js +++ b/lib/ace/theme/vibrant_ink.js @@ -68,7 +68,7 @@ exports.cssText = "\ }\ \ .ace-vibrant-ink .ace_cursor {\ - border-left: 1px solid #FFFFFF;\ + border-left: 2px solid #FFFFFF;\ }\ \ .ace-vibrant-ink .ace_cursor.ace_overwrite {\ From b77c3b348ebcb2b6e952262f4c2605a58a6d5287 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 14 Apr 2012 18:20:27 +0400 Subject: [PATCH 04/12] fix bug with ghost selections --- lib/ace/layer/cursor.js | 2 +- lib/ace/mouse/multi_select_handler.js | 14 ++++++--- lib/ace/multi_select.js | 22 ++++++++------ lib/ace/multi_select_test.js | 41 +++++++++++++++++++++------ lib/ace/range.js | 2 +- 5 files changed, 58 insertions(+), 23 deletions(-) diff --git a/lib/ace/layer/cursor.js b/lib/ace/layer/cursor.js index 36a085f3..38b4adbc 100644 --- a/lib/ace/layer/cursor.js +++ b/lib/ace/layer/cursor.js @@ -141,7 +141,7 @@ var Cursor = function(parentEl) { this.update = function(config) { this.config = config; - if (this.session.selectionMarkerCount > 1) { + if (this.session.selectionMarkerCount > 0) { var selections = this.session.$selectionMarkers; var i = 0, sel, cursorIndex = 0; diff --git a/lib/ace/mouse/multi_select_handler.js b/lib/ace/mouse/multi_select_handler.js index fa5def23..34db2cda 100644 --- a/lib/ace/mouse/multi_select_handler.js +++ b/lib/ace/mouse/multi_select_handler.js @@ -111,9 +111,10 @@ function onMouseDown(e) { if (!isMultiSelect && inSelection) return; // dragging - if (!isMultiSelect) - selection.addRange(selection.toOrientedRange()); - + if (!isMultiSelect) { + var range = selection.toOrientedRange(); + editor.addSelectionMarker(range); + } var oldRange = selection.rangeList.rangeAtPoint(pos); @@ -122,8 +123,13 @@ function onMouseDown(e) { if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) selection.substractPoint(tmpSel.cursor); - else + else { + if (range) { + editor.removeSelectionMarkers([range]); + selection.addRange(range); + } selection.addRange(tmpSel); + } }); } else if (!shift && alt && button == 0) { diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js index b1104775..0586a722 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -77,17 +77,21 @@ var EditSession = require("./edit_session").EditSession; * adds a range to selection entering multiselect mode if necessary **/ this.addRange = function(range) { - if (!this.inMultiSelectMode && this.rangeCount == 0) { - var oldRange = this.toOrientedRange(); - if (!range || !range.isEqual(oldRange)) { - this.rangeList.add(oldRange); - this.$onAddRange(oldRange); - } - } - if (!range) return; + if (!this.inMultiSelectMode && this.rangeCount == 0) { + var oldRange = this.toOrientedRange(); + if (range.intersects(oldRange)) { + this.fromOrientedRange(range); + return; + } + + this.rangeList.add(oldRange); + this.$onAddRange(oldRange); + } + + if (!range.cursor) range.cursor = range.end; @@ -98,7 +102,7 @@ var EditSession = require("./edit_session").EditSession; if (removed.length) this.$onRemoveRange(removed); - if (this.rangeCount > 0 && !this.inMultiSelectMode) { + if (this.rangeCount > 1 && !this.inMultiSelectMode) { this._emit("multiSelect"); this.inMultiSelectMode = true; this.session.$undoSelect = false; diff --git a/lib/ace/multi_select_test.js b/lib/ace/multi_select_test.js index 571202f0..8e0a4013 100644 --- a/lib/ace/multi_select_test.js +++ b/lib/ace/multi_select_test.js @@ -57,7 +57,7 @@ var exec = function(name, times, args) { } while(times --> 1) }; var testRanges = function(str) { - assert.equal(editor.selection.getAllRanges()+"", str); + assert.equal(editor.selection.getAllRanges() + "", str + ""); } module.exports = { @@ -78,8 +78,8 @@ module.exports = { assert.ok(editor.inMultiSelectMode); assert.equal(editor.selection.getAllRanges().length, 4); - var newLine = editor.session.getDocument().getNewLineCharacter(); - var copyText = "wwww".split("").join(newLine); + var newLine = editor.session.getDocument().getNewLineCharacter(); + var copyText = "wwww".split("").join(newLine); assert.equal(editor.getCopyText(), copyText); exec("insertstring", 1, "a"); exec("backspace", 2); @@ -120,14 +120,11 @@ module.exports = { " wtt.w", " wtt.w" ]); - var editor = new Editor(new MockRenderer(), doc); + editor = new Editor(new MockRenderer(), doc); MultiSelect(editor); editor.selectMoreLines(1) - assert.equal( - editor.selection.getAllRanges()+"", - "Range: [0/0] -> [0/0],Range: [1/0] -> [1/0]" - ); + testRanges("Range: [0/0] -> [0/0],Range: [1/0] -> [1/0]"); assert.ok(editor.inMultiSelectMode); var doc2 = new EditSession(["w1"]); @@ -136,6 +133,34 @@ module.exports = { editor.setSession(doc); assert.ok(editor.inMultiSelectMode); + }, + + "test: multiselect addRange": function() { + var doc = new EditSession([ + "w1.w2", + " wtt.w", + " wtt.w" + ]); + editor = new Editor(new MockRenderer(), doc); + MultiSelect(editor); + var selection = editor.selection; + + var range1 = new Range(0, 2, 0, 4); + editor.selection.fromOrientedRange(range1); + + var range2 = new Range(0, 3, 0, 4); + selection.addRange(range2); + assert.ok(!editor.inMultiSelectMode); + assert.ok(range2.isEqual(editor.selection.getRange())); + + var range3 = new Range(0, 1, 0, 1); + selection.addRange(range3); + assert.ok(editor.inMultiSelectMode); + testRanges([range3, range2]); + + var range4 = new Range(0, 0, 4, 0); + selection.addRange(range4); + assert.ok(!editor.inMultiSelectMode); } }; diff --git a/lib/ace/range.js b/lib/ace/range.js index 163979fe..0947d9f4 100644 --- a/lib/ace/range.js +++ b/lib/ace/range.js @@ -117,7 +117,7 @@ var Range = function(startRow, startColumn, endRow, endColumn) { return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; } - this.intersectsRange = function(range) { + this.intersects = function(range) { var cmp = this.compareRange(range); return (cmp == -1 || cmp == 0 || cmp == 1); } From 04e83afee1747c0effc1735d7d58f4d1547bd01a Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 15 Apr 2012 13:58:08 +0400 Subject: [PATCH 05/12] do not redraw whole editor when only one cursor is visible --- lib/ace/layer/cursor.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ace/layer/cursor.js b/lib/ace/layer/cursor.js index 38b4adbc..1c55d7a8 100644 --- a/lib/ace/layer/cursor.js +++ b/lib/ace/layer/cursor.js @@ -107,11 +107,11 @@ var Cursor = function(parentEl) { if (!this.isVisible) return; - var element = this.element; + var element = this.cursors.length == 1 ? this.cursor : this.element; this.blinkId = setInterval(function() { element.style.visibility = "hidden"; setTimeout(function() { - element.style.visibility = "visible"; + element.style.visibility = ""; }, 400); }, 1000); }; From 31a6da4b5f871c48878e6721d9f50c8fc0efde48 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 15 Apr 2012 14:45:08 +0400 Subject: [PATCH 06/12] fix Multiple selections only show 1 selection --- lib/ace/layer/marker.js | 6 +++--- lib/ace/theme/clouds.js | 5 +++++ lib/ace/theme/clouds_midnight.js | 5 +++++ lib/ace/theme/cobalt.js | 5 +++++ lib/ace/theme/dawn.js | 5 +++++ lib/ace/theme/idle_fingers.js | 5 +++++ lib/ace/theme/kr_theme.js | 5 +++++ lib/ace/theme/merbivore.js | 5 +++++ lib/ace/theme/merbivore_soft.js | 5 +++++ lib/ace/theme/mono_industrial.js | 5 +++++ lib/ace/theme/monokai.js | 5 +++++ lib/ace/theme/pastel_on_dark.js | 5 +++++ lib/ace/theme/solarized_dark.js | 5 +++++ lib/ace/theme/solarized_light.js | 5 +++++ lib/ace/theme/textmate.js | 5 ++++- lib/ace/theme/tomorrow.js | 5 +++++ lib/ace/theme/tomorrow_night.js | 5 +++++ lib/ace/theme/tomorrow_night_blue.js | 5 +++++ lib/ace/theme/tomorrow_night_bright.js | 5 +++++ lib/ace/theme/tomorrow_night_eighties.js | 5 +++++ lib/ace/theme/twilight.js | 5 +++++ lib/ace/theme/vibrant_ink.js | 5 +++++ tool/Theme.tmpl.css | 7 ++++++- 23 files changed, 113 insertions(+), 5 deletions(-) diff --git a/lib/ace/layer/marker.js b/lib/ace/layer/marker.js index ac361249..741a271d 100644 --- a/lib/ace/layer/marker.js +++ b/lib/ace/layer/marker.js @@ -99,7 +99,7 @@ var Marker = function(parentEl) { } else { this.drawSingleLineMarker( - html, range, marker.clazz, config, + html, range, marker.clazz + " start", config, null, marker.type ); } @@ -122,7 +122,7 @@ var Marker = function(parentEl) { row, range.start.column, row, this.session.getScreenLastRowColumn(row) ); - this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, "text"); + this.drawSingleLineMarker(stringBuilder, lineRange, clazz + " start", layerConfig, 1, "text"); // selection end row = range.end.row; @@ -152,7 +152,7 @@ var Marker = function(parentEl) { ); stringBuilder.push( - "
Date: Sun, 15 Apr 2012 18:23:42 +0400 Subject: [PATCH 08/12] add editor.findAll --- lib/ace/mouse/multi_select_handler.js | 2 +- lib/ace/multi_select.js | 68 ++++++++++++++++++++++----- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/lib/ace/mouse/multi_select_handler.js b/lib/ace/mouse/multi_select_handler.js index 34db2cda..24b25cd4 100644 --- a/lib/ace/mouse/multi_select_handler.js +++ b/lib/ace/mouse/multi_select_handler.js @@ -125,7 +125,7 @@ function onMouseDown(e) { selection.substractPoint(tmpSel.cursor); else { if (range) { - editor.removeSelectionMarkers([range]); + editor.removeSelectionMarker(range); selection.addRange(range); } selection.addRange(tmpSel); diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js index 0586a722..0b8850bc 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -76,22 +76,19 @@ var EditSession = require("./edit_session").EditSession; * * adds a range to selection entering multiselect mode if necessary **/ - this.addRange = function(range) { + this.addRange = function(range, $blockChangeEvents) { if (!range) return; if (!this.inMultiSelectMode && this.rangeCount == 0) { var oldRange = this.toOrientedRange(); - if (range.intersects(oldRange)) { - this.fromOrientedRange(range); - return; - } - + if (range.intersects(oldRange)) + return $blockChangeEvents || this.fromOrientedRange(range); + this.rangeList.add(oldRange); this.$onAddRange(oldRange); } - if (!range.cursor) range.cursor = range.end; @@ -108,6 +105,8 @@ var EditSession = require("./edit_session").EditSession; this.session.$undoSelect = false; this.rangeList.attach(this.session); } + + return $blockChangeEvents || this.fromOrientedRange(range); }; this.toSingleRange = function(range) { @@ -149,7 +148,6 @@ var EditSession = require("./edit_session").EditSession; this.$onAddRange = function(range) { this.rangeCount = this.rangeList.ranges.length; this.ranges.unshift(range); - this.fromOrientedRange(range); this._emit("addRange", {range: range}); }; @@ -313,17 +311,34 @@ var Editor = require("./editor").Editor; return orientedRange; }; + /** + * Editor.removeSelectionMarker(range) -> Void + * - range: selection range added with addSelectionMarker + * + * removes selection marker + **/ + this.removeSelectionMarker = function(range) { + if (!range.marker) + return; + this.session.removeMarker(range.marker); + var index = this.session.$selectionMarkers.indexOf(range); + if (index != -1) + this.session.$selectionMarkers.splice(index, 1); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + }; + this.removeSelectionMarkers = function(ranges) { + var markerList = this.session.$selectionMarkers; for (var i = ranges.length; i--; ) { var range = ranges[i]; if (!range.marker) continue; this.session.removeMarker(range.marker); - var index = this.session.$selectionMarkers.indexOf(range); + var index = markerList.indexOf(range); if (index != -1) - this.session.$selectionMarkers.splice(index, 1); + markerList.splice(index, 1); } - this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + this.session.selectionMarkerCount = markerList.length; }; this.$onAddRange = function(e) { @@ -446,6 +461,37 @@ var Editor = require("./editor").Editor; return text; }; + /** + * Editor.findAll(dir, options) -> Number + * - needle: text to find + * - options: search options + * - additive: keeps + * + * finds and selects all the occurencies of needle + * returns number of found ranges + **/ + this.findAll = function(needle, options, additive) { + options = options || {}; + options.needle = needle || options.needle; + this.$search.set(options); + + var ranges = this.$search.findAll(this.session); + if (!ranges.length) + return 0; + + this.$blockScrolling += 1; + var selection = this.multiSelect; + + if (!additive) + selection.toSingleRange(ranges[0]); + + for (var i = ranges.length; i--; ) + selection.addRange(ranges[i], true); + + this.$blockScrolling -= 1; + + return ranges.length; + }; // commands /** From 119d733fb592afebecb68026790e097395416b12 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 15 Apr 2012 18:33:48 +0400 Subject: [PATCH 09/12] replaceAll shouldn't change scroll position --- lib/ace/editor.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ace/editor.js b/lib/ace/editor.js index d7a5966e..0e1df71b 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -1163,11 +1163,12 @@ var Editor = function(renderer, session) { if (!ranges.length) return replaced; + this.$blockScrolling += 1; + var selection = this.getSelectionRange(); this.clearSelection(); this.selection.moveCursorTo(0, 0); - this.$blockScrolling += 1; for (var i = ranges.length - 1; i >= 0; --i) { if(this.$tryReplace(ranges[i], replacement)) { replaced++; From 68d0799554d76a640fcab1c859034fdc3a561a96 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 15 Apr 2012 19:02:18 +0400 Subject: [PATCH 10/12] make getStartRule getEndRule static --- lib/ace/mode/c_cpp_highlight_rules.js | 4 +-- lib/ace/mode/doc_comment_highlight_rules.js | 35 ++++++++++----------- lib/ace/mode/groovy_highlight_rules.js | 4 +-- lib/ace/mode/haxe_highlight_rules.js | 4 +-- lib/ace/mode/java_highlight_rules.js | 4 +-- lib/ace/mode/javascript_highlight_rules.js | 4 +-- lib/ace/mode/pgsql_highlight_rules.js | 4 +-- lib/ace/mode/php_highlight_rules.js | 4 +-- lib/ace/mode/scad_highlight_rules.js | 4 +-- lib/ace/mode/scala_highlight_rules.js | 4 +-- 10 files changed, 34 insertions(+), 37 deletions(-) diff --git a/lib/ace/mode/c_cpp_highlight_rules.js b/lib/ace/mode/c_cpp_highlight_rules.js index f2192803..236b7284 100644 --- a/lib/ace/mode/c_cpp_highlight_rules.js +++ b/lib/ace/mode/c_cpp_highlight_rules.js @@ -72,7 +72,7 @@ var c_cppHighlightRules = function() { token : "comment", regex : "\\/\\/.*$" }, - new DocCommentHighlightRules().getStartRule("doc-start"), + DocCommentHighlightRules.getStartRule("doc-start"), { token : "comment", // multi line comment merge : true, @@ -171,7 +171,7 @@ var c_cppHighlightRules = function() { }; this.embedRules(DocCommentHighlightRules, "doc-", - [ new DocCommentHighlightRules().getEndRule("start") ]); + [ DocCommentHighlightRules.getEndRule("start") ]); }; oop.inherits(c_cppHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/doc_comment_highlight_rules.js b/lib/ace/mode/doc_comment_highlight_rules.js index 101cfa78..b176ef01 100644 --- a/lib/ace/mode/doc_comment_highlight_rules.js +++ b/lib/ace/mode/doc_comment_highlight_rules.js @@ -69,27 +69,24 @@ var DocCommentHighlightRules = function() { oop.inherits(DocCommentHighlightRules, TextHighlightRules); -(function() { - - this.getStartRule = function(start) { - return { - token : "comment.doc", // doc comment - merge : true, - regex : "\\/\\*(?=\\*)", - next : start - }; - }; - - this.getEndRule = function (start) { - return { - token : "comment.doc", // closing comment - merge : true, - regex : "\\*\\/", - next : start - }; +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + merge : true, + regex : "\\/\\*(?=\\*)", + next : start }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + merge : true, + regex : "\\*\\/", + next : start + }; +}; -}).call(DocCommentHighlightRules.prototype); exports.DocCommentHighlightRules = DocCommentHighlightRules; diff --git a/lib/ace/mode/groovy_highlight_rules.js b/lib/ace/mode/groovy_highlight_rules.js index 6e3802a2..64ed0ab1 100644 --- a/lib/ace/mode/groovy_highlight_rules.js +++ b/lib/ace/mode/groovy_highlight_rules.js @@ -64,7 +64,7 @@ var GroovyHighlightRules = function() { token : "comment", regex : "\\/\\/.*$" }, - new DocCommentHighlightRules().getStartRule("doc-start"), + DocCommentHighlightRules.getStartRule("doc-start"), { token : "comment", // multi line comment merge : true, @@ -134,7 +134,7 @@ var GroovyHighlightRules = function() { }; this.embedRules(DocCommentHighlightRules, "doc-", - [ new DocCommentHighlightRules().getEndRule("start") ]); + [ DocCommentHighlightRules.getEndRule("start") ]); }; oop.inherits(GroovyHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/haxe_highlight_rules.js b/lib/ace/mode/haxe_highlight_rules.js index afd76659..5b17c650 100644 --- a/lib/ace/mode/haxe_highlight_rules.js +++ b/lib/ace/mode/haxe_highlight_rules.js @@ -26,7 +26,7 @@ var HaxeHighlightRules = function() { token : "comment", regex : "\\/\\/.*$" }, - new DocCommentHighlightRules().getStartRule("doc-start"), + DocCommentHighlightRules.getStartRule("doc-start"), { token : "comment", // multi line comment regex : "\\/\\*", @@ -95,7 +95,7 @@ var HaxeHighlightRules = function() { }; this.embedRules(DocCommentHighlightRules, "doc-", - [ new DocCommentHighlightRules().getEndRule("start") ]); + [ DocCommentHighlightRules.getEndRule("start") ]); }; oop.inherits(HaxeHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/java_highlight_rules.js b/lib/ace/mode/java_highlight_rules.js index 34aab3bd..77efd672 100644 --- a/lib/ace/mode/java_highlight_rules.js +++ b/lib/ace/mode/java_highlight_rules.js @@ -65,7 +65,7 @@ var JavaHighlightRules = function() { token : "comment", regex : "\\/\\/.*$" }, - new DocCommentHighlightRules().getStartRule("doc-start"), + DocCommentHighlightRules.getStartRule("doc-start"), { token : "comment", // multi line comment merge : true, @@ -135,7 +135,7 @@ var JavaHighlightRules = function() { }; this.embedRules(DocCommentHighlightRules, "doc-", - [ new DocCommentHighlightRules().getEndRule("start") ]); + [ DocCommentHighlightRules.getEndRule("start") ]); }; oop.inherits(JavaHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/javascript_highlight_rules.js b/lib/ace/mode/javascript_highlight_rules.js index a375d054..416dc3c4 100644 --- a/lib/ace/mode/javascript_highlight_rules.js +++ b/lib/ace/mode/javascript_highlight_rules.js @@ -116,7 +116,7 @@ var JavaScriptHighlightRules = function() { token : "comment", regex : /\/\/.*$/ }, - new DocCommentHighlightRules().getStartRule("doc-start"), + DocCommentHighlightRules.getStartRule("doc-start"), { token : "comment", // multi line comment merge : true, @@ -445,7 +445,7 @@ var JavaScriptHighlightRules = function() { }; this.embedRules(DocCommentHighlightRules, "doc-", - [ new DocCommentHighlightRules().getEndRule("start") ]); + [ DocCommentHighlightRules.getEndRule("start") ]); }; oop.inherits(JavaScriptHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/pgsql_highlight_rules.js b/lib/ace/mode/pgsql_highlight_rules.js index c5b6849f..d15c94da 100755 --- a/lib/ace/mode/pgsql_highlight_rules.js +++ b/lib/ace/mode/pgsql_highlight_rules.js @@ -442,7 +442,7 @@ var PgsqlHighlightRules = function() { token : "comment", regex : "--.*$" }, - new DocCommentHighlightRules().getStartRule("doc-start"), + DocCommentHighlightRules.getStartRule("doc-start"), { token : "comment", // multi-line comment merge : true, @@ -571,7 +571,7 @@ var PgsqlHighlightRules = function() { ] }; - this.embedRules(DocCommentHighlightRules, "doc-", [ new DocCommentHighlightRules().getEndRule("start") ]); + this.embedRules(DocCommentHighlightRules, "doc-", [ DocCommentHighlightRules.getEndRule("start") ]); this.embedRules(PerlHighlightRules, "perl-", [{token : "string", regex : "\\$perl\\$", next : "statement"}]); this.embedRules(PythonHighlightRules, "python-", [{token : "string", regex : "\\$python\\$", next : "statement"}]); }; diff --git a/lib/ace/mode/php_highlight_rules.js b/lib/ace/mode/php_highlight_rules.js index d2a76f5c..e25dddc8 100644 --- a/lib/ace/mode/php_highlight_rules.js +++ b/lib/ace/mode/php_highlight_rules.js @@ -45,7 +45,7 @@ var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocComme var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var PhpHighlightRules = function() { - var docComment = new DocCommentHighlightRules(); + var docComment = DocCommentHighlightRules; // http://php.net/quickref.php var builtinFunctions = lang.arrayToMap( ('abs|acos|acosh|addcslashes|addslashes|aggregate|aggregate_info|aggregate_methods|aggregate_methods_by_list|aggregate_methods_by_regexp|' + @@ -1150,7 +1150,7 @@ var PhpHighlightRules = function() { }; this.embedRules(DocCommentHighlightRules, "doc-", - [ new DocCommentHighlightRules().getEndRule("start") ]); + [ DocCommentHighlightRules.getEndRule("start") ]); }; oop.inherits(PhpHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/scad_highlight_rules.js b/lib/ace/mode/scad_highlight_rules.js index 79995250..82234750 100644 --- a/lib/ace/mode/scad_highlight_rules.js +++ b/lib/ace/mode/scad_highlight_rules.js @@ -65,7 +65,7 @@ var scadHighlightRules = function() { token : "comment", regex : "\\/\\/.*$" }, - new DocCommentHighlightRules().getStartRule("start"), + DocCommentHighlightRules.getStartRule("start"), { token : "comment", // multi line comment merge : true, @@ -159,7 +159,7 @@ var scadHighlightRules = function() { }; this.embedRules(DocCommentHighlightRules, "doc-", - [ new DocCommentHighlightRules().getEndRule("start") ]); + [ DocCommentHighlightRules.getEndRule("start") ]); }; oop.inherits(scadHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/scala_highlight_rules.js b/lib/ace/mode/scala_highlight_rules.js index 3664d67e..67f8e1b2 100644 --- a/lib/ace/mode/scala_highlight_rules.js +++ b/lib/ace/mode/scala_highlight_rules.js @@ -65,7 +65,7 @@ var ScalaHighlightRules = function() { token : "comment", regex : "\\/\\/.*$" }, - new DocCommentHighlightRules().getStartRule("doc-start"), + DocCommentHighlightRules.getStartRule("doc-start"), { token : "comment", // multi line comment merge : true, @@ -135,7 +135,7 @@ var ScalaHighlightRules = function() { }; this.embedRules(DocCommentHighlightRules, "doc-", - [ new DocCommentHighlightRules().getEndRule("start") ]); + [ DocCommentHighlightRules.getEndRule("start") ]); }; oop.inherits(ScalaHighlightRules, TextHighlightRules); From 0e21a9354ec15ac38d09168b095fc08684616aa3 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 15 Apr 2012 19:03:08 +0400 Subject: [PATCH 11/12] fix Block-comments after `function(){` --- lib/ace/mode/javascript_highlight_rules.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/ace/mode/javascript_highlight_rules.js b/lib/ace/mode/javascript_highlight_rules.js index 416dc3c4..18100423 100644 --- a/lib/ace/mode/javascript_highlight_rules.js +++ b/lib/ace/mode/javascript_highlight_rules.js @@ -292,6 +292,7 @@ var JavaScriptHighlightRules = function() { // regular expressions are only allowed after certain tokens. This // makes sure we don't mix up regexps with the divison operator "regex_allowed": [ + DocCommentHighlightRules.getStartRule("doc-start"), { token : "comment", // multi line comment merge : true, From f7f157773b454a95b091d061877407bf79df1024 Mon Sep 17 00:00:00 2001 From: richo Date: Thu, 19 Apr 2012 09:19:25 +1000 Subject: [PATCH 12/12] Update builtin definitions Add @jpgriffo and @jamestyj as contributors (definitions came from his bash mode) --- lib/ace/mode/sh_highlight_rules.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/ace/mode/sh_highlight_rules.js b/lib/ace/mode/sh_highlight_rules.js index bd0b4681..dbfdc969 100644 --- a/lib/ace/mode/sh_highlight_rules.js +++ b/lib/ace/mode/sh_highlight_rules.js @@ -20,6 +20,8 @@ * * Contributor(s): * Rich Healey + * Javier Perez-Griffo + * James Tan * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -47,14 +49,20 @@ var ShHighlightRules = function() { var reservedKeywords = lang.arrayToMap( ('!|{|}|case|do|done|elif|else|'+ 'esac|fi|for|if|in|then|until|while|'+ - '&|;' + '&|;|export|local|read|typeset|unset|'+ + 'elif|select|set' ).split('|') ); var languageConstructs = lang.arrayToMap( - // TODO - ('echo|exit|eval|source|[|]|test|'+ - 'true|false|read' + ('[|]|alias|bg|bind|break|builtin|'+ + 'cd|command|compgen|complete|continue|'+ + 'dirs|disown|echo|enable|eval|exec|'+ + 'exit|fc|fg|getopts|hash|help|history|'+ + 'jobs|kill|let|logout|popd|printf|pushd|'+ + 'pwd|return|set|shift|shopt|source|'+ + 'suspend|test|times|trap|type|ulimit|'+ + 'umask|unalias|wait' ).split('|') );