{View, $} = require 'space-pen' Grim = require 'Grim' React = require 'react-atom-fork' EditorComponent = require './editor-component' {defaults} = require 'underscore-plus' 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 overlayer' focusOnAttach: false constructor: (@editor, @props) -> super getEditor: -> @editor getModel: -> @editor Object.defineProperty @::, 'lineHeight', get: -> @editor.getLineHeightInPixels() Object.defineProperty @::, 'charWidth', get: -> @editor.getDefaultCharWidth() Object.defineProperty @::, 'firstRenderedScreenRow', get: -> @component.getRenderedRowRange()[0] Object.defineProperty @::, 'lastRenderedScreenRow', get: -> @component.getRenderedRowRange()[1] 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 @attached = true props = defaults({@editor, parentView: this}, @props) @component = React.renderComponent(EditorComponent(props), @element) node = @component.getDOMNode() @underlayer = $(node).find('.selections') @gutter = $(node).find('.gutter') @gutter.removeClassFromAllLines = (klass) => Grim.deprecate 'You no longer need to manually add and remove classes. Use `Editor::removeDecorationFromBufferRow()` and related functions' @gutter.find('.line-number').removeClass(klass) @gutter.addClassToLine = (bufferRow, klass) => Grim.deprecate 'You no longer need to manually add and remove classes. Use `Editor::addDecorationToBufferRow()` and related functions' lines = @gutter.find("[data-buffer-row='#{bufferRow}']") lines.addClass(klass) lines.length > 0 @focus() if @focusOnAttach @trigger 'editor:attached', [this] pixelPositionForBufferPosition: (bufferPosition) -> @editor.pixelPositionForBufferPosition(bufferPosition) pixelPositionForScreenPosition: (screenPosition) -> @editor.pixelPositionForScreenPosition(screenPosition) appendToLinesView: (view) -> view.css('position', 'absolute') view.css('z-index', 1) @find('.lines').prepend(view) beforeRemove: -> React.unmountComponentAtNode(@element) @attached = false @trigger 'editor:detached', this getPane: -> @closest('.pane').view() focus: -> if @component? @component.onFocus() else @focusOnAttach = true hide: -> super @component.hide() show: -> super @component.show() requestDisplayUpdate: -> # No-op shim for find-and-replace