From 3fb28803b58c82e5304c62295fe8bac1a5b7909b Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 3 Jun 2014 14:40:17 -0700 Subject: [PATCH 01/59] Add append shim --- src/react-editor-view.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 545472328..2f0d94735 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -21,6 +21,9 @@ class ReactEditorView extends View Object.defineProperty @::, 'firstRenderedScreenRow', get: -> @component.getRenderedRowRange()[0] Object.defineProperty @::, 'lastRenderedScreenRow', get: -> @component.getRenderedRowRange()[1] + append: (view) -> + @appendToLinesView(view) + scrollTop: (scrollTop) -> if scrollTop? @editor.setScrollTop(scrollTop) From 2c84d69ff258d6291ac4ebd920e94c9562cff755 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 3 Jun 2014 14:40:30 -0700 Subject: [PATCH 02/59] Add overlayer shim --- src/react-editor-view.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 2f0d94735..7f9b45b3d 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -21,6 +21,9 @@ class ReactEditorView extends View Object.defineProperty @::, 'firstRenderedScreenRow', get: -> @component.getRenderedRowRange()[0] Object.defineProperty @::, 'lastRenderedScreenRow', get: -> @component.getRenderedRowRange()[1] + overlayer: -> + this + append: (view) -> @appendToLinesView(view) From 25e3e46166349b5e95a08aeb32c1768130e570ef Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 3 Jun 2014 14:57:46 -0700 Subject: [PATCH 03/59] Make `overlayer` a property --- src/react-editor-view.coffee | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 7f9b45b3d..d7b8203b0 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -20,9 +20,7 @@ class ReactEditorView extends View Object.defineProperty @::, 'charWidth', get: -> @editor.getDefaultCharWidth() Object.defineProperty @::, 'firstRenderedScreenRow', get: -> @component.getRenderedRowRange()[0] Object.defineProperty @::, 'lastRenderedScreenRow', get: -> @component.getRenderedRowRange()[1] - - overlayer: -> - this + Object.defineProperty @::, 'overlayer', get: -> this append: (view) -> @appendToLinesView(view) From 3cd34e0b4dc6d1e4574f7eaa9006ee17fd6859dc Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 3 Jun 2014 15:25:26 -0700 Subject: [PATCH 04/59] Add gutter.getLineNumberElement shim --- src/react-editor-view.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index d7b8203b0..d7e747616 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -57,6 +57,9 @@ class ReactEditorView extends View @gutter.removeClassFromAllLines = (klass) => @gutter.find('.line-number').removeClass(klass) + @gutter.getLineNumberElement = (bufferRow) => + @gutter.find("[data-buffer-row='#{bufferRow}']") + @gutter.addClassToLine = (bufferRow, klass) => lines = @gutter.find("[data-buffer-row='#{bufferRow}']") lines.addClass(klass) From 18f7297968c9e3ea531208f4687f5f5c33793240 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 3 Jun 2014 17:12:56 -0700 Subject: [PATCH 05/59] Use actual property for overlayer --- src/react-editor-view.coffee | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index d7e747616..f66b112c3 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -20,8 +20,6 @@ class ReactEditorView extends View Object.defineProperty @::, 'charWidth', get: -> @editor.getDefaultCharWidth() Object.defineProperty @::, 'firstRenderedScreenRow', get: -> @component.getRenderedRowRange()[0] Object.defineProperty @::, 'lastRenderedScreenRow', get: -> @component.getRenderedRowRange()[1] - Object.defineProperty @::, 'overlayer', get: -> this - append: (view) -> @appendToLinesView(view) @@ -52,6 +50,7 @@ class ReactEditorView extends View node = @component.getDOMNode() @underlayer = $(node).find('.selections') + @overlayer = $(node).find('.lines') @gutter = $(node).find('.gutter') @gutter.removeClassFromAllLines = (klass) => From 087b52c9b488846176ad3f896a7bed593169ec1b Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 3 Jun 2014 17:13:23 -0700 Subject: [PATCH 06/59] Remove unnecessary append method. --- src/react-editor-view.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index f66b112c3..914e7497a 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -20,8 +20,6 @@ class ReactEditorView extends View Object.defineProperty @::, 'charWidth', get: -> @editor.getDefaultCharWidth() Object.defineProperty @::, 'firstRenderedScreenRow', get: -> @component.getRenderedRowRange()[0] Object.defineProperty @::, 'lastRenderedScreenRow', get: -> @component.getRenderedRowRange()[1] - append: (view) -> - @appendToLinesView(view) scrollTop: (scrollTop) -> if scrollTop? From 68df60351228a402f221d67e01757d88b04aa26f Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 4 Jun 2014 18:42:05 +0900 Subject: [PATCH 07/59] Upgrade space-pen to make $.fn.view work with nodes appended w/o jQuery The autosave package uses $.Event.targetView on a node that's managed by React. This upgrade to SpacePen allows us to retrieve the containing SpacePen view. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ebc5d352d..c4327a642 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "season": "^1.0.2", "semver": "1.1.4", "serializable": "^1", - "space-pen": "3.2.0", + "space-pen": "3.2.2", "temp": "0.5.0", "text-buffer": "^2.2.2", "theorist": "^1", From eeb44407e343a2f0982c920f9151a081901a7a7f Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 4 Jun 2014 18:42:27 +0900 Subject: [PATCH 08/59] Add ReactEditorView::getModel --- src/editor-component.coffee | 3 +++ src/react-editor-view.coffee | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/editor-component.coffee b/src/editor-component.coffee index cb85931be..40f75afe8 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -758,3 +758,6 @@ EditorComponent = React.createClass top = clientY - scrollViewClientRect.top + editor.getScrollTop() left = clientX - scrollViewClientRect.left + editor.getScrollLeft() {top, left} + + getModel: -> + @props.editor diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 914e7497a..12118cb67 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -99,4 +99,7 @@ class ReactEditorView extends View super @component.show() + getModel: -> + @component.getModel() + requestDisplayUpdate: -> # No-op shim for find-and-replace From 6cba6af743b80a1137340be606d1b7b275af1602 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 4 Jun 2014 19:18:54 +0900 Subject: [PATCH 09/59] Temporary: Enable react editor for specs on this branch so we get CI feedback --- spec/spec-helper.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index fcb052962..bf00f93a3 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -89,7 +89,7 @@ beforeEach -> config.set "editor.autoIndent", false config.set "core.disabledPackages", ["package-that-throws-an-exception", "package-with-broken-package-json", "package-with-broken-keymap"] - config.set "core.useReactEditor", false + config.set "core.useReactEditor", true config.save.reset() atom.config = config From f103e72c01c841b1c0b2a42da7a30bf98f9034e0 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 4 Jun 2014 21:05:29 +0900 Subject: [PATCH 10/59] Remove exceptions related to unassigned lineHeight These exceptions break specs when simulateDomAttachment is used. They were only present to ensure correct sequencing during development of the react editor, so it's safe to remove them for now. --- src/display-buffer.coffee | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index 579863ec2..36c64863b 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -228,8 +228,7 @@ class DisplayBuffer extends Model @charWidthsByScope = {} getScrollHeight: -> - unless @getLineHeightInPixels() > 0 - throw new Error("You must assign lineHeightInPixels before calling ::getScrollHeight()") + return 0 unless @getLineHeightInPixels() > 0 @getLineCount() * @getLineHeightInPixels() @@ -237,8 +236,7 @@ class DisplayBuffer extends Model (@getMaxLineLength() * @getDefaultCharWidth()) + @getCursorWidth() getVisibleRowRange: -> - unless @getLineHeightInPixels() > 0 - throw new Error("You must assign a non-zero lineHeightInPixels before calling ::getVisibleRowRange()") + return [0, 0] unless @getLineHeightInPixels() > 0 heightInLines = Math.ceil(@getHeight() / @getLineHeightInPixels()) + 1 startRow = Math.floor(@getScrollTop() / @getLineHeightInPixels()) From 7e5f667b316f5dd4e1806a70ce4437dc2133e9ec Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 4 Jun 2014 21:06:27 +0900 Subject: [PATCH 11/59] Don't assume ::component is defined --- src/react-editor-view.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 12118cb67..41b27c7c1 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -93,13 +93,13 @@ class ReactEditorView extends View hide: -> super - @component.hide() + @component?.hide() show: -> super - @component.show() + @component?.show() getModel: -> - @component.getModel() + @component?.getModel() requestDisplayUpdate: -> # No-op shim for find-and-replace From 905b28975ed253dcb35acf4daeb8d2fc079f6cd0 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 4 Jun 2014 21:06:41 +0900 Subject: [PATCH 12/59] Add split methods --- src/react-editor-view.coffee | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 41b27c7c1..ae136d1d6 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -82,6 +82,26 @@ class ReactEditorView extends View @attached = false @trigger 'editor:detached', this + # Public: Split the editor view left. + splitLeft: -> + pane = @getPane() + pane?.splitLeft(pane?.copyActiveItem()).activeView + + # Public: Split the editor view right. + splitRight: -> + pane = @getPane() + pane?.splitRight(pane?.copyActiveItem()).activeView + + # Public: Split the editor view up. + splitUp: -> + pane = @getPane() + pane?.splitUp(pane?.copyActiveItem()).activeView + + # Public: Split the editor view down. + splitDown: -> + pane = @getPane() + pane?.splitDown(pane?.copyActiveItem()).activeView + getPane: -> @closest('.pane').view() From fa66689c07f3c64cdf338da1c9a034d06ec54f9c Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 4 Jun 2014 21:07:13 +0900 Subject: [PATCH 13/59] Add .editor class to react wrapper for package activation events --- src/react-editor-view.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index ae136d1d6..f2a0177d4 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -7,7 +7,7 @@ module.exports = class ReactEditorView extends View # The `overlayer` class is included for backwards compatibility with # context menus. It should be removed in v1.0.0 - @content: -> @div class: 'react-wrapper overlayer' + @content: -> @div class: 'editor react-wrapper overlayer' focusOnAttach: false From a6d870bf4cf740eb721d2c66743ac97c3f8683be Mon Sep 17 00:00:00 2001 From: probablycorey Date: Wed, 4 Jun 2014 16:32:50 -0700 Subject: [PATCH 14/59] Add underlayer an overlayer classes to the correct elements --- src/react-editor-view.coffee | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index f2a0177d4..d79d5a8d3 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -5,9 +5,7 @@ EditorComponent = require './editor-component' module.exports = class ReactEditorView extends View - # The `overlayer` class is included for backwards compatibility with - # context menus. It should be removed in v1.0.0 - @content: -> @div class: 'editor react-wrapper overlayer' + @content: -> @div class: 'editor react-wrapper' focusOnAttach: false @@ -47,8 +45,8 @@ class ReactEditorView extends View node = @component.getDOMNode() - @underlayer = $(node).find('.selections') - @overlayer = $(node).find('.lines') + @underlayer = $(node).find('.selections').addClass('underlayer') + @overlayer = $(node).find('.lines').addClass('overlayer') @gutter = $(node).find('.gutter') @gutter.removeClassFromAllLines = (klass) => From ad88ace44818dc8e66b10c0f66fda6902ce4d04d Mon Sep 17 00:00:00 2001 From: probablycorey Date: Wed, 4 Jun 2014 17:18:00 -0700 Subject: [PATCH 15/59] Add getFirstVisibleScreenRow and getFirstVisibleScreenRow --- src/react-editor-view.coffee | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index d79d5a8d3..a8ba394f9 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -120,4 +120,10 @@ class ReactEditorView extends View getModel: -> @component?.getModel() + getFirstVisibleScreenRow: -> + @component.getRenderedRowRange()[0] + + getLastVisibleScreenRow: -> + @component.getRenderedRowRange()[1] + requestDisplayUpdate: -> # No-op shim for find-and-replace From 1d80c357084c52abbb641f7f467ec562ab50c349 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Wed, 4 Jun 2014 17:33:49 -0700 Subject: [PATCH 16/59] Add active property --- src/react-editor-view.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index a8ba394f9..7323735e3 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -18,6 +18,7 @@ class ReactEditorView extends View Object.defineProperty @::, 'charWidth', get: -> @editor.getDefaultCharWidth() Object.defineProperty @::, 'firstRenderedScreenRow', get: -> @component.getRenderedRowRange()[0] Object.defineProperty @::, 'lastRenderedScreenRow', get: -> @component.getRenderedRowRange()[1] + Object.defineProperty @::, 'active', get: -> @is(@getPane().activeView) scrollTop: (scrollTop) -> if scrollTop? From cfd9baa0d686933bb2d494ca770bfdb8d761adaf Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 5 Jun 2014 11:54:28 +0900 Subject: [PATCH 17/59] Use Editor::getVisibleRowRange instead of the rendered row range The rendered row range is larger than the visible row range to force the DOM to break up repaints. This is a more accurate method to us. --- src/react-editor-view.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 7323735e3..2d753d643 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -122,9 +122,9 @@ class ReactEditorView extends View @component?.getModel() getFirstVisibleScreenRow: -> - @component.getRenderedRowRange()[0] + @editor.getVisibleRowRange()[0] getLastVisibleScreenRow: -> - @component.getRenderedRowRange()[1] + @editor.getVisibleRowRange()[1] requestDisplayUpdate: -> # No-op shim for find-and-replace From e0b1a0cfa75dde8c0d5a74d4693320bf78f4c204 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 5 Jun 2014 11:58:36 +0900 Subject: [PATCH 18/59] Add ReactEditorView::getFontSize --- src/editor-component.coffee | 2 ++ src/react-editor-view.coffee | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/editor-component.coffee b/src/editor-component.coffee index 40f75afe8..e770296c8 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -715,6 +715,8 @@ EditorComponent = React.createClass console.log "Wasted" ReactPerf.printWasted() + getFontSize: -> @state.fontSize + setFontSize: (fontSize) -> @setState({fontSize}) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 2d753d643..18d65ae8a 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -127,4 +127,7 @@ class ReactEditorView extends View getLastVisibleScreenRow: -> @editor.getVisibleRowRange()[1] + getFontSize: -> + @component?.getFontSize() + requestDisplayUpdate: -> # No-op shim for find-and-replace From 15d1c5f992cf1acedc150dd6c9351eb3ebc9c316 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 5 Jun 2014 11:59:02 +0900 Subject: [PATCH 19/59] Add ReactEditorView::setWidthInChars shim --- src/react-editor-view.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 18d65ae8a..fdc21615e 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -130,4 +130,7 @@ class ReactEditorView extends View getFontSize: -> @component?.getFontSize() + setWidthInChars: (widthInChars) -> + @component.getDOMNode().style.width = (@editor.getDefaultCharWidth() * widthInChars) + 'px' + requestDisplayUpdate: -> # No-op shim for find-and-replace From 8417dfd10e4c9e088cb37a8c6ac2f6b245f40f8a Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 5 Jun 2014 12:01:09 +0900 Subject: [PATCH 20/59] Add the ReactEditorView::updateDisplay shim --- src/react-editor-view.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index fdc21615e..882df7d54 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -134,3 +134,5 @@ class ReactEditorView extends View @component.getDOMNode().style.width = (@editor.getDefaultCharWidth() * widthInChars) + 'px' requestDisplayUpdate: -> # No-op shim for find-and-replace + + updateDisplay: -> # No-op shim for package specs From 367e42916291989a234ba69911840e94a922e3ef Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 5 Jun 2014 12:03:56 +0900 Subject: [PATCH 21/59] Add ReactEditorView::setText --- src/react-editor-view.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 882df7d54..a9de32734 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -133,6 +133,9 @@ class ReactEditorView extends View setWidthInChars: (widthInChars) -> @component.getDOMNode().style.width = (@editor.getDefaultCharWidth() * widthInChars) + 'px' + setText: (text) -> + @editor.setText(text) + requestDisplayUpdate: -> # No-op shim for find-and-replace updateDisplay: -> # No-op shim for package specs From 2ee2efeb8420db0553f04cab433593ba62d70bcd Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 5 Jun 2014 12:07:52 +0900 Subject: [PATCH 22/59] Add ReactEditorView::isFocused shim --- src/react-editor-view.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index a9de32734..3a1ce50da 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -19,6 +19,7 @@ class ReactEditorView extends View Object.defineProperty @::, 'firstRenderedScreenRow', get: -> @component.getRenderedRowRange()[0] Object.defineProperty @::, 'lastRenderedScreenRow', get: -> @component.getRenderedRowRange()[1] Object.defineProperty @::, 'active', get: -> @is(@getPane().activeView) + Object.defineProperty @::, 'isFocused', get: -> @component?.state.focused scrollTop: (scrollTop) -> if scrollTop? From 04e4b917b05c3647c13afe00369bfaefb685584b Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Thu, 5 Jun 2014 11:36:26 -0700 Subject: [PATCH 23/59] Only show the first 10 lines of a spec failure and its stacktrace It is difficult to scroll through stack traces when there are huge failure messages. This limits the length to 10 lines, if you hover over the message it will expand. Somewhat related to #1173 --- static/jasmine.less | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/static/jasmine.less b/static/jasmine.less index 432f44c0f..9207dff7c 100644 --- a/static/jasmine.less +++ b/static/jasmine.less @@ -161,4 +161,17 @@ body { visibility: hidden; } } + + .result-message.fail, .stack-trace.padded { + text-overflow: ellipsis; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 10; + overflow: hidden; + + &:hover { + -webkit-line-clamp: inherit; + // overflow: hidden; + } + } } From d7ee81418dcb37aa02fff8a8bbac2a5ea570bdc9 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Thu, 5 Jun 2014 14:13:41 -0700 Subject: [PATCH 24/59] Remove editor class form ReactEditorView, it is on EditorComponent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I couldn’t recreate the problem with activation events mentioned https://github.com/atom/atom/commit/fa66689c07f3c64cdf338da1c9a034d06ec54f9c --- src/react-editor-view.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 3a1ce50da..d63b4d9f8 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -5,7 +5,7 @@ EditorComponent = require './editor-component' module.exports = class ReactEditorView extends View - @content: -> @div class: 'editor react-wrapper' + @content: -> @div class: 'react-wrapper' focusOnAttach: false From 7dae04b8d4774e0f96dfbb2791d1ed78256f1492 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 6 Jun 2014 16:31:39 +0900 Subject: [PATCH 25/59] Add ReactEditorView::getText --- src/react-editor-view.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index d63b4d9f8..13a510623 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -134,6 +134,9 @@ class ReactEditorView extends View setWidthInChars: (widthInChars) -> @component.getDOMNode().style.width = (@editor.getDefaultCharWidth() * widthInChars) + 'px' + getText: -> + @editor.getText() + setText: (text) -> @editor.setText(text) From fca6a7758b0a019a57eab35ec2d217d972ed1a7e Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 6 Jun 2014 16:46:01 +0900 Subject: [PATCH 26/59] Don't run afterAttach hooks twice on ReactEditorView --- src/react-editor-view.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 13a510623..b44b1ee39 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -41,6 +41,8 @@ class ReactEditorView extends View afterAttach: (onDom) -> return unless onDom + return if @attached + @attached = true props = defaults({@editor, parentView: this}, @props) @component = React.renderComponent(EditorComponent(props), @element) From 2234ff78c7795e1d7e468a4dba903df24ea477ed Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 6 Jun 2014 16:54:28 +0900 Subject: [PATCH 27/59] Include line-number class for backward compatibility --- src/gutter-component.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gutter-component.coffee b/src/gutter-component.coffee index 72581cd0a..ffbadb29f 100644 --- a/src/gutter-component.coffee +++ b/src/gutter-component.coffee @@ -131,7 +131,7 @@ GutterComponent = React.createClass style = "visibility: hidden;" innerHTML = @buildLineNumberInnerHTML(bufferRow, softWrapped, maxLineNumberDigits) - "
#{innerHTML}
" + "
#{innerHTML}
" buildLineNumberInnerHTML: (bufferRow, softWrapped, maxLineNumberDigits) -> if softWrapped From a2c41a2ae34abe46492548eb792d33a74ee82fe0 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 9 Jun 2014 14:52:56 +0900 Subject: [PATCH 28/59] Don't use the react editor in EditorView specs --- spec/editor-view-spec.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spec/editor-view-spec.coffee b/spec/editor-view-spec.coffee index 990ca47a7..c6d043d64 100644 --- a/spec/editor-view-spec.coffee +++ b/spec/editor-view-spec.coffee @@ -10,6 +10,8 @@ describe "EditorView", -> [buffer, editorView, editor, cachedEditor, cachedLineHeight, cachedCharWidth, fart] = [] beforeEach -> + atom.config.set 'core.useReactEditor', false + waitsForPromise -> atom.workspace.open('sample.js').then (o) -> editor = o From b1563fdfc0af832e4e0ec71ad2d6388d9406bf74 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 9 Jun 2014 15:04:51 +0900 Subject: [PATCH 29/59] Destroy item's of last pane even if the pane itself is not destroyed We always want to preserve at least one pane, so we don't call destroy on the pane if it is the last pane. However, we still want to destroy its items. This was previously relying on the view to destroy the underlying item, which isn't as reliable as doing it in the model. --- src/pane.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pane.coffee b/src/pane.coffee index e0c579257..19066e126 100644 --- a/src/pane.coffee +++ b/src/pane.coffee @@ -212,7 +212,10 @@ class Pane extends Model @destroyItem(item) for item in @getItems() when item isnt @activeItem destroy: -> - super unless @container?.isAlive() and @container?.getPanes().length is 1 + if @container?.isAlive() and @container.getPanes().length is 1 + @destroyItems() + else + super # Called by model superclass. destroyed: -> From c972d9b0222b151ed029391225dca314db988bf2 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 9 Jun 2014 15:11:16 +0900 Subject: [PATCH 30/59] Get invisibles from component state --- spec/workspace-view-spec.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spec/workspace-view-spec.coffee b/spec/workspace-view-spec.coffee index e2b2dada9..3f7a32259 100644 --- a/spec/workspace-view-spec.coffee +++ b/spec/workspace-view-spec.coffee @@ -201,7 +201,9 @@ describe "WorkspaceView", -> expect(rightEditorView.find(".line:first").text()).toBe " " expect(leftEditorView.find(".line:first").text()).toBe " " - withInvisiblesShowing = "#{rightEditorView.invisibles.space}#{rightEditorView.invisibles.tab} #{rightEditorView.invisibles.space}#{rightEditorView.invisibles.eol}" + {invisibles} = rightEditorView.component.state + {space, tab, eol} = invisibles + withInvisiblesShowing = "#{space}#{tab} #{space}#{eol}" atom.workspaceView.trigger "window:toggle-invisibles" expect(rightEditorView.find(".line:first").text()).toBe withInvisiblesShowing From 6f3ebe8d0c2b2e05a2a3fa43acf9fd1da7e4ef50 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 9 Jun 2014 15:16:38 +0900 Subject: [PATCH 31/59] Add ReactEditorView::hiddenInput shim --- src/react-editor-view.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index d0de06b3c..0d64a024b 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -53,6 +53,7 @@ class ReactEditorView extends View @underlayer = $(node).find('.selections').addClass('underlayer') @overlayer = $(node).find('.lines').addClass('overlayer') + @hiddenInput = $(node).find('.hidden-input') @gutter = $(node).find('.gutter') @gutter.removeClassFromAllLines = (klass) => From 4387e1649698decf3a131ebd3ad8d71b49a2c2e9 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 9 Jun 2014 16:13:09 +0900 Subject: [PATCH 32/59] Emit selection:changed events if editor is alive after update --- src/editor-component.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/editor-component.coffee b/src/editor-component.coffee index 2ebb2515d..1053cf641 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -161,7 +161,9 @@ EditorComponent = React.createClass window.removeEventListener('resize', @onWindowResize) componentWillUpdate: -> - @props.parentView.trigger 'cursor:moved' if @cursorsMoved + if @props.editor.isAlive() + @props.parentView.trigger 'cursor:moved' if @cursorsMoved + @props.parentView.trigger 'selection:changed' if @selectionChanged componentDidUpdate: (prevProps, prevState) -> @pendingChanges.length = 0 From 43b5a9cfd0db499feda7136f3319f7b5a10f9b1e Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 9 Jun 2014 16:48:51 +0900 Subject: [PATCH 33/59] Don't set `focused: true` on new pane when splitting This causes the active item to change in the model before the associated view can be added, which causes problems with the ReactEditorView having methods called on it before its afterAttach hook creates the component. We call Pane::activate subsequently unless activation is suppressed, which will focus the pane anyway, so this was redundant. --- src/pane.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pane.coffee b/src/pane.coffee index 19066e126..f09bcc90f 100644 --- a/src/pane.coffee +++ b/src/pane.coffee @@ -334,7 +334,7 @@ class Pane extends Model if @parent.orientation isnt orientation @parent.replaceChild(this, new PaneAxis({@container, orientation, children: [this]})) - newPane = new @constructor(extend({focused: true}, params)) + newPane = new @constructor(params) switch side when 'before' then @parent.insertChildBefore(this, newPane) when 'after' then @parent.insertChildAfter(this, newPane) From 8521114c08a81b36f1d196daefaabdf28eea027f Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 9 Jun 2014 17:09:02 +0900 Subject: [PATCH 34/59] Fix failures associated with not passing `focused: true` on pane splits --- spec/pane-container-spec.coffee | 1 + spec/pane-spec.coffee | 7 ++++--- spec/pane-view-spec.coffee | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/spec/pane-container-spec.coffee b/spec/pane-container-spec.coffee index 44f99a6b2..df9921e69 100644 --- a/spec/pane-container-spec.coffee +++ b/spec/pane-container-spec.coffee @@ -16,6 +16,7 @@ describe "PaneContainer", -> containerA = new PaneContainer(root: pane1A) pane2A = pane1A.splitRight(items: [new Item]) pane3A = pane2A.splitDown(items: [new Item]) + pane3A.focus() it "preserves the focused pane across serialization", -> expect(pane3A.focused).toBe true diff --git a/spec/pane-spec.coffee b/spec/pane-spec.coffee index 7ff32a083..04b1c2474 100644 --- a/spec/pane-spec.coffee +++ b/spec/pane-spec.coffee @@ -439,10 +439,11 @@ describe "Pane", -> expect(column.orientation).toBe 'vertical' expect(column.children).toEqual [pane1, pane3, pane2] - it "sets up the new pane to be focused", -> - expect(pane1.focused).toBe false + it "activates the new pane", -> + expect(pane1.isActive()).toBe true pane2 = pane1.splitRight() - expect(pane2.focused).toBe true + expect(pane1.isActive()).toBe false + expect(pane2.isActive()).toBe true describe "::destroy()", -> [container, pane1, pane2] = [] diff --git a/spec/pane-view-spec.coffee b/spec/pane-view-spec.coffee index 8d3d3be27..9f73884b5 100644 --- a/spec/pane-view-spec.coffee +++ b/spec/pane-view-spec.coffee @@ -199,6 +199,7 @@ describe "PaneView", -> it "focuses the next pane", -> container.attachToDom() + pane2.activate() expect(pane.hasFocus()).toBe false expect(pane2.hasFocus()).toBe true pane2Model.destroy() From cb9d488a1e2c6efa6edacf868b7539ababa2be53 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 11:20:45 -0700 Subject: [PATCH 35/59] Upgrade to spell-check@0.37.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7c48de18b..027b426c7 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "release-notes": "0.32.0", "settings-view": "0.119.0", "snippets": "0.45.0", - "spell-check": "0.36.0", + "spell-check": "0.37.0", "status-bar": "0.40.0", "styleguide": "0.29.0", "symbols-view": "0.55.0", From fc5dc46e739cc66b091bc7c55e206e79fb4ff3a2 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 9 Jun 2014 20:47:44 +0900 Subject: [PATCH 36/59] Make dummy line number have a buffer row of -1 This prevents accidentally returning the dummy line number when asking for line numbers for buffer row 0 using shim code. --- src/gutter-component.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gutter-component.coffee b/src/gutter-component.coffee index ffbadb29f..a4d823934 100644 --- a/src/gutter-component.coffee +++ b/src/gutter-component.coffee @@ -58,7 +58,7 @@ GutterComponent = React.createClass # since the real line numbers are absolutely positioned for performance reasons. appendDummyLineNumber: -> {maxLineNumberDigits} = @props - WrapperDiv.innerHTML = @buildLineNumberHTML(0, false, maxLineNumberDigits) + WrapperDiv.innerHTML = @buildLineNumberHTML(-1, false, maxLineNumberDigits) @dummyLineNumberNode = WrapperDiv.children[0] @refs.lineNumbers.getDOMNode().appendChild(@dummyLineNumberNode) From b2253ab7ced033f4db74b37a923cef6b76f5c17f Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 9 Jun 2014 20:50:24 +0900 Subject: [PATCH 37/59] Add ReactEditorView::insertText shim --- src/react-editor-view.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 0d64a024b..0f6fa933a 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -145,6 +145,9 @@ class ReactEditorView extends View setText: (text) -> @editor.setText(text) + insertText: (text) -> + @editor.insertText(text) + requestDisplayUpdate: -> # No-op shim for find-and-replace updateDisplay: -> # No-op shim for package specs From e9f116a14ed3438aada198098a3475e66edeb493 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 9 Jun 2014 20:54:09 +0900 Subject: [PATCH 38/59] Request update when cursors move outside of a batch update --- src/editor-component.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/src/editor-component.coffee b/src/editor-component.coffee index 1053cf641..bfb4094f1 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -511,6 +511,7 @@ EditorComponent = React.createClass onCursorsMoved: -> @cursorsMoved = true + @requestUpdate() selectToMousePositionUntilMouseUp: (event) -> {editor} = @props From c78f9137cc03f3079c39fc0d5c221d943b91e2a8 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 13:26:41 -0700 Subject: [PATCH 39/59] Make method style consistent with the rest of the file --- src/editor-component.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/editor-component.coffee b/src/editor-component.coffee index bfb4094f1..22f67cc78 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -718,7 +718,8 @@ EditorComponent = React.createClass console.log "Wasted" ReactPerf.printWasted() - getFontSize: -> @state.fontSize + getFontSize: -> + @state.fontSize setFontSize: (fontSize) -> @setState({fontSize}) From 677d3abe0e15cd320a617c9705b969bb4c1f7081 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 13:27:59 -0700 Subject: [PATCH 40/59] Add ::getFontFamily --- src/editor-component.coffee | 3 +++ src/react-editor-view.coffee | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/editor-component.coffee b/src/editor-component.coffee index 22f67cc78..4461ae6da 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -727,6 +727,9 @@ EditorComponent = React.createClass setLineHeight: (lineHeight) -> @setState({lineHeight}) + getFontFamily: -> + @state.fontFamily + setFontFamily: (fontFamily) -> @setState({fontFamily}) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 0f6fa933a..12abb2190 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -133,6 +133,9 @@ class ReactEditorView extends View getLastVisibleScreenRow: -> @editor.getVisibleRowRange()[1] + getFontFamily: -> + @component?.getFontFamily() + getFontSize: -> @component?.getFontSize() From 362f696e3e89008c362da2d7c885dbad57ad61fb Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 13:43:59 -0700 Subject: [PATCH 41/59] Add setFontFamily and setFontSize to ReactEditorView --- src/editor-component.coffee | 6 +++--- src/react-editor-view.coffee | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/editor-component.coffee b/src/editor-component.coffee index 4461ae6da..38a5903c2 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -724,15 +724,15 @@ EditorComponent = React.createClass setFontSize: (fontSize) -> @setState({fontSize}) - setLineHeight: (lineHeight) -> - @setState({lineHeight}) - getFontFamily: -> @state.fontFamily setFontFamily: (fontFamily) -> @setState({fontFamily}) + setLineHeight: (lineHeight) -> + @setState({lineHeight}) + setShowIndentGuide: (showIndentGuide) -> @setState({showIndentGuide}) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 12abb2190..5eb953105 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -136,9 +136,15 @@ class ReactEditorView extends View getFontFamily: -> @component?.getFontFamily() + setFontFamily: (fontFamily)-> + @component?.setFontFamily(fontFamily) + getFontSize: -> @component?.getFontSize() + setFontSize: (fontSize)-> + @component?.setFontSize(fontSize) + setWidthInChars: (widthInChars) -> @component.getDOMNode().style.width = (@editor.getDefaultCharWidth() * widthInChars) + 'px' From 4d6737230a71cb90e784993383fb91a19457bbbf Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 13:55:19 -0700 Subject: [PATCH 42/59] Remove unused mousewheel event spec --- spec/editor-component-spec.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/spec/editor-component-spec.coffee b/spec/editor-component-spec.coffee index b9c469829..05756b00a 100644 --- a/spec/editor-component-spec.coffee +++ b/spec/editor-component-spec.coffee @@ -787,8 +787,6 @@ describe "EditorComponent", -> expect(horizontalScrollbarNode.scrollWidth).toBe gutterNode.offsetWidth + editor.getScrollWidth() - describe "when a mousewheel event occurs on the editor", -> - describe "mousewheel events", -> it "updates the scrollLeft or scrollTop on mousewheel events depending on which delta is greater (x or y)", -> node.style.height = 4.5 * lineHeightInPixels + 'px' From 84de8c1bfd1673da434a5abb5c0a21fd91718274 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 14:01:45 -0700 Subject: [PATCH 43/59] Move benchmark code to the end of the editor component --- src/editor-component.coffee | 70 ++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/editor-component.coffee b/src/editor-component.coffee index 38a5903c2..b30a8a853 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -683,41 +683,6 @@ EditorComponent = React.createClass show: -> @setState(visible: true) - runScrollBenchmark: -> - unless process.env.NODE_ENV is 'production' - ReactPerf = require 'react-atom-fork/lib/ReactDefaultPerf' - ReactPerf.start() - - node = @getDOMNode() - - scroll = (delta, done) -> - dispatchMouseWheelEvent = -> - node.dispatchEvent(new WheelEvent('mousewheel', wheelDeltaX: -0, wheelDeltaY: -delta)) - - stopScrolling = -> - clearInterval(interval) - done?() - - interval = setInterval(dispatchMouseWheelEvent, 10) - setTimeout(stopScrolling, 500) - - console.timeline('scroll') - scroll 50, -> - scroll 100, -> - scroll 200, -> - scroll 400, -> - scroll 800, -> - scroll 1600, -> - console.timelineEnd('scroll') - unless process.env.NODE_ENV is 'production' - ReactPerf.stop() - console.log "Inclusive" - ReactPerf.printInclusive() - console.log "Exclusive" - ReactPerf.printExclusive() - console.log "Wasted" - ReactPerf.printWasted() - getFontSize: -> @state.fontSize @@ -770,3 +735,38 @@ EditorComponent = React.createClass getModel: -> @props.editor + + runScrollBenchmark: -> + unless process.env.NODE_ENV is 'production' + ReactPerf = require 'react-atom-fork/lib/ReactDefaultPerf' + ReactPerf.start() + + node = @getDOMNode() + + scroll = (delta, done) -> + dispatchMouseWheelEvent = -> + node.dispatchEvent(new WheelEvent('mousewheel', wheelDeltaX: -0, wheelDeltaY: -delta)) + + stopScrolling = -> + clearInterval(interval) + done?() + + interval = setInterval(dispatchMouseWheelEvent, 10) + setTimeout(stopScrolling, 500) + + console.timeline('scroll') + scroll 50, -> + scroll 100, -> + scroll 200, -> + scroll 400, -> + scroll 800, -> + scroll 1600, -> + console.timelineEnd('scroll') + unless process.env.NODE_ENV is 'production' + ReactPerf.stop() + console.log "Inclusive" + ReactPerf.printInclusive() + console.log "Exclusive" + ReactPerf.printExclusive() + console.log "Wasted" + ReactPerf.printWasted() From 31d7110bba4fb53498908c9d329ec34bbb7811ee Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 14:42:47 -0700 Subject: [PATCH 44/59] Remove getPageRows from API --- src/editor-view.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/editor-view.coffee b/src/editor-view.coffee index 18f8a2427..96441a0c2 100644 --- a/src/editor-view.coffee +++ b/src/editor-view.coffee @@ -280,7 +280,7 @@ class EditorView extends View @editor.moveCursorUp(@getPageRows()) @scrollTop(newScrollTop, adjustVerticalScrollbar: true) - # Public: Gets the number of actual page rows existing in an editor. + # Gets the number of actual page rows existing in an editor. # # Returns a {Number}. getPageRows: -> From 601c87713679eaf4726ab93b5a282ed6abd46598 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 14:46:47 -0700 Subject: [PATCH 45/59] Add pageDown/pageUp to ReactEditorView --- src/react-editor-view.coffee | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 5eb953105..c77d5f62d 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -124,6 +124,12 @@ class ReactEditorView extends View super @component?.show() + pageDown: -> + @editor.pageDown() + + pageUp: -> + @editor.pageUp() + getModel: -> @component?.getModel() From e8b6fb919e827efa8585764ea5d2398c521d877c Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 15:06:49 -0700 Subject: [PATCH 46/59] Add shim for ReactEditorView::redraw --- src/react-editor-view.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index c77d5f62d..4c73de9ef 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -166,3 +166,5 @@ class ReactEditorView extends View requestDisplayUpdate: -> # No-op shim for find-and-replace updateDisplay: -> # No-op shim for package specs + + redraw: -> # No-op shim From a2c4caf7adda735c11d165812aa81ec633209fd9 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 15:14:48 -0700 Subject: [PATCH 47/59] Move scroll methods below afterAttach method --- src/react-editor-view.coffee | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 4c73de9ef..3a7b8ee37 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -23,24 +23,6 @@ class ReactEditorView extends View Object.defineProperty @::, 'active', get: -> @is(@getPane().activeView) Object.defineProperty @::, 'isFocused', get: -> @component?.state.focused - scrollTop: (scrollTop) -> - if scrollTop? - @editor.setScrollTop(scrollTop) - else - @editor.getScrollTop() - - scrollLeft: (scrollLeft) -> - if scrollLeft? - @editor.setScrollLeft(scrollLeft) - else - @editor.getScrollLeft() - - scrollToScreenPosition: (screenPosition) -> - @editor.scrollToScreenPosition(screenPosition) - - scrollToBufferPosition: (bufferPosition) -> - @editor.scrollToBufferPosition(bufferPosition) - afterAttach: (onDom) -> return unless onDom return if @attached @@ -71,6 +53,24 @@ class ReactEditorView extends View @trigger 'editor:attached', [this] + scrollTop: (scrollTop) -> + if scrollTop? + @editor.setScrollTop(scrollTop) + else + @editor.getScrollTop() + + scrollLeft: (scrollLeft) -> + if scrollLeft? + @editor.setScrollLeft(scrollLeft) + else + @editor.getScrollLeft() + + scrollToScreenPosition: (screenPosition) -> + @editor.scrollToScreenPosition(screenPosition) + + scrollToBufferPosition: (bufferPosition) -> + @editor.scrollToBufferPosition(bufferPosition) + pixelPositionForBufferPosition: (bufferPosition) -> @editor.pixelPositionForBufferPosition(bufferPosition) From 7379627fcbe37d69203b0f3c58005ead57b367d2 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 15:37:02 -0700 Subject: [PATCH 48/59] Add several scroll shims to ReactEditorView --- src/react-editor-view.coffee | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 3a7b8ee37..a7a1e4622 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -65,12 +65,22 @@ class ReactEditorView extends View else @editor.getScrollLeft() + scrollToBottom: -> + @editor.setScrollBottom(Infinity) + scrollToScreenPosition: (screenPosition) -> @editor.scrollToScreenPosition(screenPosition) scrollToBufferPosition: (bufferPosition) -> @editor.scrollToBufferPosition(bufferPosition) + scrollToCursorPosition: -> + @editor.scrollToCursorPosition() + + scrollToPixelPosition: (pixelPosition) -> + screenPosition = screenPositionForPixelPosition(pixelPosition) + @editor.scrollToScreenPosition(screenPosition) + pixelPositionForBufferPosition: (bufferPosition) -> @editor.pixelPositionForBufferPosition(bufferPosition) From be201485188cb8583bbfe0a2dd239a20efa8cbd9 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 15:50:08 -0700 Subject: [PATCH 49/59] Export ReactEditorView as EditorView --- exports/atom.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exports/atom.coffee b/exports/atom.coffee index 773b24f3a..b852d68a7 100644 --- a/exports/atom.coffee +++ b/exports/atom.coffee @@ -15,7 +15,7 @@ unless process.env.ATOM_SHELL_INTERNAL_RUN_AS_NODE module.exports.$ = $ module.exports.$$ = $$ module.exports.$$$ = $$$ - module.exports.EditorView = require '../src/editor-view' + module.exports.EditorView = require '../src/react-editor-view' module.exports.ScrollView = require '../src/scroll-view' module.exports.SelectListView = require '../src/select-list-view' module.exports.Task = require '../src/task' From 0396aac11f0ca2e732cc0f21271613a2bdda74bb Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 16:03:20 -0700 Subject: [PATCH 50/59] Add several setter shims to ReactEditorView --- src/react-editor-view.coffee | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index a7a1e4622..f9e7035a2 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -164,6 +164,18 @@ class ReactEditorView extends View setWidthInChars: (widthInChars) -> @component.getDOMNode().style.width = (@editor.getDefaultCharWidth() * widthInChars) + 'px' + setLineHeight: (lineHeight) -> + @component.setLineHeight(lineHeight) + + setShowIndentGuide: (showIndentGuide) -> + @component.setShowIndentGuide(showIndentGuide) + + setSoftWrap: (softWrap) -> + @editor.setSoftWrap(softWrap) + + setShowInvisibles: (showInvisibles) -> + @component.setShowInvisibles(showInvisibles) + getText: -> @editor.getText() From 5288666bfce06b05f62717db5ac4f062f9a3bc2b Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 16:07:00 -0700 Subject: [PATCH 51/59] Revert "Export ReactEditorView as EditorView" This reverts commit be201485188cb8583bbfe0a2dd239a20efa8cbd9. --- exports/atom.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exports/atom.coffee b/exports/atom.coffee index b852d68a7..773b24f3a 100644 --- a/exports/atom.coffee +++ b/exports/atom.coffee @@ -15,7 +15,7 @@ unless process.env.ATOM_SHELL_INTERNAL_RUN_AS_NODE module.exports.$ = $ module.exports.$$ = $$ module.exports.$$$ = $$$ - module.exports.EditorView = require '../src/react-editor-view' + module.exports.EditorView = require '../src/editor-view' module.exports.ScrollView = require '../src/scroll-view' module.exports.SelectListView = require '../src/select-list-view' module.exports.Task = require '../src/task' From a227ed75866065035b75f7822bad93908178cea9 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 9 Jun 2014 16:10:29 -0700 Subject: [PATCH 52/59] Add toggleSoftWrap and toggleSoftTabs --- src/react-editor-view.coffee | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index f9e7035a2..a3e3ee0ca 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -176,6 +176,12 @@ class ReactEditorView extends View setShowInvisibles: (showInvisibles) -> @component.setShowInvisibles(showInvisibles) + toggleSoftWrap: -> + @editor.toggleSoftWrap() + + toggleSoftTabs: -> + @editor.toggleSoftTabs() + getText: -> @editor.getText() From b46ac9080c9b69617e7a5df56bf96f90f5b7df56 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Fri, 6 Jun 2014 09:13:44 -0700 Subject: [PATCH 53/59] Use ReactEditorView in the workspace view spec --- spec/workspace-view-spec.coffee | 2 +- src/workspace-view.coffee | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/spec/workspace-view-spec.coffee b/spec/workspace-view-spec.coffee index 3f7a32259..b5b71fcac 100644 --- a/spec/workspace-view-spec.coffee +++ b/spec/workspace-view-spec.coffee @@ -2,7 +2,7 @@ Q = require 'q' path = require 'path' temp = require 'temp' -EditorView = require '../src/editor-view' +EditorView = require '../src/react-editor-view' PaneView = require '../src/pane-view' Workspace = require '../src/workspace' diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index 5c45db226..ab19a8f45 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -9,7 +9,6 @@ scrollbarStyle = require 'scrollbar-style' fs = require 'fs-plus' Workspace = require './workspace' CommandInstaller = require './command-installer' -EditorView = require './editor-view' PaneView = require './pane-view' PaneColumnView = require './pane-column-view' PaneRowView = require './pane-row-view' From f9c4af301d37a9d3f98e80fd0229c15bc2f0d464 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Tue, 10 Jun 2014 15:19:54 -0700 Subject: [PATCH 54/59] Shim scrollView outlet --- src/react-editor-view.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index a3e3ee0ca..ed94c85f1 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -33,6 +33,7 @@ class ReactEditorView extends View node = @component.getDOMNode() + @scrollView = $(node).find('.scroll-view') @underlayer = $(node).find('.selections').addClass('underlayer') @overlayer = $(node).find('.lines').addClass('overlayer') @hiddenInput = $(node).find('.hidden-input') From d0385a90ea10d15f79430d895d264802946fa436 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Tue, 10 Jun 2014 15:37:49 -0700 Subject: [PATCH 55/59] Revert "Use ReactEditorView in the workspace view spec" This reverts commit b46ac9080c9b69617e7a5df56bf96f90f5b7df56. --- spec/workspace-view-spec.coffee | 2 +- src/workspace-view.coffee | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/workspace-view-spec.coffee b/spec/workspace-view-spec.coffee index b5b71fcac..3f7a32259 100644 --- a/spec/workspace-view-spec.coffee +++ b/spec/workspace-view-spec.coffee @@ -2,7 +2,7 @@ Q = require 'q' path = require 'path' temp = require 'temp' -EditorView = require '../src/react-editor-view' +EditorView = require '../src/editor-view' PaneView = require '../src/pane-view' Workspace = require '../src/workspace' diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index ab19a8f45..5c45db226 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -9,6 +9,7 @@ scrollbarStyle = require 'scrollbar-style' fs = require 'fs-plus' Workspace = require './workspace' CommandInstaller = require './command-installer' +EditorView = require './editor-view' PaneView = require './pane-view' PaneColumnView = require './pane-column-view' PaneRowView = require './pane-row-view' From 64870c733be947050222b5a8b25a5c48fd0fed88 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 11 Jun 2014 06:07:41 -0600 Subject: [PATCH 56/59] Add API for enabling/disabling input to support vim-mode's insert mode --- spec/editor-component-spec.coffee | 6 ++++++ src/editor-component.coffee | 7 +++++++ src/react-editor-view.coffee | 6 ++++++ 3 files changed, 19 insertions(+) diff --git a/spec/editor-component-spec.coffee b/spec/editor-component-spec.coffee index 16c02b421..5048f1a6a 100644 --- a/spec/editor-component-spec.coffee +++ b/spec/editor-component-spec.coffee @@ -1175,6 +1175,12 @@ describe "EditorComponent", -> inputNode.dispatchEvent(new Event('input')) expect(editor.lineForBufferRow(0)).toBe 'üvar quicksort = function () {' + it "does not handle input events when input is disabled", -> + component.setInputEnabled(false) + inputNode.value = 'x' + inputNode.dispatchEvent(new Event('input')) + expect(editor.lineForBufferRow(0)).toBe 'var quicksort = function () {' + describe "commands", -> describe "editor:consolidate-selections", -> it "consolidates selections on the editor model, aborting the key binding if there is only one selection", -> diff --git a/src/editor-component.coffee b/src/editor-component.coffee index 21459ad96..0d12a899e 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -37,6 +37,7 @@ EditorComponent = React.createClass overflowChangedEventsPaused: false overflowChangedWhilePaused: false measureLineHeightAndDefaultCharWidthWhenShown: false + inputEnabled: true render: -> {focused, fontSize, lineHeight, fontFamily, showIndentGuide, showInvisibles, visible} = @state @@ -456,6 +457,8 @@ EditorComponent = React.createClass scrollViewNode.scrollLeft = 0 onInput: (char, replaceLastCharacter) -> + return unless @inputEnabled + {editor} = @props if replaceLastCharacter @@ -760,6 +763,10 @@ EditorComponent = React.createClass getModel: -> @props.editor + isInputEnabled: -> @inputEnabled + + setInputEnabled: (@inputEnabled) -> @inputEnabled + runScrollBenchmark: -> unless process.env.NODE_ENV is 'production' ReactPerf = require 'react-atom-fork/lib/ReactDefaultPerf' diff --git a/src/react-editor-view.coffee b/src/react-editor-view.coffee index 5aac311d7..4ab5250c1 100644 --- a/src/react-editor-view.coffee +++ b/src/react-editor-view.coffee @@ -197,6 +197,12 @@ class ReactEditorView extends View insertText: (text) -> @editor.insertText(text) + isInputEnabled: -> + @component.isInputEnabled() + + setInputEnabled: (inputEnabled) -> + @component.setInputEnabled(inputEnabled) + requestDisplayUpdate: -> # No-op shim for find-and-replace updateDisplay: -> # No-op shim for package specs From 5531d54554b85ec592d113cb12f18be60eb872dc Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 11 Jun 2014 08:00:04 -0600 Subject: [PATCH 57/59] Upgrade autosave to support react editor focusout events --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 39a9e0d7b..9486876ae 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "archive-view": "0.32.0", "autocomplete": "0.28.0", "autoflow": "0.17.0", - "autosave": "0.13.0", + "autosave": "0.14.0", "background-tips": "0.14.0", "bookmarks": "0.23.0", "bracket-matcher": "0.45.0", From a09eb9698277e18d9822f44e231025931487a4d7 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 11 Jun 2014 08:05:30 -0600 Subject: [PATCH 58/59] Upgrade bookmarks to pass specs with react editor enabled --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9486876ae..a2d6ca9b7 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "autoflow": "0.17.0", "autosave": "0.14.0", "background-tips": "0.14.0", - "bookmarks": "0.23.0", + "bookmarks": "0.24.0", "bracket-matcher": "0.45.0", "command-palette": "0.22.0", "deprecation-cop": "0.6.0", From 4c0d87080a30ef6fdcece9007111cdc70df5ca86 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 11 Jun 2014 08:30:17 -0600 Subject: [PATCH 59/59] Update git-diff so specs pass with React editor enabled --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a2d6ca9b7..6f0598b16 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "feedback": "0.33.0", "find-and-replace": "0.115.0", "fuzzy-finder": "0.54.0", - "git-diff": "0.29.0", + "git-diff": "0.30.0", "go-to-line": "0.22.0", "grammar-selector": "0.27.0", "image-view": "0.35.0",