diff --git a/services/web/public/coffee/ide/editor/AceShareJsCodec.coffee b/services/web/public/coffee/ide/editor/AceShareJsCodec.coffee new file mode 100644 index 0000000000..69a57eddbc --- /dev/null +++ b/services/web/public/coffee/ide/editor/AceShareJsCodec.coffee @@ -0,0 +1,29 @@ +define [], () -> + AceShareJsCodec = + aceRangeToShareJs: (range, lines) -> + offset = 0 + for line, i in lines + offset += if i < range.row + line.length + else + range.column + offset += range.row # Include newlines + return offset + + aceChangeToShareJs: (delta, lines) -> + offset = AceShareJsCodec.aceRangeToShareJs(delta.start, lines) + + text = delta.lines.join('\n') + switch delta.action + when 'insert' + return { i: text, p: offset } + when 'remove' + return { d: text, p: offset } + else throw new Error "unknown action: #{delta.action}" + + shareJsOffsetToAcePosition: (offset, lines) -> + row = 0 + for line, row in lines + break if offset <= line.length + offset -= lines[row].length + 1 # + 1 for newline char + return {row:row, column:offset} \ No newline at end of file diff --git a/services/web/public/coffee/ide/editor/EditorManager.coffee b/services/web/public/coffee/ide/editor/EditorManager.coffee index 015f51ee80..eb063c9c6a 100644 --- a/services/web/public/coffee/ide/editor/EditorManager.coffee +++ b/services/web/public/coffee/ide/editor/EditorManager.coffee @@ -57,7 +57,12 @@ define [ # CursorPositionManager setTimeout () => @$scope.$broadcast "editor:gotoLine", options.gotoLine, options.gotoColumn - ,0 + , 0 + else if options.gotoOffset? + setTimeout () => + @$scope.$broadcast "editor:gotoOffset", options.gotoOffset + , 0 + if doc.id == @$scope.editor.open_doc_id and !options.forceReopen @$scope.$apply () => diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/cursor-position/CursorPositionManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/cursor-position/CursorPositionManager.coffee index fd1b2d7830..b8a3d43819 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/cursor-position/CursorPositionManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/cursor-position/CursorPositionManager.coffee @@ -1,4 +1,6 @@ -define [], () -> +define [ + "ide/editor/AceShareJsCodec" +], (AceShareJsCodec) -> class CursorPositionManager constructor: (@$scope, @editor, @element, @localStorage) -> @@ -23,11 +25,17 @@ define [], () -> @storeCursorPosition(@editor.getSession()) @storeScrollTopPosition(@editor.getSession()) - @$scope.$on "#{@$scope.name}:gotoLine", (editor, line, column) => + @$scope.$on "#{@$scope.name}:gotoLine", (e, line, column) => if line? setTimeout () => @gotoLine(line, column) , 10 # Hack: Must happen after @gotoStoredPosition + + @$scope.$on "#{@$scope.name}:gotoOffset", (e, offset) => + if offset? + setTimeout () => + @gotoOffset(offset) + , 10 # Hack: Must happen after @gotoStoredPosition storeScrollTopPosition: (session) -> if @doc_id? @@ -57,3 +65,8 @@ define [], () -> @editor.gotoLine(line, column) @editor.scrollToLine(line,true,true) # centre and animate @editor.focus() + + gotoOffset: (offset) -> + lines = @editor.getSession().getDocument().getAllLines() + position = AceShareJsCodec.shareJsOffsetToAcePosition(offset, lines) + @gotoLine(position.row + 1, position.column) \ No newline at end of file diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee index 016ccb7d7a..8087edcf37 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee @@ -2,7 +2,8 @@ define [ "ace/ace" "utils/EventEmitter" "ide/colors/ColorManager" -], (_, EventEmitter, ColorManager) -> + "ide/editor/AceShareJsCodec" +], (_, EventEmitter, ColorManager, AceShareJsCodec) -> class TrackChangesManager Range = ace.require("ace/range").Range @@ -377,32 +378,15 @@ define [ _aceRangeToShareJs: (range) -> lines = @editor.getSession().getDocument().getLines 0, range.row - offset = 0 - for line, i in lines - offset += if i < range.row - line.length - else - range.column - offset += range.row # Include newlines + return AceShareJsCodec.aceRangeToShareJs(range, lines) _aceChangeToShareJs: (delta) -> - offset = @_aceRangeToShareJs(delta.start) - - text = delta.lines.join('\n') - switch delta.action - when 'insert' - return { i: text, p: offset } - when 'remove' - return { d: text, p: offset } - else throw new Error "unknown action: #{delta.action}" + lines = @editor.getSession().getDocument().getLines 0, range.rowf + return AceShareJsCodec.aceChangeToShareJs(delta, lines) _shareJsOffsetToAcePosition: (offset) -> lines = @editor.getSession().getDocument().getAllLines() - row = 0 - for line, row in lines - break if offset <= line.length - offset -= lines[row].length + 1 # + 1 for newline char - return {row:row, column:offset} + return AceShareJsCodec.shareJsOffsetToAcePosition(offset, lines) _onChangesMoved: (changes) -> # TODO: PERFORMANCE: Only run through the Ace lines once, and calculate all diff --git a/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee b/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee index ae0c2160db..9623e2af9a 100644 --- a/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee +++ b/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee @@ -331,8 +331,7 @@ define [ $scope.reviewPanel.subView = subView $scope.gotoEntry = (doc_id, entry) -> - console.log "Going to entry", entry.docPos - ide.editorManager.openDocId(doc_id, { gotoLine: entry.docPos.row + 1, gotoColumn: entry.docPos.column }) + ide.editorManager.openDocId(doc_id, { gotoOffset: entry.offset }) DOC_ID_NAMES = {} $scope.getFileName = (doc_id) ->