diff --git a/demo/editor.html b/demo/editor.html index f4505e3e..ec291729 100644 --- a/demo/editor.html +++ b/demo/editor.html @@ -193,7 +193,7 @@ function getDoc() { var modeEl = document.getElementById("mode"); modeEl.onchange = function() { - editor.getDocument().setTheme(modeEl.value); + editor.getDocument().setMode(modes[modeEl.value] || modes.text); }; var modes = { diff --git a/src/ace/Document.js b/src/ace/Document.js index ae8b5dc8..7fa78455 100644 --- a/src/ace/Document.js +++ b/src/ace/Document.js @@ -76,11 +76,14 @@ var Document = function(text, mode) { } if (undoManager) { - undoManager.setDocument(this); + //undoManager.setDocument(this); var self = this; this.$informUndoManager = lang.deferredCall(function() { if (self.$deltas.length > 0) - undoManager.notify(self.$deltas); + undoManager.execute({ + action : "aceupdate", + args : [self.$deltas, self] + }); self.$deltas = []; }); } @@ -249,21 +252,10 @@ var Document = function(text, mode) { } }; - /** - * Get a verbatim copy of the given line as it is in the document - */ this.getLine = function(row) { return this.lines[row] || ""; }; - /** - * Get a line as it is displayed on screen. Tabs are replaced by spaces. - */ - this.getDisplayLine = function(row) { - var tab = new Array(this.getTabSize()+1).join(" "); - return this.lines[row].replace(/\t/g, tab); - }; - this.getLines = function(firstRow, lastRow) { return this.lines.slice(firstRow, lastRow+1); }; @@ -564,27 +556,34 @@ var Document = function(text, mode) { return indentString.length; }; - this.outdentRows = function(range, indentString) { - outdentLength = indentString.length; - - for (var i=range.start.row; i<= range.end.row; i++) { - if (this.getLine(i).substr(0, outdentLength) !== indentString) { - return 0; - } - } - - var deleteRange = new Range(0, 0, 0, outdentLength); - - for (var i=range.start.row; i<= range.end.row; i++) - { + this.outdentRows = function (range) { + var deleteRange = new Range(0, 0, 0, 0), + size = this.getTabSize(); + + for (var i = range.start.row; i <= range.end.row; ++i) { + var line = this.getLine(i); + deleteRange.start.row = i; deleteRange.end.row = i; + for (var j = 0; j < size; ++j) + if (line.charAt(j) != ' ') + break; + if (j < size && line.charAt(j) == '\t') { + deleteRange.start.column = j; + deleteRange.end.column = j + 1; + } else { + deleteRange.start.column = 0; + deleteRange.end.column = j; + } + if (i == range.start.row) + range.start.column -= deleteRange.end.column - deleteRange.start.column; + if (i == range.end.row) + range.end.column -= deleteRange.end.column - deleteRange.start.column; this.$remove(deleteRange); } - this.fireChangeEvent(range.start.row, range.end.row); - return -outdentLength; - }; + return range; + } this.moveLinesUp = function(firstRow, lastRow) { if (firstRow <= 0) return 0; diff --git a/src/ace/Editor.js b/src/ace/Editor.js index add0d5db..7ff1184b 100644 --- a/src/ace/Editor.js +++ b/src/ace/Editor.js @@ -10,7 +10,7 @@ require.def("ace/Editor", "ace/ace", "ace/lib/event", "ace/lib/lang", - "ace/TextInput", + "ace/TextInput", "ace/KeyBinding", "ace/Document", "ace/Search", @@ -345,7 +345,9 @@ var Editor = function(renderer, doc) { }; this.onMouseWheel = function(e) { - this.renderer.scrollBy(e.wheelX * 2, e.wheelY * 2); + var speed = this.$scrollSpeed * 2; + + this.renderer.scrollBy(e.wheelX * speed, e.wheelY * speed); return event.preventDefault(e); }; @@ -442,6 +444,16 @@ var Editor = function(renderer, doc) { this.setOverwrite(!this.$overwrite); }; + + this.$scrollSpeed = 1; + this.setScrollSpeed = function(speed) { + this.$scrollSpeed = speed; + } + + this.getScrollSpeed = function() { + return this.$scrollSpeed; + } + this.$selectionStyle = "line"; this.setSelectionStyle = function(style) { if (this.$selectionStyle == style) return; @@ -451,6 +463,7 @@ var Editor = function(renderer, doc) { this.$dispatchEvent("changeSelectionStyle", {data: style}); }; + this.getSelectionStyle = function() { return this.$selectionStyle; }; @@ -529,37 +542,35 @@ var Editor = function(renderer, doc) { if (this.$readOnly) return; - if (this.selection.isMultiLine()) { - var addedColumns = this.doc.indentRows(this.getSelectionRange(), "\t"); - this.selection.shiftSelection(addedColumns); - } else { - if (!this.doc.getUseSoftTabs()) - return this.onTextInput("\t"); + var range = this.getSelectionRange(); - var cursor = this.doc.remove(this.getSelectionRange()); - this.clearSelection(); - - // compute indent string - var indentString = lang.stringRepeat(" ", this.doc.getTabSize() - (cursor.column % this.doc.getTabSize())); - var addedColumns = this.doc.indentRows(this.getSelectionRange(), indentString); - cursor.column += addedColumns; - this.moveCursorToPosition(cursor); + if (range.start.row < range.end.row || + range.start.column < range.end.column) { + var count = this.doc.indentRows(this.getSelectionRange(), "\t"); + + this.selection.shiftSelection(count); + } else { + var indentString; + + if (this.doc.getUseSoftTabs()) { + var size = this.doc.getTabSize(), + count = (size - this.getCursorPosition().column % size); + + indentString = lang.stringRepeat(" ", count); + } else + indentString = "\t"; + return this.onTextInput(indentString); } - this.$updateDesiredColumn(); }; this.blockOutdent = function(indentString) { if (this.$readOnly) return; - var indentString = indentString || this.doc.getTabString(); - var addedColumns = this.doc.outdentRows(this.getSelectionRange(), indentString); - - // besides the indent string also outdent tabs - if (addedColumns == 0 && indentString != "\t") - var addedColumns = this.doc.outdentRows(this.getSelectionRange(), "\t"); - - this.selection.shiftSelection(addedColumns); + var selection = this.doc.getSelection(), + range = this.doc.outdentRows(selection.getRange()); + + selection.setSelectionRange(range, selection.isBackwards()); this.$updateDesiredColumn(); }; diff --git a/src/ace/Selection.js b/src/ace/Selection.js index 89ccea38..c65d8039 100644 --- a/src/ace/Selection.js +++ b/src/ace/Selection.js @@ -79,7 +79,7 @@ var Selection = function(doc) { var anchor = this.getSelectionAnchor(); var lead = this.getSelectionLead(); - var isBackwards = this.$isBackwards(); + var isBackwards = this.isBackwards(); if (!isBackwards || anchor.column !== 0) this.setSelectionAnchor(anchor.row, anchor.column + columns); @@ -91,7 +91,7 @@ var Selection = function(doc) { } }; - this.$isBackwards = function() { + this.isBackwards = function() { var anchor = this.selectionAnchor || this.selectionLead; var lead = this.selectionLead; return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); @@ -101,7 +101,7 @@ var Selection = function(doc) { var anchor = this.selectionAnchor || this.selectionLead; var lead = this.selectionLead; - if (this.$isBackwards()) { + if (this.isBackwards()) { return Range.fromPoints(lead, anchor); } else { @@ -116,7 +116,6 @@ var Selection = function(doc) { } }; - this.selectAll = function() { var lastRow = this.doc.getLength() - 1; this.setSelectionAnchor(lastRow, this.doc.getLine(lastRow).length); @@ -126,9 +125,14 @@ var Selection = function(doc) { }); }; - this.setSelectionRange = function(range) { - this.setSelectionAnchor(range.start.row, range.start.column); - this.selectTo(range.end.row, range.end.column); + this.setSelectionRange = function(range, reverse) { + if (reverse) { + this.setSelectionAnchor(range.end.row, range.end.column); + this.selectTo(range.start.row, range.start.column); + } else { + this.setSelectionAnchor(range.start.row, range.start.column); + this.selectTo(range.end.row, range.end.column); + } }; this.$moveSelection = function(mover) { @@ -281,14 +285,7 @@ var Selection = function(doc) { }; this.moveCursorLineStart = function() { - var row = this.selectionLead.row; - var column = this.selectionLead.column; - var beforeCursor = this.doc.getDisplayLine(row).slice(0, column); - var leadingSpace = beforeCursor.match(/^\s+/); - if (!leadingSpace || leadingSpace[0].length >= column) - this.moveCursorTo(this.selectionLead.row, 0); - else - this.moveCursorTo(this.selectionLead.row, leadingSpace[0].length); + this.moveCursorTo(this.selectionLead.row, 0); }; this.moveCursorLineEnd = function() { diff --git a/src/ace/Tokenizer.js b/src/ace/Tokenizer.js index 71b5d54f..4be24df4 100644 --- a/src/ace/Tokenizer.js +++ b/src/ace/Tokenizer.js @@ -19,8 +19,7 @@ var Tokenizer = function(rules) { ruleRegExps.push(state[i].regex); }; - this.regExps[key] = new RegExp("(?:(" + ruleRegExps.join(")|(") - + ")|(.))", "g"); + this.regExps[key] = new RegExp("(?:(" + ruleRegExps.join(")|(") + ")|(.))", "g"); } }; @@ -48,7 +47,7 @@ var Tokenizer = function(rules) { if (re.lastIndex == lastIndex) { throw new Error("tokenizer error"); } lastIndex = re.lastIndex; - window.LOG && jstestdriver.console.log(currentState, match); + window.LOG && console.log(currentState, match); for ( var i = 0; i < state.length; i++) { if (match[i + 1]) { @@ -70,7 +69,8 @@ var Tokenizer = function(rules) { break; } }; - + + if (token.type !== type) { if (token.type) { tokens.push(token); @@ -88,7 +88,7 @@ var Tokenizer = function(rules) { tokens.push(token); } - window.LOG && jstestdriver.console.log(tokens, currentState); + window.LOG && console.log(tokens, currentState); return { tokens : tokens, diff --git a/src/ace/UndoManager.js b/src/ace/UndoManager.js index 4133fb8d..6d7d2260 100644 --- a/src/ace/UndoManager.js +++ b/src/ace/UndoManager.js @@ -14,12 +14,14 @@ var UndoManager = function() { (function() { - this.$doc = null; + /*this.$doc = null; this.setDocument = function(doc) { this.$doc = doc; - }; + };*/ - this.notify = function(deltas) { + this.execute = function(options) { + var deltas = options.args[0]; + this.$doc = options.args[1]; this.$undoStack.push(deltas); }; diff --git a/src/ace/mode/XmlHighlightRules.js b/src/ace/mode/XmlHighlightRules.js index e0670ee7..e3274867 100644 --- a/src/ace/mode/XmlHighlightRules.js +++ b/src/ace/mode/XmlHighlightRules.js @@ -1,87 +1,47 @@ -/** - * Ajax.org Code Editor (ACE) - * - * @copyright 2010, Ajax.org Services B.V. - * @license LGPLv3 - * @author Fabian Jakobs - */ -require.def("ace/mode/XmlHighlightRules", - [ - "ace/lib/oop", - "ace/mode/TextHighlightRules" - ], function(oop, TextHighlightRules) { - -var XmlHighlightRules = function() { - - // regexp must not have capturing parentheses - // regexps are ordered -> the first match is used - - this.$rules = { - start : [ { - token : "text", - regex : "<\\!\\[CDATA\\[", - next : "cdata" - }, { - token : "xml_pe", - regex : "<\\?.*?\\?>" - }, { - token : "comment", - regex : "<\\!--", - next : "comment" - }, { - token : "text", // opening tag - regex : "<\\/?", - next : "tag" - }, { - token : "text", - regex : "\\s+" - }, { - token : "text", - regex : "[^<]+" - } ], - - tag : [ { - token : "text", - regex : ">", - next : "start" - }, { - token : "keyword", - regex : "[-_a-zA-Z0-9:]+" - }, { - token : "text", - regex : "\\s+" - }, { - token : "string", - regex : '".*?"' - }, { - token : "string", - regex : "'.*?'" - } ], - - cdata : [ { - token : "text", - regex : "\\]\\]>", - next : "start" - }, { - token : "text", - regex : "\\s+" - }, { - token : "text", - regex : ".+" - } ], - - comment : [ { - token : "comment", - regex : ".*?-->", - next : "start" - }, { - token : "comment", - regex : ".+" - } ] - }; -}; - -oop.inherits(XmlHighlightRules, TextHighlightRules); - -return XmlHighlightRules; -}); \ No newline at end of file + + + + + + + + + + + + + Open files at startup + + + + + + + + + OK + Cancel + Apply + + + + \ No newline at end of file