From ebfe50aafc63148b9e837d246f2deebf0378e709 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 13 Mar 2014 10:33:18 -0700 Subject: [PATCH 1/5] Keep mouse move handler from going out of control Previously the editor could be hidden and the mouse move handler would start logging errors since it will still trying to compute positions based on the move events still firing on the document. Now the display property is checked in the handler and also the selection is finalized when a move event occurs and the button is no longer pressed. Closes #1755 --- src/editor-view.coffee | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/editor-view.coffee b/src/editor-view.coffee index 92e1cd60e..0ff3a07f3 100644 --- a/src/editor-view.coffee +++ b/src/editor-view.coffee @@ -461,21 +461,29 @@ class EditorView extends View selectOnMousemoveUntilMouseup: -> lastMoveEvent = null - moveHandler = (event = lastMoveEvent) => - if event - @editor.selectToScreenPosition(@screenPositionFromMouseEvent(event)) - lastMoveEvent = event - $(document).on "mousemove.editor-#{@id}", moveHandler - interval = setInterval(moveHandler, 20) - - $(document).one "mouseup.editor-#{@id}", => + finalizeSelections = => clearInterval(interval) $(document).off 'mousemove', moveHandler + $(document).off 'mouseup', finalizeSelections + @editor.mergeIntersectingSelections(isReversed: @editor.getLastSelection().isReversed()) @editor.finalizeSelections() @syncCursorAnimations() + moveHandler = (event = lastMoveEvent) => + return unless event? + + if event.which is 1 and @[0].style.display isnt 'none' + @editor.selectToScreenPosition(@screenPositionFromMouseEvent(event)) + lastMoveEvent = event + else + finalizeSelections() + + $(document).on "mousemove.editor-#{@id}", moveHandler + interval = setInterval(moveHandler, 20) + $(document).one "mouseup.editor-#{@id}", finalizeSelections + afterAttach: (onDom) -> return unless onDom From 22dc165a257eec9e6bd356063690ad457f01fe7e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 13 Mar 2014 10:46:58 -0700 Subject: [PATCH 2/5] Set event.which to 1 in specs --- spec/editor-view-spec.coffee | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/editor-view-spec.coffee b/spec/editor-view-spec.coffee index c4e748aae..8c58e462c 100644 --- a/spec/editor-view-spec.coffee +++ b/spec/editor-view-spec.coffee @@ -587,7 +587,7 @@ describe "EditorView", -> editorView.renderedLines.trigger mousedownEvent(editorView: editorView, point: [4, 10]) # moving changes selection - $(document).trigger mousemoveEvent(editorView: editorView, point: [5, 27]) + $(document).trigger mousemoveEvent(editorView: editorView, point: [5, 27], which: 1) range = editor.getSelection().getScreenRange() expect(range.start).toEqual({row: 4, column: 10}) @@ -617,12 +617,12 @@ describe "EditorView", -> originalScrollTop = editorView.scrollTop() # moving changes selection - $(document).trigger mousemoveEvent(editorView: editorView, pageX: 0, pageY: -1) + $(document).trigger mousemoveEvent(editorView: editorView, pageX: 0, pageY: -1, which: 1) expect(editorView.scrollTop()).toBe originalScrollTop - editorView.lineHeight # every mouse move selects more text for x in [0..10] - $(document).trigger mousemoveEvent(editorView: editorView, pageX: 0, pageY: -1) + $(document).trigger mousemoveEvent(editorView: editorView, pageX: 0, pageY: -1, which: 1) expect(editorView.scrollTop()).toBe 0 @@ -633,7 +633,7 @@ describe "EditorView", -> event = mousedownEvent(editorView: editorView, point: [4, 10]) event.originalEvent.which = 2 editorView.renderedLines.trigger(event) - $(document).trigger mousemoveEvent(editorView: editorView, point: [5, 27]) + $(document).trigger mousemoveEvent(editorView: editorView, point: [5, 27], which: 1) $(document).trigger 'mouseup' range = editor.getSelection().getScreenRange() From 2f8e67d679b36c2377aac4516fe5ad7469dd11c4 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 13 Mar 2014 10:49:34 -0700 Subject: [PATCH 3/5] Add event.which to 1 in more specs --- spec/editor-view-spec.coffee | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/editor-view-spec.coffee b/spec/editor-view-spec.coffee index 8c58e462c..f5b65baa8 100644 --- a/spec/editor-view-spec.coffee +++ b/spec/editor-view-spec.coffee @@ -662,11 +662,11 @@ describe "EditorView", -> editorView.renderedLines.trigger mousedownEvent(editorView: editorView, point: [0, 8], originalEvent: {detail: 2}) expect(editor.getSelectedText()).toBe "quicksort" - editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [1, 8]) + editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [1, 8], which: 1) expect(editor.getSelectedBufferRange()).toEqual [[0, 4], [1, 10]] expect(editor.getCursorBufferPosition()).toEqual [1, 10] - editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [0, 1]) + editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [0, 1], which: 1) expect(editor.getSelectedBufferRange()).toEqual [[0, 0], [0, 13]] expect(editor.getCursorBufferPosition()).toEqual [0, 0] @@ -691,12 +691,12 @@ describe "EditorView", -> expect(editor.getSelectedBufferRange()).toEqual [[4, 0], [5, 0]] # moving changes selection linewise - editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [5, 27]) + editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [5, 27], which: 1) expect(editor.getSelectedBufferRange()).toEqual [[4, 0], [6, 0]] expect(editor.getCursorBufferPosition()).toEqual [6, 0] # moving changes selection linewise - editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [2, 27]) + editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [2, 27], which: 1) expect(editor.getSelectedBufferRange()).toEqual [[2, 0], [5, 0]] expect(editor.getCursorBufferPosition()).toEqual [2, 0] @@ -706,11 +706,11 @@ describe "EditorView", -> describe "meta-click and drag", -> it "adds an additional selection", -> editorView.renderedLines.trigger mousedownEvent(editorView: editorView, point: [4, 10]) - editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [5, 27]) + editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [5, 27], which: 1) editorView.renderedLines.trigger 'mouseup' editorView.renderedLines.trigger mousedownEvent(editorView: editorView, point: [6, 10], metaKey: true) - editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [8, 27], metaKey: true) + editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [8, 27], metaKey: true, which: 1) editorView.renderedLines.trigger 'mouseup' selections = editor.getSelections() From 37d67e8a837dcaff9be7aab857b941dd3e969134 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 13 Mar 2014 10:56:31 -0700 Subject: [PATCH 4/5] Add spec for dragging with editor hidden --- spec/editor-view-spec.coffee | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/spec/editor-view-spec.coffee b/spec/editor-view-spec.coffee index f5b65baa8..7cd2aa752 100644 --- a/spec/editor-view-spec.coffee +++ b/spec/editor-view-spec.coffee @@ -654,6 +654,25 @@ describe "EditorView", -> expect(range.start).toEqual({row: 4, column: 10}) expect(range.end).toEqual({row: 4, column: 10}) + describe "when the editor is hidden", -> + it "stops scrolling the editor", -> + editorView.vScrollMargin = 0 + editorView.attachToDom(heightInLines: 5) + editorView.scrollToBottom() + + spyOn(window, 'setInterval').andCallFake -> + + editorView.renderedLines.trigger mousedownEvent(editorView: editorView, point: [12, 0]) + originalScrollTop = editorView.scrollTop() + + $(document).trigger mousemoveEvent(editorView: editorView, pageX: 0, pageY: -1, which: 1) + expect(editorView.scrollTop()).toBe originalScrollTop - editorView.lineHeight + + editorView.hide() + + $(document).trigger mousemoveEvent(editorView: editorView, pageX: 100000, pageY: -1, which: 1) + expect(editorView.scrollTop()).toBe originalScrollTop - editorView.lineHeight + describe "double-click and drag", -> it "selects the word under the cursor, then continues to select by word in either direction as the mouse is dragged", -> expect(editor.getCursorScreenPosition()).toEqual(row: 0, column: 0) From cb41e2c41a7b27f58867ee453ff01c73d28c9857 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 13 Mar 2014 11:00:24 -0700 Subject: [PATCH 5/5] Remove unneeded do -> block --- src/editor-view.coffee | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/editor-view.coffee b/src/editor-view.coffee index 0ff3a07f3..72ae043f1 100644 --- a/src/editor-view.coffee +++ b/src/editor-view.coffee @@ -988,8 +988,7 @@ class EditorView extends View (startRow <= @firstRenderedScreenRow and endRow >= @lastRenderedScreenRow) # selection surrounds the rendered items syncCursorAnimations: -> - for cursorView in @getCursorViews() - do (cursorView) -> cursorView.resetBlinking() + cursorView.resetBlinking() for cursorView in @getCursorViews() autoscroll: (options={}) -> for cursorView in @getCursorViews()