From c53438d0e5cf2880b5dedff801eaf18d974e145d Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 29 Feb 2012 12:36:04 -0700 Subject: [PATCH] Factor position translation into a single method on LineMap --- src/atom/line-map.coffee | 45 +++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/src/atom/line-map.coffee b/src/atom/line-map.coffee index 8d91e391d..0bc8d8127 100644 --- a/src/atom/line-map.coffee +++ b/src/atom/line-map.coffee @@ -100,34 +100,10 @@ class LineMap @screenLineCount() - 1 screenPositionForBufferPosition: (bufferPosition) -> - bufferPosition = Point.fromObject(bufferPosition) - bufferDelta = new Point - screenDelta = new Point - - for lineFragment in @lineFragments - nextDelta = bufferDelta.add(lineFragment.bufferDelta) - break if nextDelta.isGreaterThan(bufferPosition) - bufferDelta = nextDelta - screenDelta = screenDelta.add(lineFragment.screenDelta) - - remainingBufferColumn = bufferPosition.column - bufferDelta.column - additionalScreenColumn = Math.max(0, Math.min(remainingBufferColumn, lineFragment.lengthForClipping())) - - new Point(screenDelta.row, screenDelta.column + additionalScreenColumn) + @translatePosition('bufferDelta', 'screenDelta', bufferPosition) bufferPositionForScreenPosition: (screenPosition) -> - screenPosition = Point.fromObject(screenPosition) - bufferDelta = new Point - screenDelta = new Point - - for lineFragment in @lineFragments - nextDelta = screenDelta.add(lineFragment.screenDelta) - break if nextDelta.isGreaterThan(screenPosition) - screenDelta = nextDelta - bufferDelta = bufferDelta.add(lineFragment.bufferDelta) - - column = bufferDelta.column + (screenPosition.column - screenDelta.column) - new Point(bufferDelta.row, column) + @translatePosition('screenDelta', 'bufferDelta', screenPosition) screenRangeForBufferRange: (bufferRange) -> start = @screenPositionForBufferPosition(bufferRange.start) @@ -139,6 +115,23 @@ class LineMap end = @bufferPositionForScreenPosition(screenRange.end) new Range(start, end) + translatePosition: (sourceDeltaType, targetDeltaType, sourcePosition) -> + sourcePosition = Point.fromObject(sourcePosition) + sourceDelta = new Point + targetDelta = new Point + + for lineFragment in @lineFragments + nextSourceDelta = sourceDelta.add(lineFragment[sourceDeltaType]) + break if nextSourceDelta.isGreaterThan(sourcePosition) + sourceDelta = nextSourceDelta + targetDelta = targetDelta.add(lineFragment[targetDeltaType]) + + unless lineFragment.isAtomic + targetDelta.column += Math.max(0, sourcePosition.column - sourceDelta.column) + + targetDelta + + clipScreenPosition: (screenPosition, options) -> wrapBeyondNewlines = options.wrapBeyondNewlines ? false wrapAtSoftNewlines = options.wrapAtSoftNewlines ? false