Просмотр исходного кода

Jump to position based on offset since we don't know doc lines for unopen docs

James Allen 10 лет назад
Родитель
Сommit
33f6c0dd1b

+ 29 - 0
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}

+ 6 - 1
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 () =>

+ 15 - 2
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)

+ 6 - 22
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

+ 1 - 2
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) ->